7 #include "jdb_kobject.h"
8 #include "jdb_module.h"
9 #include "jdb_screen.h"
10 #include "jdb_table.h"
11 #include "kernel_console.h"
16 #include "static_init.h"
19 class Jdb_ptab_m : public Jdb_module, public Jdb_kobject_handler
22 Jdb_ptab_m() FIASCO_INIT;
25 static char first_char;
26 bool show_kobject(Kobject *, int) { return false; }
29 class Jdb_ptab : public Jdb_table
37 unsigned char cur_pt_level;
40 static unsigned max_pt_level;
42 static unsigned entry_valid(Mword entry, unsigned level);
43 static unsigned entry_is_pt_ptr(Mword entry, unsigned level,
44 unsigned *entries, unsigned *next_level);
45 static Address entry_phys(Mword entry, unsigned level);
47 void print_entry(Mword entry, unsigned level);
48 void print_head(Mword entry);
51 char Jdb_ptab_m::first_char;
53 typedef Mword My_pte; // shoud be replaced by
54 // arch-dependent type
57 Jdb_ptab::Jdb_ptab(void *pt_base = 0, Space *task = 0,
58 unsigned char pt_level = 0, unsigned entries = 0,
59 Address virt_base = 0, int level = 0)
60 : base((Address)pt_base), virt_base(virt_base), _level(level),
61 _task(task), entries(entries), cur_pt_level(pt_level), dump_raw(0)
63 if (!pt_level && entries == 0)
64 this->entries = 1UL << Ptab::Level<Pdir::Traits,0>::Traits::Size;
69 Jdb_ptab::col_width(unsigned column) const
72 return Jdb_screen::Col_head_size;
74 return Jdb_screen::Mword_size_bmode;
79 Jdb_ptab::cols() const
81 return Jdb_screen::cols();
85 // available from the jdb_dump module
86 int jdb_dump_addr_task(Address addr, Space *task, int level)
87 __attribute__((weak));
92 Jdb_ptab::draw_entry(unsigned long row, unsigned long col)
95 print_head(virt(row, 1));
97 print_entry(*(My_pte*)(virt(row,col)), cur_pt_level);
102 Jdb_ptab::virt(unsigned long row, unsigned long col)
104 Mword e = (col-1) + (row * (cols()-1));
105 return base + e * sizeof(Mword);
110 Jdb_ptab::print_head(Mword entry)
112 printf(L4_PTR_FMT, entry);
117 Jdb_ptab_m::handle_key(Kobject *o, int code)
122 Space *t = Kobject::dcast<Task*>(o);
125 Thread *th = Kobject::dcast<Thread*>(o);
126 if (!th || !th->space())
132 Jdb_ptab pt_view(t->mem_space()->dir(), t, 0, 0, 0, 1);
140 Jdb_ptab::key_pressed(int c, unsigned long &row, unsigned long &col)
147 case KEY_CURSOR_HOME: // return to previous or go home
156 case KEY_RETURN: // goto ptab/address under cursor
159 My_pte pt_entry = *(My_pte*)virt(row,col);
160 if (!entry_valid(pt_entry, cur_pt_level))
163 Address pd_virt = (Address)
164 Mem_layout::phys_to_pmem(entry_phys(pt_entry, cur_pt_level));
166 unsigned next_level, entries;
168 if (cur_pt_level < max_pt_level
169 && entry_is_pt_ptr(pt_entry, cur_pt_level, &entries, &next_level))
171 Jdb_ptab pt_view((void *)pd_virt, _task, next_level, entries,
172 disp_virt(row,col), _level+1);
173 if (!pt_view.show(0,1))
177 else if (jdb_dump_addr_task != 0)
179 if (!jdb_dump_addr_task(disp_virt(row,col), _task, _level+1))
191 Jdb_module::Action_code
192 Jdb_ptab_m::action(int cmd, void *&args, char const *&fmt, int &next_char)
196 if (args == &first_char)
198 if (first_char != KEY_RETURN && first_char != ' ')
202 next_char = first_char;
203 return EXTRA_INPUT_WITH_NEXTCHAR;
207 task = 0; //Jdb::get_current_task();
210 else if (args == &task)
213 if (!Jdb::is_valid_task(task))
215 puts(" invalid task");
226 s = Kobject::dcast<Task*>(reinterpret_cast<Kobject*>(task));
228 return Jdb_module::NOTHING;
231 s = Kernel_task::kernel_task();
234 if (!(ptab_base = ((void*)s->mem_space()->dir())))
235 return Jdb_module::NOTHING;
238 Jdb_ptab pt_view(ptab_base, s);
247 Jdb_module::Cmd const *
248 Jdb_ptab_m::cmds() const
252 { 0, "p", "ptab", "%C",
253 "p[<taskno>]\tshow pagetable of current/given task",
261 Jdb_ptab_m::num_cmds() const
267 Jdb_ptab_m::Jdb_ptab_m()
268 : Jdb_module("INFO"), Jdb_kobject_handler(0)
270 Jdb_kobject::module()->register_handler(this);
273 static Jdb_ptab_m jdb_ptab_m INIT_PRIORITY(JDB_MODULE_INIT_PRIO);