1 IMPLEMENTATION[ia32,amd64,ux]:
3 #include "jdb_dbinfo.h"
5 #include "jdb_symbol.h"
11 * Handle int3 extensions in the current thread's context. All functions
12 * for which we don't need/want to switch to the debugging stack.
13 * \return 0 if this function should be handled in the context of Jdb
14 * 1 successfully handled
18 Jdb::handle_int3_threadctx_generic(Trap_state *ts)
20 Thread *t = current_thread();
21 Mem_space *s = t->mem_space();
23 //Obj_space *os = t->space()->obj_space();
24 Address ip = ts->ip();
30 Jdb_entry_frame *jef = reinterpret_cast<Jdb_entry_frame*>(ts);
31 user = jef->from_user();
32 todo = s->peek((Unsigned8*)ip, user);
36 case 0xeb: // jmp == enter_kdebug()
37 len = s->peek((Unsigned8*)(ip+1), user);
38 str = (Unsigned8*)(ip + 2);
40 if ((len > 0) && s->peek(str, user) == '*')
47 if ((len > 0) && s->peek(str, user) == '#')
48 // special: enter_kdebug("*#...")
51 if (s->peek(str, user) == '+')
53 // special: enter_kdebug("*+...") => extended log msg
56 Tb_entry_ke_reg *tb = Jdb_tbuf::new_entry<Tb_entry_ke_reg>();
58 tb->v[0] = ts->value();
59 tb->v[1] = ts->value2();
60 tb->v[2] = ts->value3();
62 tb->msg.set_buf(i, s->peek(str++, user));
63 tb->msg.term_buf(len);
67 // special: enter_kdebug("*...") => log entry
69 Tb_entry_ke *tb = Jdb_tbuf::new_entry<Tb_entry_ke>();
72 tb->msg.set_buf(i, s->peek(str++, user));
73 tb->msg.term_buf(len);
75 Jdb_tbuf::commit_entry();
80 case 0x90: // nop == l4kd_display()
81 if ( s->peek((Unsigned8*)(ip+1), user) != 0xeb /*jmp*/
82 || (len = s->peek((Unsigned8*)(ip+2), user)) <= 0)
84 str = (Unsigned8*)(ip + 3);
86 putchar(s->peek(str++, user));
91 todo = s->peek((Unsigned8*)(ip+1), user);
92 Jdb_output_frame *regs = reinterpret_cast<Jdb_output_frame*>(ts);
95 case 0: // l4kd_outchar
96 putchar(regs->value() & 0xff);
98 case 1: // l4kd_outnstring
101 for(; len > 0; len--)
102 putchar(s->peek(str++, user));
104 case 2: // l4kd_outstr
106 for (; (c=s->peek(str++, user)); )
109 case 5: // l4kd_outhex32
110 printf("%08lx", regs->value() & 0xffffffff);
112 case 6: // l4kd_outhex20
113 printf("%05lx", regs->value() & 0xfffff);
115 case 7: // l4kd_outhex16
116 printf("%04lx", regs->value() & 0xffff);
118 case 8: // L4kd_outhex12
119 printf("%03lx", regs->value() & 0xfff);
121 case 9: // l4kd_outhex8
122 printf("%02lx", regs->value() & 0xff);
124 case 11: // l4kd_outdec
125 printf("%lu", regs->value());
127 case 13: // l4kd_inchar
130 switch (jef->param())
132 case 0: // fiasco_tbuf_get_status()
134 Jdb_status_page_frame *regs =
135 reinterpret_cast<Jdb_status_page_frame*>(ts);
136 regs->set(Mem_layout::Tbuf_ustatus_page);
139 case 1: // fiasco_tbuf_log()
141 // interrupts are disabled in handle_slow_trap()
142 Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(ts);
144 static_cast<Tb_entry_ke*>(Jdb_tbuf::new_entry());
147 for (len=0; (c = s->peek(str++, user)); len++)
148 tb->msg.set_buf(len, c);
149 tb->msg.term_buf(len);
150 regs->set_tb_entry(tb);
151 Jdb_tbuf::commit_entry();
154 case 2: // fiasco_tbuf_clear()
155 Jdb_tbuf::clear_tbuf();
157 case 3: // fiasco_tbuf_dump()
159 case 4: // fiasco_tbuf_log_3val()
161 // interrupts are disabled in handle_slow_trap()
162 Jdb_log_3val_frame *regs =
163 reinterpret_cast<Jdb_log_3val_frame*>(ts);
164 Tb_entry_ke_reg *tb = Jdb_tbuf::new_entry<Tb_entry_ke_reg>();
167 tb->v[0] = regs->val1();
168 tb->v[1] = regs->val2();
169 tb->v[2] = regs->val3();
170 for (len=0; (c = s->peek(str++, user)); len++)
171 tb->msg.set_buf(len, c);
172 tb->msg.term_buf(len);
173 regs->set_tb_entry(tb);
174 Jdb_tbuf::commit_entry();
177 case 5: // fiasco_tbuf_get_status_phys()
179 Jdb_status_page_frame *regs =
180 reinterpret_cast<Jdb_status_page_frame*>(ts);
181 regs->set(s->virt_to_phys(Mem_layout::Tbuf_ustatus_page));
184 case 6: // fiasco_timer_disable
185 // XXX: no longer do Timer_tick::disable(0);
187 case 7: // fiasco_timer_enable
188 // XXX: no longer do Timer_tick::enable(0);
190 case 8: // fiasco_tbuf_log_binary()
191 // interrupts are disabled in handle_slow_trap()
192 Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(ts);
193 Tb_entry_ke_bin *tb =
194 static_cast<Tb_entry_ke_bin*>(Jdb_tbuf::new_entry());
197 for (len=0; len < Tb_entry_ke_bin::SIZE; len++)
198 tb->set_buf(len, s->peek(str++, user));
199 regs->set_tb_entry(tb);
200 Jdb_tbuf::commit_entry();
206 switch (ts->value2())
208 case 1: // fiasco_register_symbols
210 Jdb_symbols_frame *regs =
211 reinterpret_cast<Jdb_symbols_frame*>(ts);
212 Jdb_dbinfo::set(Jdb_symbol::lookup(cxx::dyn_cast<Task*>(os->lookup(regs->task()))),
213 regs->addr(), regs->size());
216 case 2: // fiasco_register_lines
218 Jdb_lines_frame *regs =
219 reinterpret_cast<Jdb_lines_frame*>(ts);
220 Jdb_dbinfo::set(Jdb_lines::lookup(regs->task()),
221 regs->addr(), regs->size());