1 class PageTableHelperBase:
7 def translation_level(level=-1):
8 raise NotImplementedError()
11 def translation_shift_bits(level):
12 raise NotImplementedError()
15 def mapping_present(pte):
16 raise NotImplementedError()
20 raise NotImplementedError()
24 raise NotImplementedError()
27 def other_attributes(level, pte):
28 raise NotImplementedError()
31 def same_kind(pte1, pte2):
32 raise NotImplementedError()
35 def physical_pfn(pte):
36 raise NotImplementedError()
40 raise NotImplementedError()
44 raise NotImplementedError()
46 class PageTableHelper32(PageTableHelperBase):
48 def null_mapping(pte):
52 def translation_level(level = -1):
60 def translation_shift_bits(level):
61 return [10, 0][level] + 12
64 def mapping_present(pte):
68 def huge_page(pte, po):
69 return bool(pte & (1 << 7)) and po
85 def other_attributes(level, pte):
95 if PageTableHelper32.translation_level(level) == 1 and pte & (1 << 8):
100 def same_kind(pte1, pte2):
101 attr_mask = 0x19f # P, R/W, U/S, PWT, PCD, PS, G
102 return (pte1 & attr_mask) == (pte2 & attr_mask)
105 def physical_pfn(pte):
120 class PageTableHelper64(PageTableHelperBase):
122 def null_mapping(pte):
126 def translation_level(level = -1):
127 return [0, 1, 2, 3][level]
134 def translation_shift_bits(level):
135 return [9, 9, 9, 0][level] + 12
138 def mapping_present(pte):
142 def huge_page(pte, po):
143 return bool(pte & (1 << 7)) and po
146 def protections(pte):
159 def other_attributes(level, pte):
169 if PageTableHelper32.translation_level(level) == 1 and pte & (1 << 8):
174 def same_kind(pte1, pte2):
175 attr_mask = 0x19f # P, R/W, U/S, PWT, PCD, PS, G
176 return (pte1 & attr_mask) == (pte2 & attr_mask)
179 def physical_pfn(pte):
192 return 0xffffff0000000000