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]:
59 #include "jdb_input.h"
60 #include "jdb_lines.h"
61 #include "jdb_module.h"
62 #include "jdb_screen.h"
63 #include "jdb_symbol.h"
64 #include "kernel_console.h"
66 #include "static_init.h"
69 char Jdb_disasm::show_intel_syntax;
70 char Jdb_disasm::show_lines = 2;
73 // available from the jdb_bp module
74 extern int jdb_instruction_bp_at_addr(Address addr) __attribute__((weak));
78 Jdb_disasm::disasm_line(char *buffer, int buflen, Address &addr,
79 int show_symbols, Space *task)
83 if ((len = disasm_bytes(buffer, buflen, addr, task, show_symbols,
84 show_intel_syntax, &Jdb::peek_task,
85 &Jdb_symbol::match_addr_to_symbol)) < 0)
97 Jdb_disasm::at_symbol(Address addr, Space *task)
99 return Jdb_symbol::match_addr_to_symbol(addr, task) != 0;
104 Jdb_disasm::at_line(Address addr, Space *task)
106 return (show_lines &&
107 Jdb_lines::match_addr_to_line(addr, task, 0, 0, show_lines==2));
112 Jdb_disasm::disasm_offset(Address &start, int offset, Space *task)
116 Address addr = start;
119 if (!disasm_line(0, 0, addr, 0, task))
121 start = addr + offset;
124 if (at_symbol(addr, task) && !offset--)
126 if (at_line(addr, task) && !offset--)
135 Address addr = start-64, va_start;
139 if (!disasm_line(0, 0, addr, 0, task))
148 if (at_symbol(addr, task) && !offset++)
150 if (at_line(addr, task) && !offset++)
158 Jdb_disasm::show_disasm_line(int len, Address &addr,
159 int show_symbols, Space *task)
168 char *line = (char*)alloca(len);
169 if (line && disasm_line(line, len, addr, show_symbols, task))
172 printf("%.*s\033[K\n", len, line);
174 printf("%-*s\n", len, line);
179 puts("........\033[K");
181 printf("........%*s", len-8, "\n");
186 Jdb_module::Action_code
187 Jdb_disasm::show(Address virt, Space *task, int level, bool do_clear_screen = false)
189 Address enter_addr = virt;
190 Space *trans_task = Jdb::translate_task(virt, task);
201 for (i=Jdb_screen::height()-1, addr=virt; i>0; i--)
205 char stat_str[4] = { " " };
207 Kconsole::console()->getchar_chance();
209 if ((symbol = Jdb_symbol::match_addr_to_symbol(addr, trans_task)))
211 snprintf(str, sizeof(str)-2, "<%s", symbol);
213 // cut symbol at newline
214 for (nl=str; *nl!='\0' && *nl!='\n'; nl++)
220 printf("%s%s\033[m\033[K\n", Jdb::esc_symbol, str);
227 if (Jdb_lines::match_addr_to_line(addr, trans_task, str,
228 sizeof(str)-1, show_lines==2))
230 printf("%s%s\033[m\033[K\n", Jdb::esc_line, str);
236 // show instruction breakpoint
237 if (jdb_instruction_bp_at_addr != 0)
239 if (Mword i = jdb_instruction_bp_at_addr(addr))
246 printf("%s"L4_PTR_FMT"%s%s ",
247 addr == enter_addr ? Jdb::esc_emph : "", addr, stat_str,
248 addr == enter_addr ? "\033[m" : "");
258 static char const * const line_mode[] = { "", "[Source]", "[Headers]" };
259 static char const * const syntax_mode[] = { "[AT&T]", "[Intel]" };
260 Jdb::printf_statline("dis", "<Space>=lines mode",
261 "<"L4_PTR_FMT"> task %-3p %-9s %-7s",
262 virt, task, line_mode[(int)show_lines],
263 syntax_mode[(int)show_intel_syntax]);
265 Jdb::cursor(Jdb_screen::height(), 6);
266 switch (int c = Jdb_core::getchar())
268 case KEY_CURSOR_LEFT:
272 case KEY_CURSOR_RIGHT:
276 case KEY_CURSOR_DOWN:
278 disasm_offset(virt, +1, task);
282 disasm_offset(virt, -1, task);
286 disasm_offset(virt, -Jdb_screen::height()+2, task);
290 disasm_offset(virt, +Jdb_screen::height()-2, task);
293 show_lines = (show_lines+1) % 3;
296 show_intel_syntax ^= 1;
298 case KEY_CURSOR_HOME:
304 Jdb::abort_command();
307 if (Jdb::is_toplevel_cmd(c))
317 Jdb_module::Action_code
318 Jdb_disasm::action(int cmd, void *&args, char const *&fmt, int &next_char)
322 Jdb_module::Action_code code;
324 code = Jdb_input_task_addr::action(args, fmt, next_char);
325 if (code == Jdb_module::NOTHING
326 && Jdb_input_task_addr::space() != 0)
328 Address addr = Jdb_input_task_addr::addr();
329 Space *space = Jdb_input_task_addr::space();
330 if (addr == (Address)-1)
331 addr = Jdb::get_entry_frame(Jdb::current_cpu)->ip();
332 return show(addr, space, 0) ? GO_BACK : NOTHING;
342 Jdb_module::Cmd const *
343 Jdb_disasm::cmds() const
348 "u[t<taskno>]<addr>\tdisassemble bytes of given/current task addr",
349 &Jdb_input_task_addr::first_char }
357 Jdb_disasm::num_cmds() const
361 Jdb_disasm::Jdb_disasm()
365 static Jdb_disasm jdb_disasm INIT_PRIORITY(JDB_MODULE_INIT_PRIO);