Newer
Older
mbed-os / components / TARGET_PSA / TARGET_TFM / COMPONENT_SPE / platform / include / tfm_spm_hal.h
@Devaraj Ranganna Devaraj Ranganna on 6 Jun 2019 6 KB [trusted-firmware-m]: Updated to e7efdc6
/*
 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

#ifndef __TFM_SPM_HAL_H__
#define __TFM_SPM_HAL_H__

#include <stdint.h>
#include "tfm_secure_api.h"
#include "spm_api.h"

/**
 * \brief Holds peripheral specific data fields required to manage the
 *        peripherals isolation
 *
 * This structure has to be defined in the platform directory, and may have
 * different definition for each platform. The structure should contain fields
 * that describe the peripheral for the functions that are prototyped in this
 * file and are responsible for configuring the isolation of the peripherals.
 *
 * Pointers to structures of this type are managed by the SPM, and passed to the
 * necessary function on isolation request. The pointers are also defined by the
 * platform in the header file tfm_peripherals_def.h. For details on this, see
 * the documentation of that file.
 */
struct tfm_spm_partition_platform_data_t;

#if defined (TFM_PSA_API) || (TFM_LVL != 1)
/**
 * \brief Holds SPM db fields that define the memory regions used by a
 *        partition.
 */
struct tfm_spm_partition_memory_data_t
{
    uint32_t code_start;   /*!< Start of the code memory of this partition. */
    uint32_t code_limit;   /*!< Address of the byte beyond the end of the code
                            *   memory of this partition.
                            */
    uint32_t ro_start;     /*!< Start of the read only memory of this
                            *   partition.
                            */
    uint32_t ro_limit;     /*!< Address of the byte beyond the end of the read
                            *   only memory of this partition.
                            */
    uint32_t rw_start;     /*!< Start of the data region of this partition. */
    uint32_t rw_limit;     /*!< Address of the byte beyond the end of the data
                            *   region of this partition.
                            */
    uint32_t zi_start;     /*!< Start of the zero initialised data region of
                            *   this partition.
                            */
    uint32_t zi_limit;     /*!< Address of the byte beyond the end of the zero
                            *   initialised region of this partition.
                            */
    uint32_t stack_bottom; /*!< The bottom of the stack for the partition. */
    uint32_t stack_top;    /*!< The top of the stack for the partition. */
};
#endif

/**
 * \brief This function initialises the HW used for isolation, and sets the
 *        default configuration for them.
 *
 * This function is called during TF-M core early startup, before DB init
 */
void tfm_spm_hal_init_isolation_hw(void);

/**
 * \brief This function initialises the HW used for isolation, and sets the
 *        default configuration for them.
 * This function is called during TF-M core early startup, after DB init
 */
void tfm_spm_hal_setup_isolation_hw(void);

/**
 * \brief Configure peripherals for a partition based on the platfotm data from
 *        the DB
 *
 * This function is called during partition initialisation (before calling the
 * init function for the partition)
 *
 * \param[in] platform_data    The platform fields of the partition DB record to
 *                             be used for configuration. Can be NULL.
 */
void tfm_spm_hal_configure_default_isolation(
                 const struct tfm_spm_partition_platform_data_t *platform_data);
/**
 * \brief Configures the system debug properties.
 *        The default configuration of this function should disable secure debug
 *        when either DAUTH_NONE or DAUTH_NS_ONLY define is set. It is up to the
 *        platform owner to decide if secure debug can be turned on in their
 *        system, if DAUTH_FULL define is present.
 *        The DAUTH_CHIP_DEFAULT define should not be considered a safe default
 *        option unless explicitly noted by the chip vendor.
 *        The implementation has to expect that one of those defines is going to
 *        be set. Otherwise, a compile error needs to be triggered.
 */
void tfm_spm_hal_init_debug(void);

/**
 * \brief Enables the fault handlers
 */
void enable_fault_handlers(void);

/**
 * \brief Configures the system reset request properties
 */
void system_reset_cfg(void);

/**
 * \brief Configures all external interrupts to target the
 *        NS state, apart for the ones associated to secure
 *        peripherals (plus MPC and PPC)
 */
void nvic_interrupt_target_state_cfg(void);

/**
 * \brief This function enable the interrupts associated
 *        to the secure peripherals (plus the isolation boundary violation
 *        interrupts)
 */
void nvic_interrupt_enable(void);

/**
 * \brief Get the VTOR value of non-secure image
 *
 * \return Returns the address where the vector table of the non-secure image
 *         is located
 */
uint32_t tfm_spm_hal_get_ns_VTOR(void);

/**
 * \brief Get the initial address of non-secure image main stack
 *
 * \return Returns the initial non-secure MSP
 */
uint32_t tfm_spm_hal_get_ns_MSP(void);

/**
 * \brief Get the entry point of the non-secure image
 *
 * \return Returns the address of the non-secure image entry point
 */
uint32_t tfm_spm_hal_get_ns_entry_point(void);


#if (TFM_LVL != 1) && !defined(TFM_PSA_API)
/**
 * \brief Configure the sandbox for a partition.
 *
 * \param[in] memory_data      The memory ranges from the partition DB for this
 *                             partition
 * \param[in] platform_data    The platform fields of the partition DB record
 *                             for this partition. Can be NULL.
 *
 * \return Returns the result operation as per \ref spm_err_t
 */
enum spm_err_t tfm_spm_hal_partition_sandbox_config(
                 const struct tfm_spm_partition_memory_data_t *memory_data,
                 const struct tfm_spm_partition_platform_data_t *platform_data);

/**
 * \brief Deconfigure the sandbox for a partition.
 *
 * \param[in] memory_data      The memory ranges from the partition DB for this
 *                             partition
 * \param[in] platform_data    The platform fields of the partition DB record
 *                             for this partition. Can be NULL.
 *
 * \return Returns the result operation as per \ref spm_err_t
 */
enum spm_err_t tfm_spm_hal_partition_sandbox_deconfig(
                 const struct tfm_spm_partition_memory_data_t *memory_data,
                 const struct tfm_spm_partition_platform_data_t *platform_data);

/**
 * \brief Set the share region mode
 *
 * \param[in] share      The mode to set
 *
 * \return Returns the result operation as per \ref spm_err_t
 */
enum spm_err_t tfm_spm_hal_set_share_region(
                                          enum tfm_buffer_share_region_e share);
#endif

#endif /* __TFM_SPM_HAL_H__ */