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"); | ... | ... |