diff options
Diffstat (limited to 'libc-top-half/musl/src/thread/__unmapself.c')
-rw-r--r-- | libc-top-half/musl/src/thread/__unmapself.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/thread/__unmapself.c b/libc-top-half/musl/src/thread/__unmapself.c new file mode 100644 index 0000000..31d94e6 --- /dev/null +++ b/libc-top-half/musl/src/thread/__unmapself.c @@ -0,0 +1,24 @@ +#include "pthread_impl.h" +#include "atomic.h" +#include "syscall.h" +/* cheat and reuse CRTJMP macro from dynlink code */ +#include "dynlink.h" + +static void *unmap_base; +static size_t unmap_size; +static char shared_stack[256]; + +static void do_unmap() +{ + __syscall(SYS_munmap, unmap_base, unmap_size); + __syscall(SYS_exit); +} + +void __unmapself(void *base, size_t size) +{ + char *stack = shared_stack + sizeof shared_stack; + stack -= (uintptr_t)stack % 16; + unmap_base = base; + unmap_size = size; + CRTJMP(do_unmap, stack); +} |