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,11 +315,11 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) | ||
| 315 | for(i = 0; i < 24; i++) { | 315 | for(i = 0; i < 24; i++) { |
| 316 | registers[i + 8] = tswapl(env->regwptr[i]); | 316 | registers[i + 8] = tswapl(env->regwptr[i]); |
| 317 | } | 317 | } |
| 318 | +#ifndef TARGET_SPARC64 | ||
| 318 | /* fill in fprs */ | 319 | /* fill in fprs */ |
| 319 | for (i = 0; i < 32; i++) { | 320 | for (i = 0; i < 32; i++) { |
| 320 | registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i])); | 321 | registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i])); |
| 321 | } | 322 | } |
| 322 | -#ifndef TARGET_SPARC64 | ||
| 323 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ | 323 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
| 324 | registers[64] = tswapl(env->y); | 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,16 +337,21 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) | ||
| 337 | registers[72] = 0; | 337 | registers[72] = 0; |
| 338 | return 73 * sizeof(target_ulong); | 338 | return 73 * sizeof(target_ulong); |
| 339 | #else | 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 | #endif | 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,11 +368,11 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) | ||
| 363 | for(i = 0; i < 24; i++) { | 368 | for(i = 0; i < 24; i++) { |
| 364 | env->regwptr[i] = tswapl(registers[i + 8]); | 369 | env->regwptr[i] = tswapl(registers[i + 8]); |
| 365 | } | 370 | } |
| 371 | +#ifndef TARGET_SPARC64 | ||
| 366 | /* fill in fprs */ | 372 | /* fill in fprs */ |
| 367 | for (i = 0; i < 32; i++) { | 373 | for (i = 0; i < 32; i++) { |
| 368 | *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]); | 374 | *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]); |
| 369 | } | 375 | } |
| 370 | -#ifndef TARGET_SPARC64 | ||
| 371 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ | 376 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
| 372 | env->y = tswapl(registers[64]); | 377 | env->y = tswapl(registers[64]); |
| 373 | PUT_PSR(env, tswapl(registers[65])); | 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,18 +382,16 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) | ||
| 377 | env->npc = tswapl(registers[69]); | 382 | env->npc = tswapl(registers[69]); |
| 378 | env->fsr = tswapl(registers[70]); | 383 | env->fsr = tswapl(registers[70]); |
| 379 | #else | 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 | #endif | 395 | #endif |
| 393 | } | 396 | } |
| 394 | #elif defined (TARGET_ARM) | 397 | #elif defined (TARGET_ARM) |
| @@ -565,7 +568,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -565,7 +568,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 565 | char buf[4096]; | 568 | char buf[4096]; |
| 566 | uint8_t mem_buf[2000]; | 569 | uint8_t mem_buf[2000]; |
| 567 | uint32_t *registers; | 570 | uint32_t *registers; |
| 568 | - uint32_t addr, len; | 571 | + target_ulong addr, len; |
| 569 | 572 | ||
| 570 | #ifdef DEBUG_GDB | 573 | #ifdef DEBUG_GDB |
| 571 | printf("command='%s'\n", line_buf); | 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,7 +583,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 580 | break; | 583 | break; |
| 581 | case 'c': | 584 | case 'c': |
| 582 | if (*p != '\0') { | 585 | if (*p != '\0') { |
| 583 | - addr = strtoul(p, (char **)&p, 16); | 586 | + addr = strtoull(p, (char **)&p, 16); |
| 584 | #if defined(TARGET_I386) | 587 | #if defined(TARGET_I386) |
| 585 | env->eip = addr; | 588 | env->eip = addr; |
| 586 | #elif defined (TARGET_PPC) | 589 | #elif defined (TARGET_PPC) |
| @@ -636,10 +639,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -636,10 +639,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 636 | put_packet(s, "OK"); | 639 | put_packet(s, "OK"); |
| 637 | break; | 640 | break; |
| 638 | case 'm': | 641 | case 'm': |
| 639 | - addr = strtoul(p, (char **)&p, 16); | 642 | + addr = strtoull(p, (char **)&p, 16); |
| 640 | if (*p == ',') | 643 | if (*p == ',') |
| 641 | p++; | 644 | p++; |
| 642 | - len = strtoul(p, NULL, 16); | 645 | + len = strtoull(p, NULL, 16); |
| 643 | if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) { | 646 | if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) { |
| 644 | put_packet (s, "E14"); | 647 | put_packet (s, "E14"); |
| 645 | } else { | 648 | } else { |
| @@ -648,10 +651,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -648,10 +651,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 648 | } | 651 | } |
| 649 | break; | 652 | break; |
| 650 | case 'M': | 653 | case 'M': |
| 651 | - addr = strtoul(p, (char **)&p, 16); | 654 | + addr = strtoull(p, (char **)&p, 16); |
| 652 | if (*p == ',') | 655 | if (*p == ',') |
| 653 | p++; | 656 | p++; |
| 654 | - len = strtoul(p, (char **)&p, 16); | 657 | + len = strtoull(p, (char **)&p, 16); |
| 655 | if (*p == ':') | 658 | if (*p == ':') |
| 656 | p++; | 659 | p++; |
| 657 | hextomem(mem_buf, p, len); | 660 | hextomem(mem_buf, p, len); |
| @@ -664,10 +667,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -664,10 +667,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 664 | type = strtoul(p, (char **)&p, 16); | 667 | type = strtoul(p, (char **)&p, 16); |
| 665 | if (*p == ',') | 668 | if (*p == ',') |
| 666 | p++; | 669 | p++; |
| 667 | - addr = strtoul(p, (char **)&p, 16); | 670 | + addr = strtoull(p, (char **)&p, 16); |
| 668 | if (*p == ',') | 671 | if (*p == ',') |
| 669 | p++; | 672 | p++; |
| 670 | - len = strtoul(p, (char **)&p, 16); | 673 | + len = strtoull(p, (char **)&p, 16); |
| 671 | if (type == 0 || type == 1) { | 674 | if (type == 0 || type == 1) { |
| 672 | if (cpu_breakpoint_insert(env, addr) < 0) | 675 | if (cpu_breakpoint_insert(env, addr) < 0) |
| 673 | goto breakpoint_error; | 676 | goto breakpoint_error; |
| @@ -681,10 +684,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -681,10 +684,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
| 681 | type = strtoul(p, (char **)&p, 16); | 684 | type = strtoul(p, (char **)&p, 16); |
| 682 | if (*p == ',') | 685 | if (*p == ',') |
| 683 | p++; | 686 | p++; |
| 684 | - addr = strtoul(p, (char **)&p, 16); | 687 | + addr = strtoull(p, (char **)&p, 16); |
| 685 | if (*p == ',') | 688 | if (*p == ',') |
| 686 | p++; | 689 | p++; |
| 687 | - len = strtoul(p, (char **)&p, 16); | 690 | + len = strtoull(p, (char **)&p, 16); |
| 688 | if (type == 0 || type == 1) { | 691 | if (type == 0 || type == 1) { |
| 689 | cpu_breakpoint_remove(env, addr); | 692 | cpu_breakpoint_remove(env, addr); |
| 690 | put_packet(s, "OK"); | 693 | put_packet(s, "OK"); |