|
@@ -244,9 +244,6 @@ static int compute_signal(int tt)
|
|
|
void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
|
|
|
{
|
|
|
int reg;
|
|
|
- struct thread_info *ti = task_thread_info(p);
|
|
|
- unsigned long ksp = (unsigned long)ti + THREAD_SIZE - 32;
|
|
|
- struct pt_regs *regs = (struct pt_regs *)ksp - 1;
|
|
|
#if (KGDB_GDB_REG_SIZE == 32)
|
|
|
u32 *ptr = (u32 *)gdb_regs;
|
|
|
#else
|
|
@@ -254,25 +251,46 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
|
|
|
#endif
|
|
|
|
|
|
for (reg = 0; reg < 16; reg++)
|
|
|
- *(ptr++) = regs->regs[reg];
|
|
|
+ *(ptr++) = 0;
|
|
|
|
|
|
/* S0 - S7 */
|
|
|
- for (reg = 16; reg < 24; reg++)
|
|
|
- *(ptr++) = regs->regs[reg];
|
|
|
+ *(ptr++) = p->thread.reg16;
|
|
|
+ *(ptr++) = p->thread.reg17;
|
|
|
+ *(ptr++) = p->thread.reg18;
|
|
|
+ *(ptr++) = p->thread.reg19;
|
|
|
+ *(ptr++) = p->thread.reg20;
|
|
|
+ *(ptr++) = p->thread.reg21;
|
|
|
+ *(ptr++) = p->thread.reg22;
|
|
|
+ *(ptr++) = p->thread.reg23;
|
|
|
|
|
|
for (reg = 24; reg < 28; reg++)
|
|
|
*(ptr++) = 0;
|
|
|
|
|
|
/* GP, SP, FP, RA */
|
|
|
- for (reg = 28; reg < 32; reg++)
|
|
|
- *(ptr++) = regs->regs[reg];
|
|
|
-
|
|
|
- *(ptr++) = regs->cp0_status;
|
|
|
- *(ptr++) = regs->lo;
|
|
|
- *(ptr++) = regs->hi;
|
|
|
- *(ptr++) = regs->cp0_badvaddr;
|
|
|
- *(ptr++) = regs->cp0_cause;
|
|
|
- *(ptr++) = regs->cp0_epc;
|
|
|
+ *(ptr++) = (long)p;
|
|
|
+ *(ptr++) = p->thread.reg29;
|
|
|
+ *(ptr++) = p->thread.reg30;
|
|
|
+ *(ptr++) = p->thread.reg31;
|
|
|
+
|
|
|
+ *(ptr++) = p->thread.cp0_status;
|
|
|
+
|
|
|
+ /* lo, hi */
|
|
|
+ *(ptr++) = 0;
|
|
|
+ *(ptr++) = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * BadVAddr, Cause
|
|
|
+ * Ideally these would come from the last exception frame up the stack
|
|
|
+ * but that requires unwinding, otherwise we can't know much for sure.
|
|
|
+ */
|
|
|
+ *(ptr++) = 0;
|
|
|
+ *(ptr++) = 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * PC
|
|
|
+ * use return address (RA), i.e. the moment after return from resume()
|
|
|
+ */
|
|
|
+ *(ptr++) = p->thread.reg31;
|
|
|
}
|
|
|
|
|
|
void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
|