Skip to content

Commit

Permalink
target/ppc: Update gdbstub to read SPR's CFAR, DEC, HDEC, TB-L/U
Browse files Browse the repository at this point in the history
SPR's CFAR, DEC, HDEC, TB-L/U are not implemented as part of CPUPPCState.
Hence, gdbstub is not able to access them using (CPUPPCState *)env->spr[] array.
Update gdb_get_spr_reg() method to handle these SPR's specifically.

Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Saif Abrar <saif.abrar@linux.vnet.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
  • Loading branch information
saifabrar authored and npiggin committed Feb 23, 2024
1 parent c295d3b commit 0c0fc26
Showing 1 changed file with 38 additions and 2 deletions.
40 changes: 38 additions & 2 deletions target/ppc/gdbstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,32 @@ static int gdb_get_spr_reg(CPUPPCState *env, GByteArray *buf, int n)
}

len = TARGET_LONG_SIZE;
gdb_get_regl(buf, env->spr[reg]);

/* Handle those SPRs that are not part of the env->spr[] array */
target_ulong val;
switch (reg) {
#if defined(TARGET_PPC64)
case SPR_CFAR:
val = env->cfar;
break;
#endif
case SPR_HDEC:
val = cpu_ppc_load_hdecr(env);
break;
case SPR_TBL:
val = cpu_ppc_load_tbl(env);
break;
case SPR_TBU:
val = cpu_ppc_load_tbu(env);
break;
case SPR_DECR:
val = cpu_ppc_load_decr(env);
break;
default:
val = env->spr[reg];
}
gdb_get_regl(buf, val);

ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, len), len);
return len;
}
Expand All @@ -411,7 +436,18 @@ static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)

len = TARGET_LONG_SIZE;
ppc_maybe_bswap_register(env, mem_buf, len);
env->spr[reg] = ldn_p(mem_buf, len);

/* Handle those SPRs that are not part of the env->spr[] array */
target_ulong val = ldn_p(mem_buf, len);
switch (reg) {
#if defined(TARGET_PPC64)
case SPR_CFAR:
env->cfar = val;
break;
#endif
default:
env->spr[reg] = val;
}

return len;
}
Expand Down

0 comments on commit 0c0fc26

Please sign in to comment.