]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/jdb/jdb_mapdb.cpp
Update
[l4.git] / kernel / fiasco / src / jdb / jdb_mapdb.cpp
index c8d5508673644003d2f85add585e8af7a3c285f5..80f49e83c046e9bec12b0ca074028b5cfbe9ccf2 100644 (file)
@@ -45,12 +45,22 @@ size_str (Mword size)
   return scratchbuf;
 }
 
+static
+unsigned long long
+Jdb_mapdb::val(Mdb_types::Pfn p, Mdb_types::Order base_size)
+{
+  return cxx::int_value<Mdb_types::Pfn>(p << base_size);
+}
+
+
 static
 bool
-Jdb_mapdb::show_tree(Treemap* pages, Page_number address,
-                    unsigned &screenline, unsigned indent = 1)
+Jdb_mapdb::show_tree(Treemap* pages, Mapping::Pcnt offset, Mdb_types::Order base_size,
+                     unsigned &screenline, unsigned indent = 1)
 {
-  Page_number   page = address >> pages->_page_shift;
+  typedef Treemap::Page Page;
+
+  Page       page = pages->trunc_to_page(offset);
   Physframe*    f = pages->frame(page);
   Mapping_tree* t = f->tree.get();
   unsigned      i;
@@ -58,47 +68,49 @@ Jdb_mapdb::show_tree(Treemap* pages, Page_number address,
 
   if (! t)
     {
-      printf(" no mapping tree registered for frame number 0x%x\033[K\n",
-            (unsigned) page.value());
+      printf(" no mapping tree registered for frame number 0x%lx\033[K\n",
+             cxx::int_value<Mapping::Page>(page));
       screenline++;
       return true;
     }
 
-  printf(" mapping tree for %s-page "L4_PTR_FMT" of task %p - header at "
-        L4_PTR_FMT"\033[K\n",
-        size_str (1UL << pages->_page_shift),
-        pages->vaddr(t->mappings()).value(), t->mappings()[0].space(), (Address)t);
+  printf(" mapping tree for %s-page %012llx of task %lx - header at "
+         L4_PTR_FMT "\033[K\n",
+         size_str(1ULL << cxx::int_value<Mdb_types::Order>(pages->_page_shift + base_size)),
+         val(pages->vaddr(t->mappings()), base_size),
+         Kobject_dbg::pointer_to_id(t->mappings()[0].space()),
+         (Address)t);
 #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
@@ -107,57 +119,62 @@ Jdb_mapdb::show_tree(Treemap* pages, Page_number address,
 
   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="L4_PTR_FMT"  task=%lx  depth=",
-                indent + m->depth() > 10 ? 0 : indent + m->depth(),
-                i+1, (Address) m->data(),
-                pages->vaddr(m).value(),
+        {
+          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(),
-                                    address.offset(Page_count::create(1UL << pages->_page_shift)),
-                                    screenline, indent + m->parent()->depth()))
-           return false;
-       }
+        {
+          if (! Jdb_mapdb::show_tree(m->submap(),
+                                     cxx::get_lsb(offset, pages->_page_shift),
+                                     base_size,
+                                     screenline, indent + m->parent()->depth()))
+            return false;
+        }
     }
 
   return true;
@@ -167,117 +184,117 @@ static
 Address
 Jdb_mapdb::end_address (Mapdb* mapdb)
 {
-  return mapdb->_treemap->end_addr().value();
+  return cxx::int_value<Mdb_types::Pfn>(mapdb->_treemap->end_addr());
 }
 
 static
 void
-Jdb_mapdb::show (Page_number page, char which_mapdb)
+Jdb_mapdb::show(Mapping::Pfn page, char which_mapdb)
 {
   unsigned     j;
   int          c;
 
   Jdb::clear_screen();
+  typedef Mdb_types::Order Order;
 
   for (;;)
     {
       Mapdb* mapdb;
       const char* type;
-      Mword page_shift;
-      Page_count super_inc;
+      Mapping::Pcnt super_inc;
+      Mdb_types::Order super_shift;
+      Order base_size = Order(0);
 
       switch (which_mapdb)
-       {
-       case 'm':
-         type = "Phys frame";
-         mapdb = mapdb_instance();
-         page_shift = 0; //Config::PAGE_SHIFT;
-         super_inc = Page_count::create(Config::SUPERPAGE_SIZE / Config::PAGE_SIZE);
-         break;
-#ifdef CONFIG_IO_PROT
-       case 'i':
-         type = "I/O port";
-         mapdb = io_mapdb_instance();
-         page_shift = 0;
-         super_inc = Page_count::create(0x100);
-         break;
+        {
+        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;
+#ifdef CONFIG_PF_PC
+        case 'i':
+          type = "I/O port";
+          mapdb = mapdb_io.get();
+          base_size = Order(0);
+          super_shift = Mdb_types::Order(8);
+          break;
 #endif
-       default:
-         return;
-       }
+        default:
+          return;
+        }
 
-      if (! mapdb->valid_address (page << page_shift))
-       page = Page_number::create(0);
+      super_inc = Mapping::Pcnt(1) << super_shift;
+
+      if (! mapdb->valid_address(page))
+        page = Mapping::Pfn(0);
 
       Jdb::cursor();
-      printf ("%s "L4_PTR_FMT"\033[K\n\033[K\n",
-             type, page.value() << page_shift);
+      printf("%s %012llx\033[K\n\033[K\n", type, val(page, base_size));
 
       j = 3;
 
-      if (! Jdb_mapdb::show_tree (mapdb->_treemap,
-                                 (page << page_shift)
-                                   - mapdb->_treemap->_page_offset,
-                                 j))
-       return;
+      if (! Jdb_mapdb::show_tree(mapdb->_treemap, page - Mapping::Pfn(0), base_size, j))
+        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 << page_shift))
-                page = Page_number::create(0);
-             redraw = true;
-             break;
-           case 'p':
-           case KEY_CURSOR_UP:
-             if (! mapdb->valid_address(--page << page_shift))
-                page = Page_number::create(end_address (mapdb) - 1) >> page_shift;
-             redraw = true;
-             break;
-           case 'N':
-           case KEY_PAGE_DOWN:
-             page = (page + super_inc).trunc(super_inc);
-             if (! mapdb->valid_address(page << page_shift))
-                page = Page_number::create(0);
-             redraw = true;
-             break;
-           case 'P':
-           case KEY_PAGE_UP:
-             page = (page - super_inc).trunc(super_inc);
-             if (! mapdb->valid_address(page << page_shift))
-                page = Page_number::create(end_address (mapdb) - 1) >> page_shift;
-             redraw = true;
-             break;
-           case ' ':
-             if (which_mapdb == 'm')
-#ifdef CONFIG_IO_PROT
-               which_mapdb = 'i';
-             else if (which_mapdb == 'i')
+        {
+          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))
+                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))
+                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))
+                page = Mapping::Pfn(end_address(mapdb) - 1);
+              redraw = true;
+              break;
+            case ' ':
+              if (which_mapdb == 'm')
+#ifdef CONFIG_PF_PC
+                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;
+            }
+        }
     }
 }
 
