X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/92f6e64a6da763c45ff9f4ab5eafcab3d8766dcb..b60166b327a9108b07e3069fa6568a451529ffd9:/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py diff --git a/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py b/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py new file mode 100644 index 0000000..5785376 --- /dev/null +++ b/lunaix-os/scripts/gdb/lunadbg/arch/x86/pte.py @@ -0,0 +1,101 @@ +class PageTableHelperBase: + @staticmethod + def null_mapping(pte): + return pte == 0 + + @staticmethod + def translation_level(level=-1): + raise NotImplementedError() + + @staticmethod + def translation_shift_bits(level): + raise NotImplementedError() + + @staticmethod + def mapping_present(pte): + raise NotImplementedError() + + @staticmethod + def huge_page(pte): + raise NotImplementedError() + + @staticmethod + def protections(pte): + raise NotImplementedError() + + @staticmethod + def other_attributes(level, pte): + raise NotImplementedError() + + @staticmethod + def same_kind(pte1, pte2): + raise NotImplementedError() + + @staticmethod + def physical_pfn(pte): + raise NotImplementedError() + + @staticmethod + def vaddr_width(): + raise NotImplementedError() + +class PageTableHelper32(PageTableHelperBase): + @staticmethod + def translation_level(level = -1): + return [0, 1][level] + + @staticmethod + def translation_shift_bits(level): + return [9, 0][level] + 12 + + @staticmethod + def mapping_present(pte): + return bool(pte & 1) + + @staticmethod + def huge_page(pte): + return bool(pte & (1 << 7)) + + @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 32 + +class PageTableHelper64(PageTableHelperBase): + pass \ No newline at end of file