1570af302Sopenharmony_ci#include "pthread_impl.h" 2570af302Sopenharmony_ci#include "atomic.h" 3570af302Sopenharmony_ci#include "syscall.h" 4570af302Sopenharmony_ci/* cheat and reuse CRTJMP macro from dynlink code */ 5570af302Sopenharmony_ci#include "dynlink.h" 6570af302Sopenharmony_ci 7570af302Sopenharmony_cistatic void *unmap_base; 8570af302Sopenharmony_cistatic size_t unmap_size; 9570af302Sopenharmony_cistatic char shared_stack[256]; 10570af302Sopenharmony_ci 11570af302Sopenharmony_cistatic void do_unmap() 12570af302Sopenharmony_ci{ 13570af302Sopenharmony_ci __syscall(SYS_munmap, unmap_base, unmap_size); 14570af302Sopenharmony_ci __syscall(SYS_exit); 15570af302Sopenharmony_ci} 16570af302Sopenharmony_ci 17570af302Sopenharmony_civoid __unmapself(void *base, size_t size) 18570af302Sopenharmony_ci{ 19570af302Sopenharmony_ci char *stack = shared_stack + sizeof shared_stack; 20570af302Sopenharmony_ci stack -= (uintptr_t)stack % 16; 21570af302Sopenharmony_ci unmap_base = base; 22570af302Sopenharmony_ci unmap_size = size; 23570af302Sopenharmony_ci CRTJMP(do_unmap, stack); 24570af302Sopenharmony_ci} 25