Fix GDB machdep code for PPC/PPC64
There was a couple issues with GDB machdep code for PPC/PPC64, the main ones being: - wrong register sizes being returned - pcb_context index was wrong (this affects all PPC variants) Reviewed by: jhibbits Differential Revision: https://reviews.freebsd.org/D22201
This commit is contained in:
parent
d7271ace1d
commit
a8a6278ea0
@ -36,10 +36,43 @@
|
||||
#define PPC_GDB_NREGS4 (70 + 1)
|
||||
#define PPC_GDB_NREGS8 (1 + 32)
|
||||
#define PPC_GDB_NREGS16 0
|
||||
|
||||
#else
|
||||
/*
|
||||
* 0 - 32*GPR(4/8)
|
||||
* 32 - 32*FPR(8)
|
||||
* 64 - PC, PS (4/8)
|
||||
* 66 - CR (4)
|
||||
* 67 - LR, CTR (4/8)
|
||||
* 69 - XER, FPSCR (4)
|
||||
* 71 - 32*VR(16)
|
||||
* 103 - VSCR, VRSAVE (4)
|
||||
*/
|
||||
|
||||
#define PPC_REGNUM_R0 0
|
||||
#define PPC_REGNUM_R31 (PPC_REGNUM_R0 + 31)
|
||||
#define PPC_REGNUM_FR0 32
|
||||
#define PPC_REGNUM_FR31 (PPC_REGNUM_FR0 + 31)
|
||||
#define PPC_REGNUM_PC 64
|
||||
#define PPC_REGNUM_PS 65
|
||||
#define PPC_REGNUM_CR 66
|
||||
#define PPC_REGNUM_LR 67
|
||||
#define PPC_REGNUM_CTR 68
|
||||
#define PPC_REGNUM_XER 69
|
||||
#define PPC_REGNUM_FPSCR 70
|
||||
#define PPC_REGNUM_VR0 71
|
||||
#define PPC_REGNUM_VR31 (PPC_REGNUM_VR0 + 31)
|
||||
|
||||
#define PPC_GDB_NREGS0 0
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#define PPC_GDB_NREGS4 5
|
||||
#define PPC_GDB_NREGS8 (64 + 4)
|
||||
#else
|
||||
#define PPC_GDB_NREGS4 (32 + 7 + 2)
|
||||
#define PPC_GDB_NREGS8 32
|
||||
#endif
|
||||
|
||||
#define PPC_GDB_NREGS16 32
|
||||
#endif
|
||||
|
||||
@ -61,9 +94,15 @@ gdb_cpu_regsz(int regnum)
|
||||
if (regnum == 71 || regnum >= 73)
|
||||
return (8);
|
||||
#else
|
||||
if (regnum >= 32 && regnum <= 63)
|
||||
#ifdef __powerpc64__
|
||||
if ((regnum >= PPC_REGNUM_R0 && regnum <= PPC_REGNUM_PS) ||
|
||||
regnum == PPC_REGNUM_LR || regnum == PPC_REGNUM_CTR)
|
||||
return (8);
|
||||
if (regnum >= 71 && regnum <= 102)
|
||||
#else
|
||||
if (regnum >= PPC_REGNUM_FR0 && regnum <= PPC_REGNUM_FR31)
|
||||
return (8);
|
||||
#endif
|
||||
if (regnum >= PPC_REGNUM_VR0 && regnum <= PPC_REGNUM_VR31)
|
||||
return (16);
|
||||
#endif
|
||||
return (4);
|
||||
|
@ -65,8 +65,10 @@ gdb_cpu_getreg(int regnum, size_t *regsz)
|
||||
|
||||
if (regnum == 1)
|
||||
return (&kdb_thrctx->pcb_sp);
|
||||
if (regnum >= 14 && regnum <= 31)
|
||||
return (kdb_thrctx->pcb_context + (regnum - 14));
|
||||
if (regnum == 2 && *regsz == 8)
|
||||
return (&kdb_thrctx->pcb_toc);
|
||||
if (regnum >= 12 && regnum <= 31)
|
||||
return (kdb_thrctx->pcb_context + (regnum - 12));
|
||||
if (regnum == 64)
|
||||
return (&kdb_thrctx->pcb_lr);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user