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"
12 #include "cxx/cxx_int"
14 STATIC_INITIALIZE_P(Jdb, JDB_INIT_PRIO);
16 DEFINE_PER_CPU static Per_cpu<Proc::Status> jdb_irq_state;
18 // disable interrupts before entering the kernel debugger
21 Jdb::save_disable_irqs(Cpu_number cpu)
23 jdb_irq_state.cpu(cpu) = Proc::cli_save();
24 if (cpu == Cpu_number::boot_cpu())
28 // restore interrupts after leaving the kernel debugger
31 Jdb::restore_irqs(Cpu_number cpu)
33 if (cpu == Cpu_number::boot_cpu())
35 Proc::sti_restore(jdb_irq_state.cpu(cpu));
40 Jdb::enter_trap_handler(Cpu_number)
45 Jdb::leave_trap_handler(Cpu_number)
48 PROTECTED static inline
50 Jdb::monitor_address(Cpu_number, void *)
55 Jdb::handle_conditional_breakpoint(Cpu_number)
60 Jdb::handle_nested_trap(Jdb_entry_frame *e)
62 printf("Trap in JDB: IP:%08lx PSR=%08lx ERR=%08lx\n",
63 e->ip(), e->psr, e->error_code);
68 Jdb::handle_debug_traps(Cpu_number cpu)
70 Jdb_entry_frame *ef = entry_frame.cpu(cpu);
72 if (ef->error_code == 0x00e00000)
73 snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(Cpu_number::first())), "%s",
74 (char const *)ef->r[0]);
75 else if (ef->debug_ipi())
76 snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(Cpu_number::first())),
84 Jdb::handle_user_request(Cpu_number cpu)
86 Jdb_entry_frame *ef = Jdb::entry_frame.cpu(cpu);
87 const char *str = (char const *)ef->r[0];
88 Space * task = get_task(cpu);
92 return cpu != Cpu_number::boot_cpu();
94 if (ef->error_code == 0x00e00001)
95 return execute_command_ni(task, str);
97 if (!peek(str, task, tmp) || tmp != '*')
99 if (!peek(str+1, task, tmp) || tmp != '#')
102 return execute_command_ni(task, str+2);
107 Jdb::test_checksums()
112 Jdb::handle_special_cmds(int)
116 FIASCO_INIT FIASCO_NOINLINE void
119 static Jdb_handler enter(at_jdb_enter);
120 static Jdb_handler leave(at_jdb_leave);
122 Jdb::jdb_enter.add(&enter);
123 Jdb::jdb_leave.add(&leave);
125 Thread::nested_trap_handler = (Trap_state::Handler)enter_jdb;
127 Kconsole::console()->register_console(push_cons());
133 Jdb::access_mem_task(Address virt, Space * task)
142 if (Mem_layout::in_kernel(virt))
144 auto p = Kmem_space::kdir()->walk(Virt_addr(virt));
148 phys = p.page_addr() | cxx::get_lsb(virt, p.page_order());
155 phys = Address(task->virt_to_phys(virt));
158 if (phys == (Address)-1)
159 phys = task->virt_to_phys_s0((void *)virt);
161 if (phys == (Address)-1)
165 unsigned long addr = Mem_layout::phys_to_pmem(phys);
166 if (addr == (Address)-1)
168 Mem_unit::flush_vdcache();
169 auto pte = static_cast<Mem_space*>(Kernel_task::kernel_task())
170 ->_dir->walk(Virt_addr(Mem_layout::Jdb_tmp_map_area), Pdir::Super_level);
172 if (!pte.is_valid() || pte.page_addr() != cxx::mask_lsb(phys, pte.page_order()))
174 pte.create_page(Phys_mem_addr(cxx::mask_lsb(phys, pte.page_order())),
175 Page::Attr(Page::Rights::RW()));
176 pte.write_back_if(true);
179 Mem_unit::tlb_flush();
181 addr = Mem_layout::Jdb_tmp_map_area + (phys & (Config::SUPERPAGE_SIZE - 1));
189 Jdb::translate_task(Address addr, Space * task)
191 return (Kmem::is_kmem_page_fault(addr, 0)) ? 0 : task;
196 Jdb::peek_task(Address virt, Space * task, void *value, int width)
198 void const *mem = access_mem_task(virt, task);
206 Mword dealign = (virt & 0x3) * 8;
207 *(Mword*)value = (*(Mword*)mem & (0xff << dealign)) >> dealign;
212 Mword dealign = ((virt & 0x2) >> 1) * 16;
213 *(Mword*)value = (*(Mword*)mem & (0xffff << dealign)) >> dealign;
217 memcpy(value, mem, width);
225 Jdb::is_adapter_memory(Address, Space *)
232 Jdb::poke_task(Address virt, Space * task, void const *val, int width)
234 void *mem = access_mem_task(virt, task);
238 memcpy(mem, val, width);
247 Mem_unit::clean_vdcache();
254 Mem_unit::flush_vcache();
269 Jdb::write_tsc_s(Signed64 tsc, char *buf, int maxlen, bool sign)
273 *buf++ = (tsc < 0) ? '-' : (tsc == 0) ? ' ' : '+';
276 snprintf(buf, maxlen, "%lld c", tsc);
281 Jdb::write_tsc(Signed64 tsc, char *buf, int maxlen, bool sign)
283 write_tsc_s(tsc, buf, maxlen, sign);
286 //----------------------------------------------------------------------------
287 IMPLEMENTATION [arm && !mp]:
289 PROTECTED static inline
290 template< typename T >
292 Jdb::set_monitored_address(T *dest, T val)
295 //----------------------------------------------------------------------------
296 IMPLEMENTATION [arm && mp]:
302 Jdb::send_nmi(Cpu_number cpu)
304 printf("NMI to %d, what's that?\n",
305 cxx::int_value<Cpu_number>(cpu));
308 PROTECTED static inline
309 template< typename T >
311 Jdb::set_monitored_address(T *dest, T val)
318 PROTECTED static inline
319 template< typename T >
320 T Jdb::monitor_address(Cpu_number, T volatile *addr)