65 lines
2.5 KiB
C
65 lines
2.5 KiB
C
/* vim: set ft=cpp.doxygen : */
|
|
#pragma once
|
|
#include <stdint.h>
|
|
|
|
/// The place where the kernel pages are virtually mapped to
|
|
#define KERNEL_VIRT_BASE 0xFFFFFF0000000000
|
|
|
|
/// amd64 standard states that addresses' upper bits are copies of the 47th bit, so these need to be
|
|
/// stripped down to only 48 bits
|
|
#define AMD64_MM_STRIPSX(a) ((uintptr_t) (a) & 0xFFFFFFFFFFFF)
|
|
#define AMD64_MM_ADDRSX(a) (((uintptr_t) (a) & (1ULL << 47)) ? \
|
|
(0xFFFFFF0000000000 | ((uintptr_t) (a))) : \
|
|
((uintptr_t) (a)))
|
|
|
|
#define MM_VIRTUALIZE(a) ((uintptr_t) (a) + 0xFFFFFF0000000000)
|
|
#define MM_PHYS(a) ((uintptr_t) (a) - 0xFFFFFF0000000000)
|
|
|
|
#define MM_PAGE_SIZE 0x1000
|
|
|
|
#define MM_PTE_INDEX_MASK 0x1FF
|
|
#define MM_PTE_COUNT 512
|
|
#define MM_PTE_FLAGS_MASK (0xFFF | MM_PAGE_NOEXEC)
|
|
#define MM_PTE_MASK (~MM_PTE_FLAGS_MASK)
|
|
|
|
#define MM_PAGE_MASK (~0xFFF)
|
|
|
|
// Same as L1 mask
|
|
#define MM_PAGE_OFFSET_MASK 0xFFF
|
|
#define MM_PAGE_L2_OFFSET_MASK ((1 << MM_PDI_SHIFT) - 1)
|
|
#define MM_PAGE_L3_OFFSET_MASK ((1 << MM_PDPTI_SHIFT) - 1)
|
|
#define MM_PAGE_L4_OFFSET_MASK ((1 << MM_PML4I_SHIFT) - 1)
|
|
|
|
#define MM_PTI_SHIFT 12
|
|
#define MM_PDI_SHIFT 21
|
|
#define MM_PDPTI_SHIFT 30
|
|
#define MM_PML4I_SHIFT 39
|
|
|
|
#define MM_PAGE_PRESENT (1ULL << 0)
|
|
#define MM_PAGE_WRITE (1ULL << 1)
|
|
#define MM_PAGE_USER (1ULL << 2)
|
|
#define MM_PAGE_WT (1ULL << 3)
|
|
#define MM_PAGE_NOCACHE (1ULL << 4)
|
|
#define MM_PAGE_ACCESSED (1ULL << 5)
|
|
#define MM_PAGE_DIRTY (1ULL << 6)
|
|
#define MM_PAGE_HUGE (1ULL << 7)
|
|
#define MM_PAGE_GLOBAL (1ULL << 8)
|
|
#define MM_PAGE_NOEXEC (1ULL << 63)
|
|
|
|
/// Page map level 4
|
|
typedef uint64_t *mm_pml4_t;
|
|
/// Page directory pointer table
|
|
typedef uint64_t *mm_pdpt_t;
|
|
/// Page directory
|
|
typedef uint64_t *mm_pagedir_t;
|
|
/// Page table
|
|
typedef uint64_t *mm_pagetab_t;
|
|
|
|
/// Virtual memory space
|
|
typedef mm_pml4_t mm_space_t;
|
|
|
|
/// Kernel memory space
|
|
extern mm_space_t mm_kernel;
|
|
|
|
void amd64_mm_init(void);
|