]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ppc32/thread-jdb.cpp
482095d034f62bc1b797cf328552a8343a642f2b
[l4.git] / kernel / fiasco / src / kern / ppc32 / thread-jdb.cpp
1 INTERFACE [ppc32 && debug]:
2
3 #include "trap_state.h"
4 #include "util.h"
5
6 EXTENSION class Thread
7 {
8 public:
9   typedef void (*Dbg_extension_entry)(Thread *t, Entry_frame *r);
10   static Dbg_extension_entry dbg_extension[64];
11 private:
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;
14 };
15
16 //------------------------------------------------------------------------------
17 IMPLEMENTATION [ppc32 && debug]:
18
19 Thread::Dbg_extension_entry Thread::dbg_extension[64];
20 Trap_state::Handler Thread::nested_trap_handler FIASCO_FASTCALL;
21
22 extern "C" void sys_kdb_ke()
23 {
24   cpu_lock.lock();
25   Thread *t = current_thread();
26
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
30     {
31       NOT_IMPL_PANIC;
32       unsigned func = (unsigned)t->regs()->r[1] & 0xffff; //r4
33       if(Thread::dbg_extension[func])
34         {
35           Thread::dbg_extension[func](t, t->regs());
36           return;
37         }
38     }
39
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
43     {
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;
47     }
48
49   kdb_ke(str);
50 }
51
52 IMPLEMENT
53 int
54 Thread::call_nested_trap_handler(Trap_state *ts)
55 {
56   unsigned phys_cpu = Proc::cpu_id();
57   unsigned log_cpu = Cpu::cpus.find_cpu(Cpu::By_phys_id(phys_cpu));
58   if (log_cpu == ~0U)
59     {
60       printf("Trap on unknown CPU phys_id=%x\n", phys_cpu);
61       log_cpu = 0;
62     }
63
64   unsigned long &ntr = nested_trap_recover.cpu(log_cpu);
65
66   void *stack = 0;
67
68   if (!ntr)
69     stack = dbg_stack.cpu(log_cpu).stack_top;
70
71   Mword dummy1, tmp;
72   {
73     register Mword _ts asm("3") = (Mword)ts;
74     register Mword _lcpu asm("r4") = log_cpu;
75
76     asm volatile(
77         " mr    %[origstack], %%r1        \n"
78         " lwz   %[tmp], 0(%[ntr])         \n"
79         " cmpwi %[tmp], 0                 \n"
80         " bne 1f                          \n"
81         " mr %%r1, %[stack]               \n"
82         "1:                               \n"
83         " mtsprg1 %%r1                    \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"
91         " mtlr  %[tmp]                    \n"
92         " mtctr %[handler]                \n"
93         " bctr                            \n"
94         "2:                               \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)
105         : "memory");
106
107     return _ts;
108   }
109 }
110
111 IMPLEMENTATION [ppc32 && !debug]:
112
113 extern "C" void sys_kdb_ke()
114 {
115 }
116 extern "C" void enter_jdb()
117 {}