4 #include "kernel_task.h"
5 #include "kmem_alloc.h"
6 #include "kmem_space.h"
8 #include "mem_layout.h"
10 #include "static_init.h"
13 STATIC_INITIALIZE_P(Jdb, JDB_INIT_PRIO);
15 DEFINE_PER_CPU static Per_cpu<Proc::Status> jdb_irq_state;
17 // disable interrupts before entering the kernel debugger
20 Jdb::save_disable_irqs(unsigned cpu)
22 jdb_irq_state.cpu(cpu) = Proc::cli_save();
27 // restore interrupts after leaving the kernel debugger
30 Jdb::restore_irqs(unsigned cpu)
34 Proc::sti_restore(jdb_irq_state.cpu(cpu));
39 Jdb::enter_trap_handler(unsigned /*cpu*/)
44 Jdb::leave_trap_handler(unsigned /*cpu*/)
47 PROTECTED static inline
49 Jdb::monitor_address(unsigned, void *)
54 Jdb::handle_conditional_breakpoint(unsigned /*cpu*/)
59 Jdb::handle_nested_trap(Jdb_entry_frame *e)
61 printf("Trap in JDB: IP:%08lx PSR=%08lx ERR=%08lx\n",
62 e->ip(), e->psr, e->error_code);
67 Jdb::handle_debug_traps(unsigned cpu)
69 Jdb_entry_frame *ef = entry_frame.cpu(cpu);
71 if (ef->error_code == 0x00e00000)
72 snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(0)), "%s",
73 (char const *)ef->r[0]);
74 else if (ef->debug_ipi())
75 snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(0)),
83 Jdb::handle_user_request(unsigned cpu)
85 Jdb_entry_frame *ef = Jdb::entry_frame.cpu(cpu);
86 const char *str = (char const *)ef->r[0];
87 Space * task = get_task(cpu);
93 if (ef->error_code == 0x00e00001)
94 return execute_command_ni(task, str);
96 if (!peek(str, task, tmp) || tmp != '*')
98 if (!peek(str+1, task, tmp) || tmp != '#')
101 return execute_command_ni(task, str+2);
106 Jdb::test_checksums()
111 Jdb::handle_special_cmds(int)
115 FIASCO_INIT FIASCO_NOINLINE void
118 static Jdb_handler enter(at_jdb_enter);
119 static Jdb_handler leave(at_jdb_leave);
121 Jdb::jdb_enter.add(&enter);
122 Jdb::jdb_leave.add(&leave);
124 Thread::nested_trap_handler = (Trap_state::Handler)enter_jdb;
126 Kconsole::console()->register_console(push_cons());
132 Jdb::access_mem_task(Address virt, Space * task)
141 if (Mem_layout::in_kernel(virt))
143 Pte p = Kmem_space::kdir()->walk((void *)virt, 0, false, Ptab::Null_alloc(), 0);
147 phys = p.phys((void*)virt);
154 phys = Address(task->virt_to_phys(virt));
157 if (phys == (Address)-1)
158 phys = task->virt_to_phys_s0((void *)virt);
160 if (phys == (Address)-1)
164 unsigned long addr = Mem_layout::phys_to_pmem(phys);
165 if (addr == (Address)-1)
167 Mem_unit::flush_vdcache();
168 Pte pte = static_cast<Mem_space*>(Kernel_task::kernel_task())
169 ->_dir->walk((void*)Mem_layout::Jdb_tmp_map_area, 0, false, Ptab::Null_alloc(), 0);
171 if (pte.phys() != (phys & ~(Config::SUPERPAGE_SIZE - 1)))
172 pte.set(phys & ~(Config::SUPERPAGE_SIZE - 1), Config::SUPERPAGE_SIZE,
173 Mem_page_attr(Page::KERN_RW | Page::CACHEABLE), true);
175 Mem_unit::dtlb_flush();
177 addr = Mem_layout::Jdb_tmp_map_area + (phys & (Config::SUPERPAGE_SIZE - 1));
185 Jdb::translate_task(Address addr, Space * task)
187 return (Kmem::is_kmem_page_fault(addr, 0)) ? 0 : task;
192 Jdb::peek_task(Address virt, Space * task, void *value, int width)
194 void const *mem = access_mem_task(virt, task);
202 Mword dealign = (virt & 0x3) * 8;
203 *(Mword*)value = (*(Mword*)mem & (0xff << dealign)) >> dealign;
208 Mword dealign = ((virt & 0x2) >> 1) * 16;
209 *(Mword*)value = (*(Mword*)mem & (0xffff << dealign)) >> dealign;
213 memcpy(value, mem, width);
221 Jdb::is_adapter_memory(Address, Space *)
228 Jdb::poke_task(Address virt, Space * task, void const *val, int width)
230 void *mem = access_mem_task(virt, task);
234 memcpy(mem, val, width);
243 Mem_unit::clean_vdcache();
250 Mem_unit::flush_vcache();
265 Jdb::write_tsc_s(Signed64 tsc, char *buf, int maxlen, bool sign)
269 *buf++ = (tsc < 0) ? '-' : (tsc == 0) ? ' ' : '+';
272 snprintf(buf, maxlen, "%lld c", tsc);
277 Jdb::write_tsc(Signed64 tsc, char *buf, int maxlen, bool sign)
279 write_tsc_s(tsc, buf, maxlen, sign);
282 //----------------------------------------------------------------------------
283 IMPLEMENTATION [arm && !mp]:
285 PROTECTED static inline
286 template< typename T >
288 Jdb::set_monitored_address(T *dest, T val)
291 //----------------------------------------------------------------------------
292 IMPLEMENTATION [arm && mp]:
298 Jdb::send_nmi(unsigned cpu)
300 printf("NMI to %d, what's that?\n", cpu);
303 PROTECTED static inline
304 template< typename T >
306 Jdb::set_monitored_address(T *dest, T val)
313 PROTECTED static inline
314 template< typename T >
315 T Jdb::monitor_address(unsigned, T volatile *addr)