Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
phys_window.c
Go to the documentation of this file.
1#include "phys_window.h"
2#include "autoconf.h"
3#include <hal/cpu/paging.h>
4#include <libk/serial.h>
5#include <memory/vm_manager.h>
6
7static mem_physwindow_t physical_memory_windows[VOXIA_PHYS_MAX_WINDOW_COUNT] = {
8 0};
9
10extern void paging_physwindow_mmap(page_t page_dir, uint64_t virt,
11 uint64_t phys, int flags);
12
18mem_physwindow_t* mem_resolve_physwindow(uintptr_t virt_addr) {
19 for (size_t i = 0; i < VOXIA_PHYS_MAX_WINDOW_COUNT; i++) {
20 if (physical_memory_windows[i].virt_addr == virt_addr) {
21 return &physical_memory_windows[i];
22 }
23 }
24 return 0;
25}
26
30 for (size_t i = 0; i < VOXIA_PHYS_MAX_WINDOW_COUNT; i++) {
32 *virt_addr = mem_vma_phys_window_start + i * 0x1000;
33 physical_memory_windows[i].virt_addr = *virt_addr;
35 physical_memory_windows[i].flag = flag;
36
38 paging_get_highest_page_map(), *virt_addr,
40 (flag == PHYS_WINDOW_FLAG_READ ? 0b1 : 0)
41 | (flag == PHYS_WINDOW_FLAG_WRITE ? 0b10
42 : 0b0)
43 | 0b11);
44
45 if ((flag & PHYS_WINDOW_FLAG_LOCK)
47 physical_memory_windows[i].lock = 1;
48 }
49
50 // serial_trace("mem_create_physwindow: Created physical window at %d\n", i);
51
53 }
54 }
55 serial_trace("[ERROR] mem_create_physwindow: No available physical "
56 "window slots\n");
58}
59
61 for (size_t i = 0; i < VOXIA_PHYS_MAX_WINDOW_COUNT; i++) {
62 if (physical_memory_windows[i].virt_addr == virt_addr) {
63 physical_memory_windows[i].lock = 0;
65 }
66 }
67
68#if VOXIA_LOG_VERBOSE
69 serial_trace("[WARNING] mem_release_physwindow: Virtual address 0x%x "
70 "not found in physical "
71 "memory windows\n",
72 virt_addr);
73#endif
75}
uint8_t lock
Definition cache.h:1
uint16_t flags
Definition thread.h:5
page_t paging_get_highest_page_map(void)
Definition paging.c:463
volatile uintptr_t * page_t
Definition paging.h:11
mem_physwindow_status_t mem_release_physwindow(uintptr_t virt_addr)
Definition phys_window.c:60
void paging_physwindow_mmap(page_t page_dir, uint64_t virt, uint64_t phys, int flags)
mem_physwindow_status_t mem_create_physwindow(uintptr_t phys_addr, uintptr_t *virt_addr, mem_physwindow_flag_t flag)
Definition phys_window.c:28
static mem_physwindow_t physical_memory_windows[VOXIA_PHYS_MAX_WINDOW_COUNT]
Definition phys_window.c:7
mem_physwindow_t * mem_resolve_physwindow(uintptr_t virt_addr)
resolve a physical memory window by virtual address
Definition phys_window.c:18
@ PHYS_WINDOW_FLAG_READ
Definition phys_window.h:16
@ PHYS_WINDOW_FLAG_LOCK
Definition phys_window.h:18
@ PHYS_WINDOW_FLAG_WRITE
Definition phys_window.h:17
int mem_physwindow_status_t
Definition phys_window.h:7
int mem_physwindow_flag_t
Definition phys_window.h:14
@ PHYS_WINDOW_STATUS_OK
Definition phys_window.h:9
@ PHYS_WINDOW_STATUS_NOT_FOUND
Definition phys_window.h:11
#define serial_trace(...)
Definition serial.h:19
uintptr_t phys_addr
Definition slab.h:6
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
@ mem_vma_phys_window_start
Definition vm_manager.h:23