From 5c7fb3e1cf989c28613bc2677d43c911a0932927 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sun, 21 Sep 2025 22:51:38 +0200 Subject: [PATCH] Request process arguments differently, mmap-style dlmalloc port, new linklist utils --- ulib/_premain.c | 16 +++------ ulib/dlmalloc/dlmalloc_port.inc | 57 +++++++++++++++++------------- ulib/linklist.h | 62 +++++++++++++++++++++++---------- ulib/util/util.h | 14 ++++++++ 4 files changed, 96 insertions(+), 53 deletions(-) diff --git a/ulib/_premain.c b/ulib/_premain.c index f11d08a..81f4a95 100644 --- a/ulib/_premain.c +++ b/ulib/_premain.c @@ -22,7 +22,7 @@ char **_args; size_t _argslen; char **args(void) { - return (char **)_args; + return _args; } size_t argslen(void) { @@ -33,19 +33,13 @@ size_t argslen(void) { void _premain(void) { clearbss(); - _argslen = processctl(-1, PCTL_ARGLEN, 0, 0, 0); - _args = dlmalloc(_argslen * sizeof(*_args)); - if (_args == NULL) { - return; - } - for (size_t i = 0; i < _argslen; i++) { + #define MAX_ARGS 30 + _args = (char **)dlmalloc(MAX_ARGS * sizeof(char *)); + for (size_t i = 0; i < MAX_ARGS; i++) { _args[i] = dlmalloc(PROC_ARG_MAX); - if (_args[i] == NULL) { - return; - } } - processctl(-1, PCTL_ARGV, (uint64_t)_args, _argslen, 0); + processctl(-1, PCTL_ARGV, (uint64_t)&_argslen, (uint64_t)_args, MAX_ARGS); main(); } diff --git a/ulib/dlmalloc/dlmalloc_port.inc b/ulib/dlmalloc/dlmalloc_port.inc index 8ead8fb..65abcd6 100644 --- a/ulib/dlmalloc/dlmalloc_port.inc +++ b/ulib/dlmalloc/dlmalloc_port.inc @@ -21,14 +21,10 @@ #define LACKS_SYS_PARAM_H 1 #define LACKS_STRINGS_H 1 #define LACKS_SCHED_H 1 -#define HAVE_MMAP 0 -#define MORECORE_CONTIGUOUS 0 -#define ABORT \ - do { \ - uprintf("dlmalloc: Aborting...\n"); \ - } while(0) +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define ABORT uprintf("dlmalloc: Aborting...\n") #define MALLOC_FAILURE_ACTION -#define HAVE_MORECORE 1 #define USE_LOCKS 2 #define malloc_getpagesize 0x1000 #define EINVAL E_INVALIDARGUMENT @@ -59,24 +55,37 @@ static size_t _roundpage(size_t sz) { return (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); } -void *_last = 0; +#define MAP_PRIVATE 0 +#define PROT_READ 0 +#define PROT_WRITE 0 +#define O_RDWR 0 -void *sbrk(ptrdiff_t inc) { - if (inc < 0) { - return 0; - } - if (!inc) { - return _last; - } +#define EMUL_DEV_ZERO_FD 123 - uint64_t pages = _roundpage(inc); - uint8_t *maddr = NULL; - int32_t ret = mman_map(NULL, pages, MMAN_MAP_PF_RW, 0, &maddr); - if (ret != E_OK || maddr == NULL) { - return 0; - } - string_memset(maddr, 0, pages); - _last = (void *)(maddr + pages); - return maddr; +int open(char *path, int flags) { + return EMUL_DEV_ZERO_FD; +} + +void *mmap(void *addr, size_t len, int prot, int flags, int fd, int off) { + (void)off; + uint8_t *outaddr = NULL; + size_t need = _roundpage(len); + + int32_t err = mman_map(NULL, need, MMAN_MAP_PF_RW, 0, &outaddr); + if (err != E_OK || outaddr == NULL) { + return NULL; + } + + if (fd == EMUL_DEV_ZERO_FD) { + string_memset(outaddr, 0, need); + } + + return outaddr; +} + +int munmap(void *addr, size_t len) { + (void)len; + mman_unmap((uint8_t *)addr); + return 0; } diff --git a/ulib/linklist.h b/ulib/linklist.h index 56b07f5..8f66b13 100644 --- a/ulib/linklist.h +++ b/ulib/linklist.h @@ -3,35 +3,45 @@ #define LL_APPEND(head, new) \ do { \ - if ((head) != NULL) { \ - typeof((head)) __tmp; \ - (new)->next = NULL; \ - __tmp = (head); \ - while (__tmp->next != NULL) { \ - __tmp = __tmp->next; \ + if ((new) != NULL) { \ + if ((head) != NULL) { \ + typeof((head)) __tmp; \ + (new)->next = NULL; \ + __tmp = (head); \ + while (__tmp->next != NULL) { \ + __tmp = __tmp->next; \ + } \ + __tmp->next = (new); \ + } else { \ + (new)->next = NULL; \ + (head) = (new); \ } \ - __tmp->next = (new); \ - } else { \ - (new)->next = NULL; \ - (head) = (new); \ } \ } while(0) #define LL_REMOVE(head, ele) \ do { \ - typeof((head)) __cur = (head); \ - typeof((head)) __prev = NULL; \ - while (__cur != (ele)) { \ - __prev = __cur; \ - __cur = __cur->next; \ - } \ - if (__prev != NULL) { \ - __prev->next = __cur->next; \ + if ((head) != NULL && (ele) != NULL) { \ + typeof((head)) __cur = (head); \ + typeof((head)) __prev = NULL; \ + while (__cur != NULL && __cur != (ele)) { \ + __prev = __cur; \ + __cur = __cur->next; \ + } \ + if (__cur == (ele)) { \ + if (__prev != NULL) { \ + __prev->next = __cur->next; \ + } else { \ + (head) = __cur->next; \ + } \ + (ele)->next = NULL; \ + } \ } \ } while(0) #define LL_FINDPROP(head, out, propname, propvalue) \ do { \ + (out) = NULL; \ typeof((head)) __tmp = (head); \ while (__tmp) { \ if (__tmp->propname == (propvalue)) { \ @@ -42,4 +52,20 @@ } \ } while(0) +#define LL_FOREACH_SAFE(head, var, tmp) \ + for (typeof(head) var = (head), tmp = (var ? var->next : NULL); \ + var != NULL; \ + var = tmp, tmp = (var ? var->next : NULL) \ + ) + +#define LL_FOREACH_SAFE_IDX(head, var, tmp, idx) \ + for (typeof(head) var = (head), tmp = (var ? var->next : NULL); \ + var != NULL && ((idx) = 0, 1); \ + var = tmp, tmp = (var ? var->next : NULL), (idx)++) + +#define LL_FOREACH_SAFE_IDX_LIMIT(head, var, tmp, idx, max) \ + for ((idx) = 0, var = (head), tmp = (var ? var->next : NULL); \ + var != NULL && (idx) < (max); \ + var = tmp, tmp = (var ? var->next : NULL), (idx)++) + #endif // ULIB_LINKLIST_H_ diff --git a/ulib/util/util.h b/ulib/util/util.h index ed8a97f..6999973 100644 --- a/ulib/util/util.h +++ b/ulib/util/util.h @@ -11,6 +11,20 @@ *(X); \ }) \ +#define MIN(a, b) \ +({ \ + typeof(a) _a = (a); \ + typeof(b) _b = (b); \ + (_a < _b ? _a : _b); \ +}) + +#define MAX(a, b) \ +({ \ + typeof(a) _a = (a); \ + typeof(b) _b = (b); \ + (_a > _b ? _a : _b); \ +}) + void quit(void); #endif // ULIB_UTIL_UTIL_H_