Skip to content

Page Table

include/mem/page_table.h View source View on GitHub
struct pte_tagged {
    enum pte_tag_type  type;
    uint64_t           payload;
};
enum pte_tag_type : uint8_t {
    PTE_TAG_TYPE_NONE = 0,
    PTE_TAG_TYPE_DEMAND_PAGED = 1,
};
typedef _Atomic uint64_t pte_atomic_t;
void pte_tagged_check(struct pte_tagged *pt);
uint64_t pte_tagged_pack(struct pte_tagged *pt);
struct pte_tagged pte_tagged_unpack(pte_t pte);
bool pte_locked(pte_atomic_t *pte);
uint64_t pte_read(pte_atomic_t *pte);
uint64_t pte_or(pte_atomic_t *pte, uint64_t val);
void pte_unlock_internal(pte_atomic_t *pte);
void pte_lock_internal(pte_atomic_t *pte);
enum irql pte_lock_irql(pte_atomic_t *pte);
void pte_unlock_irql(pte_atomic_t *pte, enum irql old_irql);
bool pte_has_tag(pte_atomic_t *pte);
uint64_t pte_tag_pte(pte_atomic_t *pte, struct pte_tagged *ptag);
struct pte_tagged pte_read_tag(pte_atomic_t *pte);
bool pte_in_use(pte_atomic_t *pte);
#define PT_LEVELS 4
#define PT_SHIFT_L1 12
#define PT_SHIFT_L2 21
#define PT_SHIFT_L3 30
#define PT_SHIFT_L4 39
#define PT_STRIDE 9
#define PTE_LOCK_SHIFT 9
#define PTE_AVAIL2_SHIFT 10
#define PTE_LOCK_BIT ((uint64_t) 1 << PTE_LOCK_SHIFT)
#define PTE_AVAIL2_BIT ((uint64_t) 1 << PTE_AVAIL2_SHIFT)
#define PTE_TAGGED_TYPE_SHIFT (PAGE_PRESENT_SHIFT + 1)
#define PTE_TAGGED_TYPE_MASK 0x3ULL
#define PTE_TAGGED_PAYLOAD_LOW_BITS 6
#define PTE_TAGGED_PAYLOAD_LOW_SHIFT 3 /* packed position of the low chunk */
#define PTE_TAGGED_PAYLOAD_HIGH_SHIFT \
    11 /* packed position of the high chunk \
        */
#define PTE_TAGGED_PAYLOAD_LOW_MASK ((1ULL << PTE_TAGGED_PAYLOAD_LOW_BITS) - 1)
#define PTE_TAGGED_PAYLOAD_BITS \
    (PTE_TAGGED_PAYLOAD_LOW_BITS + (64 - PTE_TAGGED_PAYLOAD_HIGH_SHIFT))
#define PTE_TAGGED_GET_TYPE(pte) \
    (((pte) >> PTE_TAGGED_TYPE_SHIFT) & PTE_TAGGED_TYPE_MASK)
#define PTE_TAGGED_SET_TYPE(type) ((uint64_t) (type) << PTE_TAGGED_TYPE_SHIFT)