mirror of https://gitee.com/openkylin/qemu.git
S390 GDB stub
In order to debug funny kernel breakages it's always good to have a working gdb stub around. While Uli's patches don't include one one, I needed one that's at least good enough for 'bt' and some variable examinations during early bootup. So here it is - the absolute basics to get the qemu gdb stub running with s390x targets. Sgined-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
8cb310e130
commit
afcb0e4559
52
gdbstub.c
52
gdbstub.c
|
@ -1348,6 +1348,55 @@ static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
|
|||
|
||||
return 8;
|
||||
}
|
||||
#elif defined (TARGET_S390X)
|
||||
|
||||
#define NUM_CORE_REGS S390_NUM_TOTAL_REGS
|
||||
|
||||
static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n)
|
||||
{
|
||||
switch (n) {
|
||||
case S390_PSWM_REGNUM: GET_REGL(env->psw.mask); break;
|
||||
case S390_PSWA_REGNUM: GET_REGL(env->psw.addr); break;
|
||||
case S390_R0_REGNUM ... S390_R15_REGNUM:
|
||||
GET_REGL(env->regs[n-S390_R0_REGNUM]); break;
|
||||
case S390_A0_REGNUM ... S390_A15_REGNUM:
|
||||
GET_REG32(env->aregs[n-S390_A0_REGNUM]); break;
|
||||
case S390_FPC_REGNUM: GET_REG32(env->fpc); break;
|
||||
case S390_F0_REGNUM ... S390_F15_REGNUM:
|
||||
/* XXX */
|
||||
break;
|
||||
case S390_PC_REGNUM: GET_REGL(env->psw.addr); break;
|
||||
case S390_CC_REGNUM: GET_REG32(env->cc); break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n)
|
||||
{
|
||||
target_ulong tmpl;
|
||||
uint32_t tmp32;
|
||||
int r = 8;
|
||||
tmpl = ldtul_p(mem_buf);
|
||||
tmp32 = ldl_p(mem_buf);
|
||||
|
||||
switch (n) {
|
||||
case S390_PSWM_REGNUM: env->psw.mask = tmpl; break;
|
||||
case S390_PSWA_REGNUM: env->psw.addr = tmpl; break;
|
||||
case S390_R0_REGNUM ... S390_R15_REGNUM:
|
||||
env->regs[n-S390_R0_REGNUM] = tmpl; break;
|
||||
case S390_A0_REGNUM ... S390_A15_REGNUM:
|
||||
env->aregs[n-S390_A0_REGNUM] = tmp32; r=4; break;
|
||||
case S390_FPC_REGNUM: env->fpc = tmp32; r=4; break;
|
||||
case S390_F0_REGNUM ... S390_F15_REGNUM:
|
||||
/* XXX */
|
||||
break;
|
||||
case S390_PC_REGNUM: env->psw.addr = tmpl; break;
|
||||
case S390_CC_REGNUM: env->cc = tmp32; r=4; break;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
#else
|
||||
|
||||
#define NUM_CORE_REGS 0
|
||||
|
@ -1616,6 +1665,9 @@ static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
|
|||
s->c_cpu->pc = pc;
|
||||
#elif defined (TARGET_ALPHA)
|
||||
s->c_cpu->pc = pc;
|
||||
#elif defined (TARGET_S390X)
|
||||
cpu_synchronize_state(s->c_cpu);
|
||||
s->c_cpu->psw.addr = pc;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue