Commit 96d19126227eb6010336f38ce4c09966964bb1f4

Authored by blueswir1
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 {
... ...