diff --git a/sys/powerpc/include/gdb_machdep.h b/sys/powerpc/include/gdb_machdep.h index e8c5055fdf5..7e36e974f6f 100644 --- a/sys/powerpc/include/gdb_machdep.h +++ b/sys/powerpc/include/gdb_machdep.h @@ -29,20 +29,32 @@ #ifndef _MACHINE_GDB_MACHDEP_H_ #define _MACHINE_GDB_MACHDEP_H_ -#define GDB_NREGS 153 +#define PPC_GDB_NREGS4 (32 + 7 + 2) +#define PPC_GDB_NREGS8 32 +#define PPC_GDB_NREGS16 32 + +#define GDB_NREGS (PPC_GDB_NREGS4 + PPC_GDB_NREGS8 + PPC_GDB_NREGS16) #define GDB_REG_PC 64 -#define GDB_BUFSZ (GDB_NREGS*4) +#define GDB_BUFSZ (PPC_GDB_NREGS4 * 8 + \ + PPC_GDB_NREGS8 * 16 + \ + PPC_GDB_NREGS16 * 32) static __inline size_t gdb_cpu_regsz(int regnum) { - return (sizeof(int)); + + if (regnum >= 32 && regnum <= 63) + return (8); + if (regnum >= 71 && regnum <= 102) + return (16); + return (4); } static __inline int gdb_cpu_query(void) { + return (0); } diff --git a/sys/powerpc/powerpc/gdb_machdep.c b/sys/powerpc/powerpc/gdb_machdep.c index a29ff5d2cae..ebe1250eade 100644 --- a/sys/powerpc/powerpc/gdb_machdep.c +++ b/sys/powerpc/powerpc/gdb_machdep.c @@ -53,48 +53,20 @@ gdb_cpu_getreg(int regnum, size_t *regsz) *regsz = gdb_cpu_regsz(regnum); if (kdb_thread == curthread) { - switch (regnum) { - case 0: return (&kdb_frame->fixreg[0]); - case 2: return (&kdb_frame->fixreg[2]); - case 3: return (&kdb_frame->fixreg[3]); - case 4: return (&kdb_frame->fixreg[4]); - case 5: return (&kdb_frame->fixreg[5]); - case 6: return (&kdb_frame->fixreg[6]); - case 7: return (&kdb_frame->fixreg[7]); - case 8: return (&kdb_frame->fixreg[8]); - case 9: return (&kdb_frame->fixreg[9]); - case 10: return (&kdb_frame->fixreg[10]); - case 11: return (&kdb_frame->fixreg[11]); - case 12: return (&kdb_frame->fixreg[12]); - case 13: return (&kdb_frame->fixreg[13]); - case 64: return (&kdb_frame->srr0); - case 67: return (&kdb_frame->lr); - - } + if (regnum == 0 || (regnum >= 2 && regnum <= 31)) + return (kdb_frame->fixreg + regnum); + if (regnum == 64) + return (&kdb_frame->srr0); + if (regnum == 67) + return (&kdb_frame->lr); } - switch (regnum) { - case 1: return (&kdb_thrctx->pcb_sp); - case 14: return (&kdb_thrctx->pcb_context[0]); - case 15: return (&kdb_thrctx->pcb_context[1]); - case 16: return (&kdb_thrctx->pcb_context[2]); - case 17: return (&kdb_thrctx->pcb_context[3]); - case 18: return (&kdb_thrctx->pcb_context[4]); - case 19: return (&kdb_thrctx->pcb_context[5]); - case 20: return (&kdb_thrctx->pcb_context[6]); - case 21: return (&kdb_thrctx->pcb_context[7]); - case 22: return (&kdb_thrctx->pcb_context[8]); - case 23: return (&kdb_thrctx->pcb_context[9]); - case 24: return (&kdb_thrctx->pcb_context[10]); - case 25: return (&kdb_thrctx->pcb_context[11]); - case 26: return (&kdb_thrctx->pcb_context[12]); - case 27: return (&kdb_thrctx->pcb_context[13]); - case 28: return (&kdb_thrctx->pcb_context[14]); - case 29: return (&kdb_thrctx->pcb_context[15]); - case 30: return (&kdb_thrctx->pcb_context[16]); - case 31: return (&kdb_thrctx->pcb_context[17]); - case 64: return (&kdb_thrctx->pcb_lr); - } + if (regnum == 1) + return (&kdb_thrctx->pcb_sp); + if (regnum >= 14 && regnum <= 31) + return (kdb_thrctx->pcb_context + (regnum - 14)); + if (regnum == 64) + return (&kdb_thrctx->pcb_lr); return (NULL); }