blob: 0ebe89c0e98526e69b86eca7bde25db639af351c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#pragma once
#include <stddef.h>
#define PAGE_MAP_LEVELS 4
#define PAGE_MAP_BITS 9
#define PAGE_OFFSET_BITS 12
#define PAGE_PR (1ULL << 0)
#define PAGE_WR (1ULL << 1)
#define PAGE_US (1ULL << 2)
#define PAGE_LG (1ULL << 7)
#define PAGE_NX (1ULL << 63)
#define PAGE_SIZE 0x1000
#define PAGE_OFFSET_MASK (PAGE_SIZE - 1)
#define PAGE_ADDRESS_MASK 0x0007fffffffff000
#define PAGE_ATTRIBUTE_MASK 0xf800000000000fff
#define PAGE_SIZE_LARGE 0x200000
#define PAGE_OFFSET_MASK_LARGE (PAGE_SIZE_LARGE - 1)
#define PAGE_ADDRESS_MASK_LARGE 0x0007ffffffe00000
#define PAGE_ATTRIBUTE_MASK_LARGE 0xf800000000001fff
#define PAGE_SIZE_HUGE 0x40000000
#define PAGE_TABLE_INDEX_MASK ((1 << PAGE_MAP_BITS) - 1)
#define pte_index_bits(l) (PAGE_OFFSET_BITS + PAGE_MAP_BITS * (l - 1))
#define pte_index(v, l) (((uintptr_t)v >> pte_index_bits(l)) & PAGE_TABLE_INDEX_MASK)
#define page_size(l) (1 << pte_index_bits(l))
#define page_address(a, l) ((uintptr_t)(a) & ~(page_size(l) - 1))
#define page_offset(a, l) ((uintptr_t)(a) & (page_size(l) - 1))
#define page_count(s, l) (((s + page_size(l) - 1) & ~(page_size(l) - 1)) / page_size(l))
#define page_align(a, l) ((page_size(l) + (uintptr_t)(a)) & ~(page_size(l) - 1))
|