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
This commit is contained in:
bellard 2006-06-25 15:32:37 +00:00
parent 1579bde84d
commit 9d9754a31d
1 changed files with 35 additions and 32 deletions

View File

@ -315,11 +315,11 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
for(i = 0; i < 24; i++) { for(i = 0; i < 24; i++) {
registers[i + 8] = tswapl(env->regwptr[i]); registers[i + 8] = tswapl(env->regwptr[i]);
} }
#ifndef TARGET_SPARC64
/* fill in fprs */ /* fill in fprs */
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i])); registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
} }
#ifndef TARGET_SPARC64
/* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
registers[64] = tswapl(env->y); registers[64] = tswapl(env->y);
{ {
@ -337,16 +337,21 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
registers[72] = 0; registers[72] = 0;
return 73 * sizeof(target_ulong); return 73 * sizeof(target_ulong);
#else #else
for (i = 0; i < 32; i += 2) { /* fill in fprs */
registers[i/2 + 64] = tswapl(*((uint64_t *)&env->fpr[i])); for (i = 0; i < 64; i += 2) {
uint64_t tmp;
tmp = (uint64_t)tswap32(*((uint32_t *)&env->fpr[i])) << 32;
tmp |= tswap32(*((uint32_t *)&env->fpr[i + 1]));
registers[i/2 + 32] = tmp;
} }
registers[81] = tswapl(env->pc); registers[64] = tswapl(env->pc);
registers[82] = tswapl(env->npc); registers[65] = tswapl(env->npc);
registers[83] = tswapl(env->tstate[env->tl]); registers[66] = tswapl(env->tstate[env->tl]);
registers[84] = tswapl(env->fsr); registers[67] = tswapl(env->fsr);
registers[85] = tswapl(env->fprs); registers[68] = tswapl(env->fprs);
registers[86] = tswapl(env->y); registers[69] = tswapl(env->y);
return 87 * sizeof(target_ulong); return 70 * sizeof(target_ulong);
#endif #endif
} }
@ -363,11 +368,11 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
for(i = 0; i < 24; i++) { for(i = 0; i < 24; i++) {
env->regwptr[i] = tswapl(registers[i + 8]); env->regwptr[i] = tswapl(registers[i + 8]);
} }
#ifndef TARGET_SPARC64
/* fill in fprs */ /* fill in fprs */
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
*((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]); *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]);
} }
#ifndef TARGET_SPARC64
/* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
env->y = tswapl(registers[64]); env->y = tswapl(registers[64]);
PUT_PSR(env, tswapl(registers[65])); PUT_PSR(env, tswapl(registers[65]));
@ -377,18 +382,16 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
env->npc = tswapl(registers[69]); env->npc = tswapl(registers[69]);
env->fsr = tswapl(registers[70]); env->fsr = tswapl(registers[70]);
#else #else
for (i = 0; i < 32; i += 2) { for (i = 0; i < 64; i += 2) {
uint64_t tmp; *((uint32_t *)&env->fpr[i]) = tswap32(registers[i/2 + 32] >> 32);
tmp = tswapl(registers[i/2 + 64]) << 32; *((uint32_t *)&env->fpr[i + 1]) = tswap32(registers[i/2 + 32] & 0xffffffff);
tmp |= tswapl(registers[i/2 + 64 + 1]);
*((uint64_t *)&env->fpr[i]) = tmp;
} }
env->pc = tswapl(registers[81]); env->pc = tswapl(registers[64]);
env->npc = tswapl(registers[82]); env->npc = tswapl(registers[65]);
env->tstate[env->tl] = tswapl(registers[83]); env->tstate[env->tl] = tswapl(registers[66]);
env->fsr = tswapl(registers[84]); env->fsr = tswapl(registers[67]);
env->fprs = tswapl(registers[85]); env->fprs = tswapl(registers[68]);
env->y = tswapl(registers[86]); env->y = tswapl(registers[69]);
#endif #endif
} }
#elif defined (TARGET_ARM) #elif defined (TARGET_ARM)
@ -565,7 +568,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
char buf[4096]; char buf[4096];
uint8_t mem_buf[2000]; uint8_t mem_buf[2000];
uint32_t *registers; uint32_t *registers;
uint32_t addr, len; target_ulong addr, len;
#ifdef DEBUG_GDB #ifdef DEBUG_GDB
printf("command='%s'\n", line_buf); printf("command='%s'\n", line_buf);
@ -580,7 +583,7 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
break; break;
case 'c': case 'c':
if (*p != '\0') { if (*p != '\0') {
addr = strtoul(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
#if defined(TARGET_I386) #if defined(TARGET_I386)
env->eip = addr; env->eip = addr;
#elif defined (TARGET_PPC) #elif defined (TARGET_PPC)
@ -636,10 +639,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
put_packet(s, "OK"); put_packet(s, "OK");
break; break;
case 'm': case 'm':
addr = strtoul(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
len = strtoul(p, NULL, 16); len = strtoull(p, NULL, 16);
if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) { if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) {
put_packet (s, "E14"); put_packet (s, "E14");
} else { } else {
@ -648,10 +651,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
} }
break; break;
case 'M': case 'M':
addr = strtoul(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
len = strtoul(p, (char **)&p, 16); len = strtoull(p, (char **)&p, 16);
if (*p == ':') if (*p == ':')
p++; p++;
hextomem(mem_buf, p, len); hextomem(mem_buf, p, len);
@ -664,10 +667,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
type = strtoul(p, (char **)&p, 16); type = strtoul(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
addr = strtoul(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
len = strtoul(p, (char **)&p, 16); len = strtoull(p, (char **)&p, 16);
if (type == 0 || type == 1) { if (type == 0 || type == 1) {
if (cpu_breakpoint_insert(env, addr) < 0) if (cpu_breakpoint_insert(env, addr) < 0)
goto breakpoint_error; goto breakpoint_error;
@ -681,10 +684,10 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf)
type = strtoul(p, (char **)&p, 16); type = strtoul(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
addr = strtoul(p, (char **)&p, 16); addr = strtoull(p, (char **)&p, 16);
if (*p == ',') if (*p == ',')
p++; p++;
len = strtoul(p, (char **)&p, 16); len = strtoull(p, (char **)&p, 16);
if (type == 0 || type == 1) { if (type == 0 || type == 1) {
cpu_breakpoint_remove(env, addr); cpu_breakpoint_remove(env, addr);
put_packet(s, "OK"); put_packet(s, "OK");