// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_INCLUDE_ARCH_EXCEPTION_H_
#define ZIRCON_KERNEL_INCLUDE_ARCH_EXCEPTION_H_

#include <sys/types.h>
#include <zircon/compiler.h>
#include <zircon/types.h>

struct Thread;
typedef struct arch_exception_context arch_exception_context_t;
typedef struct zx_exception_report zx_exception_report_t;

// Called by arch code when it cannot handle an exception.
// |context| is architecture-specific, and can be dumped to the console
// using arch_dump_exception_context(). Implemented by non-arch code.
zx_status_t dispatch_user_exception(uint exception_type, const arch_exception_context_t* context);

// Dispatches an exception that was raised by a syscall using
// thread_signal_policy_exception() (see <kernel/thread.h>), causing
// dispatch_user_exception() to be called with the current context. Implemented
// by arch code. |policy_exception_code| is information about the policy error
// which is stored into the zx_exception_report_t.
zx_status_t arch_dispatch_user_policy_exception(uint32_t policy_exception_code,
                                                uint32_t policy_exception_data);

// Dumps architecture-specific state to the console. |context| typically comes
// from a call to dispatch_user_exception(). Implemented by arch code.
void arch_dump_exception_context(const arch_exception_context_t* context);

// Sets |report| using architecture-specific information from |context|.
// Implemented by arch code.
void arch_fill_in_exception_context(const arch_exception_context_t* context,
                                    zx_exception_report_t* report);

// Record registers in |context| as being available to |zx_thread_read_state(),
// zx_thread_write_state()|.
//
// This is called prior to the thread stopping in an exception, and must be matched with a
// corresponding call to |arch_remove_exception_context()| prior to the thread resuming execution if
// it returns true.
__WARN_UNUSED_RESULT
bool arch_install_exception_context(Thread* thread, const arch_exception_context_t* context);

// Undo a previous call to |arch_install_exception_context()|.
void arch_remove_exception_context(Thread* thread);

#endif  // ZIRCON_KERNEL_INCLUDE_ARCH_EXCEPTION_H_
