diff options
author | Anton Kling <anton@kling.gg> | 2024-04-26 16:06:35 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-04-26 16:20:59 +0200 |
commit | 59e3f74a2e1a0806350e1ffd77a528821d1f2be3 (patch) | |
tree | a514572b0b9468f6ae3ba7cd075181c58c2371e7 /kernel/sched/scheduler.c | |
parent | 15bc439577c49e97c24a074fe6d9e9464f917054 (diff) |
Kernel: More out of memory condition checks
Diffstat (limited to 'kernel/sched/scheduler.c')
-rw-r--r-- | kernel/sched/scheduler.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index 57ab33b..7d5740b 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -257,9 +257,13 @@ void exit(int status) { switch_task(); } -u32 setup_stack(u32 stack_pointer, int argc, char **argv) { - mmu_allocate_region(STACK_LOCATION - STACK_SIZE, STACK_SIZE, MMU_FLAG_RW, - NULL); +u32 setup_stack(u32 stack_pointer, int argc, char **argv, int *err) { + *err = 0; + if (!mmu_allocate_region(STACK_LOCATION - STACK_SIZE, STACK_SIZE, MMU_FLAG_RW, + NULL)) { + *err = 1; + return 0; + } flush_tlb(); u32 ptr = stack_pointer; @@ -316,7 +320,11 @@ int exec(const char *filename, char **argv, int dealloc_argv, current_task->data_segment_end = align_page((void *)end_of_code); - u32 ptr = setup_stack(0x90000000, argc, argv); + int err; + u32 ptr = setup_stack(0x90000000, argc, argv, &err); + if (err) { + return 0; + } if (dealloc_argv) { for (int i = 0; i < argc; i++) { @@ -557,32 +565,27 @@ void *allocate_virtual_user_memory(size_t length, int prot, int flags) { (void)prot; (void)flags; void *rc = get_free_virtual_memory(length); - if ((void *)-1 == rc) { - return (void *)-1; + if (!rc) { + return NULL; } - mmu_allocate_region(rc, length, MMU_FLAG_RW, NULL); - return rc; -} - -void *user_kernel_mapping(void *kernel_addr, size_t length) { - void *rc = get_free_virtual_memory(length); - if ((void *)-1 == rc) { - return (void *)-1; + if (!mmu_allocate_region(rc, length, MMU_FLAG_RW, NULL)) { + return NULL; } - - mmu_map_directories(rc, NULL, kernel_addr, NULL, length); return rc; } void *create_physical_mapping(void **physical_addresses, size_t length) { void *rc = get_free_virtual_memory(length); - if ((void *)-1 == rc) { - return (void *)-1; + if (!rc) { + return NULL; } int n = (uintptr_t)align_page((void *)length) / 0x1000; for (int i = 0; i < n; i++) { - mmu_map_physical(rc + (i * 0x1000), NULL, physical_addresses[i], 0x1000); + if (!mmu_map_physical(rc + (i * 0x1000), NULL, physical_addresses[i], + 0x1000)) { + return NULL; + } } return rc; } @@ -616,7 +619,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, if (-1 == fd) { void *rc = allocate_virtual_user_memory(length, prot, flags); - if ((void *)-1 == rc) { + if (!rc) { kprintf("ENOMEM\n"); return (void *)-ENOMEM; } @@ -643,6 +646,10 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, length = vmobject->size; } void *rc = create_physical_mapping(vmobject->object, length); + if (!rc) { + kprintf("ENOMEM\n"); + return (void *)-ENOMEM; + } free_map->u_address = rc; free_map->k_address = NULL; free_map->length = length; |