| /* |
| * Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef ERROR_HANDLING_ERROR_HANDLING_H_ |
| #define ERROR_HANDLING_ERROR_HANDLING_H_ |
| |
| #include "error_handling/string_stream.h" |
| #include "sdk_util/macros.h" |
| |
| EXTERN_C_BEGIN |
| |
| struct NaClExceptionContext; |
| |
| typedef void (*EHRawHandler)(struct NaClExceptionContext* context); |
| typedef void (*EHJsonHandler)(const char* str); |
| |
| typedef struct { |
| uint32_t prog_ctr; |
| uint32_t frame_ptr; |
| uint32_t next_ptr; |
| } EHFrame; |
| |
| |
| /** Initialize error handling. |
| * |
| * Initializes the error handling to catch untrusted exceptions. The init |
| * functions will install an untrusted exception handler. |
| * |
| * The raw form will install the provided handler directly to the exception |
| * system. |
| * |
| * The json form will install a default handler which will walk the stack |
| * creating a valid JSON string which is passed to the provided handler. |
| * |
| * NOTE: Exception handling is enabled process wide. |
| * NOTE: Exception handling is not guaranteed to be available so it should |
| * not be considered an error if the request fails. |
| */ |
| void EHRequestExceptionsRaw(EHRawHandler callback); |
| void EHRequestExceptionsJson(EHJsonHandler callback); |
| |
| |
| /** Request an alternate signal handling stack for this thread. |
| * |
| * Specifies an alternate stack which will be used when this thread enters |
| * the exception handler. This is useful in cases when the threads original |
| * stack may have overflowed or may be too small to handler the exception. |
| * |
| * Returns the allocated stack or MAP_FAILED. |
| * |
| * NOTE: Unlike the handler, this is a per thread call. |
| * NOTE: If the allocation fails, the exception will still take place on the |
| * thread's original stack. |
| */ |
| void *EHRequestExceptionStackOnThread(size_t stack_size); |
| |
| |
| /** Determine if NaCl will forward exceptions. |
| * |
| * Returns non-zero if a hander has been installed and exceptions will |
| * be forwarded. |
| * |
| * NOTE: Exception handling is not guaranteed to be available so it should |
| * not be considered an error if the request fails. |
| */ |
| int EHHanderInstalled(); |
| |
| |
| /** Fill an exception frame from an exception context. */ |
| int EHGetTopFrame(sstream_t* ss, struct NaClExceptionContext* context, |
| EHFrame* frame); |
| |
| |
| /** Unwind the stack by one frame. |
| * |
| * Returns zero once it failes to unwind. |
| */ |
| int EHUnwindFrame(EHFrame* frame); |
| |
| EXTERN_C_END |
| |
| #endif // ERROR_HANDLING_ERROR_HANDLING_H_ |
| |