Commit 96d19126227eb6010336f38ce4c09966964bb1f4
1 parent
c588979b
Fix Sparc32plus GDBstub support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4689 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
39 additions
and
25 deletions
gdbstub.c
... | ... | @@ -469,40 +469,49 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
469 | 469 | ppc_store_xer(env, tswapl(registers[101])); |
470 | 470 | } |
471 | 471 | #elif defined (TARGET_SPARC) |
472 | +#ifdef TARGET_ABI32 | |
473 | +#define tswap_abi(val) tswap32(val &0xffffffff) | |
474 | +#else | |
475 | +#define tswap_abi(val) tswapl(val) | |
476 | +#endif | |
472 | 477 | static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
473 | 478 | { |
479 | +#ifdef TARGET_ABI32 | |
480 | + abi_ulong *registers = (abi_ulong *)mem_buf; | |
481 | +#else | |
474 | 482 | target_ulong *registers = (target_ulong *)mem_buf; |
483 | +#endif | |
475 | 484 | int i; |
476 | 485 | |
477 | 486 | /* fill in g0..g7 */ |
478 | 487 | for(i = 0; i < 8; i++) { |
479 | - registers[i] = tswapl(env->gregs[i]); | |
488 | + registers[i] = tswap_abi(env->gregs[i]); | |
480 | 489 | } |
481 | 490 | /* fill in register window */ |
482 | 491 | for(i = 0; i < 24; i++) { |
483 | - registers[i + 8] = tswapl(env->regwptr[i]); | |
492 | + registers[i + 8] = tswap_abi(env->regwptr[i]); | |
484 | 493 | } |
485 | -#ifndef TARGET_SPARC64 | |
494 | +#if !defined(TARGET_SPARC64) || defined(TARGET_ABI32) | |
486 | 495 | /* fill in fprs */ |
487 | 496 | for (i = 0; i < 32; i++) { |
488 | - registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i])); | |
497 | + registers[i + 32] = tswap_abi(*((uint32_t *)&env->fpr[i])); | |
489 | 498 | } |
490 | 499 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
491 | - registers[64] = tswapl(env->y); | |
500 | + registers[64] = tswap_abi(env->y); | |
492 | 501 | { |
493 | - target_ulong tmp; | |
502 | + uint32_t tmp; | |
494 | 503 | |
495 | - tmp = GET_PSR(env); | |
496 | - registers[65] = tswapl(tmp); | |
504 | + tmp = GET_PSR(env); | |
505 | + registers[65] = tswap32(tmp); | |
497 | 506 | } |
498 | - registers[66] = tswapl(env->wim); | |
499 | - registers[67] = tswapl(env->tbr); | |
500 | - registers[68] = tswapl(env->pc); | |
501 | - registers[69] = tswapl(env->npc); | |
502 | - registers[70] = tswapl(env->fsr); | |
507 | + registers[66] = tswap_abi(env->wim); | |
508 | + registers[67] = tswap_abi(env->tbr); | |
509 | + registers[68] = tswap_abi(env->pc); | |
510 | + registers[69] = tswap_abi(env->npc); | |
511 | + registers[70] = tswap_abi(env->fsr); | |
503 | 512 | registers[71] = 0; /* csr */ |
504 | 513 | registers[72] = 0; |
505 | - return 73 * sizeof(target_ulong); | |
514 | + return 73 * sizeof(uint32_t); | |
506 | 515 | #else |
507 | 516 | /* fill in fprs */ |
508 | 517 | for (i = 0; i < 64; i += 2) { |
... | ... | @@ -527,30 +536,34 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
527 | 536 | |
528 | 537 | static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
529 | 538 | { |
539 | +#ifdef TARGET_ABI32 | |
540 | + abi_ulong *registers = (abi_ulong *)mem_buf; | |
541 | +#else | |
530 | 542 | target_ulong *registers = (target_ulong *)mem_buf; |
543 | +#endif | |
531 | 544 | int i; |
532 | 545 | |
533 | 546 | /* fill in g0..g7 */ |
534 | 547 | for(i = 0; i < 7; i++) { |
535 | - env->gregs[i] = tswapl(registers[i]); | |
548 | + env->gregs[i] = tswap_abi(registers[i]); | |
536 | 549 | } |
537 | 550 | /* fill in register window */ |
538 | 551 | for(i = 0; i < 24; i++) { |
539 | - env->regwptr[i] = tswapl(registers[i + 8]); | |
552 | + env->regwptr[i] = tswap_abi(registers[i + 8]); | |
540 | 553 | } |
541 | -#ifndef TARGET_SPARC64 | |
554 | +#if !defined(TARGET_SPARC64) || defined(TARGET_ABI32) | |
542 | 555 | /* fill in fprs */ |
543 | 556 | for (i = 0; i < 32; i++) { |
544 | - *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]); | |
557 | + *((uint32_t *)&env->fpr[i]) = tswap_abi(registers[i + 32]); | |
545 | 558 | } |
546 | 559 | /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
547 | - env->y = tswapl(registers[64]); | |
548 | - PUT_PSR(env, tswapl(registers[65])); | |
549 | - env->wim = tswapl(registers[66]); | |
550 | - env->tbr = tswapl(registers[67]); | |
551 | - env->pc = tswapl(registers[68]); | |
552 | - env->npc = tswapl(registers[69]); | |
553 | - env->fsr = tswapl(registers[70]); | |
560 | + env->y = tswap_abi(registers[64]); | |
561 | + PUT_PSR(env, tswap_abi(registers[65])); | |
562 | + env->wim = tswap_abi(registers[66]); | |
563 | + env->tbr = tswap_abi(registers[67]); | |
564 | + env->pc = tswap_abi(registers[68]); | |
565 | + env->npc = tswap_abi(registers[69]); | |
566 | + env->fsr = tswap_abi(registers[70]); | |
554 | 567 | #else |
555 | 568 | for (i = 0; i < 64; i += 2) { |
556 | 569 | uint64_t tmp; |
... | ... | @@ -574,6 +587,7 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
574 | 587 | env->y = tswapl(registers[69]); |
575 | 588 | #endif |
576 | 589 | } |
590 | +#undef tswap_abi | |
577 | 591 | #elif defined (TARGET_ARM) |
578 | 592 | static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
579 | 593 | { | ... | ... |