352 lines
17 KiB
C
352 lines
17 KiB
C
|
/**
|
||
|
******************************************************************************
|
||
|
* @file stm32l4xx_hal_firewall.h
|
||
|
* @author MCD Application Team
|
||
|
* @brief Header file of FIREWALL HAL module.
|
||
|
******************************************************************************
|
||
|
* @attention
|
||
|
*
|
||
|
* Copyright (c) 2017 STMicroelectronics.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||
|
* in the root directory of this software component.
|
||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||
|
*
|
||
|
******************************************************************************
|
||
|
*/
|
||
|
|
||
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
||
|
#ifndef STM32L4xx_HAL_FIREWALL_H
|
||
|
#define STM32L4xx_HAL_FIREWALL_H
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/* Includes ------------------------------------------------------------------*/
|
||
|
#include "stm32l4xx_hal_def.h"
|
||
|
|
||
|
/** @addtogroup STM32L4xx_HAL_Driver
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup FIREWALL FIREWALL
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/* Exported types ------------------------------------------------------------*/
|
||
|
/** @defgroup FIREWALL_Exported_Types FIREWALL Exported Types
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief FIREWALL Initialization Structure definition
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t CodeSegmentStartAddress; /*!< Protected code segment start address. This value is 24-bit long, the 8 LSB bits are
|
||
|
reserved and forced to 0 in order to allow a 256-byte granularity. */
|
||
|
|
||
|
uint32_t CodeSegmentLength; /*!< Protected code segment length in bytes. This value is 22-bit long, the 8 LSB bits are
|
||
|
reserved and forced to 0 for the length to be a multiple of 256 bytes. */
|
||
|
|
||
|
uint32_t NonVDataSegmentStartAddress; /*!< Protected non-volatile data segment start address. This value is 24-bit long, the 8 LSB
|
||
|
bits are reserved and forced to 0 in order to allow a 256-byte granularity. */
|
||
|
|
||
|
uint32_t NonVDataSegmentLength; /*!< Protected non-volatile data segment length in bytes. This value is 22-bit long, the 8 LSB
|
||
|
bits are reserved and forced to 0 for the length to be a multiple of 256 bytes. */
|
||
|
|
||
|
uint32_t VDataSegmentStartAddress; /*!< Protected volatile data segment start address. This value is 17-bit long, the 6 LSB bits
|
||
|
are reserved and forced to 0 in order to allow a 64-byte granularity. */
|
||
|
|
||
|
uint32_t VDataSegmentLength; /*!< Protected volatile data segment length in bytes. This value is 17-bit long, the 6 LSB
|
||
|
bits are reserved and forced to 0 for the length to be a multiple of 64 bytes. */
|
||
|
|
||
|
uint32_t VolatileDataExecution; /*!< Set VDE bit specifying whether or not the volatile data segment can be executed.
|
||
|
When VDS = 1 (set by parameter VolatileDataShared), VDE bit has no meaning.
|
||
|
This parameter can be a value of @ref FIREWALL_VolatileData_Executable */
|
||
|
|
||
|
uint32_t VolatileDataShared; /*!< Set VDS bit in specifying whether or not the volatile data segment can be shared with a
|
||
|
non-protected application code.
|
||
|
This parameter can be a value of @ref FIREWALL_VolatileData_Shared */
|
||
|
|
||
|
}FIREWALL_InitTypeDef;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Exported constants --------------------------------------------------------*/
|
||
|
/** @defgroup FIREWALL_Exported_Constants FIREWALL Exported Constants
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @defgroup FIREWALL_VolatileData_Executable FIREWALL volatile data segment execution status
|
||
|
* @{
|
||
|
*/
|
||
|
#define FIREWALL_VOLATILEDATA_NOT_EXECUTABLE ((uint32_t)0x0000)
|
||
|
#define FIREWALL_VOLATILEDATA_EXECUTABLE ((uint32_t)FW_CR_VDE)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/** @defgroup FIREWALL_VolatileData_Shared FIREWALL volatile data segment share status
|
||
|
* @{
|
||
|
*/
|
||
|
#define FIREWALL_VOLATILEDATA_NOT_SHARED ((uint32_t)0x0000)
|
||
|
#define FIREWALL_VOLATILEDATA_SHARED ((uint32_t)FW_CR_VDS)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/** @defgroup FIREWALL_Pre_Arm FIREWALL pre arm status
|
||
|
* @{
|
||
|
*/
|
||
|
#define FIREWALL_PRE_ARM_RESET ((uint32_t)0x0000)
|
||
|
#define FIREWALL_PRE_ARM_SET ((uint32_t)FW_CR_FPA)
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Private macros --------------------------------------------------------*/
|
||
|
/** @defgroup FIREWALL_Private_Macros FIREWALL Private Macros
|
||
|
* @{
|
||
|
*/
|
||
|
#define IS_FIREWALL_CODE_SEGMENT_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && ((ADDRESS) < (FLASH_BASE + FLASH_SIZE)))
|
||
|
#define IS_FIREWALL_CODE_SEGMENT_LENGTH(ADDRESS, LENGTH) (((ADDRESS) + (LENGTH)) <= (FLASH_BASE + FLASH_SIZE))
|
||
|
|
||
|
#define IS_FIREWALL_NONVOLATILEDATA_SEGMENT_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && ((ADDRESS) < (FLASH_BASE + FLASH_SIZE)))
|
||
|
#define IS_FIREWALL_NONVOLATILEDATA_SEGMENT_LENGTH(ADDRESS, LENGTH) (((ADDRESS) + (LENGTH)) <= (FLASH_BASE + FLASH_SIZE))
|
||
|
|
||
|
#define IS_FIREWALL_VOLATILEDATA_SEGMENT_ADDRESS(ADDRESS) (((ADDRESS) >= SRAM1_BASE) && ((ADDRESS) < (SRAM1_BASE + SRAM1_SIZE_MAX)))
|
||
|
#define IS_FIREWALL_VOLATILEDATA_SEGMENT_LENGTH(ADDRESS, LENGTH) (((ADDRESS) + (LENGTH)) <= (SRAM1_BASE + SRAM1_SIZE_MAX))
|
||
|
|
||
|
|
||
|
#define IS_FIREWALL_VOLATILEDATA_SHARE(SHARE) (((SHARE) == FIREWALL_VOLATILEDATA_NOT_SHARED) || \
|
||
|
((SHARE) == FIREWALL_VOLATILEDATA_SHARED))
|
||
|
|
||
|
#define IS_FIREWALL_VOLATILEDATA_EXECUTE(EXECUTE) (((EXECUTE) == FIREWALL_VOLATILEDATA_NOT_EXECUTABLE) || \
|
||
|
((EXECUTE) == FIREWALL_VOLATILEDATA_EXECUTABLE))
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Exported macros -----------------------------------------------------------*/
|
||
|
/** @defgroup FIREWALL_Exported_Macros FIREWALL Exported Macros
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @brief Check whether the FIREWALL is enabled or not.
|
||
|
* @retval FIREWALL enabling status (TRUE or FALSE).
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_IS_ENABLED() HAL_IS_BIT_CLR(SYSCFG->CFGR1, SYSCFG_CFGR1_FWDIS)
|
||
|
|
||
|
|
||
|
/** @brief Enable FIREWALL pre arm.
|
||
|
* @note When FPA bit is set, any code executed outside the protected segment
|
||
|
* closes the Firewall, otherwise it generates a system reset.
|
||
|
* @note This macro provides the same service as HAL_FIREWALL_EnablePreArmFlag() API
|
||
|
* but can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_PREARM_ENABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
SET_BIT(FIREWALL->CR, FW_CR_FPA) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_FPA) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
|
||
|
|
||
|
/** @brief Disable FIREWALL pre arm.
|
||
|
* @note When FPA bit is set, any code executed outside the protected segment
|
||
|
* closes the Firewall, otherwise, it generates a system reset.
|
||
|
* @note This macro provides the same service as HAL_FIREWALL_DisablePreArmFlag() API
|
||
|
* but can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_PREARM_DISABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
CLEAR_BIT(FIREWALL->CR, FW_CR_FPA) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_FPA) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
/** @brief Enable volatile data sharing in setting VDS bit.
|
||
|
* @note When VDS bit is set, the volatile data segment is shared with non-protected
|
||
|
* application code. It can be accessed whatever the Firewall state (opened or closed).
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_VOLATILEDATA_SHARED_ENABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
SET_BIT(FIREWALL->CR, FW_CR_VDS) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_VDS) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
/** @brief Disable volatile data sharing in resetting VDS bit.
|
||
|
* @note When VDS bit is reset, the volatile data segment is not shared and cannot be
|
||
|
* hit by a non protected executable code when the Firewall is closed. If it is
|
||
|
* accessed in such a condition, a system reset is generated by the Firewall.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_VOLATILEDATA_SHARED_DISABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
CLEAR_BIT(FIREWALL->CR, FW_CR_VDS) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_VDS) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
/** @brief Enable volatile data execution in setting VDE bit.
|
||
|
* @note VDE bit is ignored when VDS is set. IF VDS = 1, the Volatile data segment can be
|
||
|
* executed whatever the VDE bit value.
|
||
|
* @note When VDE bit is set (with VDS = 0), the volatile data segment is executable. When
|
||
|
* the Firewall call is closed, a "call gate" entry procedure is required to open
|
||
|
* first the Firewall.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_VOLATILEDATA_EXECUTION_ENABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
SET_BIT(FIREWALL->CR, FW_CR_VDE) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_VDE) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
/** @brief Disable volatile data execution in resetting VDE bit.
|
||
|
* @note VDE bit is ignored when VDS is set. IF VDS = 1, the Volatile data segment can be
|
||
|
* executed whatever the VDE bit value.
|
||
|
* @note When VDE bit is reset (with VDS = 0), the volatile data segment cannot be executed.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_VOLATILEDATA_EXECUTION_DISABLE() \
|
||
|
do { \
|
||
|
__IO uint32_t tmpreg; \
|
||
|
CLEAR_BIT(FIREWALL->CR, FW_CR_VDE) ; \
|
||
|
/* Read bit back to ensure it is taken into account by Peripheral */ \
|
||
|
/* (introduce proper delay inside macro execution) */ \
|
||
|
tmpreg = READ_BIT(FIREWALL->CR, FW_CR_VDE) ; \
|
||
|
UNUSED(tmpreg); \
|
||
|
} while(0)
|
||
|
|
||
|
|
||
|
/** @brief Check whether or not the volatile data segment is shared.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
* @retval VDS bit setting status (TRUE or FALSE).
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_GET_VOLATILEDATA_SHARED() ((FIREWALL->CR & FW_CR_VDS) == FW_CR_VDS)
|
||
|
|
||
|
/** @brief Check whether or not the volatile data segment is declared executable.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
* @retval VDE bit setting status (TRUE or FALSE).
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_GET_VOLATILEDATA_EXECUTION() ((FIREWALL->CR & FW_CR_VDE) == FW_CR_VDE)
|
||
|
|
||
|
/** @brief Check whether or not the Firewall pre arm bit is set.
|
||
|
* @note This macro can be executed inside a code area protected by the Firewall.
|
||
|
* @note This macro can be executed whatever the Firewall state (opened or closed) when
|
||
|
* NVDSL register is equal to 0. Otherwise (when NVDSL register is different from
|
||
|
* 0, that is, when the non volatile data segment is defined), the macro can be
|
||
|
* executed only when the Firewall is opened.
|
||
|
* @retval FPA bit setting status (TRUE or FALSE).
|
||
|
*/
|
||
|
#define __HAL_FIREWALL_GET_PREARM() ((FIREWALL->CR & FW_CR_FPA) == FW_CR_FPA)
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/* Exported functions --------------------------------------------------------*/
|
||
|
|
||
|
/** @addtogroup FIREWALL_Exported_Functions FIREWALL Exported Functions
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/** @addtogroup FIREWALL_Exported_Functions_Group1 Initialization Functions
|
||
|
* @brief Initialization and Configuration Functions
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/* Initialization functions ********************************/
|
||
|
HAL_StatusTypeDef HAL_FIREWALL_Config(FIREWALL_InitTypeDef * fw_init);
|
||
|
void HAL_FIREWALL_GetConfig(FIREWALL_InitTypeDef * fw_config);
|
||
|
void HAL_FIREWALL_EnableFirewall(void);
|
||
|
void HAL_FIREWALL_EnablePreArmFlag(void);
|
||
|
void HAL_FIREWALL_DisablePreArmFlag(void);
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* STM32L4xx_HAL_FIREWALL_H */
|