1 IMPLEMENTATION[ia32 || amd64]:
7 #include "jdb_ktrace.h"
8 #include "jdb_module.h"
9 #include "jdb_symbol.h"
10 #include "jdb_screen.h"
11 #include "static_init.h"
15 class Jdb_misc_general : public Jdb_module
18 Jdb_misc_general() FIASCO_INIT;
20 static char first_char;
23 char Jdb_misc_general::first_char;
27 Jdb_module::Action_code
28 Jdb_misc_general::action(int cmd, void *&, char const *&, int &)
34 if (first_char == '+' || first_char == '-')
37 Config::esc_hack = (first_char == '+');
48 Jdb_module::Cmd const *
49 Jdb_misc_general::cmds() const
53 { 0, "E", "esckey", "%C",
54 "E{+|-}\ton/off enter jdb by pressing <ESC>",
62 Jdb_misc_general::num_cmds() const
68 Jdb_misc_general::Jdb_misc_general()
69 : Jdb_module("GENERAL")
73 static Jdb_misc_general jdb_misc_general INIT_PRIORITY(JDB_MODULE_INIT_PRIO);
76 //---------------------------------------------------------------------------//
78 class Jdb_misc_debug : public Jdb_module
81 Jdb_misc_debug() FIASCO_INIT;
83 static char first_char;
87 char Jdb_misc_debug::first_char;
88 Mword Jdb_misc_debug::task;
91 Jdb_misc_debug::show_lbr_entry(const char *str, Address addr)
95 printf("%s "L4_PTR_FMT" ", str, addr);
96 if (Jdb_symbol::match_addr_to_symbol_fuzzy(&addr, 0, symbol, sizeof(symbol)))
97 printf("(%s)", symbol);
101 Jdb_module::Action_code
102 Jdb_misc_debug::action(int cmd, void *&args, char const *&fmt, int &)
108 if (first_char == '+' || first_char == '-')
111 Jdb::set_single_step(Jdb::current_cpu, first_char == '+');
125 if (first_char == '+' || first_char == '-')
127 Cpu::boot_cpu()->lbr_enable(first_char == '+');
131 else if (first_char == 'd')
140 Jdb::msr_test = Jdb::Msr_test_fail_warn;
141 if (Cpu::boot_cpu()->lbr_type() == Cpu::Lbr_pentium_4 ||
142 Cpu::boot_cpu()->lbr_type() == Cpu::Lbr_pentium_4_ext)
145 Unsigned32 branch_tos;
147 msr = Cpu::rdmsr(MSR_LER_FROM_LIP);
148 show_lbr_entry("\nbefore exc:", (Address)msr);
149 msr = Cpu::rdmsr(MSR_LER_TO_LIP);
150 show_lbr_entry(" =>", (Address)msr);
152 msr = Cpu::rdmsr(MSR_LASTBRANCH_TOS);
153 branch_tos = (Unsigned32)msr;
155 if (Cpu::boot_cpu()->lbr_type() == Cpu::Lbr_pentium_4)
157 // older P4 models provide a stack of 4 MSRs
158 for (int i=0, j=branch_tos & 3; i<4; i++)
161 msr = Cpu::rdmsr(MSR_LASTBRANCH_0+j);
162 show_lbr_entry("\nbranch/exc:", (Address)(msr >> 32));
163 show_lbr_entry(" =>", (Address)msr);
168 // newer P4 models provide a stack of 16 MSR pairs
169 for (int i=0, j=branch_tos & 15; i<16; i++)
172 msr = Cpu::rdmsr(0x680+j);
173 show_lbr_entry("\nbranch/exc:", (Address)msr);
174 msr = Cpu::rdmsr(0x6c0+j);
175 show_lbr_entry(" =>", (Address)msr);
179 else if (Cpu::boot_cpu()->lbr_type() == Cpu::Lbr_pentium_6)
183 msr = Cpu::rdmsr(MSR_LASTBRANCHFROMIP);
184 show_lbr_entry("\nbranch:", (Address)msr);
185 msr = Cpu::rdmsr(MSR_LASTBRANCHTOIP);
186 show_lbr_entry(" =>", (Address)msr);
187 msr = Cpu::rdmsr(MSR_LASTINTFROMIP);
188 show_lbr_entry("\n int:", (Address)msr);
189 msr = Cpu::rdmsr(MSR_LASTINTTOIP);
190 show_lbr_entry(" =>", (Address)msr);
193 printf("Last branch recording feature not available");
195 Jdb::msr_test = Jdb::Msr_test_default;
205 Jdb_module::Cmd const *
206 Jdb_misc_debug::cmds() const
210 { 0, "S", "singlestep", "%C",
211 "S{+|-}\ton/off permanent single step mode",
213 { 1, "L", "lbr", "%C",
214 "L\tshow last branch recording information\n"
215 "Ld<taskno>\tshow LDT of specific task",
223 Jdb_misc_debug::num_cmds() const
229 Jdb_misc_debug::Jdb_misc_debug()
230 : Jdb_module("DEBUGGING")
234 static Jdb_misc_debug jdb_misc_debug INIT_PRIORITY(JDB_MODULE_INIT_PRIO);
238 Jdb_misc_debug::show_ldt()
240 Space *s = Kobject::dcast<Task*>(reinterpret_cast<Kobject*>(task));
245 printf(" -- invalid task number '%lx'", task);
249 addr = s->_ldt.addr();
250 size = s->_ldt.size();
254 printf(" -- no LDT active");
258 printf("\nLDT of space %lx at "L4_PTR_FMT"-"L4_PTR_FMT"\n", task, addr, addr+size-1);
260 Gdt_entry *desc = reinterpret_cast<Gdt_entry *>(addr);
262 for (; size>=Cpu::Ldt_entry_size; size-=Cpu::Ldt_entry_size, desc++)
266 printf(" %5lx: ", (Mword)desc - addr);
272 class Jdb_misc_info : public Jdb_module
275 Jdb_misc_info() FIASCO_INIT;
277 static char first_char;
280 static Unsigned64 value64;
283 char Jdb_misc_info::first_char;
284 Address Jdb_misc_info::addr;
285 Mword Jdb_misc_info::value;
286 Unsigned64 Jdb_misc_info::value64;
289 Jdb_module::Action_code
290 Jdb_misc_info::action(int cmd, void *&args, char const *&fmt, int &)
295 // read/write physical memory
296 if (args == &first_char)
298 if (first_char == 'r' || first_char == 'w')
306 else if (args == &addr || args == &value)
308 addr &= ~(sizeof(Mword)-1);
310 Jdb::poke_phys(addr, &value, sizeof(value));
311 if (first_char == 'w' && args == &addr)
315 Jdb::peek_phys(addr, &value, sizeof(value));
316 printf(L4_MWORD_FMT, value);
317 if (first_char == 'w' && args == &addr)
319 putstr(") new value=");
329 // read/write machine status register
330 if (!Cpu::boot_cpu()->can_wrmsr())
332 puts("MSR not supported");
336 if (args == &first_char)
338 if (first_char == 'r' || first_char == 'w')
341 fmt = L4_ADDR_INPUT_FMT;
346 else if (args == &addr || args == &value64)
348 Jdb::msr_test = Jdb::Msr_test_fail_warn;
349 if (args == &value64)
350 Cpu::wrmsr(value64, addr);
351 if (first_char == 'w' && (args == &addr))
355 value64 = Cpu::rdmsr(addr);
356 printf(L4_X64_FMT, value64);
357 if (first_char == 'w' && (args == &addr))
359 putstr(") new value=");
365 Jdb::msr_test = Jdb::Msr_test_default;
374 Jdb_module::Cmd const *
375 Jdb_misc_info::cmds() const
379 { 0, "A", "adapter", "%C",
380 "A{r|w}<addr>\tread/write any physical address",
382 { 1, "M", "msr", "%C",
383 "M{r|w}<addr>\tread/write machine status register",
391 Jdb_misc_info::num_cmds() const
397 Jdb_misc_info::Jdb_misc_info()
402 static Jdb_misc_info jdb_misc_info INIT_PRIORITY(JDB_MODULE_INIT_PRIO);