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
57 static_cast<Tb_entry_ke_reg*>(Jdb_tbuf::new_entry());
60 tb->set_buf(i, s->peek(str++, user));
65 // special: enter_kdebug("*...") => log entry
68 static_cast<Tb_entry_ke*>(Jdb_tbuf::new_entry());
71 tb->set_buf(i, s->peek(str++, user));
74 Jdb_tbuf::commit_entry();
79 case 0x90: // nop == l4kd_display()
80 if ( s->peek((Unsigned8*)(ip+1), user) != 0xeb /*jmp*/
81 || (len = s->peek((Unsigned8*)(ip+2), user)) <= 0)
83 str = (Unsigned8*)(ip + 3);
85 putchar(s->peek(str++, user));
90 todo = s->peek((Unsigned8*)(ip+1), user);
91 Jdb_output_frame *regs = reinterpret_cast<Jdb_output_frame*>(ts);
94 case 0: // l4kd_outchar
95 putchar(regs->value() & 0xff);
97 case 1: // l4kd_outnstring
100 for(; len > 0; len--)
101 putchar(s->peek(str++, user));
103 case 2: // l4kd_outstr
105 for (; (c=s->peek(str++, user)); )
108 case 5: // l4kd_outhex32
109 printf("%08lx", regs->value() & 0xffffffff);
111 case 6: // l4kd_outhex20
112 printf("%05lx", regs->value() & 0xfffff);
114 case 7: // l4kd_outhex16
115 printf("%04lx", regs->value() & 0xffff);
117 case 8: // L4kd_outhex12
118 printf("%03lx", regs->value() & 0xfff);
120 case 9: // l4kd_outhex8
121 printf("%02lx", regs->value() & 0xff);
123 case 11: // l4kd_outdec
124 printf("%ld", regs->value());
126 case 13: // l4kd_inchar
129 switch (jef->param())
131 case 0: // fiasco_tbuf_get_status()
133 Jdb_status_page_frame *regs =
134 reinterpret_cast<Jdb_status_page_frame*>(ts);
135 regs->set(Mem_layout::Tbuf_ustatus_page);
138 case 1: // fiasco_tbuf_log()
140 // interrupts are disabled in handle_slow_trap()
141 Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(ts);
143 static_cast<Tb_entry_ke*>(Jdb_tbuf::new_entry());
146 for (len=0; (c = s->peek(str++, user)); len++)
149 regs->set_tb_entry(tb);
150 Jdb_tbuf::commit_entry();
153 case 2: // fiasco_tbuf_clear()
154 Jdb_tbuf::clear_tbuf();
156 case 3: // fiasco_tbuf_dump()
158 case 4: // fiasco_tbuf_log_3val()
160 // interrupts are disabled in handle_slow_trap()
161 Jdb_log_3val_frame *regs =
162 reinterpret_cast<Jdb_log_3val_frame*>(ts);
163 Tb_entry_ke_reg *tb =
164 static_cast<Tb_entry_ke_reg*>(Jdb_tbuf::new_entry());
166 tb->set(t, ip-1, regs->val1(), regs->val2(), regs->val3());
167 for (len=0; (c = s->peek(str++, user)); len++)
170 regs->set_tb_entry(tb);
171 Jdb_tbuf::commit_entry();
174 case 5: // fiasco_tbuf_get_status_phys()
176 Jdb_status_page_frame *regs =
177 reinterpret_cast<Jdb_status_page_frame*>(ts);
178 regs->set(s->virt_to_phys(Mem_layout::Tbuf_ustatus_page));
181 case 6: // fiasco_timer_disable
184 case 7: // fiasco_timer_enable
187 case 8: // fiasco_tbuf_log_binary()
188 // interrupts are disabled in handle_slow_trap()
189 Jdb_log_frame *regs = reinterpret_cast<Jdb_log_frame*>(ts);
190 Tb_entry_ke_bin *tb =
191 static_cast<Tb_entry_ke_bin*>(Jdb_tbuf::new_entry());
194 for (len=0; len < Tb_entry_ke_bin::SIZE; len++)
195 tb->set_buf(len, s->peek(str++, user));
196 regs->set_tb_entry(tb);
197 Jdb_tbuf::commit_entry();
203 switch (ts->value2())
205 case 1: // fiasco_register_symbols
207 Jdb_symbols_frame *regs =
208 reinterpret_cast<Jdb_symbols_frame*>(ts);
209 Jdb_dbinfo::set(Jdb_symbol::lookup(Kobject::dcast<Task*>(os->lookup(regs->task()))),
210 regs->addr(), regs->size());
213 case 2: // fiasco_register_lines
215 Jdb_lines_frame *regs =
216 reinterpret_cast<Jdb_lines_frame*>(ts);
217 Jdb_dbinfo::set(Jdb_lines::lookup(regs->task()),
218 regs->addr(), regs->size());