buf[at] = (uint8_t)(int8_t)rel;
}
-static void* pmm_alloc_page_low_16mb(void) {
- for (int tries = 0; tries < 4096; tries++) {
- void* p = pmm_alloc_page();
- if (!p) return NULL;
- if ((uintptr_t)p < 0x01000000U) {
- return p;
- }
- pmm_free_page(p);
- }
- return NULL;
-}
+/* User pages can be anywhere in physical memory on 32-bit PAE. */
__attribute__((noreturn)) void x86_enter_usermode(uintptr_t user_eip, uintptr_t user_esp) {
kprintf("[USER] enter ring3 eip=0x%x esp=0x%x\n",
const uintptr_t user_code_vaddr = 0x00400000U;
const uintptr_t user_stack_vaddr = 0x00800000U;
- void* code_phys = pmm_alloc_page_low_16mb();
- void* stack_phys = pmm_alloc_page_low_16mb();
+ void* code_phys = pmm_alloc_page();
+ void* stack_phys = pmm_alloc_page();
if (!code_phys || !stack_phys) {
kprintf("[USER] OOM allocating user pages.\n");
return;
return x86_flags;
}
-/* --- Low-memory page allocator --- */
-
-static void* pmm_alloc_page_low(void) {
- for (int tries = 0; tries < 1024; tries++) {
- void* p = pmm_alloc_page();
- if (!p) return 0;
- if ((uintptr_t)p < 0x01000000) return p;
- pmm_free_page(p);
- }
- return 0;
-}
-
/* User space covers PDPT indices 0-2 (0x00000000 - 0xBFFFFFFF).
* PDPT[3] is kernel (0xC0000000 - 0xFFFFFFFF). */
#define PAE_USER_PDPT_MAX 3
uintptr_t irqf = spin_lock_irqsave(&vmm_lock);
/* Allocate PDPT (32 bytes, but occupies one page for simplicity) */
- uint32_t pdpt_phys = (uint32_t)(uintptr_t)pmm_alloc_page_low();
+ uint32_t pdpt_phys = (uint32_t)(uintptr_t)pmm_alloc_page();
if (!pdpt_phys) {
spin_unlock_irqrestore(&vmm_lock, irqf);
return 0;
/* Allocate 4 page directories */
uint32_t pd_phys[4];
for (int i = 0; i < 4; i++) {
- pd_phys[i] = (uint32_t)(uintptr_t)pmm_alloc_page_low();
+ pd_phys[i] = (uint32_t)(uintptr_t)pmm_alloc_page();
if (!pd_phys[i]) {
for (int j = 0; j < i; j++) pmm_free_page((void*)(uintptr_t)pd_phys[j]);
pmm_free_page((void*)(uintptr_t)pdpt_phys);
if (pte & X86_PTE_RW) flags |= VMM_FLAG_RW;
if (pte & X86_PTE_USER) flags |= VMM_FLAG_USER;
- void* dst_frame = pmm_alloc_page_low();
+ void* dst_frame = pmm_alloc_page();
if (!dst_frame) {
vmm_as_activate(old_as);
spin_unlock_irqrestore(&vmm_lock, irqf);
if (pid < 0) {
static const char msg[] = "[init] sigsegv test fork failed\n";
(void)sys_write(1, msg, (uint32_t)(sizeof(msg) - 1));
- sys_exit(1);
+ goto sigsegv_done;
}
if (pid == 0) {
} else {
static const char msg[] = "[init] SIGSEGV failed\n";
(void)sys_write(1, msg, (uint32_t)(sizeof(msg) - 1));
- sys_exit(1);
}
+ sigsegv_done:;
}
int ok = 1;