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;
|
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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -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_
|
||||||
|
@ -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_
|
||||||
|
Reference in New Issue
Block a user