@@ -299,37 +316,33 @@ Jdb_mapdb::action(int cmd, void *&args, char const *&fmt, int &next_char)
   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;
-
-#ifdef CONFIG_IO_PROT
-       case 'i':
-         fmt = " port: "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;
 #endif
-
-       case 'o':
-         fmt = " object: %x";
-         break;
-       }
+        }
 
       which_mapdb = subcmd;
       args = &pagenum;
@@ -340,10 +353,7 @@ Jdb_mapdb::action(int cmd, void *&args, char const *&fmt, int &next_char)
     return NOTHING;
 
  doit:
-  if (which_mapdb == 'o')
-    Jdb_mapdb::show_simple_tree ((Kobject*)pagenum);
-  else
-    show(Page_number::create(pagenum), which_mapdb);
+  show(Mapping::Pfn(pagenum), which_mapdb);
   return NOTHING;
 }
 
@@ -353,9 +363,9 @@ Jdb_mapdb::cmds() const
 {
   static Cmd cs[] =
     {
-       { 0, "m", "mapdb", "%c",
-         "m[it]<addr>\tshow [I/O,task] 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 },
     };
@@ -382,8 +392,7 @@ static Jdb_mapdb jdb_mapdb INIT_PRIORITY(JDB_MODULE_INIT_PRIO);
 class Jdb_kobject_mapdb_hdl : public Jdb_kobject_handler
 {
 public:
-  Jdb_kobject_mapdb_hdl() : Jdb_kobject_handler(0) {}
-  virtual bool show_kobject(Kobject *, int) { return true; }
+  virtual bool show_kobject(Kobject_common *, int) { return true; }
   virtual ~Jdb_kobject_mapdb_hdl() {}
 };
 
@@ -397,7 +406,7 @@ Jdb_kobject_mapdb_hdl::init()
 
 PUBLIC
 bool
-Jdb_kobject_mapdb_hdl::handle_key(Kobject *o, int keycode)
+Jdb_kobject_mapdb_hdl::handle_key(Kobject_common *o, int keycode)
 {
   if (keycode == 'm')
     {
@@ -433,21 +442,21 @@ Jdb_mapdb::dump_all_cap_trees()
       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)
@@ -466,7 +475,7 @@ IMPLEMENTATION:
 
 static
 bool
-Jdb_mapdb::show_simple_tree(Kobject *f, unsigned indent = 1)
+Jdb_mapdb::show_simple_tree(Kobject_common *f, unsigned indent = 1)
 {
   (void)indent;
   (void)f;
@@ -475,60 +484,64 @@ Jdb_mapdb::show_simple_tree(Kobject *f, unsigned indent = 1)
   int           c;
 
   puts(Jdb_screen::Line);
-  if (!f || !f->map_root()->_root)
+  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;
     }
 
   printf(" mapping tree for object D:%lx (%p) ref_cnt=%ld\n",
-         f->dbg_id(), f, f->map_root()->_cnt);
+         f->dbg_info()->dbg_id(), f, f->map_root()->_cnt);
 
   screenline += 2;
 
-  for (Obj::Mapping* m = f->map_root()->_root; m; m = m->_n)
+  for (Obj::Mapping::List::Iterator m = f->map_root()->_root.begin();
+       m != f->map_root()->_root.end(); ++m)
     {
       Kconsole::console()->getchar_chance();
 
-      Obj::Entry *e = static_cast<Obj::Entry*>(m);
+      Obj::Entry *e = static_cast<Obj::Entry*>(*m);
       Dbg_page_info *pi = Dbg_page_info::table()[Virt_addr(e)];
 
       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*>(Space::space(pi->info<Obj_space::Dbg_info>()->s))->dbg_id();
-         cap_idx += pi->info<Obj_space::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, (unsigned)e->rights(), e->_flags,
-            e->obj());
+      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());
 
       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);
-
-
-
   return true;
 }