1/*
2 * Copyright (c) 2013 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
6
7#ifndef ERROR_HANDLING_ERROR_HANDLING_H_
8#define ERROR_HANDLING_ERROR_HANDLING_H_
9
10#include "error_handling/string_stream.h"
11#include "sdk_util/macros.h"
12
13EXTERN_C_BEGIN
14
15struct NaClExceptionContext;
16
17typedef void (*EHRawHandler)(struct NaClExceptionContext* context);
18typedef void (*EHJsonHandler)(const char* str);
19
20typedef struct {
21  uint32_t prog_ctr;
22  uint32_t frame_ptr;
23  uint32_t next_ptr;
24} EHFrame;
25
26
27/** Initialize error handling.
28 *
29 * Initializes the error handling to catch untrusted exceptions.  The init
30 * functions will install an untrusted exception handler.
31 *
32 * The raw form will install the provided handler directly to the exception
33 * system.
34 *
35 * The json form will install a default handler which will walk the stack
36 * creating a valid JSON string which is passed to the provided handler.
37 *
38 * NOTE: Exception handling is enabled process wide.
39 * NOTE: Exception handling is not guaranteed to be available so it should
40 * not be considered an error if the request fails.
41 */
42void EHRequestExceptionsRaw(EHRawHandler callback);
43void EHRequestExceptionsJson(EHJsonHandler callback);
44
45
46/** Request an alternate signal handling stack for this thread.
47 *
48 * Specifies an alternate stack which will be used when this thread enters
49 * the exception handler.  This is useful in cases when the threads original
50 * stack may have overflowed or may be too small to handler the exception.
51 *
52 * Returns the allocated stack or MAP_FAILED.
53 *
54 * NOTE: Unlike the handler, this is a per thread call.
55 * NOTE: If the allocation fails, the exception will still take place on the
56 * thread's original stack.
57 */
58void *EHRequestExceptionStackOnThread(size_t stack_size);
59
60
61/** Determine if NaCl will forward exceptions.
62 *
63 * Returns non-zero if a hander has been installed and exceptions will
64 * be forwarded.
65 *
66 * NOTE: Exception handling is not guarenteed to be available so it should
67 * not be considered an error if the request fails.
68 */
69int EHHanderInstalled();
70
71
72/** Fill an exception frame from an exception context. */
73int EHGetTopFrame(sstream_t* ss, struct NaClExceptionContext* context,
74                  EHFrame* frame);
75
76
77/** Unwind the stack by one frame.
78 *
79 * Returns zero once it failes to unwind.
80 */
81int EHUnwindFrame(EHFrame* frame);
82
83EXTERN_C_END
84
85#endif  // ERROR_HANDLING_ERROR_HANDLING_H_
86
87