1 IMPLEMENTATION [sparc]:
4 #include "kmem_alloc.h"
6 #include "mem_layout.h"
8 #include "static_init.h"
11 STATIC_INITIALIZE_P(Jdb, JDB_INIT_PRIO);
13 DEFINE_PER_CPU static Per_cpu<Proc::Status> jdb_irq_state;
15 // disable interrupts before entering the kernel debugger
18 Jdb::save_disable_irqs(Cpu_number cpu)
20 jdb_irq_state.cpu(cpu) = Proc::cli_save();
23 // restore interrupts after leaving the kernel debugger
26 Jdb::restore_irqs(Cpu_number cpu)
28 Proc::sti_restore(jdb_irq_state.cpu(cpu));
33 Jdb::enter_trap_handler(Cpu_number)
38 Jdb::leave_trap_handler(Cpu_number)
43 Jdb::handle_conditional_breakpoint(Cpu_number)
48 Jdb::handle_nested_trap(Jdb_entry_frame *e)
50 printf("Trap in JDB: IP:%08lx SRR1=%08lx\n",
56 Jdb::handle_debug_traps(Cpu_number cpu)
58 Jdb_entry_frame *ef = entry_frame.cpu(cpu);
59 snprintf(error_buffer.cpu(cpu), sizeof(error_buffer.cpu(Cpu_number::first())), "%s",
60 (char const *)ef->r[2]);
67 Jdb::handle_user_request(Cpu_number cpu)
69 Jdb_entry_frame *ef = Jdb::entry_frame.cpu(cpu);
70 const char *str = (char const *)ef->r[2];
71 Space * task = get_task(cpu);
74 if (!peek(str, task, tmp) || tmp != '*')
76 if (!peek(str+1, task, tmp) || tmp != '#')
79 return execute_command_ni(task, str+2);
89 Jdb::handle_special_cmds(int)
93 FIASCO_INIT FIASCO_NOINLINE void
96 static Jdb_handler enter(at_jdb_enter);
97 static Jdb_handler leave(at_jdb_leave);
99 Jdb::jdb_enter.add(&enter);
100 Jdb::jdb_leave.add(&leave);
102 Thread::nested_trap_handler = (Trap_state::Handler)enter_jdb;
103 Kconsole::console()->register_console(push_cons());
109 Jdb::access_mem_task(Address virt, Space * task)
119 if (Mem_layout::in_kernel(virt))
121 phys = Kmem::virt_to_phys((void *)virt);
122 if (phys == (Address)-1)
131 phys = Address(task->virt_to_phys(virt));
133 if(phys = (Address)-1)
134 phys = task->virt_to_phys_s0((void *)virt);
136 if (phys == (Address)-1)
145 Jdb::translate_task(Address addr, Space * task)
148 // return (Kmem::is_kmem_page_fault(addr, 0)) ? 0 : task;
155 Jdb::peek_task(Address virt, Space * task, void *value, int width)
158 void const *mem = access_mem_task(virt, task);
166 Mword dealign = (virt & 0x3) * 8;
167 *(Mword*)value = (*(Mword*)mem & (0xff << dealign)) >> dealign;
172 Mword dealign = ((virt & 0x2) >> 1) * 16;
173 *(Mword*)value = (*(Mword*)mem & (0xffff << dealign)) >> dealign;
177 memcpy(value, mem, width);
185 Jdb::is_adapter_memory(Address, Space *)
192 Jdb::poke_task(Address virt, Space * task, void const *val, int width)
194 (void)virt; (void)task; (void)val; (void)width;
196 void *mem = access_mem_task(virt, task);
200 memcpy(mem, val, width);*/
209 // Mem_unit::clean_vdcache();
216 // Mem_unit::flush_vcache();
231 Jdb::write_tsc_s(Signed64 /*tsc*/, char * /*buf*/, int /*maxlen*/, bool /*sign*/)
236 Jdb::write_tsc(Signed64 /*tsc*/, char * /*buf*/, int /*maxlen*/, bool /*sign*/)
239 PROTECTED static inline
240 template< typename T >
242 Jdb::set_monitored_address(T *dest, T val)