// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#ifndef OPENTITAN_SW_DEVICE_MASK_ROM_MASK_ROM_H_
#define OPENTITAN_SW_DEVICE_MASK_ROM_MASK_ROM_H_

#include <stdnoreturn.h>

// Header Extern Guard (so header can be used from C and C++)
#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

/**
 * Denotes functions that have to use the interrupt handler ABI.
 *
 * These must be 4-byte aligned, and they use a different calling convention.
 */
#define MASK_ROM_INTERRUPT_HANDLER_ABI __attribute__((aligned(4), interrupt))

/**
 * Denotes functions that have to be near the interrupt vector, because they
 * are jumped to from it.
 */
#define MASK_ROM_VECTOR_FUNCTION __attribute__((section(".crt")))

/**
 * The first assembly procedure executed by the Mask ROM (defined in
 * `mask_rom.S`).
 *
 * This procedure does not obey the standard RISC-V calling convention, so it
 * must not be called from other C code.
 */
MASK_ROM_VECTOR_FUNCTION
void _mask_rom_start_boot(void);

/**
 * The first C function executed by the Mask ROM (defined in `mask_rom.c`)
 */
noreturn void mask_rom_boot(void);

/**
 * Mask ROM hardware exception handler.
 *
 * This may not be able to be implemented in C.
 */
MASK_ROM_VECTOR_FUNCTION
MASK_ROM_INTERRUPT_HANDLER_ABI
void mask_rom_exception_handler(void);

/**
 * Mask ROM non-maskable interrupt handler.
 *
 * This may not be able to be implemented in C.
 */
MASK_ROM_VECTOR_FUNCTION
MASK_ROM_INTERRUPT_HANDLER_ABI
void mask_rom_nmi_handler(void);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  // OPENTITAN_SW_DEVICE_MASK_ROM_MASK_ROM_H_
