| // 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 { |
| /// Requests the exception handler to send a signal indicating the server is |
| /// active and able to respond to requests. |
| /// |
| /// It's recommended clients call IsActive and wait for a response before |
| /// sending an exception to the server with OnException because a |
| /// zx.handle:EXCEPTION can't be released by the client once it's sent |
| /// across the channel. |
| /// |
| /// Note: a response guarantees the server was active when it sent the |
| /// response, but doesn't preclcude the server being unresponsive after the |
| /// reply was sent. |
| IsActive() -> (); |
| |
| /// 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(resource struct { |
| exception zx.handle:EXCEPTION; |
| info ExceptionInfo; |
| }) -> (); |
| }; |
| |
| /// 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. |
| type ExceptionInfo = struct { |
| // Process ID or pid. |
| process_koid zx.koid; |
| |
| // Thread ID or tid. |
| thread_koid zx.koid; |
| |
| type ExceptionType; |
| }; |
| |
| /// Generic wrapper over a thread exception. Mirrors closely the information |
| /// given by an exception channel. |
| /// Both |process| and |thread| will be valid if present. |
| type ProcessException = resource table { |
| /// `exception` is guaranteed to be valid. |
| 1: exception zx.handle:EXCEPTION; |
| 2: info ExceptionInfo; |
| |
| /// Both `process` and `thread` will be valid if present. |
| 3: process zx.handle:PROCESS; |
| |
| /// The thread that generated the exception. |
| /// The process may have other threads that are not reflected here. |
| 4: thread zx.handle: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. |
| type ExceptionType = strict enum : 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; |
| }; |