]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/jdb/ia32/64/jdb_ptab-amd64.cpp
update
[l4.git] / kernel / fiasco / src / jdb / ia32 / 64 / jdb_ptab-amd64.cpp
index a3aaa2e20a0d5df019e2f22eb29df5ced41e2803..ac2c8a4bc60c45f92dfa8ff26b04b44af39446d1 100644 (file)
@@ -2,104 +2,41 @@ IMPLEMENTATION [amd64]:
 
 #include "paging.h"
 
-unsigned Jdb_ptab::max_pt_level = Pdir::Depth;
-
-IMPLEMENT inline NEEDS ["paging.h"]
-unsigned
-Jdb_ptab::entry_is_pt_ptr(Mword entry, unsigned level,
-                          unsigned *entries, unsigned *next_level)
-{
-  if (level > Pdir::Super_level || entry & Pt_entry::Pse_bit)
-    return 0;
-  *entries = Ptab::Level<Pdir::Traits, Pdir::Depth>::length(level);
-  *next_level = level+1;
-  return 1;
-}
-
-IMPLEMENT inline NEEDS ["paging.h"]
-Address
-Jdb_ptab::entry_phys(Mword entry, unsigned level)
-{
-  return Ptab::Level<Pdir::Traits, Pdir::Depth>::addr(level, entry);
-}
-
-IMPLEMENT inline NEEDS ["paging.h"]
-unsigned
-Jdb_ptab::entry_valid(Mword entry, unsigned)
-{ return entry & Pt_entry::Valid; }
-
 IMPLEMENT
 void
-Jdb_ptab::print_entry(Mword entry, unsigned level)
+Jdb_ptab::print_entry(Pdir::Pte_ptr const &entry)
 {
   if (dump_raw)
     {
-      printf(L4_PTR_FMT, entry);
+      printf(L4_PTR_FMT, *entry.pte);
       return;
     }
 
-  if (!entry_valid(entry,level))
+  if (!entry.is_valid())
     {
       putstr("        -       ");
       return;
     }
 
-  Address phys = entry_phys(entry, level);
+  Address phys = entry_phys(entry);
 
-  if (level == Pdir::Super_level && entry & Pt_entry::Pse_bit)
+  if (entry.level != Pdir::Depth && entry.is_leaf())
     printf((phys >> 20) > 0xFF
           ? "       %03lx/2" : "        %02lx/2", phys >> 20);
   else
     printf((phys >> Config::PAGE_SHIFT) > 0xFFFF
            ? "%13lx" : "         %04lx", phys >> Config::PAGE_SHIFT);
 
-  putchar(((cur_pt_level>=max_pt_level || (entry & Pt_entry::Pse_bit)) &&
-        (entry & Pt_entry::Cpu_global)) ? '+' : '-');
-  printf("%s%c%s", entry & Pt_entry::Noncacheable ? JDB_ANSI_COLOR(lightblue) : "",
-                   entry & Pt_entry::Noncacheable
-                    ? 'n' : (entry & Pt_entry::Write_through) ? 't' : '-',
-                   entry & Pt_entry::Noncacheable ? JDB_ANSI_END : "");
-  putchar(entry & Pt_entry::User
-           ? (entry & Pt_entry::Writable) ? 'w' : 'r'
-           : (entry & Pt_entry::Writable) ? 'W' : 'R');
+  putchar(((cur_pt_level >= Pdir::Depth || entry.is_leaf()) &&
+        (*entry.pte & Pt_entry::Cpu_global)) ? '+' : '-');
+  printf("%s%c%s", *entry.pte & Pt_entry::Noncacheable ? JDB_ANSI_COLOR(lightblue) : "",
+                   *entry.pte & Pt_entry::Noncacheable
+                    ? 'n' : (*entry.pte & Pt_entry::Write_through) ? 't' : '-',
+                   *entry.pte & Pt_entry::Noncacheable ? JDB_ANSI_END : "");
+  putchar(*entry.pte & Pt_entry::User
+           ? (*entry.pte & Pt_entry::Writable) ? 'w' : 'r'
+           : (*entry.pte & Pt_entry::Writable) ? 'W' : 'R');
 }
 
-PUBLIC
-unsigned long
-Jdb_ptab::rows() const
-{  return entries/4; }
 
-PRIVATE
-Address
-Jdb_ptab::disp_virt(unsigned long row, unsigned col)
-{
-  Pdir::Va e(Mword(col-1) + (Mword(row) * Mword(cols()-1)));
-  e <<= Ptab::Level<Pdir::Traits, Pdir::Depth>::shift(cur_pt_level);
-  return Virt_addr(e).value() + virt_base;
-}
 
-PUBLIC
-void
-Jdb_ptab::print_statline(unsigned long row, unsigned long col)
-{
-  if (cur_pt_level == 0)
-    {
-      Jdb::printf_statline("pml4", "<Space>=mode <CR>=goto pdp",
-         "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
-    }
-  else if (cur_pt_level == 1)
-    {
-      Jdb::printf_statline("pdp", "<Space>=mode <CR>=goto pdir",
-         "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
-    }
-  else if (cur_pt_level == 2)
-    {
-      Jdb::printf_statline("pdir", "<Space>=mode <CR>=goto ptab/superpage",
-         "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
-    }
-  else // PT_MODE
-    {
-      Jdb::printf_statline("ptab", "<Space>=mode <CR>=goto page",
-         "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
-    }
-}