Skip to content

Page

include/mem/page.h View source View on GitHub
struct page {
    uint64_t  meta;
};
struct page_table {
    pte_t  entries[512];
};
enum page_tag {
    PAGE_TAG_NONE = 0,
    PAGE_TAG_BUDDY = 1,
    PAGE_TAG_FOLIO = 2,
    PAGE_TAG_ARENA = 3,
};
enum page_tag page_get_tag(const struct page *p);
void page_set_tag(struct page *p, enum page_tag tag);
uint64_t page_get_payload(const struct page *p);
void page_set_payload(struct page *p, uint64_t payload);
void page_assert_tag(const struct page *p, enum page_tag expected);
struct page page_for_pfn(pfn_t pfn);
struct page page_for_paddr(paddr_t paddr);
pfn_t page_get_pfn(const struct page *bp);
paddr_t page_get_paddr(const struct page *bp);
vaddr_t page_get_vaddr(const struct page *bp);
#define PAGE_SIZE KB(4)
#define PAGE_2MB MB(2)
#define PAGE_1GB GB(1)
#define PAGE_PRESENT_SHIFT (0)
#define PAGE_PRESENT (0x1UL)
#define PAGE_WRITE (0x2UL)
#define PAGE_USER_ALLOWED (0x4UL)
#define PAGE_ALL 0xFFFUL
#define PAGE_XD (1UL << 63) // E(x)ecute (D)isable
#define PAGE_PHYS_MASK (0x00FFFFFFF000UL)
#define PAGE_PAGE_SIZE (1UL << 7)
#define PAGE_UNCACHABLE ((1UL << 4) | PAGE_WRITE)
#define PAGE_NO_FLAGS (0)
#define PAGE_WRITETHROUGH (1UL << 3)
#define PAGE_2MB_page (1ULL << 7)
#define PAGE_PAGEABLE (0)
#define PAGE_MOVABLE (0)
#define PAGE_2MB_PHYS_MASK (~((uintptr_t) PAGE_2MB - 1))
#define PAGE_ALIGN_DOWN(x) ALIGN_DOWN((uintptr_t) (x), PAGE_SIZE)
#define PAGE_ALIGN_UP(x) ALIGN_UP((uintptr_t) (x), PAGE_SIZE)
#define IS_PAGE_ALIGNED(x) IS_ALIGNED((uintptr_t) (x), PAGE_SIZE)
#define PAGE_2MB_ALIGN_DOWN(x) ALIGN_DOWN((uintptr_t) (x), PAGE_2MB)
#define PAGE_2MB_ALIGN_UP(x) ALIGN_UP((uintptr_t) (x), PAGE_2MB)
#define PAGE_1GB_ALIGN_DOWN(x) ALIGN_DOWN((uintptr_t) (x), PAGE_1GB)
#define PAGE_1GB_ALIGN_UP(x) ALIGN_UP((uintptr_t) (x), PAGE_1GB)
#define PAGE_TO_PFN(addr) ((addr) / PAGE_SIZE)
#define PFN_TO_PAGE(pfn) ((pfn) * PAGE_SIZE)
#define PAGES_NEEDED_FOR(bytes) (((bytes) + PAGE_SIZE - 1ULL) / PAGE_SIZE)
#define VMM_MAP_BASE 0xFFFFA00000200000
#define VMM_MAP_LIMIT 0xFFFFA00010000000
#define PT_ENTRIES 512
#define PT_INDEX_MASK 0x1FFULL
#define PAGE_4K_SHIFT 12
#define PAGE_2M_SHIFT 21
#define PAGE_1G_SHIFT 30
#define PAGE_4K_MASK ((1ULL << PAGE_4K_SHIFT) - 1)
#define PAGE_2M_MASK ((1ULL << PAGE_2M_SHIFT) - 1)
#define PAGE_TAG_MASK 0x7ULL
#define PAGE_PAYLOAD_ALIGNMENT 8