Commit 9d9754a31dd1e954c95d7cc3553845677a1a9f63
1 parent
1579bde8
sparc fpu fix - allow 64 bit addresses (Blue Swirl)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2009 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
35 additions
and
32 deletions
gdbstub.c
| ... | ... | @@ -315,11 +315,11 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
| 315 | 315 | for(i = 0; i < 24; i++) { |
| 316 | 316 | registers[i + 8] = tswapl(env->regwptr[i]); |
| 317 | 317 | } |
| 318 | +#ifndef TARGET_SPARC64 | |
| 318 | 319 | /* fill in fprs */ |
| 319 | 320 | for (i = 0; i < 32; i++) { |
| 320 | 321 | registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i])); |
| 321 | 322 | } |
| 322 | -#ifndef TARGET_SPARC64 | |
| 323 | 323 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
| 324 | 324 | registers[64] = tswapl(env->y); |
| 325 | 325 | { |
| ... | ... | @@ -337,16 +337,21 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
| 337 | 337 | registers[72] = 0; |
| 338 | 338 | return 73 * sizeof(target_ulong); |
| 339 | 339 | #else |
| 340 | - for (i = 0; i < 32; i += 2) { | |
| 341 | - registers[i/2 + 64] = tswapl(*((uint64_t *)&env->fpr[i])); | |
| 340 | + /* fill in fprs */ | |
| 341 | + for (i = 0; i < 64; i += 2) { | |
| 342 | + uint64_t tmp; | |
| 343 | + | |
| 344 | + tmp = (uint64_t)tswap32(*((uint32_t *)&env->fpr[i])) << 32; | |
| 345 | + tmp |= tswap32(*((uint32_t *)&env->fpr[i + 1])); | |
| 346 | + registers[i/2 + 32] = tmp; | |
| 342 | 347 | } |
| 343 | - registers[81] = tswapl(env->pc); | |
| 344 | - registers[82] = tswapl(env->npc); | |
| 345 | - registers[83] = tswapl(env->tstate[env->tl]); | |
| 346 | - registers[84] = tswapl(env->fsr); | |
| 347 | - registers[85] = tswapl(env->fprs); | |
| 348 | - registers[86] = tswapl(env->y); | |
| 349 | - return 87 * sizeof(target_ulong); | |
| 348 | + registers[64] = tswapl(env->pc); | |
| 349 | + registers[65] = tswapl(env->npc); | |
| 350 | + registers[66] = tswapl(env->tstate[env->tl]); | |
| 351 | + registers[67] = tswapl(env->fsr); | |
| 352 | + registers[68] = tswapl(env->fprs); | |
| 353 | + registers[69] = tswapl(env->y); | |
| 354 | + return 70 * sizeof(target_ulong); | |
| 350 | 355 | #endif |
| 351 | 356 | } |
| 352 | 357 | |
| ... | ... | @@ -363,11 +368,11 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
| 363 | 368 | for(i = 0; i < 24; i++) { |
| 364 | 369 | env->regwptr[i] = tswapl(registers[i + 8]); |
| 365 | 370 | } |
| 371 | +#ifndef TARGET_SPARC64 | |
| 366 | 372 | /* fill in fprs */ |
| 367 | 373 | for (i = 0; i < 32; i++) { |
| 368 | 374 | *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]); |
| 369 | 375 | } |
| 370 | -#ifndef TARGET_SPARC64 | |
| 371 | 376 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
| 372 | 377 | env->y = tswapl(registers[64]); |
| 373 | 378 | PUT_PSR(env, tswapl(registers[65])); |
| ... | ... | @@ -377,18 +382,16 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
| 377 | 382 | env->npc = tswapl(registers[69]); |
| 378 | 383 | env->fsr = tswapl(registers[70]); |
| 379 | 384 | #else |
| 380 | - for (i = 0; i < 32; i += 2) { | |
| 381 | - uint64_t tmp; | |
| 382 | - tmp = tswapl(registers[i/2 + 64]) << 32; | |
| 383 | - tmp |= tswapl(registers[i/2 + 64 + 1]); | |
| 384 | - *((uint64_t *)&env->fpr[i]) = tmp; | |
| 385 | + for (i = 0; i < 64; i += 2) { | |
| 386 | + *((uint32_t *)&env->fpr[i]) = tswap32(registers[i/2 + 32] >> 32); | |
| 387 | + *((uint32_t *)&env->fpr[i + 1]) = tswap32(registers[i/2 + 32] & 0xffffffff); | |
| 385 | 388 | } |
| 386 | - env->pc = tswapl(registers[81]); | |
| 387 | - env->npc = tswapl(registers[82]); | |
| 388 | - env->tstate[env->tl] = tswapl(registers[83]); | |
| 389 | - env->fsr = tswapl(registers[84]); | |
| 390 | - env->fprs = tswapl(registers[85]); | |
| 391 | - env->y = tswapl(registers[86]); | |
| 389 | + env->pc = tswapl(registers[64]); | |
| 390 | + env->npc = tswapl(registers[65]); | |
| 391 | + env->tstate[env->tl] = tswapl(registers[66]); | |
| 392 | + env->fsr = tswapl(registers[67]); | |
| 393 | + env->fprs = tswapl(registers[68]); | |
| 394 | + env->y = tswapl(registers[69]); | |
| 392 | 395 | #endif |
| 393 | 396 | } |
| 394 | 397 | #elif defined (TARGET_ARM) |
| ... | ... | @@ -565,7 +568,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 565 | 568 | char buf[4096]; |
| 566 | 569 | uint8_t mem_buf[2000]; |
| 567 | 570 | uint32_t *registers; |
| 568 | - uint32_t addr, len; | |
| 571 | + target_ulong addr, len; | |
| 569 | 572 | |
| 570 | 573 | #ifdef DEBUG_GDB |
| 571 | 574 | printf("command='%s'\n", line_buf); |
| ... | ... | @@ -580,7 +583,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 580 | 583 | break; |
| 581 | 584 | case 'c': |
| 582 | 585 | if (*p != '\0') { |
| 583 | - addr = strtoul(p, (char **)&p, 16); | |
| 586 | + addr = strtoull(p, (char **)&p, 16); | |
| 584 | 587 | #if defined(TARGET_I386) |
| 585 | 588 | env->eip = addr; |
| 586 | 589 | #elif defined (TARGET_PPC) |
| ... | ... | @@ -636,10 +639,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 636 | 639 | put_packet(s, "OK"); |
| 637 | 640 | break; |
| 638 | 641 | case 'm': |
| 639 | - addr = strtoul(p, (char **)&p, 16); | |
| 642 | + addr = strtoull(p, (char **)&p, 16); | |
| 640 | 643 | if (*p == ',') |
| 641 | 644 | p++; |
| 642 | - len = strtoul(p, NULL, 16); | |
| 645 | + len = strtoull(p, NULL, 16); | |
| 643 | 646 | if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) { |
| 644 | 647 | put_packet (s, "E14"); |
| 645 | 648 | } else { |
| ... | ... | @@ -648,10 +651,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 648 | 651 | } |
| 649 | 652 | break; |
| 650 | 653 | case 'M': |
| 651 | - addr = strtoul(p, (char **)&p, 16); | |
| 654 | + addr = strtoull(p, (char **)&p, 16); | |
| 652 | 655 | if (*p == ',') |
| 653 | 656 | p++; |
| 654 | - len = strtoul(p, (char **)&p, 16); | |
| 657 | + len = strtoull(p, (char **)&p, 16); | |
| 655 | 658 | if (*p == ':') |
| 656 | 659 | p++; |
| 657 | 660 | hextomem(mem_buf, p, len); |
| ... | ... | @@ -664,10 +667,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 664 | 667 | type = strtoul(p, (char **)&p, 16); |
| 665 | 668 | if (*p == ',') |
| 666 | 669 | p++; |
| 667 | - addr = strtoul(p, (char **)&p, 16); | |
| 670 | + addr = strtoull(p, (char **)&p, 16); | |
| 668 | 671 | if (*p == ',') |
| 669 | 672 | p++; |
| 670 | - len = strtoul(p, (char **)&p, 16); | |
| 673 | + len = strtoull(p, (char **)&p, 16); | |
| 671 | 674 | if (type == 0 || type == 1) { |
| 672 | 675 | if (cpu_breakpoint_insert(env, addr) < 0) |
| 673 | 676 | goto breakpoint_error; |
| ... | ... | @@ -681,10 +684,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) |
| 681 | 684 | type = strtoul(p, (char **)&p, 16); |
| 682 | 685 | if (*p == ',') |
| 683 | 686 | p++; |
| 684 | - addr = strtoul(p, (char **)&p, 16); | |
| 687 | + addr = strtoull(p, (char **)&p, 16); | |
| 685 | 688 | if (*p == ',') |
| 686 | 689 | p++; |
| 687 | - len = strtoul(p, (char **)&p, 16); | |
| 690 | + len = strtoull(p, (char **)&p, 16); | |
| 688 | 691 | if (type == 0 || type == 1) { |
| 689 | 692 | cpu_breakpoint_remove(env, addr); |
| 690 | 693 | put_packet(s, "OK"); | ... | ... |