Commit 9d9754a31dd1e954c95d7cc3553845677a1a9f63

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