add vm probing for x86_64
[lunaix-os.git] / lunaix-os / scripts / gdb / lunadbg / arch / x86 / pte.py
index 57853768bf10058e7ed9860577dc34354a0e64e6..1bf626e31e99ec40eec0d57db460612aca5a6b36 100644 (file)
@@ -38,23 +38,35 @@ class PageTableHelperBase:
     @staticmethod
     def vaddr_width():
         raise NotImplementedError()
+    
+    @staticmethod
+    def pte_size():
+        raise NotImplementedError()
 
 class PageTableHelper32(PageTableHelperBase):
+    @staticmethod
+    def null_mapping(pte):
+        return pte == 0
+    
     @staticmethod
     def translation_level(level = -1):
         return [0, 1][level]
     
+    @staticmethod
+    def pgtable_len():
+        return (1 << 10)
+    
     @staticmethod
     def translation_shift_bits(level):
-        return [9, 0][level] + 12
+        return [10, 0][level] + 12
     
     @staticmethod
     def mapping_present(pte):
         return bool(pte & 1)
     
     @staticmethod
-    def huge_page(pte):
-        return bool(pte & (1 << 7))
+    def huge_page(pte, po):
+        return bool(pte & (1 << 7)) and po 
     
     @staticmethod
     def protections(pte):
@@ -96,6 +108,85 @@ class PageTableHelper32(PageTableHelperBase):
     @staticmethod
     def vaddr_width():
         return 32
+    
+    @staticmethod
+    def pte_size():
+        return 4
+    
+    @staticmethod
+    def vm_mnt():
+        return 0xFFC00000
 
 class PageTableHelper64(PageTableHelperBase):
-    pass
\ No newline at end of file
+    @staticmethod
+    def null_mapping(pte):
+        return pte == 0
+    
+    @staticmethod
+    def translation_level(level = -1):
+        return [0, 1, 2, 3][level]
+    
+    @staticmethod
+    def pgtable_len():
+        return (1 << 9)
+    
+    @staticmethod
+    def translation_shift_bits(level):
+        return [9, 9, 9, 0][level] + 12
+    
+    @staticmethod
+    def mapping_present(pte):
+        return bool(pte & 1)
+    
+    @staticmethod
+    def huge_page(pte, po):
+        return bool(pte & (1 << 7)) and po 
+    
+    @staticmethod
+    def protections(pte):
+        prot = ['R'] # RWXUP
+        if (pte & (1 << 1)):
+            prot.append('W')
+        if (pte & -1):
+            prot.append('X')
+        if (pte & (1 << 2)):
+            prot.append('U')
+        if (pte & (1)):
+            prot.append('P')
+        return prot
+    
+    @staticmethod
+    def other_attributes(level, pte):
+        attrs = []
+        if pte & (1 << 5):
+            attrs.append("A")
+        if pte & (1 << 6):
+            attrs.append("D")
+        if pte & (1 << 3):
+            attrs.append("PWT")
+        if pte & (1 << 4):
+            attrs.append("PCD")
+        if PageTableHelper32.translation_level(level) == 1 and pte & (1 << 8):
+            attrs.append("G")
+        return attrs
+    
+    @staticmethod
+    def same_kind(pte1, pte2):
+        attr_mask = 0x19f  # P, R/W, U/S, PWT, PCD, PS, G
+        return (pte1 & attr_mask) == (pte2 & attr_mask)
+    
+    @staticmethod
+    def physical_pfn(pte):
+        return pte >> 12
+    
+    @staticmethod
+    def vaddr_width():
+        return 48
+    
+    @staticmethod
+    def pte_size():
+        return 8
+    
+    @staticmethod
+    def vm_mnt():
+        return 0xffffff0000000000
\ No newline at end of file