]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/ia32/64/jdb_ptab-amd64.cpp
a3aaa2e20a0d5df019e2f22eb29df5ced41e2803
[l4.git] / kernel / fiasco / src / jdb / ia32 / 64 / jdb_ptab-amd64.cpp
1 IMPLEMENTATION [amd64]:
2
3 #include "paging.h"
4
5 unsigned Jdb_ptab::max_pt_level = Pdir::Depth;
6
7 IMPLEMENT inline NEEDS ["paging.h"]
8 unsigned
9 Jdb_ptab::entry_is_pt_ptr(Mword entry, unsigned level,
10                           unsigned *entries, unsigned *next_level)
11 {
12   if (level > Pdir::Super_level || entry & Pt_entry::Pse_bit)
13     return 0;
14   *entries = Ptab::Level<Pdir::Traits, Pdir::Depth>::length(level);
15   *next_level = level+1;
16   return 1;
17 }
18
19 IMPLEMENT inline NEEDS ["paging.h"]
20 Address
21 Jdb_ptab::entry_phys(Mword entry, unsigned level)
22 {
23   return Ptab::Level<Pdir::Traits, Pdir::Depth>::addr(level, entry);
24 }
25
26 IMPLEMENT inline NEEDS ["paging.h"]
27 unsigned
28 Jdb_ptab::entry_valid(Mword entry, unsigned)
29 { return entry & Pt_entry::Valid; }
30
31 IMPLEMENT
32 void
33 Jdb_ptab::print_entry(Mword entry, unsigned level)
34 {
35   if (dump_raw)
36     {
37       printf(L4_PTR_FMT, entry);
38       return;
39     }
40
41   if (!entry_valid(entry,level))
42     {
43       putstr("        -       ");
44       return;
45     }
46
47   Address phys = entry_phys(entry, level);
48
49   if (level == Pdir::Super_level && entry & Pt_entry::Pse_bit)
50     printf((phys >> 20) > 0xFF
51            ? "       %03lx/2" : "        %02lx/2", phys >> 20);
52   else
53     printf((phys >> Config::PAGE_SHIFT) > 0xFFFF
54            ? "%13lx" : "         %04lx", phys >> Config::PAGE_SHIFT);
55
56   putchar(((cur_pt_level>=max_pt_level || (entry & Pt_entry::Pse_bit)) &&
57          (entry & Pt_entry::Cpu_global)) ? '+' : '-');
58   printf("%s%c%s", entry & Pt_entry::Noncacheable ? JDB_ANSI_COLOR(lightblue) : "",
59                    entry & Pt_entry::Noncacheable
60                     ? 'n' : (entry & Pt_entry::Write_through) ? 't' : '-',
61                    entry & Pt_entry::Noncacheable ? JDB_ANSI_END : "");
62   putchar(entry & Pt_entry::User
63             ? (entry & Pt_entry::Writable) ? 'w' : 'r'
64             : (entry & Pt_entry::Writable) ? 'W' : 'R');
65 }
66
67 PUBLIC
68 unsigned long
69 Jdb_ptab::rows() const
70 {  return entries/4; }
71
72 PRIVATE
73 Address
74 Jdb_ptab::disp_virt(unsigned long row, unsigned col)
75 {
76   Pdir::Va e(Mword(col-1) + (Mword(row) * Mword(cols()-1)));
77   e <<= Ptab::Level<Pdir::Traits, Pdir::Depth>::shift(cur_pt_level);
78   return Virt_addr(e).value() + virt_base;
79 }
80
81 PUBLIC
82 void
83 Jdb_ptab::print_statline(unsigned long row, unsigned long col)
84 {
85   if (cur_pt_level == 0)
86     {
87       Jdb::printf_statline("pml4", "<Space>=mode <CR>=goto pdp",
88           "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
89     }
90   else if (cur_pt_level == 1)
91     {
92       Jdb::printf_statline("pdp", "<Space>=mode <CR>=goto pdir",
93           "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
94     }
95   else if (cur_pt_level == 2)
96     {
97       Jdb::printf_statline("pdir", "<Space>=mode <CR>=goto ptab/superpage",
98           "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
99     }
100   else // PT_MODE
101     {
102       Jdb::printf_statline("ptab", "<Space>=mode <CR>=goto page",
103           "<" L4_PTR_FMT "> task %p", disp_virt(row,col), _task);
104     }
105 }