/*
 * Copyright (c) 2015, ARM Limited, All Rights Reserved
 * SPDX-License-Identifier: Apache-2.0
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __UVISOR_API_HALT_EXPORTS_H__
#define __UVISOR_API_HALT_EXPORTS_H__

#define UVISOR_ERROR_INVALID_BOX_ID             (-2)
#define UVISOR_ERROR_BUFFER_TOO_SMALL           (-3)
#define UVISOR_ERROR_BOX_NAMESPACE_ANONYMOUS    (-4)
#define UVISOR_ERROR_BAD_MAGIC                  (-5)
#define UVISOR_ERROR_BAD_VERSION                (-6)
#define UVISOR_ERROR_OUT_OF_STRUCTURES          (-7)
#define UVISOR_ERROR_INVALID_PARAMETERS         (-8)
#define UVISOR_ERROR_NOT_IMPLEMENTED            (-9)
#define UVISOR_ERROR_TIMEOUT                    (-10)


#define UVISOR_ERROR_CLASS_MASK     (0xFFFF0000UL)
#define UVISOR_ERROR_MASK           (0x0000FFFFUL)

#define UVISOR_ERROR_CLASS_PAGE     (1UL << 16)

typedef enum {
    USER_NOT_ALLOWED = 1,
    DEBUG_BOX_HALT,
} THaltUserError;

typedef enum {
    HALT_NO_ERROR = 0,
    PERMISSION_DENIED = 1,
    SANITY_CHECK_FAILED,
    NOT_IMPLEMENTED,
    NOT_ALLOWED,
    FAULT_MEMMANAGE,
    FAULT_BUS,
    FAULT_USAGE,
    FAULT_HARD,
    FAULT_DEBUG,
    FAULT_SECURE,
    __THALTERROR_MAX /* always keep as the last element of the enum */
} THaltError;

/** A basic exception frame
 *
 * This struct contains the registers always saved during an exception in the
 * order they are placed in the memory.
 * If FPU state is also saved it's placed after this register block.
 * On ARMv8-M in certain cases an additional state context may be placed on
 * the stack before this block.
 */
typedef struct {
    uint32_t r0;
    uint32_t r1;
    uint32_t r2;
    uint32_t r3;
    uint32_t r12;
    uint32_t lr;
    uint32_t retaddr;
    uint32_t retpsr;
} UVISOR_PACKED exception_frame_t;

/* A pointer to this structure will be given to halt_error() handler
 * of the debug box driver. */
typedef struct {
    /* A basic exception stack frame that is always present with a valid stack. */
    exception_frame_t stack_frame;

    /* A few registers that may be useful for debug. */
    uint32_t lr;
    uint32_t control;
    uint32_t ipsr;

    /* Fault status registers. */
    uint32_t mmfar;
    uint32_t bfar;
    uint32_t cfsr;
    uint32_t hfsr;
    uint32_t dfsr;
    uint32_t afsr;

    /* Bitmask telling which of the above regions are valid. */
    uint32_t valid_data;
} UVISOR_PACKED THaltInfo;

/* Bitmask to specify which HaltInfo regions are valid. */
typedef enum {
    HALT_INFO_STACK_FRAME = 0x1,
    HALT_INFO_REGISTERS   = 0x2
} THaltInfoValidMask;

#endif /* __UVISOR_API_HALT_EXPORTS_H__ */
