Commit 263ed50e authored by davidcunado-arm's avatar davidcunado-arm Committed by GitHub
Browse files

Merge pull request #1065 from jenswi-linaro/optee_qemu

qemu: Add OP-TEE extra image parsing support
parents c1f81466 e2af1cad
...@@ -73,6 +73,11 @@ ...@@ -73,6 +73,11 @@
#define SEC_DRAM_BASE 0x0e100000 #define SEC_DRAM_BASE 0x0e100000
#define SEC_DRAM_SIZE 0x00f00000 #define SEC_DRAM_SIZE 0x00f00000
/* Load pageable part of OP-TEE at end of secure DRAM */
#define QEMU_OPTEE_PAGEABLE_LOAD_BASE (SEC_DRAM_BASE + SEC_DRAM_SIZE - \
QEMU_OPTEE_PAGEABLE_LOAD_SIZE)
#define QEMU_OPTEE_PAGEABLE_LOAD_SIZE 0x00400000
/* /*
* ARM-TF lives in SRAM, partition it here * ARM-TF lives in SRAM, partition it here
*/ */
...@@ -154,7 +159,8 @@ ...@@ -154,7 +159,8 @@
#define NS_IMAGE_OFFSET 0x60000000 #define NS_IMAGE_OFFSET 0x60000000
#define ADDR_SPACE_SIZE (1ull << 32) #define PLAT_PHY_ADDR_SPACE_SIZE (1ull << 32)
#define PLAT_VIRT_ADDR_SPACE_SIZE (1ull << 32)
#define MAX_MMAP_REGIONS 8 #define MAX_MMAP_REGIONS 8
#define MAX_XLAT_TABLES 6 #define MAX_XLAT_TABLES 6
#define MAX_IO_DEVICES 3 #define MAX_IO_DEVICES 3
......
...@@ -65,6 +65,10 @@ BL2_SOURCES += plat/qemu/qemu_bl2_mem_params_desc.c \ ...@@ -65,6 +65,10 @@ BL2_SOURCES += plat/qemu/qemu_bl2_mem_params_desc.c \
plat/qemu/qemu_image_load.c \ plat/qemu/qemu_image_load.c \
common/desc_image_load.c common/desc_image_load.c
endif endif
ifeq (${SPD},opteed)
BL2_SOURCES += lib/optee/optee_utils.c
endif
BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \ BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \
lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a53.S \
...@@ -72,13 +76,23 @@ BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \ ...@@ -72,13 +76,23 @@ BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \
drivers/arm/gic/v2/gicv2_helpers.c \ drivers/arm/gic/v2/gicv2_helpers.c \
drivers/arm/gic/v2/gicv2_main.c \ drivers/arm/gic/v2/gicv2_main.c \
drivers/arm/gic/common/gic_common.c \ drivers/arm/gic/common/gic_common.c \
plat/common/aarch64/plat_psci_common.c \ plat/common/plat_psci_common.c \
plat/qemu/qemu_pm.c \ plat/qemu/qemu_pm.c \
plat/qemu/topology.c \ plat/qemu/topology.c \
plat/qemu/aarch64/plat_helpers.S \ plat/qemu/aarch64/plat_helpers.S \
plat/qemu/qemu_bl31_setup.c \ plat/qemu/qemu_bl31_setup.c \
plat/qemu/qemu_gic.c plat/qemu/qemu_gic.c
# Add the build options to pack Trusted OS Extra1 and Trusted OS Extra2 images
# in the FIP if the platform requires.
ifneq ($(BL32_EXTRA1),)
$(eval $(call FIP_ADD_IMG,BL32_EXTRA1,--tos-fw-extra1))
endif
ifneq ($(BL32_EXTRA2),)
$(eval $(call FIP_ADD_IMG,BL32_EXTRA2,--tos-fw-extra2))
endif
# Disable the PSCI platform compatibility layer # Disable the PSCI platform compatibility layer
ENABLE_PLAT_COMPAT := 0 ENABLE_PLAT_COMPAT := 0
......
...@@ -72,6 +72,43 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = { ...@@ -72,6 +72,43 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
.next_handoff_image_id = BL33_IMAGE_ID, .next_handoff_image_id = BL33_IMAGE_ID,
}, },
/*
* Fill BL32 external 1 related information.
* A typical use for extra1 image is with OP-TEE where it is the
* pager image.
*/
{ .image_id = BL32_EXTRA1_IMAGE_ID,
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
entry_point_info_t, SECURE | NON_EXECUTABLE),
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
.image_info.image_base = BL32_BASE,
.image_info.image_max_size = BL32_LIMIT - BL32_BASE,
.next_handoff_image_id = INVALID_IMAGE_ID,
},
/*
* Fill BL32 external 2 related information.
* A typical use for extra2 image is with OP-TEE where it is the
* paged image.
*/
{ .image_id = BL32_EXTRA2_IMAGE_ID,
SET_STATIC_PARAM_HEAD(ep_info, PARAM_EP, VERSION_2,
entry_point_info_t, SECURE | NON_EXECUTABLE),
SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2,
image_info_t, IMAGE_ATTRIB_SKIP_LOADING),
#ifdef SPD_opteed
.image_info.image_base = QEMU_OPTEE_PAGEABLE_LOAD_BASE,
.image_info.image_max_size = QEMU_OPTEE_PAGEABLE_LOAD_SIZE,
#endif
.next_handoff_image_id = INVALID_IMAGE_ID,
},
# endif /* QEMU_LOAD_BL32 */ # endif /* QEMU_LOAD_BL32 */
/* Fill BL33 related information */ /* Fill BL33 related information */
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
#include <console.h> #include <console.h>
#include <debug.h> #include <debug.h>
#include <desc_image_load.h> #include <desc_image_load.h>
#ifdef SPD_opteed
#include <optee_utils.h>
#endif
#include <libfdt.h> #include <libfdt.h>
#include <platform_def.h> #include <platform_def.h>
#include <string.h> #include <string.h>
...@@ -225,12 +228,36 @@ static int qemu_bl2_handle_post_image_load(unsigned int image_id) ...@@ -225,12 +228,36 @@ static int qemu_bl2_handle_post_image_load(unsigned int image_id)
{ {
int err = 0; int err = 0;
bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id); bl_mem_params_node_t *bl_mem_params = get_bl_mem_params_node(image_id);
#ifdef SPD_opteed
bl_mem_params_node_t *pager_mem_params = NULL;
bl_mem_params_node_t *paged_mem_params = NULL;
#endif
assert(bl_mem_params); assert(bl_mem_params);
switch (image_id) { switch (image_id) {
# ifdef AARCH64 # ifdef AARCH64
case BL32_IMAGE_ID: case BL32_IMAGE_ID:
#ifdef SPD_opteed
pager_mem_params = get_bl_mem_params_node(BL32_EXTRA1_IMAGE_ID);
assert(pager_mem_params);
paged_mem_params = get_bl_mem_params_node(BL32_EXTRA2_IMAGE_ID);
assert(paged_mem_params);
err = parse_optee_header(&bl_mem_params->ep_info,
&pager_mem_params->image_info,
&paged_mem_params->image_info);
if (err != 0) {
WARN("OPTEE header parse error.\n");
}
/*
* OP-TEE expect to receive DTB address in x2.
* This will be copied into x2 by dispatcher.
*/
bl_mem_params->ep_info.args.arg3 = PLAT_QEMU_DT_BASE;
#endif
bl_mem_params->ep_info.spsr = qemu_get_spsr_for_bl32_entry(); bl_mem_params->ep_info.spsr = qemu_get_spsr_for_bl32_entry();
break; break;
# endif # endif
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#define BL2_IMAGE_NAME "bl2.bin" #define BL2_IMAGE_NAME "bl2.bin"
#define BL31_IMAGE_NAME "bl31.bin" #define BL31_IMAGE_NAME "bl31.bin"
#define BL32_IMAGE_NAME "bl32.bin" #define BL32_IMAGE_NAME "bl32.bin"
#define BL32_EXTRA1_IMAGE_NAME "bl32_extra1.bin"
#define BL32_EXTRA2_IMAGE_NAME "bl32_extra2.bin"
#define BL33_IMAGE_NAME "bl33.bin" #define BL33_IMAGE_NAME "bl33.bin"
#if TRUSTED_BOARD_BOOT #if TRUSTED_BOARD_BOOT
...@@ -61,6 +63,14 @@ static const io_uuid_spec_t bl32_uuid_spec = { ...@@ -61,6 +63,14 @@ static const io_uuid_spec_t bl32_uuid_spec = {
.uuid = UUID_SECURE_PAYLOAD_BL32, .uuid = UUID_SECURE_PAYLOAD_BL32,
}; };
static const io_uuid_spec_t bl32_extra1_uuid_spec = {
.uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA1,
};
static const io_uuid_spec_t bl32_extra2_uuid_spec = {
.uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA2,
};
static const io_uuid_spec_t bl33_uuid_spec = { static const io_uuid_spec_t bl33_uuid_spec = {
.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33, .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
}; };
...@@ -112,6 +122,14 @@ static const io_file_spec_t sh_file_spec[] = { ...@@ -112,6 +122,14 @@ static const io_file_spec_t sh_file_spec[] = {
.path = BL32_IMAGE_NAME, .path = BL32_IMAGE_NAME,
.mode = FOPEN_MODE_RB .mode = FOPEN_MODE_RB
}, },
[BL32_EXTRA1_IMAGE_ID] = {
.path = BL32_EXTRA1_IMAGE_NAME,
.mode = FOPEN_MODE_RB
},
[BL32_EXTRA2_IMAGE_ID] = {
.path = BL32_EXTRA2_IMAGE_NAME,
.mode = FOPEN_MODE_RB
},
[BL33_IMAGE_ID] = { [BL33_IMAGE_ID] = {
.path = BL33_IMAGE_NAME, .path = BL33_IMAGE_NAME,
.mode = FOPEN_MODE_RB .mode = FOPEN_MODE_RB
...@@ -185,6 +203,16 @@ static const struct plat_io_policy policies[] = { ...@@ -185,6 +203,16 @@ static const struct plat_io_policy policies[] = {
(uintptr_t)&bl32_uuid_spec, (uintptr_t)&bl32_uuid_spec,
open_fip open_fip
}, },
[BL32_EXTRA1_IMAGE_ID] = {
&fip_dev_handle,
(uintptr_t)&bl32_extra1_uuid_spec,
open_fip
},
[BL32_EXTRA2_IMAGE_ID] = {
&fip_dev_handle,
(uintptr_t)&bl32_extra2_uuid_spec,
open_fip
},
[BL33_IMAGE_ID] = { [BL33_IMAGE_ID] = {
&fip_dev_handle, &fip_dev_handle,
(uintptr_t)&bl33_uuid_spec, (uintptr_t)&bl33_uuid_spec,
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
void opteed_init_optee_ep_state(struct entry_point_info *optee_entry_point, void opteed_init_optee_ep_state(struct entry_point_info *optee_entry_point,
uint32_t rw, uint64_t pc, uint32_t rw, uint64_t pc,
uint64_t pageable_part, uint64_t mem_limit, uint64_t pageable_part, uint64_t mem_limit,
optee_context_t *optee_ctx) uint64_t dt_addr, optee_context_t *optee_ctx)
{ {
uint32_t ep_attr; uint32_t ep_attr;
...@@ -54,6 +54,7 @@ void opteed_init_optee_ep_state(struct entry_point_info *optee_entry_point, ...@@ -54,6 +54,7 @@ void opteed_init_optee_ep_state(struct entry_point_info *optee_entry_point,
zeromem(&optee_entry_point->args, sizeof(optee_entry_point->args)); zeromem(&optee_entry_point->args, sizeof(optee_entry_point->args));
optee_entry_point->args.arg0 = pageable_part; optee_entry_point->args.arg0 = pageable_part;
optee_entry_point->args.arg1 = mem_limit; optee_entry_point->args.arg1 = mem_limit;
optee_entry_point->args.arg2 = dt_addr;
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -96,6 +96,7 @@ int32_t opteed_setup(void) ...@@ -96,6 +96,7 @@ int32_t opteed_setup(void)
uint32_t linear_id; uint32_t linear_id;
uint64_t opteed_pageable_part; uint64_t opteed_pageable_part;
uint64_t opteed_mem_limit; uint64_t opteed_mem_limit;
uint64_t dt_addr;
linear_id = plat_my_core_pos(); linear_id = plat_my_core_pos();
...@@ -120,19 +121,17 @@ int32_t opteed_setup(void) ...@@ -120,19 +121,17 @@ int32_t opteed_setup(void)
if (!optee_ep_info->pc) if (!optee_ep_info->pc)
return 1; return 1;
/*
* We could inspect the SP image and determine it's execution
* state i.e whether AArch32 or AArch64.
*/
opteed_rw = optee_ep_info->args.arg0; opteed_rw = optee_ep_info->args.arg0;
opteed_pageable_part = optee_ep_info->args.arg1; opteed_pageable_part = optee_ep_info->args.arg1;
opteed_mem_limit = optee_ep_info->args.arg2; opteed_mem_limit = optee_ep_info->args.arg2;
dt_addr = optee_ep_info->args.arg3;
opteed_init_optee_ep_state(optee_ep_info, opteed_init_optee_ep_state(optee_ep_info,
opteed_rw, opteed_rw,
optee_ep_info->pc, optee_ep_info->pc,
opteed_pageable_part, opteed_pageable_part,
opteed_mem_limit, opteed_mem_limit,
dt_addr,
&opteed_sp_context[linear_id]); &opteed_sp_context[linear_id]);
/* /*
......
...@@ -99,7 +99,7 @@ static void opteed_cpu_on_finish_handler(uint64_t unused) ...@@ -99,7 +99,7 @@ static void opteed_cpu_on_finish_handler(uint64_t unused)
opteed_init_optee_ep_state(&optee_on_entrypoint, opteed_rw, opteed_init_optee_ep_state(&optee_on_entrypoint, opteed_rw,
(uint64_t)&optee_vectors->cpu_on_entry, (uint64_t)&optee_vectors->cpu_on_entry,
0, 0, optee_ctx); 0, 0, 0, optee_ctx);
/* Initialise this cpu's secure context */ /* Initialise this cpu's secure context */
cm_init_my_context(&optee_on_entrypoint); cm_init_my_context(&optee_on_entrypoint);
......
...@@ -149,6 +149,7 @@ void opteed_init_optee_ep_state(struct entry_point_info *optee_ep, ...@@ -149,6 +149,7 @@ void opteed_init_optee_ep_state(struct entry_point_info *optee_ep,
uint64_t pc, uint64_t pc,
uint64_t pageable_part, uint64_t pageable_part,
uint64_t mem_limit, uint64_t mem_limit,
uint64_t dt_addr,
optee_context_t *optee_ctx); optee_context_t *optee_ctx);
extern optee_context_t opteed_sp_context[OPTEED_CORE_COUNT]; extern optee_context_t opteed_sp_context[OPTEED_CORE_COUNT];
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment