Make remote GDB work for AIM processors. For BookE, the kernel

will have a special section, named .PPC.EMB.apuinfo, which will
tell GDB that a BookE processor is targeted and which will
result in GDB using a different register definition. In order
to support remote GDB for BookE, we need the GDB stub in the
kernel look for that section and use the BookE definitions.
This commit is contained in:
Marcel Moolenaar 2008-03-17 00:46:52 +00:00
parent 29cc138cdf
commit 294800e52d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=177288
2 changed files with 27 additions and 43 deletions

View File

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

View File

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