|
XenevaOS
|
#include <stdint.h>#include <aurora.h>
Go to the source code of this file.
Macros | |
| #define | PTE_VALID (1ULL << 0) |
| #define | PTE_TABLE (1ULL << 1) |
| #define | PTE_BLOCK (0ULL << 1) |
| #define | PTE_AF (1ULL << 10) |
| #define | PTE_SH_INNER (3ULL << 8) |
| #define | PTE_AP_RW (0ULL << 6) |
| #define | PTE_AP_RW_USER (1ULL << 6) |
| #define | PTE_ATTR_IDX_0 (0ULL << 2) |
| #define | PTE_ATTR_IDX_1 (1ULL << 2) |
| #define | PTE_USER_EXECUTABLE (0ULL << 54) |
| #define | PTE_KERNEL_EXECUTABLE (0ULL << 53) |
| #define | PTE_USER_NOT_EXECUTABLE (1ULL << 54) |
| #define | PTE_KERNEL_NOT_EXECUTABLE (1ULL << 53) |
| #define | PTE_NORMAL_MEM PTE_ATTR_IDX_1 |
| #define | PTE_DEVICE_MEM PTE_ATTR_IDX_0 |
| #define | PTE_NORMAL_NON_CACHEABLE (2ULL << 2) |
| #define | PHYSICAL_MEM_BASE 0xFFFF800000000000 |
| #define | MMIO_BASE 0xFFFFFF1000000000 |
| #define | PAGE_SHIFT 12 |
| #define | VIRT_GETPAGE_CREATE (1<<0) |
| #define | VIRT_GETPAGE_ONLY_RET (1<<1) |
| #define | KERNEL_BASE_ADDRESS 0xFFFFE00000000000 |
| #define | USER_BASE_ADDRESS 0x0000000060000000 |
| #define | USER_END_ADDRESS 0x0000000080000000 |
| #define | PAGE_SIZE (1ULL << PAGE_SHIFT) |
| #define | PAGE_MASK (PAGE_SIZE - 1) |
| #define | VIRT_ADDR_ALIGN(vaddr) (vaddr & ~(PAGE_SIZE - 1)) |
| #define | PAGE_ALIGN(value) (((PAGE_SIZE-1)&value) ? ((value + PAGE_SIZE) & ~(PAGE_SIZE-1)) : value) |
Functions | |
| void | AuVmmngrInitialize () |
| AuVmmngrInitialize – initialize the virtual memory manager. | |
| AU_EXTERN AU_EXPORT AuVPage * | AuVmmngrGetPage (uint64_t virt_addr, uint8_t flags, uint8_t mode) |
| AU_EXTERN AU_EXPORT bool | AuMapPage (uint64_t phys_addr, uint64_t virt_addr, uint8_t attrib) |
| AuMapPage – Maps a virtual page to physical frame. | |
| AU_EXTERN AU_EXPORT bool | AuMapPageEx (uint64_t *pml4i, uint64_t phys_addr, uint64_t virt_addr, uint8_t attrib) |
| AuMapPageEx – Maps a virtual page to physical frame in given page level. | |
| AU_EXTERN AU_EXPORT void * | AuMapMMIO (uint64_t phys_addr, size_t page_count) |
| AuMapMMIO – Maps Memory Mapped I/O addresses. | |
| AU_EXTERN AU_EXPORT uint64_t * | AuGetFreePage (bool user, void *ptr) |
| AuGetFreePage – Checks for free page. | |
| AU_EXTERN AU_EXPORT void | AuFreePages (uint64_t virt_addr, bool free_physical, size_t s) |
| AuFreePages – frees up contiguous pages. | |
| AU_EXTERN AU_EXPORT void | AuUpdatePageFlags (uint64_t virt_addr, uint64_t flags) |
| AuFreePages – frees up contiguous pages. | |
| AU_EXTERN AU_EXPORT void * | AuGetPhysicalAddress (uint64_t virt_addr) |
| AuGetPhysicalAddress – returns the physical address from a virtual address. | |
| AU_EXTERN AU_EXPORT void * | AuGetPhysicalAddressEx (uint64_t *cr3, uint64_t virt_addr) |
| AU_EXTERN AU_EXPORT uint64_t * | AuCreateVirtualAddressSpace () |
| AuCreateVirtualAddressSpace – create a new virtual address space. | |
| AU_EXTERN AU_EXPORT uint64_t * | AuGetRootPageTable () |
| void | AuVmmngrBootFree () |
| void | AuVmmngrCloneAddressSpace (uint64_t *destcr3, uint64_t *srccr3) |
| AuVmmngrCloneAddressSpace – clones a given address space. | |
BSD 2-Clause License
Copyright (c) 2022-2023, Manas Kamal Choudhury All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
| #define KERNEL_BASE_ADDRESS 0xFFFFE00000000000 |
| #define MMIO_BASE 0xFFFFFF1000000000 |
| #define PAGE_ALIGN | ( | value | ) | (((PAGE_SIZE-1)&value) ? ((value + PAGE_SIZE) & ~(PAGE_SIZE-1)) : value) |
| #define PAGE_MASK (PAGE_SIZE - 1) |
| #define PAGE_SHIFT 12 |
| #define PAGE_SIZE (1ULL << PAGE_SHIFT) |
| #define PHYSICAL_MEM_BASE 0xFFFF800000000000 |
| #define PTE_AF (1ULL << 10) |
| #define PTE_AP_RW (0ULL << 6) |
| #define PTE_AP_RW_USER (1ULL << 6) |
| #define PTE_ATTR_IDX_0 (0ULL << 2) |
| #define PTE_ATTR_IDX_1 (1ULL << 2) |
| #define PTE_BLOCK (0ULL << 1) |
| #define PTE_DEVICE_MEM PTE_ATTR_IDX_0 |
| #define PTE_KERNEL_EXECUTABLE (0ULL << 53) |
| #define PTE_KERNEL_NOT_EXECUTABLE (1ULL << 53) |
| #define PTE_NORMAL_MEM PTE_ATTR_IDX_1 |
| #define PTE_NORMAL_NON_CACHEABLE (2ULL << 2) |
| #define PTE_SH_INNER (3ULL << 8) |
| #define PTE_TABLE (1ULL << 1) |
| #define PTE_USER_EXECUTABLE (0ULL << 54) |
| #define PTE_USER_NOT_EXECUTABLE (1ULL << 54) |
| #define PTE_VALID (1ULL << 0) |
| #define USER_BASE_ADDRESS 0x0000000060000000 |
| #define USER_END_ADDRESS 0x0000000080000000 |
| #define VIRT_ADDR_ALIGN | ( | vaddr | ) | (vaddr & ~(PAGE_SIZE - 1)) |
| #define VIRT_GETPAGE_CREATE (1<<0) |
| #define VIRT_GETPAGE_ONLY_RET (1<<1) |
AuCreateVirtualAddressSpace – create a new virtual address space.
AuFreePages – frees up contiguous pages.
| virt_addr | – starting virtual address |
| free_physical | – free up physical frame |
| size_t | s – size of area to be freed |
AuGetFreePage – Checks for free page.
| user | – specifies if it needs to look from user base address |
| ptr | – if it is non-null, than lookup begins from given pointer |
AuGetPhysicalAddress – returns the physical address from a virtual address.
| virt_addr | – Virtual address |
AuMapMMIO – Maps Memory Mapped I/O addresses.
| phys_addr | – MMIO physical address |
| page_count | – number of pages |
AuMapPage – Maps a virtual page to physical frame.
| phys_addr | – physical address |
| virt_addr | – virtual address |
| attrib | – Page attributes |
| AU_EXTERN AU_EXPORT bool AuMapPageEx | ( | uint64_t * | pml4i, |
| uint64_t | phys_addr, | ||
| uint64_t | virt_addr, | ||
| uint8_t | attrib | ||
| ) |
AuMapPageEx – Maps a virtual page to physical frame in given page level.
| pml4i | – root page level pointer |
| phys_addr | – physical address |
| virt_addr | – virtual address |
| attrib | – Page attributes |
AuFreePages – frees up contiguous pages.
| virt_addr | – starting virtual address |
| flags | – flags to update |
|
extern |
@breif AuVmmngrBootFree – free up the lower half of kernel address space
AuVmmngrCloneAddressSpace – clones a given address space.
| destcr3 | – destination cr3 |
| srccr3 | – source cr3 |
@breif AuVmmngrGetPage – Returns virtual page from virtual address in AuVPage format
| virt_addr | – Virtual address |
| _flags | – extra virtual page flags, this is set only if mode is set to VMMNGR_GETPAGE_CREATE |
| mode | – specifies whether to create a virtual page if its not present |
|
extern |
AuVmmngrInitialize – initialize the virtual memory manager.