]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/arm/jdb_ptab-arm.cpp
cf96fd153169fd844bc34d7b46e8bd515523242e
[l4.git] / kernel / fiasco / src / jdb / arm / jdb_ptab-arm.cpp
1 IMPLEMENTATION [arm]:
2
3 #include "paging.h"
4 #include "simpleio.h"
5
6 unsigned Jdb_ptab::max_pt_level = 1;
7
8 // -----------------------------------------------------------------------
9 IMPLEMENTATION [arm && armv5]:
10
11 IMPLEMENT inline
12 unsigned
13 Jdb_ptab::entry_valid(Mword entry, unsigned)
14 { return entry & 0x03; }
15
16 IMPLEMENT inline
17 unsigned
18 Jdb_ptab::entry_is_pt_ptr(Mword entry, unsigned level,
19                           unsigned *entries, unsigned *next_level)
20 {
21   if (level > 0 || (entry & 0x03) == 0x02)
22     return 0;
23
24   if ((entry & 0x03) == 0x01)
25     *entries = 256;  // coarse (1KB)
26   else
27     *entries = 1024; // fine (4KB)
28
29   *next_level = 1;
30   return 1;
31 }
32
33 PRIVATE inline
34 bool
35 Jdb_ptab::is_cached(Mword entry, unsigned level)
36 {
37   if (level == 0 && (entry & 3) != 2)
38     return true; /* No caching options on PDEs */
39   return (entry & Page::Cache_mask) == Page::CACHEABLE;
40 }
41
42 PRIVATE inline
43 bool
44 Jdb_ptab::is_executable(Mword entry)
45 {
46   (void)entry;
47   return 1;
48 }
49
50 PRIVATE inline
51 char
52 Jdb_ptab::ap_char(unsigned ap)
53 {
54   return ap & 0x2 ? (ap & 0x1) ? 'w' : 'r'
55                   : (ap & 0x1) ? 'W' : 'R';
56 }
57
58
59 // -----------------------------------------------------------------------
60 IMPLEMENTATION [arm && (armv6 || armv7)]:
61
62 IMPLEMENT inline NEEDS ["paging.h"]
63 unsigned
64 Jdb_ptab::entry_valid(Mword entry, unsigned)
65 { return (entry & 3) == 1 || (entry & 3) == 2; }
66
67 IMPLEMENT inline
68 unsigned
69 Jdb_ptab::entry_is_pt_ptr(Mword entry, unsigned level,
70                           unsigned *entries, unsigned *next_level)
71 {
72   if (level > 0 || (entry & 0x03) == 0x02)
73     return 0;
74
75   *entries = 256;  // coarse (1KB)
76   *next_level = 1;
77   return 1;
78 }
79
80 PRIVATE inline
81 bool
82 Jdb_ptab::is_cached(Mword entry, unsigned level)
83 {
84   if (level == 0)
85     {
86       if ((entry & 3) == 2)
87         return (entry & 0x700c) == 0x5004;
88       return true;
89     }
90
91   return (entry & Page::Cache_mask) == Page::CACHEABLE;
92 }
93
94 PRIVATE inline
95 bool
96 Jdb_ptab::is_executable(Mword entry)
97 {
98   return (entry & 3) == 2 || (entry & 3) == 1;
99 }
100
101 PRIVATE inline
102 char
103 Jdb_ptab::ap_char(unsigned ap)
104 {
105   switch (ap & 0x23)
106   {
107     case    0: return '-';
108     case    1: return 'W';
109     case    2: return 'r';
110     case    3: return 'w';
111     case 0x21: return 'R';
112     case 0x22: case 0x23: return 'r';
113     default: return '?';
114   };
115 }
116
117 // -----------------------------------------------------------------------
118 IMPLEMENTATION [arm]:
119
120 IMPLEMENT inline NEEDS ["paging.h"]
121 Address
122 Jdb_ptab::entry_phys(Mword entry, unsigned level)
123 {
124   unsigned t = entry & 0x03;
125   if (level == 0)
126     {
127       switch(t)
128         {
129         default:
130         case 0:
131           return 0;
132         case 1:
133           return entry & 0xfffffc00;
134         case 2:
135           return entry & 0xfff00000;
136         case 3:
137           return entry & 0xfffff000;
138         }
139     }
140   else
141     {
142       switch (t)
143         {
144         default:
145         case 0:
146           return 0;
147         case 1:
148           return entry & 0xffff0000;
149         case 2:
150           return entry & 0xfffff000;
151         case 3:
152           return entry & 0xfffffc00;
153         }
154     }
155 }
156
157 IMPLEMENT
158 void
159 Jdb_ptab::print_entry(Mword entry, unsigned level)
160 {
161   if (dump_raw)
162     printf("%08lx", entry);
163   else
164     {
165       if (!entry_valid(entry,level))
166         {
167           putstr("    -   ");
168           return;
169         }
170       Address phys = entry_phys(entry, level);
171
172       unsigned t = entry & 0x03;
173       unsigned ap = entry >> 4;
174       char ps;
175       if (level == 0)
176         switch (t)
177           {
178           case 1: ps = 'C'; break;
179           case 2: ps = 'S'; ap = entry >> 10; break;
180           case 3: ps = 'F'; break;
181           default: ps = 'U'; break;
182           }
183       else
184         switch (t)
185           {
186           case 1: ps = 'l'; break;
187           case 2: ps = 's'; break;
188           case 3: ps = 't'; break;
189           default: ps = 'u'; break;
190           }
191
192       printf("%05lx%s%c", phys >> Config::PAGE_SHIFT,
193                           is_cached(entry, level)
194                            ? "-" : JDB_ANSI_COLOR(lightblue) "n" JDB_ANSI_END,
195                           ps);
196       if (level == 0 && t != 2)
197         putchar('-');
198       else
199         printf("%s%c" JDB_ANSI_END,
200                is_executable(entry) ? "" : JDB_ANSI_COLOR(red),
201                ap_char(ap));
202     }
203 }
204
205 PUBLIC
206 unsigned long
207 Jdb_ptab::rows() const
208 { return entries/8; }