summaryrefslogtreecommitdiff
path: root/kernel/src/mem
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-09-05 23:54:12 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-09-07 17:46:10 +0200
commit956bb743a3ba6939aaff2372fc45628cda6a9840 (patch)
tree0d1fd304eb584c892e28e43bbc851cf66786d9da /kernel/src/mem
parent59f86fe8dd237e50c7fea03b506125e3abff0157 (diff)
userspace finally working
Diffstat (limited to 'kernel/src/mem')
-rw-r--r--kernel/src/mem/paging.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index 630fb6d..19a2c3a 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -45,15 +45,15 @@ void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
void init_paging(void)
{
- page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
- page_table_lvl3[0] = (uint64_t)page_table_lvl2_0 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
- page_table_lvl3[1] = (uint64_t)page_table_lvl2_1 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
- page_table_lvl3[2] = (uint64_t)page_table_lvl2_2 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
- page_table_lvl3[3] = (uint64_t)page_table_lvl2_3 + FLAG_PRESENT + FLAG_WRITABLE - KERNEL_VMA;
+ page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl3[0] = (uint64_t)page_table_lvl2_0 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl3[1] = (uint64_t)page_table_lvl2_1 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl3[2] = (uint64_t)page_table_lvl2_2 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl3[3] = (uint64_t)page_table_lvl2_3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
// higher half map first 6mb
for (size_t i = 0; i < 3; i++) {
- map_addr(KERNEL_VMA + PAGE_SIZE * i, 0x00000000 + PAGE_SIZE * i, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
+ map_addr(KERNEL_VMA + PAGE_SIZE * i, 0x00000000 + PAGE_SIZE * i, FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER + FLAG_HUGE);
}
load_pt_lvl4(page_table_lvl4);
@@ -65,7 +65,7 @@ void page_fault(uint64_t error)
uint64_t addr;
__asm__ volatile ("mov %%cr2, %0;" : "=r"(addr) : : "memory");
- map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_HUGE);
+ map_addr(addr, addr, FLAG_PRESENT | FLAG_WRITABLE | FLAG_USER | FLAG_HUGE);
printf("address: 0x%x, error code: %d\n", addr, error);
}