From ff78c951f005db08e9f3768ecd6c3b284ee5db76 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 27 Sep 2020 17:31:23 -0700 Subject: [PATCH] [libc] Implement sbrk to allow malloc() to work Userspace can now allocte via malloc. This is slightly janky because it relies on a single static handle in the library code. --- src/drivers/nulldrv/main.cpp | 22 +++-------- src/kernel/vm_space.cpp | 2 + src/libraries/libc/include/j6libc/syscalls.h | 2 + src/libraries/libc/j6libc/sbrk.c | 39 +++++++++++++++++++- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/drivers/nulldrv/main.cpp b/src/drivers/nulldrv/main.cpp index 1d579e8..9922228 100644 --- a/src/drivers/nulldrv/main.cpp +++ b/src/drivers/nulldrv/main.cpp @@ -61,27 +61,17 @@ main(int argc, const char **argv) _syscall_system_log("main thread starting"); - uintptr_t base = 0xcc0000000; - j6_handle_t vma = j6_handle_invalid; - j6_status_t result = _syscall_vma_create_map(&vma, 0x100000, base, 1); - if (result != j6_status_ok) - return result; - - size_t size = 0x800000; - result = _syscall_vma_resize(vma, &size); - if (result != j6_status_ok) - return result; - - if (size == 0x800000) - _syscall_system_log("main thread resized memory area"); + void *base = malloc(0x1000); + if (!base) + return 1; uint64_t *vma_ptr = reinterpret_cast(base); for (int i = 0; i < 300; ++i) - vma_ptr[i * 512] = uint64_t(i); + vma_ptr[i] = uint64_t(i); _syscall_system_log("main thread wrote to memory area"); - result = _syscall_endpoint_create(&endp); + j6_status_t result = _syscall_endpoint_create(&endp); if (result != j6_status_ok) return result; @@ -94,7 +84,7 @@ main(int argc, const char **argv) _syscall_system_log("main thread created sub thread"); char message[] = "MAIN THREAD SUCCESSFULLY CALLED SENDRECV IF THIS IS LOWERCASE"; - size = sizeof(message); + size_t size = sizeof(message); result = _syscall_endpoint_sendrecv(endp, &size, (void*)message); if (result != j6_status_ok) return result; diff --git a/src/kernel/vm_space.cpp b/src/kernel/vm_space.cpp index a3969e0..78c28fc 100644 --- a/src/kernel/vm_space.cpp +++ b/src/kernel/vm_space.cpp @@ -71,6 +71,7 @@ vm_space::add(uintptr_t base, vm_area *area) //TODO: check for collisions m_areas.sorted_insert({base, area}); area->mapper().add(this); + area->handle_retain(); return true; } @@ -81,6 +82,7 @@ vm_space::remove(vm_area *area) if (a.area == area) { m_areas.remove(a); area->mapper().remove(this); + area->handle_release(); return true; } } diff --git a/src/libraries/libc/include/j6libc/syscalls.h b/src/libraries/libc/include/j6libc/syscalls.h index 15f3072..9815a03 100644 --- a/src/libraries/libc/include/j6libc/syscalls.h +++ b/src/libraries/libc/include/j6libc/syscalls.h @@ -1,5 +1,7 @@ #pragma once +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/src/libraries/libc/j6libc/sbrk.c b/src/libraries/libc/j6libc/sbrk.c index 17a914b..dff49c5 100644 --- a/src/libraries/libc/j6libc/sbrk.c +++ b/src/libraries/libc/j6libc/sbrk.c @@ -1,4 +1,39 @@ #include -void *sbrk(intptr_t) __attribute__ ((weak)); +#include +#include +//void *sbrk(intptr_t) __attribute__ ((weak)); -void *sbrk(intptr_t i) { return 0; } +static j6_handle_t __core_handle = 0; +static intptr_t __core_size = 0; + +static const uintptr_t __core_base = 0x1c0000000; + +static const void *error_val = (void*)-1; + +void *sbrk(intptr_t i) +{ + if (i == 0) + return (void*)__core_base; + + if (__core_size == 0) { + if (i < 0) + return (void*)-1; + + j6_status_t result = _syscall_vma_create_map(&__core_handle, i, __core_base, 1); + if (result != j6_status_ok) + return (void*)-1; + + __core_size = i; + return (void*)__core_base; + } + + size_t new_size = __core_size + i; + j6_status_t result = _syscall_vma_resize(__core_handle, &new_size); + if (result != j6_status_ok) + return (void*)-1; + + uintptr_t prev = __core_base + __core_size; + __core_size += i; + + return (void*)prev; +}