]> 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 64ff3edcde94ed736c3ad9e1a3618465df6df10c..80f49e83c046e9bec12b0ca074028b5cfbe9ccf2 100644 (file)
@@ -56,7 +56,7 @@ Jdb_mapdb::val(Mdb_types::Pfn p, Mdb_types::Order base_size)
 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;
 
@@ -69,7 +69,7 @@ Jdb_mapdb::show_tree(Treemap* pages, Mapping::Pcnt offset, Mdb_types::Order base
   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;
     }
@@ -83,34 +83,34 @@ Jdb_mapdb::show_tree(Treemap* pages, Mapping::Pcnt offset, Mdb_types::Order base
 #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
@@ -119,58 +119,62 @@ Jdb_mapdb::show_tree(Treemap* pages, Mapping::Pcnt offset, Mdb_types::Order base
 
   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;
@@ -202,29 +206,29 @@ Jdb_mapdb::show(Mapping::Pfn page, char which_mapdb)
       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));
@@ -232,65 +236,65 @@ Jdb_mapdb::show(Mapping::Pfn page, char which_mapdb)
       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;
+            }
+        }
     }
 }
 
@@ -312,31 +316,31 @@ 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;
+        {
+        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
         }
 
@@ -359,9 +363,9 @@ Jdb_mapdb::cmds() const
 {
   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 },
     };
@@ -388,7 +392,6 @@ 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_common *, int) { return true; }
   virtual ~Jdb_kobject_mapdb_hdl() {}
 };
@@ -439,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)
@@ -484,7 +487,7 @@ Jdb_mapdb::show_simple_tree(Kobject_common *f, unsigned indent = 1)
   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;
@@ -506,31 +509,36 @@ Jdb_mapdb::show_simple_tree(Kobject_common *f, unsigned indent = 1)
       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);