]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/arm/jdb-arm.cpp
update
[l4.git] / kernel / fiasco / src / jdb / arm / jdb-arm.cpp
1 IMPLEMENTATION [arm]:
2
3 #include "globals.h"
4 #include "kernel_task.h"
5 #include "kmem_alloc.h"
6 #include "kmem_space.h"
7 #include "space.h"
8 #include "mem_layout.h"
9 #include "mem_unit.h"
10 #include "static_init.h"
11
12
13 STATIC_INITIALIZE_P(Jdb, JDB_INIT_PRIO);
14
15 static Per_cpu<Proc::Status> DEFINE_PER_CPU jdb_irq_state;
16
17 // disable interrupts before entering the kernel debugger
18 IMPLEMENT
19 void
20 Jdb::save_disable_irqs(unsigned cpu)
21 {
22   jdb_irq_state.cpu(cpu) = Proc::cli_save();
23 }
24
25 // restore interrupts after leaving the kernel debugger
26 IMPLEMENT
27 void
28 Jdb::restore_irqs(unsigned cpu)
29 {
30   Proc::sti_restore(jdb_irq_state.cpu(cpu));
31 }
32
33 IMPLEMENT inline
34 void
35 Jdb::enter_trap_handler(unsigned /*cpu*/)
36 {}
37
38 IMPLEMENT inline
39 void
40 Jdb::leave_trap_handler(unsigned /*cpu*/)
41 {}
42
43 PROTECTED static inline
44 void
45 Jdb::monitor_address(unsigned, void *)
46 {}
47
48 IMPLEMENT inline
49 bool
50 Jdb::handle_conditional_breakpoint(unsigned /*cpu*/)
51 { return false; }
52
53 IMPLEMENT
54 void
55 Jdb::handle_nested_trap(Jdb_entry_frame *e)
56 {
57   printf("Trap in JDB: IP:%08lx PSR=%08lx ERR=%08lx\n",
58          e->ip(), e->psr, e->error_code);
59 }
60
61 IMPLEMENT
62 bool
63 Jdb::handle_debug_traps(unsigned cpu)
64 {
65   Jdb_entry_frame *ef = entry_frame.cpu(cpu);
66
67   if (ef->error_code == 0x00e00000)
68     snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(0)), "%s",
69              (char const *)ef->r[0]);
70   else if (ef->error_code == 0x00f00000)
71     snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(0)),
72              "IPI ENTRY");
73
74   return true;
75 }
76
77 IMPLEMENT inline
78 bool
79 Jdb::handle_user_request(unsigned cpu)
80 {
81   Jdb_entry_frame *ef = Jdb::entry_frame.cpu(cpu);
82   const char *str = (char const *)ef->r[0];
83   Space * task = get_task(cpu);
84   char tmp;
85
86   if (!peek(str, task, tmp) || tmp != '*')
87     return false;
88   if (!peek(str+1, task, tmp) || tmp != '#')
89     return false;
90
91   return execute_command_ni(task, str+2);
92 }
93
94 IMPLEMENT inline
95 bool
96 Jdb::test_checksums()
97 { return true; }
98
99 static
100 bool
101 Jdb::handle_special_cmds(int)
102 { return 1; }
103
104 PUBLIC static
105 FIASCO_INIT FIASCO_NOINLINE void
106 Jdb::init()
107 {
108   static Jdb_handler enter(at_jdb_enter);
109   static Jdb_handler leave(at_jdb_leave);
110
111   Jdb::jdb_enter.add(&enter);
112   Jdb::jdb_leave.add(&leave);
113
114   Thread::nested_trap_handler = (Trap_state::Handler)enter_jdb;
115
116   Kconsole::console()->register_console(push_cons());
117 }
118
119
120 PRIVATE static
121 void *
122 Jdb::access_mem_task(Address virt, Space * task)
123 {
124   // align
125   virt &= ~0x03;
126
127   Address phys;
128
129   if (!task)
130     {
131       if (Mem_layout::in_kernel(virt))
132         {
133           Pte p = Kmem_space::kdir()->walk((void *)virt, 0, false,0);
134           if (!p.valid())
135             return 0;
136
137           phys = p.phys((void*)virt);
138         }
139       else
140         phys = virt;
141     }
142   else
143     {
144       phys = Address(task->mem_space()->virt_to_phys(virt));
145
146
147       if (phys == (Address)-1)
148         phys = task->mem_space()->virt_to_phys_s0((void *)virt);
149
150       if (phys == (Address)-1)
151         return 0;
152     }
153
154   unsigned long addr = Mem_layout::phys_to_pmem(phys);
155   if (addr == (Address)-1)
156     {
157       Mem_unit::flush_vdcache();
158       Pte pte = Kernel_task::kernel_task()->mem_space()->_dir->walk
159         ((void*)Mem_layout::Jdb_tmp_map_area, 0, false, 0);
160
161       if (pte.phys() != (phys & ~(Config::SUPERPAGE_SIZE - 1)))
162         pte.set(phys & ~(Config::SUPERPAGE_SIZE - 1), Config::SUPERPAGE_SIZE,
163                 Mem_page_attr(Page::KERN_RW | Page::CACHEABLE), true);
164
165       Mem_unit::dtlb_flush();
166
167       addr = Mem_layout::Jdb_tmp_map_area + (phys & (Config::SUPERPAGE_SIZE - 1));
168     }
169
170   return (Mword*)addr;
171 }
172
173 PUBLIC static
174 Space *
175 Jdb::translate_task(Address addr, Space * task)
176 {
177   return (Kmem::is_kmem_page_fault(addr, 0)) ? 0 : task;
178 }
179
180 PUBLIC static
181 int
182 Jdb::peek_task(Address virt, Space * task, void *value, int width)
183 {
184   void const *mem = access_mem_task(virt, task);
185   if (!mem)
186     return -1;
187
188   switch (width)
189     {
190     case 1:
191         {
192           Mword dealign = (virt & 0x3) * 8;
193           *(Mword*)value = (*(Mword*)mem & (0xff << dealign)) >> dealign;
194         }
195         break;
196     case 2:
197         {
198           Mword dealign = ((virt & 0x2) >> 1) * 16;
199           *(Mword*)value = (*(Mword*)mem & (0xffff << dealign)) >> dealign;
200         }
201         break;
202     case 4:
203       memcpy(value, mem, width);
204     }
205
206   return 0;
207 }
208
209 PUBLIC static
210 int
211 Jdb::is_adapter_memory(Address, Space *)
212 {
213   return 0;
214 }
215
216 PUBLIC static
217 int
218 Jdb::poke_task(Address virt, Space * task, void const *val, int width)
219 {
220   void *mem = access_mem_task(virt, task);
221   if (!mem)
222     return -1;
223
224   memcpy(mem, val, width);
225   return 0;
226 }
227
228
229 PRIVATE static
230 void
231 Jdb::at_jdb_enter()
232 {
233   Mem_unit::clean_vdcache();
234 }
235
236 PRIVATE static
237 void
238 Jdb::at_jdb_leave()
239 {
240   Mem_unit::flush_vcache();
241 }
242
243 PUBLIC static inline
244 void
245 Jdb::enter_getchar()
246 {}
247
248 PUBLIC static inline
249 void
250 Jdb::leave_getchar()
251 {}
252
253 PUBLIC static
254 void
255 Jdb::write_tsc_s(Signed64 tsc, char *buf, int maxlen, bool sign)
256 {
257   if (sign)
258     {
259       *buf++ = (tsc < 0) ? '-' : (tsc == 0) ? ' ' : '+';
260       maxlen--;
261     }
262   snprintf(buf, maxlen, "%lld c", tsc);
263 }
264
265 PUBLIC static
266 void
267 Jdb::write_tsc(Signed64 tsc, char *buf, int maxlen, bool sign)
268 {
269   write_tsc_s(tsc, buf, maxlen, sign);
270 }
271
272 //----------------------------------------------------------------------------
273 IMPLEMENTATION [arm && mp]:
274
275 #include <cstdio>
276
277 static
278 void
279 Jdb::send_nmi(unsigned /*cpu*/)
280 {
281   printf("NMI, what's that?\n");
282 }
283