From 3d0c30e6697b2b6ae77a03adefa2a8b81ebe4d92 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sun, 21 Mar 2021 14:31:08 +0100 Subject: Cleaner shared memory implementation --- libc/alloc.c | 7 +++++-- libc/inc/sys.h | 7 +++---- libc/sys.c | 19 ++++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) (limited to 'libc') diff --git a/libc/alloc.c b/libc/alloc.c index 8522203..b8139d0 100644 --- a/libc/alloc.c +++ b/libc/alloc.c @@ -26,12 +26,15 @@ static int liballoc_free(void *ptr, u32 p) static void *liballoc_alloc(u32 p) { - return sys_alloc(p); + u32 addr; + assert(sys_alloc(p, &addr) == EOK); + return (void *)addr; } static int liballoc_free(void *ptr, u32 p) { - sys_free(ptr, p); + UNUSED(p); + assert(sys_free(ptr) == EOK); return 0; } diff --git a/libc/inc/sys.h b/libc/inc/sys.h index 8f30dbb..caa1dbd 100644 --- a/libc/inc/sys.h +++ b/libc/inc/sys.h @@ -17,7 +17,6 @@ enum sys { SYS_LOOP, // To infinity and beyond (debug)! SYS_ALLOC, // Allocate memory - SYS_SHALLOC, // Allocate shared memory SYS_SHACCESS, // Access shared memory SYS_FREE, // Free memory SYS_STAT, // Get file information @@ -78,10 +77,10 @@ res yield(void); res boot(u32 cmd); u32 time(void); -void *sys_alloc(u32 size); -res shalloc(u32 size, u32 *id); +res sys_alloc(u32 size, u32 *addr); +res sys_free(void *ptr); +res shalloc(u32 size, u32 *addr, u32 *id); res shaccess(u32 id, u32 *addr, u32 *size); -void sys_free(void *ptr, u32 size); static inline u32 getpid(void) { diff --git a/libc/sys.c b/libc/sys.c index b40b84d..491c37c 100644 --- a/libc/sys.c +++ b/libc/sys.c @@ -2,6 +2,7 @@ // Syscall implementation #include +#include #include #include @@ -78,25 +79,25 @@ res sys5(enum sys num, int d1, int d2, int d3, int d4, int d5) * Syscalls */ -void *sys_alloc(u32 size) +res sys_alloc(u32 size, u32 *addr) { - return (void *)sys1(SYS_ALLOC, (int)size); + u32 id = 0; + return sys4(SYS_ALLOC, (int)size, (int)addr, (int)&id, 0); } -res shalloc(u32 size, u32 *id) +res sys_free(void *ptr) { - return (res)sys2(SYS_SHALLOC, (int)size, (int)id); + return sys1(SYS_FREE, (int)ptr); } -res shaccess(u32 id, u32 *addr, u32 *size) +res shalloc(u32 size, u32 *addr, u32 *id) { - return (res)sys3(SYS_SHACCESS, (int)id, (int)addr, (int)size); + return sys4(SYS_ALLOC, (int)size, (int)addr, (int)id, 1); } -// TODO: Freeing by ptr + size could be a security risk -> only by address! -void sys_free(void *ptr, u32 size) +res shaccess(u32 id, u32 *addr, u32 *size) { - sys2(SYS_FREE, (int)ptr, (int)size); + return sys3(SYS_SHACCESS, (int)id, (int)addr, (int)size); } void loop(void) -- cgit v1.2.3