From 313093773e81eb89ad3c44b048a79bbcd6e94099 Mon Sep 17 00:00:00 2001 From: Minep Date: Fri, 6 Jan 2023 00:47:54 +0000 Subject: [PATCH] feat: brk and sbrk (mmap based) feat: environ access refactor: status code user space port --- lunaix-os/includes/lunaix/mm/mmap.h | 5 +++++ lunaix-os/kernel/loader/exec.c | 5 +++-- lunaix-os/kernel/mm/dmm.c | 28 ++++++++++++++++++++-------- lunaix-os/kernel/mm/mmap.c | 28 +++++++++++++++++++++++++--- lunaix-os/usr/api/unistd.c | 4 ++-- lunaix-os/usr/includes/errno.h | 25 +++++++++++++++++++++++++ lunaix-os/usr/includes/string.h | 3 +++ lunaix-os/usr/includes/sys/ioctl.h | 2 ++ lunaix-os/usr/includes/unistd.h | 6 ++++-- lunaix-os/usr/libc/string.c | 15 ++++++++++++++- lunaix-os/usr/uinit.c | 3 +++ lunaix-os/usr/uwrap.S | 5 +++++ 12 files changed, 111 insertions(+), 18 deletions(-) diff --git a/lunaix-os/includes/lunaix/mm/mmap.h b/lunaix-os/includes/lunaix/mm/mmap.h index ff1e443..f85302e 100644 --- a/lunaix-os/includes/lunaix/mm/mmap.h +++ b/lunaix-os/includes/lunaix/mm/mmap.h @@ -17,6 +17,11 @@ struct mmap_param u32_t type; // region type }; +int +mem_adjust_inplace(vm_regions_t* regions, + struct mm_region* region, + ptr_t newend); + int mem_map(void** addr_out, struct mm_region** created, diff --git a/lunaix-os/kernel/loader/exec.c b/lunaix-os/kernel/loader/exec.c index 0105753..331cacc 100644 --- a/lunaix-os/kernel/loader/exec.c +++ b/lunaix-os/kernel/loader/exec.c @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -50,7 +51,7 @@ __exec_remap_heap(struct ld_param* param, struct proc_mm* pvms) .flags = MAP_ANON | MAP_PRIVATE, .type = REGION_TYPE_HEAP, .proct = PROT_READ | PROT_WRITE, - .mlen = DEFAULT_HEAP_PAGES * PG_SIZE }; + .mlen = PG_SIZE }; int status = 0; struct mm_region* heap; if ((status = mem_map(NULL, &heap, param->info.end, NULL, &map_param))) { @@ -192,5 +193,5 @@ __DEFINE_LXSYSCALL3(int, // return so execve 'will not return' from the perspective of it's invoker done: - return errno; + return DO_STATUS(errno); } \ No newline at end of file diff --git a/lunaix-os/kernel/mm/dmm.c b/lunaix-os/kernel/mm/dmm.c index 188bb06..cc75bd9 100644 --- a/lunaix-os/kernel/mm/dmm.c +++ b/lunaix-os/kernel/mm/dmm.c @@ -1,18 +1,30 @@ -#include -#include +#include +#include #include #include #include +#include -__DEFINE_LXSYSCALL1(int, sbrk, size_t, size) +__DEFINE_LXSYSCALL1(void*, sbrk, ssize_t, incr) { - // TODO mem_remap to expand heap region - return 0; + struct proc_mm* pvms = &__current->mm; + struct mm_region* heap = pvms->heap; + + assert(heap); + int err = mem_adjust_inplace(&pvms->regions, heap, heap->end + incr); + if (err) { + return (void*)DO_STATUS(err); + } + return (void*)heap->end; } -__DEFINE_LXSYSCALL1(void*, brk, void*, addr) +__DEFINE_LXSYSCALL1(int, brk, void*, addr) { - // TODO mem_remap to expand heap region - return 0; + struct proc_mm* pvms = &__current->mm; + struct mm_region* heap = pvms->heap; + + assert(heap); + int err = mem_adjust_inplace(&pvms->regions, heap, (ptr_t)addr); + return DO_STATUS(err); } \ No newline at end of file diff --git a/lunaix-os/kernel/mm/mmap.c b/lunaix-os/kernel/mm/mmap.c index 3a8677d..f700fd5 100644 --- a/lunaix-os/kernel/mm/mmap.c +++ b/lunaix-os/kernel/mm/mmap.c @@ -11,9 +11,8 @@ #define BS_SIZE (KERNEL_MM_BASE - UMMAP_START) int -mem_has_overlap(vm_regions_t* regions, ptr_t start, size_t len) +mem_has_overlap(vm_regions_t* regions, ptr_t start, ptr_t end) { - ptr_t end = start + end - 1; struct mm_region *pos, *n; llist_for_each(pos, n, regions, head) { @@ -33,6 +32,29 @@ mem_has_overlap(vm_regions_t* regions, ptr_t start, size_t len) return 0; } +int +mem_adjust_inplace(vm_regions_t* regions, + struct mm_region* region, + ptr_t newend) +{ + ssize_t len = newend - region->start; + if (len == 0) { + return 0; + } + + if (len < 0) { + return EINVAL; + } + + if (mem_has_overlap(regions, region->start, newend)) { + return ENOMEM; + } + + region->end = newend; + + return 0; +} + int mem_map(void** addr_out, struct mm_region** created, @@ -48,7 +70,7 @@ mem_map(void** addr_out, vm_regions_t* vm_regions = ¶m->pvms->regions; if ((param->flags & MAP_FIXED_NOREPLACE)) { - if (mem_has_overlap(vm_regions, found_loc, param->mlen)) { + if (mem_has_overlap(vm_regions, found_loc, param->mlen + found_loc)) { return EEXIST; } goto found; diff --git a/lunaix-os/usr/api/unistd.c b/lunaix-os/usr/api/unistd.c index e8a4a0a..088c335 100644 --- a/lunaix-os/usr/api/unistd.c +++ b/lunaix-os/usr/api/unistd.c @@ -3,9 +3,9 @@ __LXSYSCALL(pid_t, fork) -__LXSYSCALL1(int, sbrk, void*, addr) +__LXSYSCALL1(int, brk, void*, addr) -__LXSYSCALL1(void*, brk, unsigned long, size) +__LXSYSCALL1(void*, sbrk, ssize_t, size) __LXSYSCALL(pid_t, getpid) diff --git a/lunaix-os/usr/includes/errno.h b/lunaix-os/usr/includes/errno.h index 5b9b51b..f3c5347 100644 --- a/lunaix-os/usr/includes/errno.h +++ b/lunaix-os/usr/includes/errno.h @@ -1,6 +1,31 @@ #ifndef __LUNAIX_SYS_ERRNO_H #define __LUNAIX_SYS_ERRNO_H +#define EINVAL -(6) +#define EINTR -(7) +#define EMFILE -8 +#define ENOENT -9 +#define ENAMETOOLONG -10 +#define ENOTDIR -11 +#define EEXIST -12 +#define EBADF -13 +#define ENOTSUP -14 +#define EIO -15 +#define ELOOP -16 +#define ENOTEMPTY -17 +#define EROFS -18 +#define EISDIR -19 +#define EBUSY -20 +#define EXDEV -21 +#define ENODEV -22 +#define ERANGE -23 +#define ENOMEM -(3) +#define ENOTDEV -24 +#define EOVERFLOW -25 +#define ENOTBLK -26 +#define ENOEXEC -27 +#define E2BIG -28 + int geterrno(); diff --git a/lunaix-os/usr/includes/string.h b/lunaix-os/usr/includes/string.h index 4c45ce2..2b5799a 100644 --- a/lunaix-os/usr/includes/string.h +++ b/lunaix-os/usr/includes/string.h @@ -15,4 +15,7 @@ strncpy(char* dest, const char* src, size_t n); const char* strchr(const char* str, int character); +char* +strcpy(char* dest, const char* src); + #endif /* __LUNAIX_STRING_H */ diff --git a/lunaix-os/usr/includes/sys/ioctl.h b/lunaix-os/usr/includes/sys/ioctl.h index 827cd44..58c681a 100644 --- a/lunaix-os/usr/includes/sys/ioctl.h +++ b/lunaix-os/usr/includes/sys/ioctl.h @@ -1,6 +1,8 @@ #ifndef __LUNAIX_SYS_IOCTL_H #define __LUNAIX_SYS_IOCTL_H +#include + int ioctl(int fd, int req, ...); diff --git a/lunaix-os/usr/includes/unistd.h b/lunaix-os/usr/includes/unistd.h index 90740a0..8420ffa 100644 --- a/lunaix-os/usr/includes/unistd.h +++ b/lunaix-os/usr/includes/unistd.h @@ -3,6 +3,8 @@ #include +extern const char** environ; + pid_t fork(); @@ -19,10 +21,10 @@ pid_t setpgid(pid_t pid, pid_t pgid); int -sbrk(void* addr); +brk(void* addr); void* -brk(size_t size); +sbrk(ssize_t size); void _exit(int status); diff --git a/lunaix-os/usr/libc/string.c b/lunaix-os/usr/libc/string.c index 2e34dc7..280cbbe 100644 --- a/lunaix-os/usr/libc/string.c +++ b/lunaix-os/usr/libc/string.c @@ -41,4 +41,17 @@ strncpy(char* dest, const char* src, size_t n) while (i <= n) dest[i++] = 0; return dest; -} \ No newline at end of file +} + +char* +strcpy(char* dest, const char* src) +{ + char c; + unsigned int i = 0; + while ((c = src[i])) { + dest[i] = c; + i++; + } + dest[i] = '\0'; + return dest; +} diff --git a/lunaix-os/usr/uinit.c b/lunaix-os/usr/uinit.c index ab383c2..0352743 100644 --- a/lunaix-os/usr/uinit.c +++ b/lunaix-os/usr/uinit.c @@ -6,5 +6,8 @@ usr_pre_init(struct usr_exec_param* param) { // TODO some inits before executing user program + extern ptr_t environ; + environ = (ptr_t)param->envp; + return 0; } \ No newline at end of file diff --git a/lunaix-os/usr/uwrap.S b/lunaix-os/usr/uwrap.S index 1f07722..5708463 100644 --- a/lunaix-os/usr/uwrap.S +++ b/lunaix-os/usr/uwrap.S @@ -1,6 +1,11 @@ #define __ASM__ #include +.section .data + .global environ + environ: + .long 0 + .section .text .global _u_start _u_start: -- 2.27.0