You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.0 KiB
C

/* Copyright (C) 2021,2022 fef <owo@fef.moe>. All rights reserved. */
#pragma once
#define _ARCH_PAGE_H_
/**
* @brief Data structures and constants for paging on x86 (please end my suffering).
*/
#include <arch/vmparam.h>
#define __HAVE_HUGEPAGES
/** @brief Binary logarithm of `PAGE_SIZE`. */
#define PAGE_SHIFT 12
/** @brief Page size in bytes. */
#define PAGE_SIZE (1 << PAGE_SHIFT)
#ifdef __x86_64__
#include <amd64/page.h>
#else
#include <i386/page.h>
#endif
#define HUGEPAGE_SIZE (1 << HUGEPAGE_SHIFT)
#ifdef __HAVE_GIGAPAGES
#define GIGAPAGE_SIZE (1 << GIGAPAGE_SHIFT)
#endif
#ifndef _ASM_SOURCE
#include <arch/multiboot.h>
/** @brief Initialize `vm_page_array` based on the multiboot memory map. */
void x86_paging_init(struct mb2_tag_mmap *mmap);
/** @brief Pointer bitmask to get the base address of their page. */
#define PAGE_MASK ( ~((unsigned long)PAGE_SIZE - 1) )
/** @brief Pointer bitmask to get the base address of their huge page. */
#define HUGEPAGE_MASK ( ~((unsigned long)HUGEPAGE_SIZE - 1) )
#define PAGE_ALIGN(ptr) ((typeof(ptr))( (uintptr_t)(ptr) & PAGE_MASK ))
#define HUGEPAGE_ALIGN(ptr) ((typeof(ptr))( (uintptr_t)(ptr) & HUGEPAGE_MASK ))
#ifdef __HAVE_GIGAPAGES
#define GIGAPAGE_MASK ( ~((unsigned long)GIGAPAGE_SIZE - 1) )
#define GIGAPAGE_ALIGN(ptr) ((typeof(ptr))( (uintptr_t)(ptr) & GIGAPAGE_MASK ))
#endif
/* page fault status code bits */
#define X86_PF_PRESENT (1u << 0)
#define X86_PF_WRITE (1u << 1)
#define X86_PF_USER (1u << 2)
#define X86_PF_RESERVED (1u << 3)
#define X86_PF_INSTR (1u << 4)
#define X86_PF_PKEY (1u << 5)
#define X86_PF_SHADOW_STACK (1u << 6)
#define X86_PF_SGX (1u << 15)
/**
* @brief Get the physical address a virtual one is currently mapped to.
*
* @param virt virtual address
* @returns The physical address, or -1 cast to `vm_paddr_t` if there is no mapping
*/
vm_paddr_t vtophys(void *virt);
static inline void vm_flush(void)
{
register_t tmp;
__asm__ volatile(
" mov %%cr3, %0 \n"
" mov %0, %%cr3 \n"
: "=r"(tmp)
:
: "memory"
);
}
#endif /* not _ASM_SOURCE */