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:
Leandro Lupori 2019-10-31 12:03:47 +00:00
parent d7271ace1d
commit a8a6278ea0
2 changed files with 45 additions and 4 deletions

View File

@ -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);

View File

@ -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);