mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +00:00

This patch introduces the Granule Protection Table (GPT) library code. This implementation will be updated later to be more flexible, as the current implementation is very rigid. Signed-off-by: Zelalem Aweke <zelalem.aweke@arm.com> Change-Id: I3af824a28c6e9a5d36459c0c51d2d9bebfba1505
86 lines
2.4 KiB
C
86 lines
2.4 KiB
C
/*
|
|
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef GPT_H
|
|
#define GPT_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <arch.h>
|
|
|
|
#include "gpt_defs.h"
|
|
|
|
#define GPT_DESC_ATTRS(_type, _gpi) \
|
|
((((_type) & PAS_REG_DESC_TYPE_MASK) \
|
|
<< PAS_REG_DESC_TYPE_SHIFT) | \
|
|
(((_gpi) & PAS_REG_GPI_MASK) \
|
|
<< PAS_REG_GPI_SHIFT))
|
|
|
|
/*
|
|
* Macro to create a GPT entry for this PAS range either as a L0 block
|
|
* descriptor or L1 table descriptor depending upon the size of the range.
|
|
*/
|
|
#define MAP_GPT_REGION(_pa, _sz, _gpi) \
|
|
{ \
|
|
.base_pa = (_pa), \
|
|
.size = (_sz), \
|
|
.attrs = GPT_DESC_ATTRS(PAS_REG_DESC_TYPE_ANY, (_gpi)), \
|
|
}
|
|
|
|
/*
|
|
* Special macro to create a L1 table descriptor at L0 for a 1GB region as
|
|
* opposed to creating a block mapping by default.
|
|
*/
|
|
#define MAP_GPT_REGION_TBL(_pa, _sz, _gpi) \
|
|
{ \
|
|
.base_pa = (_pa), \
|
|
.size = (_sz), \
|
|
.attrs = GPT_DESC_ATTRS(PAS_REG_DESC_TYPE_TBL, (_gpi)), \
|
|
}
|
|
|
|
/*
|
|
* Structure for specifying a Granule range and its properties
|
|
*/
|
|
typedef struct pas_region {
|
|
unsigned long long base_pa; /**< Base address for PAS. */
|
|
size_t size; /**< Size of the PAS. */
|
|
unsigned int attrs; /**< PAS GPI and entry type. */
|
|
} pas_region_t;
|
|
|
|
/*
|
|
* Structure to initialise the Granule Protection Tables.
|
|
*/
|
|
typedef struct gpt_init_params {
|
|
unsigned int pgs; /**< Address Width of Phisical Granule Size. */
|
|
unsigned int pps; /**< Protected Physical Address Size. */
|
|
unsigned int l0gptsz; /**< Granule size on L0 table entry. */
|
|
pas_region_t *pas_regions; /**< PAS regions to protect. */
|
|
unsigned int pas_count; /**< Number of PAS regions to initialise. */
|
|
uintptr_t l0_mem_base; /**< L0 Table base address. */
|
|
size_t l0_mem_size; /**< Size of memory reserved for L0 tables. */
|
|
uintptr_t l1_mem_base; /**< L1 Table base address. */
|
|
size_t l1_mem_size; /**< Size of memory reserved for L1 tables. */
|
|
} gpt_init_params_t;
|
|
|
|
/** @brief Initialise the Granule Protection tables.
|
|
*/
|
|
int gpt_init(gpt_init_params_t *params);
|
|
|
|
/** @brief Enable the Granule Protection Checks.
|
|
*/
|
|
void gpt_enable(void);
|
|
|
|
/** @brief Disable the Granule Protection Checks.
|
|
*/
|
|
void gpt_disable(void);
|
|
|
|
/** @brief Transition a granule between security states.
|
|
*/
|
|
int gpt_transition_pas(uint64_t pa,
|
|
unsigned int src_sec_state,
|
|
unsigned int target_pas);
|
|
|
|
#endif /* GPT_H */
|