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 "thread_object.h"
17 #include "static_init.h"
20 class Jdb_ptab_m : public Jdb_module, public Jdb_kobject_handler
23 Jdb_ptab_m() FIASCO_INIT;
26 static char first_char;
27 bool show_kobject(Kobject *, int) { return false; }
30 class Jdb_ptab : public Jdb_table
38 unsigned char cur_pt_level;
41 static unsigned max_pt_level;
43 static unsigned entry_valid(Mword entry, unsigned level);
44 static unsigned entry_is_pt_ptr(Mword entry, unsigned level,
45 unsigned *entries, unsigned *next_level);
46 static Address entry_phys(Mword entry, unsigned level);
48 void print_entry(Mword entry, unsigned level);
49 void print_head(Mword entry);
52 char Jdb_ptab_m::first_char;
54 typedef Mword My_pte; // shoud be replaced by
55 // arch-dependent type
58 Jdb_ptab::Jdb_ptab(void *pt_base = 0, Space *task = 0,
59 unsigned char pt_level = 0, unsigned entries = 0,
60 Address virt_base = 0, int level = 0)
61 : base((Address)pt_base), virt_base(virt_base), _level(level),
62 _task(task), entries(entries), cur_pt_level(pt_level), dump_raw(0)
64 if (!pt_level && entries == 0)
65 this->entries = 1UL << Ptab::Level<Pdir::Traits,0>::Traits::Size;
70 Jdb_ptab::col_width(unsigned column) const
73 return Jdb_screen::Col_head_size;
75 return Jdb_screen::Mword_size_bmode;
80 Jdb_ptab::cols() const
82 return Jdb_screen::cols();
86 // available from the jdb_dump module
87 int jdb_dump_addr_task(Address addr, Space *task, int level)
88 __attribute__((weak));
93 Jdb_ptab::draw_entry(unsigned long row, unsigned long col)
96 print_head(virt(row, 1));
98 print_entry(*(My_pte*)(virt(row,col)), cur_pt_level);
103 Jdb_ptab::virt(unsigned long row, unsigned long col)
105 Mword e = (col-1) + (row * (cols()-1));
106 return base + e * sizeof(Mword);
111 Jdb_ptab::print_head(Mword entry)
113 printf(L4_PTR_FMT, entry);
118 Jdb_ptab_m::handle_key(Kobject *o, int code)
123 Space *t = Kobject::dcast<Task*>(o);
126 Thread *th = Kobject::dcast<Thread_object*>(o);
127 if (!th || !th->space())
133 Jdb_ptab pt_view(t->mem_space()->dir(), t, 0, 0, 0, 1);
141 Jdb_ptab::key_pressed(int c, unsigned long &row, unsigned long &col)
148 case KEY_CURSOR_HOME: // return to previous or go home
157 case KEY_RETURN: // goto ptab/address under cursor
160 My_pte pt_entry = *(My_pte*)virt(row,col);
161 if (!entry_valid(pt_entry, cur_pt_level))
164 Address pd_virt = (Address)
165 Mem_layout::phys_to_pmem(entry_phys(pt_entry, cur_pt_level));
167 unsigned next_level, entries;
169 if (cur_pt_level < max_pt_level
170 && entry_is_pt_ptr(pt_entry, cur_pt_level, &entries, &next_level))
172 Jdb_ptab pt_view((void *)pd_virt, _task, next_level, entries,
173 disp_virt(row,col), _level+1);
174 if (!pt_view.show(0,1))
178 else if (jdb_dump_addr_task != 0)
180 if (!jdb_dump_addr_task(disp_virt(row,col), _task, _level+1))
192 Jdb_module::Action_code
193 Jdb_ptab_m::action(int cmd, void *&args, char const *&fmt, int &next_char)
197 if (args == &first_char)
199 if (first_char != KEY_RETURN && first_char != ' ')
203 next_char = first_char;
204 return EXTRA_INPUT_WITH_NEXTCHAR;
208 task = 0; //Jdb::get_current_task();
211 else if (args == &task)
214 if (!Jdb::is_valid_task(task))
216 puts(" invalid task");
227 s = Kobject::dcast<Task*>(reinterpret_cast<Kobject*>(task));
229 return Jdb_module::NOTHING;
232 s = Kernel_task::kernel_task();
235 if (!(ptab_base = ((void*)s->mem_space()->dir())))
236 return Jdb_module::NOTHING;
239 Jdb_ptab pt_view(ptab_base, s);
248 Jdb_module::Cmd const *
249 Jdb_ptab_m::cmds() const
253 { 0, "p", "ptab", "%C",
254 "p[<taskno>]\tshow pagetable of current/given task",
262 Jdb_ptab_m::num_cmds() const
268 Jdb_ptab_m::Jdb_ptab_m()
269 : Jdb_module("INFO"), Jdb_kobject_handler(0)
271 Jdb_kobject::module()->register_handler(this);
274 static Jdb_ptab_m jdb_ptab_m INIT_PRIORITY(JDB_MODULE_INIT_PRIO);