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