int32_t NaClSysExceptionHandler(struct NaClAppThread *natp, uint32_t handler_addr, uint32_t old_handler) { struct NaClApp *nap = natp->nap; int32_t rv = -NACL_ABI_EINVAL; if (!nap->enable_exception_handling) { rv = -NACL_ABI_ENOSYS; goto no_lock_exit; } if (!NaClIsValidJumpTarget(nap, handler_addr)) { rv = -NACL_ABI_EFAULT; goto no_lock_exit; } NaClXMutexLock(&nap->exception_mu); /* * This needs to be done while holding the lock so that we don't * start two Windows debug exception handlers. */ if (handler_addr != 0) { if (!NaClDebugExceptionHandlerEnsureAttached(nap)) { rv = -NACL_ABI_ENOSYS; goto unlock_exit; } } if (0 != old_handler && !NaClCopyOutToUser(nap, (uintptr_t) old_handler, &nap->exception_handler, sizeof nap->exception_handler)) { rv = -NACL_ABI_EFAULT; goto unlock_exit; } nap->exception_handler = handler_addr; rv = 0; unlock_exit: NaClXMutexUnlock(&nap->exception_mu); no_lock_exit: return rv; }
int NaClFaultedThreadQueueEnable(struct NaClApp *nap) { nap->enable_faulted_thread_queue = 1; return NaClDebugExceptionHandlerEnsureAttached(nap); }