|  | // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | library fuchsia.exception; | 
|  |  | 
|  | using zx; | 
|  |  | 
|  | /// Protocol meant for clients interested in handling exceptions for a | 
|  | /// particular service. | 
|  | [Discoverable] | 
|  | protocol Handler { | 
|  | /// This exception mirrors closely the information provided by exception | 
|  | /// channels. The design is to have clients of this API behave as closely as | 
|  | /// possible to native exception handlers that are listening to an exception | 
|  | /// channel. | 
|  | /// | 
|  | /// `exception` is an exception handle, which controls the exception's | 
|  | /// lifetime. See exception zircon docs for more information. | 
|  | /// | 
|  | /// `info` represents basic exception information as provided by the | 
|  | /// exception channel. | 
|  | OnException(zx.handle:EXCEPTION exception, ExceptionInfo info) -> (); | 
|  | }; | 
|  |  | 
|  | /// Basic exception information associated with a particular exception. | 
|  | /// Maps to `zx_exception_info_t`. | 
|  | // TODO(fxbug.dev/7755): Currently there is no good support for tables within the | 
|  | //                 llcpp bindings, which would make this API very cumbersome to | 
|  | //                 use. When better support lands, move this to a table. | 
|  | struct ExceptionInfo { | 
|  | // Process ID or pid. | 
|  | zx.koid process_koid; | 
|  |  | 
|  | // Thread ID or tid. | 
|  | zx.koid thread_koid; | 
|  |  | 
|  | ExceptionType type; | 
|  | }; | 
|  |  | 
|  | /// Generic wrapper over a thread exception. Mirrors closely the information | 
|  | /// given by an exception channel. | 
|  | /// Both |process| and |thread| will be valid if present. | 
|  | resource table ProcessException { | 
|  | /// `exception` is guaranteed to be valid. | 
|  | 1: zx.handle:EXCEPTION exception; | 
|  | 2: ExceptionInfo info; | 
|  |  | 
|  | /// Both `process` and `thread` will be valid if present. | 
|  | 3: zx.handle:PROCESS process; | 
|  |  | 
|  | /// The thread that generated the exception. | 
|  | /// The process may have other threads that are not reflected here. | 
|  | 4: zx.handle:THREAD thread; | 
|  | }; | 
|  |  | 
|  | /// What type of exception was triggered. | 
|  | /// Maps to the types defined in `zx_excp_type_t`. | 
|  | /// If zircon/syscalls/exception.h changes, this needs to be updates as well to | 
|  | /// reflect that. | 
|  | // TODO(fxbug.dev/7802): Once there is a way to better generate zx bindings, move this | 
|  | //                 definitions to a common library. | 
|  | enum ExceptionType : uint32 { | 
|  | GENERAL = 0x8; | 
|  | FATAL_PAGE_FAULT = 0x108; | 
|  | UNDEFINED_INSTRUCTION = 0x208; | 
|  | SW_BREAKPOINT = 0x308; | 
|  | HW_BREAKPOINT = 0x408; | 
|  | UNALIGNED_ACCESS = 0x508; | 
|  | THREAD_STARTING = 0x8008; | 
|  | THREAD_EXITING = 0x8108; | 
|  | POLICY_ERROR = 0x8208; | 
|  | PROCESS_STARTING = 0x8308; | 
|  | }; |