static
bool
Jdb_mapdb::show_tree(Treemap* pages, Mapping::Pcnt offset, Mdb_types::Order base_size,
- unsigned &screenline, unsigned indent = 1)
+ unsigned &screenline, unsigned indent = 1)
{
typedef Treemap::Page Page;
if (! t)
{
printf(" no mapping tree registered for frame number 0x%lx\033[K\n",
- cxx::int_value<Mapping::Page>(page));
+ cxx::int_value<Mapping::Page>(page));
screenline++;
return true;
}
#ifdef NDEBUG
// If NDEBUG is active, t->_empty_count is undefined
printf(" header info: "
- "entries used: %u free: -- total: %u lock=%u\033[K\n",
- t->_count, t->number_of_entries(),
- f->lock.test());
+ "entries used: %u free: -- total: %u lock=%u\033[K\n",
+ t->_count, t->number_of_entries(),
+ f->lock.test());
if (t->_count > t->number_of_entries())
{
printf("\033[K\n"
- "\033[K\n"
- " seems to be a wrong tree ! ...exiting");
+ "\033[K\n"
+ " seems to be a wrong tree ! ...exiting");
// clear rest of page
for (i=6; i<Jdb_screen::height(); i++)
- printf("\033[K\n");
+ printf("\033[K\n");
return false;
}
#else
printf(" header info: "
- "entries used: %u free: %u total: %u lock=%u\033[K\n",
- t->_count, t->_empty_count, t->number_of_entries(),
- f->lock.test());
+ "entries used: %u free: %u total: %u lock=%d\033[K\n",
+ t->_count, t->_empty_count, t->number_of_entries(),
+ f->lock.test());
if (unsigned (t->_count) + t->_empty_count > t->number_of_entries())
{
printf("\033[K\n"
- "\033[K\n"
- " seems to be a wrong tree ! ...exiting");
+ "\033[K\n"
+ " seems to be a wrong tree ! ...exiting");
// clear rest of page
for (i=6; i<Jdb_screen::height(); i++)
- printf("\033[K\n");
+ printf("\033[K\n");
return false;
}
#endif
screenline += 2;
- for (i=0; i < t->_count; i++, m++)
+ unsigned empty = 0;
+ for(i=0; i < t->_count + empty; i++, m++)
{
Kconsole::console()->getchar_chance();
if (m->depth() == Mapping::Depth_submap)
- printf("%*u: %lx subtree@" L4_PTR_FMT,
- indent + m->parent()->depth() > 10
- ? 0 : indent + m->parent()->depth(),
- i+1, (Address) m->data(), (Mword) m->submap());
+ printf("%*u: %lx subtree@" L4_PTR_FMT,
+ indent + m->parent()->depth() > 10
+ ? 0 : (int)(indent + m->parent()->depth()),
+ i+1, (Address) m->data(), (Mword) m->submap());
else
- {
- printf("%*u: %lx va=%012llx task=%lx depth=",
- indent + m->depth() > 10 ? 0 : indent + m->depth(),
- i+1, (Address) m->data(),
- val(pages->vaddr(m), base_size),
+ {
+ printf("%*u: %lx va=%012llx task=%lx depth=",
+ indent + m->depth() > 10 ? 0 : (int)(indent + m->depth()),
+ i+1, (Address) m->data(),
+ val(pages->vaddr(m), base_size),
Kobject_dbg::pointer_to_id(m->space()));
- if (m->depth() == Mapping::Depth_root)
- printf("root");
- else if (m->depth() == Mapping::Depth_empty)
- printf("empty");
- else if (m->depth() == Mapping::Depth_end)
- printf("end");
- else
- printf("%lu", static_cast<unsigned long>(m->depth()));
- }
+ if (m->depth() == Mapping::Depth_root)
+ printf("root");
+ else if (m->depth() == Mapping::Depth_empty)
+ {
+ printf("empty");
+ ++empty;
+ }
+ else if (m->depth() == Mapping::Depth_end)
+ printf("end");
+ else
+ printf("%lu", static_cast<unsigned long>(m->depth()));
+ }
puts("\033[K");
screenline++;
if (screenline >= (m->depth() == Mapping::Depth_submap
- ? Jdb_screen::height() - 3
- : Jdb_screen::height()))
- {
- printf(" any key for next page or <ESC>");
- Jdb::cursor(screenline, 33);
- c = Jdb_core::getchar();
- printf("\r\033[K");
- if (c == KEY_ESC)
- return false;
- screenline = 3;
- Jdb::cursor(3, 1);
- }
+ ? Jdb_screen::height() - 3
+ : Jdb_screen::height()))
+ {
+ printf(" any key for next page or <ESC>");
+ Jdb::cursor(screenline, 33);
+ c = Jdb_core::getchar();
+ printf("\r\033[K");
+ if (c == KEY_ESC)
+ return false;
+ screenline = 3;
+ Jdb::cursor(3, 1);
+ }
if (m->depth() == Mapping::Depth_submap)
- {
- if (! Jdb_mapdb::show_tree(m->submap(),
- cxx::get_lsb(offset, pages->_page_shift),
+ {
+ if (! Jdb_mapdb::show_tree(m->submap(),
+ cxx::get_lsb(offset, pages->_page_shift),
base_size,
- screenline, indent + m->parent()->depth()))
- return false;
- }
+ screenline, indent + m->parent()->depth()))
+ return false;
+ }
}
return true;
Order base_size = Order(0);
switch (which_mapdb)
- {
- case 'm':
- type = "Phys frame";
- mapdb = mapdb_mem.get();
+ {
+ case 'm':
+ type = "Phys frame";
+ mapdb = mapdb_mem.get();
base_size = Order(Config::PAGE_SHIFT);
super_shift = Mdb_types::Order(Config::SUPERPAGE_SHIFT - Config::PAGE_SHIFT);
- break;
+ break;
#ifdef CONFIG_PF_PC
- case 'i':
- type = "I/O port";
- mapdb = mapdb_io.get();
+ case 'i':
+ type = "I/O port";
+ mapdb = mapdb_io.get();
base_size = Order(0);
super_shift = Mdb_types::Order(8);
- break;
+ break;
#endif
- default:
- return;
- }
+ default:
+ return;
+ }
super_inc = Mapping::Pcnt(1) << super_shift;
if (! mapdb->valid_address(page))
- page = Mapping::Pfn(0);
+ page = Mapping::Pfn(0);
Jdb::cursor();
printf("%s %012llx\033[K\n\033[K\n", type, val(page, base_size));
j = 3;
if (! Jdb_mapdb::show_tree(mapdb->_treemap, page - Mapping::Pfn(0), base_size, j))
- return;
+ return;
for (; j<Jdb_screen::height(); j++)
- puts("\033[K");
+ puts("\033[K");
static char prompt[] = "mapdb[m]";
prompt[6] = which_mapdb;
Jdb::printf_statline(prompt,
- "n=next p=previous N=nextsuper P=prevsuper", "_");
+ "n=next p=previous N=nextsuper P=prevsuper", "_");
for (bool redraw=false; !redraw; )
- {
- Jdb::cursor(Jdb_screen::height(), 10);
- switch (c = Jdb_core::getchar())
- {
- case 'n':
- case KEY_CURSOR_DOWN:
- if (! mapdb->valid_address(++page))
+ {
+ Jdb::cursor(Jdb_screen::height(), 10);
+ switch (c = Jdb_core::getchar())
+ {
+ case 'n':
+ case KEY_CURSOR_DOWN:
+ if (! mapdb->valid_address(++page))
page = Mapping::Pfn(0);
- redraw = true;
- break;
- case 'p':
- case KEY_CURSOR_UP:
- if (! mapdb->valid_address(--page))
+ redraw = true;
+ break;
+ case 'p':
+ case KEY_CURSOR_UP:
+ if (! mapdb->valid_address(--page))
page = Mapping::Pfn(end_address(mapdb) - 1);
- redraw = true;
- break;
- case 'N':
- case KEY_PAGE_DOWN:
- page = cxx::mask_lsb(page + super_inc, super_shift);
- if (! mapdb->valid_address(page))
+ redraw = true;
+ break;
+ case 'N':
+ case KEY_PAGE_DOWN:
+ page = cxx::mask_lsb(page + super_inc, super_shift);
+ if (! mapdb->valid_address(page))
page = Mapping::Pfn(0);
- redraw = true;
- break;
- case 'P':
- case KEY_PAGE_UP:
- page = cxx::mask_lsb(page - super_inc, super_shift);
- if (! mapdb->valid_address(page))
+ redraw = true;
+ break;
+ case 'P':
+ case KEY_PAGE_UP:
+ page = cxx::mask_lsb(page - super_inc, super_shift);
+ if (! mapdb->valid_address(page))
page = Mapping::Pfn(end_address(mapdb) - 1);
- redraw = true;
- break;
- case ' ':
- if (which_mapdb == 'm')
+ redraw = true;
+ break;
+ case ' ':
+ if (which_mapdb == 'm')
#ifdef CONFIG_PF_PC
- which_mapdb = 'i';
- else if (which_mapdb == 'i')
+ which_mapdb = 'i';
+ else if (which_mapdb == 'i')
#endif
- which_mapdb = 'm';
- redraw = true;
+ which_mapdb = 'm';
+ redraw = true;
break;
- case KEY_ESC:
- Jdb::abort_command();
- return;
- default:
- if (Jdb::is_toplevel_cmd(c))
- return;
- }
- }
+ case KEY_ESC:
+ Jdb::abort_command();
+ return;
+ default:
+ if (Jdb::is_toplevel_cmd(c))
+ return;
+ }
+ }
}
}
if (args == (void*) &subcmd)
{
switch (subcmd)
- {
- default:
- return NOTHING;
-
- case '\r':
- case ' ':
- goto doit;
-
- case '0' ... '9':
- case 'a' ... 'f':
- case 'A' ... 'F':
- which_mapdb = 'm';
- fmt = " frame: " L4_FRAME_INPUT_FMT;
- args = &pagenum;
- next_char = subcmd;
- return EXTRA_INPUT_WITH_NEXTCHAR;
-
- case 'm':
- fmt = " frame: " L4_FRAME_INPUT_FMT;
- break;
+ {
+ default:
+ return NOTHING;
+
+ case '\r':
+ case ' ':
+ goto doit;
+
+ case '0' ... '9':
+ case 'a' ... 'f':
+ case 'A' ... 'F':
+ which_mapdb = 'm';
+ fmt = " frame: " L4_FRAME_INPUT_FMT;
+ args = &pagenum;
+ next_char = subcmd;
+ return EXTRA_INPUT_WITH_NEXTCHAR;
+
+ case 'm':
+ fmt = " frame: " L4_FRAME_INPUT_FMT;
+ break;
#ifdef CONFIG_PF_PC
- case 'i':
- fmt = " port: " L4_FRAME_INPUT_FMT;
- break;
+ case 'i':
+ fmt = " port: " L4_FRAME_INPUT_FMT;
+ break;
#endif
}
{
static Cmd cs[] =
{
- { 0, "m", "mapdb", "%c",
- "m[i]<addr>\tshow [I/O] mapping database starting at address",
- &subcmd },
+ { 0, "m", "mapdb", "%c",
+ "m[i]<addr>\tshow [I/O] mapping database starting at address",
+ &subcmd },
{ 1, "", "dumpmapdbobjs", "",
"dumpmapdbobjs\tDump complete object mapping database", 0 },
};
class Jdb_kobject_mapdb_hdl : public Jdb_kobject_handler
{
public:
- Jdb_kobject_mapdb_hdl() : Jdb_kobject_handler(0) {}
virtual bool show_kobject(Kobject_common *, int) { return true; }
virtual ~Jdb_kobject_mapdb_hdl() {}
};
if (!t)
{
printf("\n");
- continue;
+ continue;
}
Mapping *m = t->mappings();
printf(" intask=");
for (int i = 0; i < t->_count; i++, m++)
- {
+ {
if (m->depth() == Mapping::Depth_submap)
printf("%s[subtree]", i ? "," : "");
else
printf("%s[%lx:%d]",
i ? "," : "", Kobject::pointer_to_id(m->space()),
m->depth());
- }
+ }
printf("\n");
if (m->depth() == Mapping::Depth_submap)
if (!f || f->map_root()->_root.empty())
{
printf(" no mapping tree registered for frame number 0x%lx\033[K\n",
- (unsigned long) f);
+ (unsigned long) f);
screenline++;
puts(Jdb_screen::Line);
return true;
Mword space_id = ~0UL;
Address cap_idx = ((Address)e % Config::PAGE_SIZE) / sizeof(Obj::Entry);
+ String_buf<16> task_descr;
if (pi)
- {
- space_id = static_cast<Task*>(pi->info<Obj::Cap_page_dbg_info>()->s)->dbg_info()->dbg_id();
- cap_idx += pi->info<Obj::Cap_page_dbg_info>()->offset;
- }
+ {
+ Kobject_dbg *o = static_cast<Task*>(pi->info<Obj::Cap_page_dbg_info>()->s)->dbg_info();
+ space_id = o->dbg_id();
+ Jdb_kobject_name *n = Jdb_kobject_extension::find_extension<Jdb_kobject_name>(Kobject::from_dbg(o));
+ if (n)
+ task_descr.printf("(%.*s)", n->max_len(), n->name());
+ cap_idx += pi->info<Obj::Cap_page_dbg_info>()->offset;
+ }
- printf(" " L4_PTR_FMT "[C:%lx]: space=D:%lx rights=%x flags=%lx obj=%p",
- (Address)*m, cap_idx, space_id,
+ printf(" " L4_PTR_FMT "[C:%lx]: space=D:%lx%.*s rights=%x flags=%lx obj=%p",
+ (Address)*m, cap_idx, space_id, task_descr.length(), task_descr.begin(),
(unsigned)cxx::int_value<Obj::Attr>(e->rights()), e->_flags,
- e->obj());
+ e->obj());
puts("\033[K");
screenline++;
if (screenline >= Jdb_screen::height())
- {
- printf(" any key for next page or <ESC>");
- Jdb::cursor(screenline, 33);
- c = Jdb_core::getchar();
- printf("\r\033[K");
- if (c == KEY_ESC)
- return false;
- screenline = 3;
- Jdb::cursor(3, 1);
- }
+ {
+ printf(" any key for next page or <ESC>");
+ Jdb::cursor(screenline, 33);
+ c = Jdb_core::getchar();
+ printf("\r\033[K");
+ if (c == KEY_ESC)
+ return false;
+ screenline = 3;
+ Jdb::cursor(3, 1);
+ }
}
puts(Jdb_screen::Line);