1 INTERFACE [ppc32 && debug]:
3 #include "trap_state.h"
9 typedef void (*Dbg_extension_entry)(Thread *t, Entry_frame *r);
10 static Dbg_extension_entry dbg_extension[64];
12 static int call_nested_trap_handler(Trap_state *ts) asm ("call_nested_trap_handler");
13 static Trap_state::Handler nested_trap_handler FIASCO_FASTCALL;
16 //------------------------------------------------------------------------------
17 IMPLEMENTATION [ppc32 && debug]:
19 Thread::Dbg_extension_entry Thread::dbg_extension[64];
20 Trap_state::Handler Thread::nested_trap_handler FIASCO_FASTCALL;
22 extern "C" void sys_kdb_ke()
25 Thread *t = current_thread();
27 //arriving from outx function
28 unsigned *x = (unsigned *)t->regs()->ip();
29 if(t->regs()->r[29] == (Mword)-0x24 && t->regs()->r[2] & (1 << 31)) //ip && r3
32 unsigned func = (unsigned)t->regs()->r[1] & 0xffff; //r4
33 if(Thread::dbg_extension[func])
35 Thread::dbg_extension[func](t, t->regs());
40 char str[32] = "USER ENTRY";
41 //arriving from enter_kdebug
42 if (t->regs()->r[29] == (Mword)-0x24 && t->regs()->r[2] & (1 << 30)) //ip && r3
44 //t->mem_space()->copy_from_user(str, (char *)(x + 1), sizeof(str));
45 strncpy(str, (char *)(x + 1), sizeof(str));
46 str[sizeof(str)-1] = 0;
54 Thread::call_nested_trap_handler(Trap_state *ts)
56 unsigned phys_cpu = Proc::cpu_id();
57 unsigned log_cpu = Cpu::cpus.find_cpu(Cpu::By_phys_id(phys_cpu));
60 printf("Trap on unknown CPU phys_id=%x\n", phys_cpu);
64 unsigned long &ntr = nested_trap_recover.cpu(log_cpu);
69 stack = dbg_stack.cpu(log_cpu).stack_top;
73 register Mword _ts asm("3") = (Mword)ts;
74 register Mword _lcpu asm("r4") = log_cpu;
77 " mr %[origstack], %%r1 \n"
78 " lwz %[tmp], 0(%[ntr]) \n"
81 " mr %%r1, %[stack] \n"
84 " addi %[tmp], %[tmp], 1 \n"
85 " stw %[tmp], 0(%[ntr]) \n"
86 " subi %%r1, %%r1, 16 \n" //extent stack frame
87 " stw %[origstack], 16(%%r1) \n"
88 " stw %[ntr], 12(%%r1) \n"
89 " lis %[tmp], 2f@ha \n"
90 " addi %[tmp], %[tmp], 2f@l \n"
92 " mtctr %[handler] \n"
95 " lwz %[ntr], 12(%%r1) \n"
96 " lwz %%r1, 16(%%r1) \n"
97 " lwz %[tmp], 0(%[ntr]) \n"
98 " subi %[tmp], %[tmp], 1 \n"
99 " stw %[tmp], 0(%[ntr]) \n"
100 : [origstack] "=&r" (dummy1), [tmp] "=&r" (tmp),
101 "=r" (_ts), "=r" (_lcpu)
102 : [ntr] "r" (&ntr), [stack] "r" (stack),
103 [handler] "r" (*nested_trap_handler),
104 "2" (_ts), "3" (_lcpu)
111 IMPLEMENTATION [ppc32 && !debug]:
113 extern "C" void sys_kdb_ke()
116 extern "C" void enter_jdb()