// 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;
};
