3 #include "jdb_module.h"
9 // ------------------------------------------------------------------------
10 INTERFACE [!jdb_disasm]:
12 class Jdb_disasm : public Jdb_module
15 static bool avail() { return false; }
18 // ------------------------------------------------------------------------
19 INTERFACE [jdb_disasm]:
21 class Jdb_disasm : public Jdb_module
24 Jdb_disasm() FIASCO_INIT;
25 static bool avail() { return true; }
27 static char show_intel_syntax;
28 static char show_lines;
32 // ------------------------------------------------------------------------
33 IMPLEMENTATION [!jdb_disasm]:
36 Jdb_module::Action_code
37 Jdb_disasm::show(Address, Space *, int, bool = false)
39 return Jdb_module::NOTHING;
44 Jdb_disasm::show_disasm_line(int, Address &, int, Space *)
49 // ------------------------------------------------------------------------
50 IMPLEMENTATION [jdb_disasm]:
60 #include "jdb_input.h"
61 #include "jdb_lines.h"
62 #include "jdb_module.h"
63 #include "jdb_screen.h"
64 #include "jdb_symbol.h"
65 #include "kernel_console.h"
67 #include "static_init.h"
70 char Jdb_disasm::show_intel_syntax;
71 char Jdb_disasm::show_lines = 2;
75 Jdb_disasm::disasm_line(char *buffer, int buflen, Address &addr,
76 int show_symbols, Space *task)
80 if ((len = disasm_bytes(buffer, buflen, addr, task, show_symbols,
81 show_intel_syntax, &Jdb::peek_task,
82 &Jdb_symbol::match_addr_to_symbol)) < 0)
94 Jdb_disasm::at_symbol(Address addr, Space *task)
96 return Jdb_symbol::match_addr_to_symbol(addr, task) != 0;
101 Jdb_disasm::at_line(Address addr, Space *task)
103 return (show_lines &&
104 Jdb_lines::match_addr_to_line(addr, task, 0, 0, show_lines==2));
109 Jdb_disasm::disasm_offset(Address &start, int offset, Space *task)
113 Address addr = start;
116 if (!disasm_line(0, 0, addr, 0, task))
118 start = addr + offset;
121 if (at_symbol(addr, task) && !offset--)
123 if (at_line(addr, task) && !offset--)
132 Address addr = start-64, va_start;
136 if (!disasm_line(0, 0, addr, 0, task))
145 if (at_symbol(addr, task) && !offset++)
147 if (at_line(addr, task) && !offset++)
155 Jdb_disasm::show_disasm_line(int len, Address &addr,
156 int show_symbols, Space *task)
165 char *line = (char*)alloca(len);
166 if (line && disasm_line(line, len, addr, show_symbols, task))
169 printf("%.*s\033[K\n", len, line);
171 printf("%-*s\n", len, line);
176 puts("........\033[K");
178 printf("........%*s", len-8, "\n");
183 Jdb_module::Action_code
184 Jdb_disasm::show(Address virt, Space *task, int level, bool do_clear_screen = false)
186 Address enter_addr = virt;
187 Space *trans_task = Jdb::translate_task(virt, task);
198 for (i=Jdb_screen::height()-1, addr=virt; i>0; i--)
202 char stat_str[4] = { " " };
204 Kconsole::console()->getchar_chance();
206 if ((symbol = Jdb_symbol::match_addr_to_symbol(addr, trans_task)))
208 snprintf(str, sizeof(str)-2, "<%s", symbol);
210 // cut symbol at newline
211 for (nl=str; *nl!='\0' && *nl!='\n'; nl++)
217 printf("%s%s\033[m\033[K\n", Jdb::esc_symbol, str);
224 if (Jdb_lines::match_addr_to_line(addr, trans_task, str,
225 sizeof(str)-1, show_lines==2))
227 printf("%s%s\033[m\033[K\n", Jdb::esc_line, str);
233 // show instruction breakpoint
234 if (Mword i = Jdb_bp::instruction_bp_at_addr(addr))
240 printf("%s"L4_PTR_FMT"%s%s ",
241 addr == enter_addr ? Jdb::esc_emph : "", addr, stat_str,
242 addr == enter_addr ? "\033[m" : "");
252 static char const * const line_mode[] = { "", "[Source]", "[Headers]" };
253 static char const * const syntax_mode[] = { "[AT&T]", "[Intel]" };
254 Jdb::printf_statline("dis", "<Space>=lines mode",
255 "<"L4_PTR_FMT"> task %-3p %-9s %-7s",
256 virt, task, line_mode[(int)show_lines],
257 syntax_mode[(int)show_intel_syntax]);
259 Jdb::cursor(Jdb_screen::height(), 6);
260 switch (int c = Jdb_core::getchar())
262 case KEY_CURSOR_LEFT:
266 case KEY_CURSOR_RIGHT:
270 case KEY_CURSOR_DOWN:
272 disasm_offset(virt, +1, task);
276 disasm_offset(virt, -1, task);
280 disasm_offset(virt, -Jdb_screen::height()+2, task);
284 disasm_offset(virt, +Jdb_screen::height()-2, task);
287 show_lines = (show_lines+1) % 3;
290 show_intel_syntax ^= 1;
292 case KEY_CURSOR_HOME:
298 Jdb::abort_command();
301 if (Jdb::is_toplevel_cmd(c))
311 Jdb_module::Action_code
312 Jdb_disasm::action(int cmd, void *&args, char const *&fmt, int &next_char)
316 Jdb_module::Action_code code;
318 code = Jdb_input_task_addr::action(args, fmt, next_char);
319 if (code == Jdb_module::NOTHING
320 && Jdb_input_task_addr::space() != 0)
322 Address addr = Jdb_input_task_addr::addr();
323 Space *space = Jdb_input_task_addr::space();
324 if (addr == (Address)-1)
325 addr = Jdb::get_entry_frame(Jdb::current_cpu)->ip();
326 return show(addr, space, 0) ? GO_BACK : NOTHING;
336 Jdb_module::Cmd const *
337 Jdb_disasm::cmds() const
342 "u[t<taskno>]<addr>\tdisassemble bytes of given/current task addr",
343 &Jdb_input_task_addr::first_char }
351 Jdb_disasm::num_cmds() const
355 Jdb_disasm::Jdb_disasm()
359 static Jdb_disasm jdb_disasm INIT_PRIORITY(JDB_MODULE_INIT_PRIO);