target-alpha: Fix gdb access to fpcr and unique.
cpu_gdb_read/write_register need to access the fpcr via the cpu_alpha_load/store_fpcr functions. The unique register is number 66 in the gdb remote protocol. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
d354899c82
commit
7c5a90dd41
88
gdbstub.c
88
gdbstub.c
@ -1343,52 +1343,72 @@ static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
|
|||||||
}
|
}
|
||||||
#elif defined (TARGET_ALPHA)
|
#elif defined (TARGET_ALPHA)
|
||||||
|
|
||||||
#define NUM_CORE_REGS 65
|
#define NUM_CORE_REGS 67
|
||||||
|
|
||||||
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
|
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
|
||||||
{
|
{
|
||||||
if (n < 31) {
|
uint64_t val;
|
||||||
GET_REGL(env->ir[n]);
|
CPU_DoubleU d;
|
||||||
}
|
|
||||||
else if (n == 31) {
|
|
||||||
GET_REGL(0);
|
|
||||||
}
|
|
||||||
else if (n<63) {
|
|
||||||
uint64_t val;
|
|
||||||
|
|
||||||
val = *((uint64_t *)&env->fir[n-32]);
|
switch (n) {
|
||||||
GET_REGL(val);
|
case 0 ... 30:
|
||||||
|
val = env->ir[n];
|
||||||
|
break;
|
||||||
|
case 32 ... 62:
|
||||||
|
d.d = env->fir[n - 32];
|
||||||
|
val = d.ll;
|
||||||
|
break;
|
||||||
|
case 63:
|
||||||
|
val = cpu_alpha_load_fpcr(env);
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
val = env->pc;
|
||||||
|
break;
|
||||||
|
case 66:
|
||||||
|
val = env->unique;
|
||||||
|
break;
|
||||||
|
case 31:
|
||||||
|
case 65:
|
||||||
|
/* 31 really is the zero register; 65 is unassigned in the
|
||||||
|
gdb protocol, but is still required to occupy 8 bytes. */
|
||||||
|
val = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else if (n==63) {
|
GET_REGL(val);
|
||||||
GET_REGL(env->fpcr);
|
|
||||||
}
|
|
||||||
else if (n==64) {
|
|
||||||
GET_REGL(env->pc);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
GET_REGL(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
|
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
|
||||||
{
|
{
|
||||||
target_ulong tmp;
|
target_ulong tmp = ldtul_p(mem_buf);
|
||||||
tmp = ldtul_p(mem_buf);
|
CPU_DoubleU d;
|
||||||
|
|
||||||
if (n < 31) {
|
switch (n) {
|
||||||
|
case 0 ... 30:
|
||||||
env->ir[n] = tmp;
|
env->ir[n] = tmp;
|
||||||
|
break;
|
||||||
|
case 32 ... 62:
|
||||||
|
d.ll = tmp;
|
||||||
|
env->fir[n - 32] = d.d;
|
||||||
|
break;
|
||||||
|
case 63:
|
||||||
|
cpu_alpha_store_fpcr(env, tmp);
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
env->pc = tmp;
|
||||||
|
break;
|
||||||
|
case 66:
|
||||||
|
env->unique = tmp;
|
||||||
|
break;
|
||||||
|
case 31:
|
||||||
|
case 65:
|
||||||
|
/* 31 really is the zero register; 65 is unassigned in the
|
||||||
|
gdb protocol, but is still required to occupy 8 bytes. */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n > 31 && n < 63) {
|
|
||||||
env->fir[n - 32] = ldfl_p(mem_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n == 64 ) {
|
|
||||||
env->pc=tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
#elif defined (TARGET_S390X)
|
#elif defined (TARGET_S390X)
|
||||||
|
Loading…
Reference in New Issue
Block a user