xref: /aosp_15_r20/external/musl/src/thread/__unmapself.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include "atomic.h"
3*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
4*c9945492SAndroid Build Coastguard Worker /* cheat and reuse CRTJMP macro from dynlink code */
5*c9945492SAndroid Build Coastguard Worker #include "dynlink.h"
6*c9945492SAndroid Build Coastguard Worker 
7*c9945492SAndroid Build Coastguard Worker static void *unmap_base;
8*c9945492SAndroid Build Coastguard Worker static size_t unmap_size;
9*c9945492SAndroid Build Coastguard Worker static char shared_stack[256];
10*c9945492SAndroid Build Coastguard Worker 
do_unmap()11*c9945492SAndroid Build Coastguard Worker static void do_unmap()
12*c9945492SAndroid Build Coastguard Worker {
13*c9945492SAndroid Build Coastguard Worker 	__syscall(SYS_munmap, unmap_base, unmap_size);
14*c9945492SAndroid Build Coastguard Worker 	__syscall(SYS_exit);
15*c9945492SAndroid Build Coastguard Worker }
16*c9945492SAndroid Build Coastguard Worker 
__unmapself(void * base,size_t size)17*c9945492SAndroid Build Coastguard Worker void __unmapself(void *base, size_t size)
18*c9945492SAndroid Build Coastguard Worker {
19*c9945492SAndroid Build Coastguard Worker 	char *stack = shared_stack + sizeof shared_stack;
20*c9945492SAndroid Build Coastguard Worker 	stack -= (uintptr_t)stack % 16;
21*c9945492SAndroid Build Coastguard Worker 	unmap_base = base;
22*c9945492SAndroid Build Coastguard Worker 	unmap_size = size;
23*c9945492SAndroid Build Coastguard Worker 	CRTJMP(do_unmap, stack);
24*c9945492SAndroid Build Coastguard Worker }
25