blob: 5e0b18bfad0a8f22bb00f14a4e0fc6954f05e9a8 [file] [log] [blame]
// Copyright 2013 Google Inc. All Rights Reserved.
#include <unistd.h>
#include <bionic/pthread_internal.h>
#include <irt_syscalls.h>
void _exit_thread() {
pthread_internal_t* thread = __get_thread();
// Let NaCl service runtime fill zero to the thread ID after
// untrusted code finshes completely. pthread_join will wait for
// this to check if it is safe to unmap the stack of this thread.
//
// nacl-glibc/nptl/pthread_create.c also lets service runtime update
// the thread ID.
__nacl_irt_thread_exit(&thread->kernel_id);
// This should not happen.
static const int kStderrFd = 2;
static const char kMsg[] = "__nacl_irt_thread_exit failed\n";
write(kStderrFd, kMsg, sizeof(kMsg) - 1);
#if defined(__x86_64__) || defined(__i386__)
while (1)
__asm__("hlt");
#else
// For nacl_arm. sfi_constant_barrier is expanded to a bkpt instruction
// which passes the validation.
__asm__(".balign 16\n"
"sfi_constant_barrier\n"
".balign 16");
#endif
}