XenevaOS
Loading...
Searching...
No Matches
Macros | Functions
vmmngr.h File Reference
#include <stdint.h>
#include <aurora.h>
Include dependency graph for vmmngr.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_tAuGetFreePage (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_tAuCreateVirtualAddressSpace ()
 AuCreateVirtualAddressSpace – create a new virtual address space.
 
AU_EXTERN AU_EXPORT uint64_tAuGetRootPageTable ()
 
void AuVmmngrBootFree ()
 
void AuVmmngrCloneAddressSpace (uint64_t *destcr3, uint64_t *srccr3)
 AuVmmngrCloneAddressSpace – clones a given address space.
 

Detailed Description

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:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

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.

Macro Definition Documentation

◆ KERNEL_BASE_ADDRESS

#define KERNEL_BASE_ADDRESS   0xFFFFE00000000000

◆ MMIO_BASE

#define MMIO_BASE   0xFFFFFF1000000000

◆ PAGE_ALIGN

#define PAGE_ALIGN (   value)    (((PAGE_SIZE-1)&value) ? ((value + PAGE_SIZE) & ~(PAGE_SIZE-1)) : value)

◆ PAGE_MASK

#define PAGE_MASK   (PAGE_SIZE - 1)

◆ PAGE_SHIFT

#define PAGE_SHIFT   12

◆ PAGE_SIZE

#define PAGE_SIZE   (1ULL << PAGE_SHIFT)

◆ PHYSICAL_MEM_BASE

#define PHYSICAL_MEM_BASE   0xFFFF800000000000

◆ PTE_AF

#define PTE_AF   (1ULL << 10)

◆ PTE_AP_RW

#define PTE_AP_RW   (0ULL << 6)

◆ PTE_AP_RW_USER

#define PTE_AP_RW_USER   (1ULL << 6)

◆ PTE_ATTR_IDX_0

#define PTE_ATTR_IDX_0   (0ULL << 2)

◆ PTE_ATTR_IDX_1

#define PTE_ATTR_IDX_1   (1ULL << 2)

◆ PTE_BLOCK

#define PTE_BLOCK   (0ULL << 1)

◆ PTE_DEVICE_MEM

#define PTE_DEVICE_MEM   PTE_ATTR_IDX_0

◆ PTE_KERNEL_EXECUTABLE

#define PTE_KERNEL_EXECUTABLE   (0ULL << 53)

◆ PTE_KERNEL_NOT_EXECUTABLE

#define PTE_KERNEL_NOT_EXECUTABLE   (1ULL << 53)

◆ PTE_NORMAL_MEM

#define PTE_NORMAL_MEM   PTE_ATTR_IDX_1

◆ PTE_NORMAL_NON_CACHEABLE

#define PTE_NORMAL_NON_CACHEABLE   (2ULL << 2)

◆ PTE_SH_INNER

#define PTE_SH_INNER   (3ULL << 8)

◆ PTE_TABLE

#define PTE_TABLE   (1ULL << 1)

◆ PTE_USER_EXECUTABLE

#define PTE_USER_EXECUTABLE   (0ULL << 54)

◆ PTE_USER_NOT_EXECUTABLE

#define PTE_USER_NOT_EXECUTABLE   (1ULL << 54)

◆ PTE_VALID

#define PTE_VALID   (1ULL << 0)

◆ USER_BASE_ADDRESS

#define USER_BASE_ADDRESS   0x0000000060000000

◆ USER_END_ADDRESS

#define USER_END_ADDRESS   0x0000000080000000

◆ VIRT_ADDR_ALIGN

#define VIRT_ADDR_ALIGN (   vaddr)    (vaddr & ~(PAGE_SIZE - 1))

◆ VIRT_GETPAGE_CREATE

#define VIRT_GETPAGE_CREATE   (1<<0)

◆ VIRT_GETPAGE_ONLY_RET

#define VIRT_GETPAGE_ONLY_RET   (1<<1)

Function Documentation

◆ AuCreateVirtualAddressSpace()

AU_EXTERN AU_EXPORT uint64_t * AuCreateVirtualAddressSpace ( )

AuCreateVirtualAddressSpace – create a new virtual address space.

Returns
pointer to newly created address space

◆ AuFreePages()

AU_EXTERN AU_EXPORT void AuFreePages ( uint64_t  virt_addr,
bool  free_physical,
size_t  s 
)

AuFreePages – frees up contiguous pages.

Parameters
virt_addr– starting virtual address
free_physical– free up physical frame
size_ts – size of area to be freed

◆ AuGetFreePage()

AU_EXTERN AU_EXPORT uint64_t * AuGetFreePage ( bool  user,
void *  ptr 
)

AuGetFreePage – Checks for free page.

Parameters
user– specifies if it needs to look from user base address
ptr– if it is non-null, than lookup begins from given pointer
Returns
pointer to free virtual page

◆ AuGetPhysicalAddress()

AU_EXTERN AU_EXPORT void * AuGetPhysicalAddress ( uint64_t  virt_addr)

AuGetPhysicalAddress – returns the physical address from a virtual address.

Parameters
virt_addr– Virtual address
Returns
the physical address of respected virtual address

◆ AuGetPhysicalAddressEx()

AU_EXTERN AU_EXPORT void * AuGetPhysicalAddressEx ( uint64_t cr3,
uint64_t  virt_addr 
)

◆ AuGetRootPageTable()

AU_EXTERN AU_EXPORT uint64_t * AuGetRootPageTable ( )

◆ AuMapMMIO()

AU_EXTERN AU_EXPORT void * AuMapMMIO ( uint64_t  phys_addr,
size_t  page_count 
)

AuMapMMIO – Maps Memory Mapped I/O addresses.

Parameters
phys_addr– MMIO physical address
page_count– number of pages
Returns
Pointer to newly mapped virtual mmio address

◆ AuMapPage()

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.

Parameters
phys_addr– physical address
virt_addr– virtual address
attrib– Page attributes
Returns
1 on success 0 on failure

◆ AuMapPageEx()

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.

Parameters
pml4i– root page level pointer
phys_addr– physical address
virt_addr– virtual address
attrib– Page attributes
Returns
1 on success, 0 on failure

◆ AuUpdatePageFlags()

AU_EXTERN AU_EXPORT void AuUpdatePageFlags ( uint64_t  virt_addr,
uint64_t  flags 
)

AuFreePages – frees up contiguous pages.

Parameters
virt_addr– starting virtual address
flags– flags to update

◆ AuVmmngrBootFree()

void AuVmmngrBootFree ( )
extern

@breif AuVmmngrBootFree – free up the lower half of kernel address space

◆ AuVmmngrCloneAddressSpace()

void AuVmmngrCloneAddressSpace ( uint64_t destcr3,
uint64_t srccr3 
)
extern

AuVmmngrCloneAddressSpace – clones a given address space.

Parameters
destcr3– destination cr3
srccr3– source cr3

◆ AuVmmngrGetPage()

AU_EXTERN AU_EXPORT AuVPage * AuVmmngrGetPage ( uint64_t  virt_addr,
uint8_t  _flags,
uint8_t  mode 
)

@breif AuVmmngrGetPage – Returns virtual page from virtual address in AuVPage format

Parameters
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
Returns
virtual page from virtual address in AuVPage format

◆ AuVmmngrInitialize()

void AuVmmngrInitialize ( )
extern

AuVmmngrInitialize – initialize the virtual memory manager.