Request process arguments differently, mmap-style dlmalloc port, new linklist utils

This commit is contained in:
2025-09-21 22:51:38 +02:00
parent 397379bca3
commit 5c7fb3e1cf
4 changed files with 96 additions and 53 deletions

View File

@ -22,7 +22,7 @@ char **_args;
size_t _argslen; size_t _argslen;
char **args(void) { char **args(void) {
return (char **)_args; return _args;
} }
size_t argslen(void) { size_t argslen(void) {
@ -33,19 +33,13 @@ size_t argslen(void) {
void _premain(void) { void _premain(void) {
clearbss(); clearbss();
_argslen = processctl(-1, PCTL_ARGLEN, 0, 0, 0); #define MAX_ARGS 30
_args = dlmalloc(_argslen * sizeof(*_args)); _args = (char **)dlmalloc(MAX_ARGS * sizeof(char *));
if (_args == NULL) { for (size_t i = 0; i < MAX_ARGS; i++) {
return;
}
for (size_t i = 0; i < _argslen; i++) {
_args[i] = dlmalloc(PROC_ARG_MAX); _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(); main();
} }

View File

@ -21,14 +21,10 @@
#define LACKS_SYS_PARAM_H 1 #define LACKS_SYS_PARAM_H 1
#define LACKS_STRINGS_H 1 #define LACKS_STRINGS_H 1
#define LACKS_SCHED_H 1 #define LACKS_SCHED_H 1
#define HAVE_MMAP 0 #define HAVE_MMAP 1
#define MORECORE_CONTIGUOUS 0 #define HAVE_MORECORE 0
#define ABORT \ #define ABORT uprintf("dlmalloc: Aborting...\n")
do { \
uprintf("dlmalloc: Aborting...\n"); \
} while(0)
#define MALLOC_FAILURE_ACTION #define MALLOC_FAILURE_ACTION
#define HAVE_MORECORE 1
#define USE_LOCKS 2 #define USE_LOCKS 2
#define malloc_getpagesize 0x1000 #define malloc_getpagesize 0x1000
#define EINVAL E_INVALIDARGUMENT #define EINVAL E_INVALIDARGUMENT
@ -59,24 +55,37 @@ static size_t _roundpage(size_t sz) {
return (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); 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) { #define EMUL_DEV_ZERO_FD 123
if (inc < 0) {
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; return 0;
} }
if (!inc) {
return _last;
}
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;
}

View File

@ -3,6 +3,7 @@
#define LL_APPEND(head, new) \ #define LL_APPEND(head, new) \
do { \ do { \
if ((new) != NULL) { \
if ((head) != NULL) { \ if ((head) != NULL) { \
typeof((head)) __tmp; \ typeof((head)) __tmp; \
(new)->next = NULL; \ (new)->next = NULL; \
@ -15,23 +16,32 @@
(new)->next = NULL; \ (new)->next = NULL; \
(head) = (new); \ (head) = (new); \
} \ } \
} \
} while(0) } while(0)
#define LL_REMOVE(head, ele) \ #define LL_REMOVE(head, ele) \
do { \ do { \
if ((head) != NULL && (ele) != NULL) { \
typeof((head)) __cur = (head); \ typeof((head)) __cur = (head); \
typeof((head)) __prev = NULL; \ typeof((head)) __prev = NULL; \
while (__cur != (ele)) { \ while (__cur != NULL && __cur != (ele)) { \
__prev = __cur; \ __prev = __cur; \
__cur = __cur->next; \ __cur = __cur->next; \
} \ } \
if (__cur == (ele)) { \
if (__prev != NULL) { \ if (__prev != NULL) { \
__prev->next = __cur->next; \ __prev->next = __cur->next; \
} else { \
(head) = __cur->next; \
} \
(ele)->next = NULL; \
} \
} \ } \
} while(0) } while(0)
#define LL_FINDPROP(head, out, propname, propvalue) \ #define LL_FINDPROP(head, out, propname, propvalue) \
do { \ do { \
(out) = NULL; \
typeof((head)) __tmp = (head); \ typeof((head)) __tmp = (head); \
while (__tmp) { \ while (__tmp) { \
if (__tmp->propname == (propvalue)) { \ if (__tmp->propname == (propvalue)) { \
@ -42,4 +52,20 @@
} \ } \
} while(0) } 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_ #endif // ULIB_LINKLIST_H_

View File

@ -11,6 +11,20 @@
*(X); \ *(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); void quit(void);
#endif // ULIB_UTIL_UTIL_H_ #endif // ULIB_UTIL_UTIL_H_