15#define EXPORT_SYMBOL(sym) \
16 __attribute__((used, visibility("default"))) void* __export_##sym = &sym
56 uint64_t index1 = (virt >> 12) & 0x1ff;
58 uint64_t index4 = (virt >> 39) & 0x1ff;
59 uint64_t index3 = (virt >> 30) & 0x1ff;
60 uint64_t index2 = (virt >> 21) & 0x1ff;
75 asm volatile(
"invlpg (%0)" ::
"r"(virt) :
"memory");
79 for (
uint64_t i = 0; i < VOXIA_PHYS_MAX_WINDOW_COUNT; i++) {
88 LOG_INFO(
"PAGING",
"mapping physwindow_pt 0x%lx to 0x%lx",
98 for (
uint64_t i = 0; i < 0x80000000; i += 0x1000) {
112 LOG_INFO(
"PAGING",
"paging setup done");
118 serial_trace(
"Debugging virtual address: 0x%lx\n", virt);
120 uint64_t index4 = (virt >> 39) & 0x1ff;
121 uint64_t index3 = (virt >> 30) & 0x1ff;
122 uint64_t index2 = (virt >> 21) & 0x1ff;
123 uint64_t index1 = (virt >> 12) & 0x1ff;
130 serial_trace(
"PML4[%lu] = 0x%lx flags 0b%b\n", index4, p4[index4],
133 if (!(p4[index4] & 1)) {
145 serial_trace(
"PDPT[%lu] = 0x%lx flags 0b%b\n", index3, pdpt[index3],
146 pdpt[index3] & 0xFFF);
148 if (!(pdpt[index3] & 1)) {
161 serial_trace(
"PDP[%lu] = 0x%lx flags 0b%b\n", index2, pdp[index2],
162 pdp[index2] & 0xFFF);
164 if (!(pdp[index2] & 1)) {
178 serial_trace(
"PT[%lu] = 0x%lx flags 0b%b\n", index1, pt[index1],
181 if (!(pt[index1] & 1))
215 for (
int i = 256; i < 512; i++)
226 uint64_t index4 = (virt >> 39) & 0x1ff;
227 uint64_t index3 = (virt >> 30) & 0x1ff;
228 uint64_t index2 = (virt >> 21) & 0x1ff;
229 uint64_t index1 = (virt >> 12) & 0x1ff;
248 p4 = (
page_t)pml4_virt_addr;
250 if (p4[index4] & 1) {
252 uintptr_t pdpt_virt_addr = pdpt_phys_addr;
259 pdpt = (
page_t)pdpt_virt_addr;
260 p4[index4] = pdpt_phys_addr | inter_flags;
263 uintptr_t pdpt_virt_addr = pdpt_phys_addr;
271 pdpt = (
page_t)pdpt_virt_addr;
272 p4[index4] = pdpt_phys_addr | inter_flags;
275 if (pdpt[index3] & 1) {
284 pdp = (
page_t)pdp_virt_addr;
285 pdpt[index3] = pdp_phys_addr | inter_flags;
296 pdp = (
page_t)pdp_virt_addr;
297 pdpt[index3] = pdp_phys_addr | inter_flags;
300 if (pdp[index2] & 1) {
309 pt = (
page_t)pt_virt_addr;
310 pdp[index2] = pt_phys_addr | inter_flags;
321 pt = (
page_t)pt_virt_addr;
322 pdp[index2] = pt_phys_addr | inter_flags;
325 pt[index1] = phys_clean |
flags;
327 asm volatile(
"" :::
"memory");
336 asm volatile(
"invlpg (%0)" ::
"r"(virt) :
"memory");
344 for (; i + 3 <
size; i += 4) {
345 vxMmap(page_dir, virt + (i + 0) * 4096, phys + (i + 0) * 4096,
347 vxMmap(page_dir, virt + (i + 1) * 4096, phys + (i + 1) * 4096,
349 vxMmap(page_dir, virt + (i + 2) * 4096, phys + (i + 2) * 4096,
351 vxMmap(page_dir, virt + (i + 3) * 4096, phys + (i + 3) * 4096,
355 for (; i <
size; i++) {
356 vxMmap(page_dir, virt + i * 4096, phys + i * 4096,
flags);
363 uint64_t index4 = (virt >> 39) & 0x1ff;
364 uint64_t index3 = (virt >> 30) & 0x1ff;
365 uint64_t index2 = (virt >> 21) & 0x1ff;
366 uint64_t index1 = (virt >> 12) & 0x1ff;
380 p4 = (
page_t)pml4_virt_addr;
382 if (p4[index4] & 1) {
384 uintptr_t pdpt_virt_addr = pdpt_phys_addr;
391 pdpt = (
page_t)pdpt_virt_addr;
399 if (pdpt[index3] & 1) {
408 pdp = (
page_t)pdp_virt_addr;
418 if (pdp[index2] & 1) {
427 pt = (
page_t)pt_virt_addr;
447 asm volatile(
"invlpg (%0)" ::
"r"(virt) :
"memory");
458 asm volatile(
"mfence\n\t"
466 uint64_t index4 = (vaddr >> 39) & 0x1ff;
467 uint64_t index3 = (vaddr >> 30) & 0x1ff;
468 uint64_t index2 = (vaddr >> 21) & 0x1ff;
469 uint64_t index1 = (vaddr >> 12) & 0x1ff;
480 if (pdpt[index3] & 1)
void serial2_printf(const char *fmt,...)
volatile boolean_t paging_has_been_set
static spinlock_t paging_lock
void paging_reload(page_t p)
void paging_debug(page_t pml4_phys, uint64_t virt)
page_t paging_get_highest_page_map(void)
page_t paging_create_page_directory()
void paging_setup(page_t p)
static page_t kernel_pml4
void paging_unmap_page(page_t page_dir, uint64_t virt)
void vxMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t flags)
void paging_unmap_fill(page_t page_dir, uint64_t virt, size_t size)
static page_t physwindow_pt
static uintptr_t PHYS_BASE_METADATA_ADDR
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
static void initialize_physical_paging_window(page_t page)
uint64_t vaddr_to_paddr(page_t p, uint64_t vaddr)
void paging_physwindow_mmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t flags)
uint8_t * dma_bitmap_base_
volatile uintptr_t * page_t
void * phys_base_alloc(uint64_t block)
mem_physwindow_status_t mem_release_physwindow(uintptr_t virt_addr)
mem_physwindow_status_t mem_create_physwindow(uintptr_t phys_addr, uintptr_t *virt_addr, mem_physwindow_flag_t flag)
#define LOG_INFO(mod, fmt,...)
#define serial_trace(...)
void spin_acquire(spinlock_t *lock)
void spin_release(spinlock_t *lock)
void memset(void *ptr, int value, size_t num)
@ mem_vma_phys_window_start