Request process arguments differently, mmap-style dlmalloc port, new linklist utils
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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_
|
||||
|
@ -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_
|
||||
|
Reference in New Issue
Block a user