kernel: Patches to run processes in Ring 3.

This commit is contained in:
RaphProductions 2025-05-07 13:14:18 +02:00
parent 8f6399e309
commit e6a2c1e240
10 changed files with 271 additions and 22 deletions

View file

@ -3,6 +3,7 @@
#include "mm/pmm.h"
#include "mm/memop.h"
#include "sys/log.h"
#include "vmm.h"
#include <stddef.h>
@ -148,12 +149,26 @@ void vmm_load_pagemap(pagemap_t *pm) {
}
static uint64_t *__vmm_get_next_lvl(uint64_t *level, uint64_t entry, uint64_t flags) {
if (level[entry] & 1)
return HIGHER_HALF(PTE_GET_ADDR(level[entry]));
uint64_t *pml = HIGHER_HALF(pmm_request_page());
memset(pml, 0, PMM_PAGE_SIZE);
level[entry] = (uint64_t)PHYSICAL(pml) | (flags & 0xFFF); // N'ajoute que les flags pertinents
return pml;
if (!(level[entry] & 1)){
uint64_t *pml = HIGHER_HALF(pmm_request_page());
memset(pml, 0, PMM_PAGE_SIZE);
level[entry] = (uint64_t)PHYSICAL(pml);
}
level[entry] |= (flags & 0xFFF); // N'ajoute que les flags pertinents
return HIGHER_HALF(PTE_GET_ADDR(level[entry]));
}
uint64_t vmm_get_flags(pagemap_t* pm, uint64_t vaddr) {
uint64_t pml4_entry = (vaddr >> 39) & 0x1ff;
uint64_t pml3_entry = (vaddr >> 30) & 0x1ff;
uint64_t pml2_entry = (vaddr >> 21) & 0x1ff;
uint64_t pml1_entry = (vaddr >> 12) & 0x1ff;
uint64_t *pml3 = __vmm_get_next_lvl(pm->toplevel, pml4_entry, 0);
uint64_t *pml2 = __vmm_get_next_lvl(pml3, pml3_entry, 0);
uint64_t *pml1 = __vmm_get_next_lvl(pml2, pml2_entry, 0);
return pml1[pml1_entry] & 0x7000000000000FFF;
}
void vmm_map(pagemap_t *pm, uint64_t vaddr, uint64_t paddr, uint64_t flags) {