diff options
author | Soby Mathew <soby.mathew@arm.com> | 2020-01-29 09:51:21 +0000 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2020-01-29 09:51:21 +0000 |
commit | 8efec9e097781fb9598f7923b3ae9a8487a8635f (patch) | |
tree | ccfe3ea82cd15e0e41084bf6c7665629c44e40c7 /plat/qemu | |
parent | c1f118f1a724108bed7be2822244e6a06a28ab93 (diff) | |
parent | 61cbd41d7914032d3df1e49c1c1efbe2f9cb4c39 (diff) | |
download | arm-trusted-firmware-8efec9e097781fb9598f7923b3ae9a8487a8635f.tar.gz |
Merge changes I0fb7cf79,Ia8eb4710 into integration
* changes:
qemu: Implement qemu_system_off via semihosting.
qemu: Support ARM_LINUX_KERNEL_AS_BL33 to pass FDT address.
Diffstat (limited to 'plat/qemu')
-rw-r--r-- | plat/qemu/common/qemu_bl2_setup.c | 21 | ||||
-rw-r--r-- | plat/qemu/common/qemu_pm.c | 6 | ||||
-rw-r--r-- | plat/qemu/qemu/platform.mk | 10 | ||||
-rw-r--r-- | plat/qemu/qemu_sbsa/platform.mk | 10 |
4 files changed, 43 insertions, 4 deletions
diff --git a/plat/qemu/common/qemu_bl2_setup.c b/plat/qemu/common/qemu_bl2_setup.c index 166d2454e..3e289fc6b 100644 --- a/plat/qemu/common/qemu_bl2_setup.c +++ b/plat/qemu/common/qemu_bl2_setup.c @@ -51,7 +51,7 @@ static void security_setup(void) static void update_dt(void) { int ret; - void *fdt = (void *)(uintptr_t)PLAT_QEMU_DT_BASE; + void *fdt = (void *)(uintptr_t)ARM_PRELOADED_DTB_BASE; ret = fdt_open_into(fdt, fdt, PLAT_QEMU_DT_MAX_SIZE); if (ret < 0) { @@ -172,12 +172,12 @@ static int qemu_bl2_handle_post_image_load(unsigned int image_id) * 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; + bl_mem_params->ep_info.args.arg3 = ARM_PRELOADED_DTB_BASE; #else /* case AARCH32_SP_OPTEE */ bl_mem_params->ep_info.args.arg0 = bl_mem_params->ep_info.args.arg1; bl_mem_params->ep_info.args.arg1 = 0; - bl_mem_params->ep_info.args.arg2 = PLAT_QEMU_DT_BASE; + bl_mem_params->ep_info.args.arg2 = ARM_PRELOADED_DTB_BASE; bl_mem_params->ep_info.args.arg3 = 0; #endif #endif @@ -192,8 +192,23 @@ static int qemu_bl2_handle_post_image_load(unsigned int image_id) pager_mem_params->ep_info.lr_svc = bl_mem_params->ep_info.pc; #endif +#if ARM_LINUX_KERNEL_AS_BL33 + /* + * According to the file ``Documentation/arm64/booting.txt`` of + * the Linux kernel tree, Linux expects the physical address of + * the device tree blob (DTB) in x0, while x1-x3 are reserved + * for future use and must be 0. + */ + bl_mem_params->ep_info.args.arg0 = + (u_register_t)ARM_PRELOADED_DTB_BASE; + bl_mem_params->ep_info.args.arg1 = 0U; + bl_mem_params->ep_info.args.arg2 = 0U; + bl_mem_params->ep_info.args.arg3 = 0U; +#else /* BL33 expects to receive the primary CPU MPID (through r0) */ bl_mem_params->ep_info.args.arg0 = 0xffff & read_mpidr(); +#endif + bl_mem_params->ep_info.spsr = qemu_get_spsr_for_bl33_entry(); break; default: diff --git a/plat/qemu/common/qemu_pm.c b/plat/qemu/common/qemu_pm.c index a199688df..116211c51 100644 --- a/plat/qemu/common/qemu_pm.c +++ b/plat/qemu/common/qemu_pm.c @@ -10,10 +10,13 @@ #include <arch_helpers.h> #include <common/debug.h> #include <lib/psci/psci.h> +#include <lib/semihosting.h> #include <plat/common/platform.h> #include "qemu_private.h" +#define ADP_STOPPED_APPLICATION_EXIT 0x20026 + /* * The secure entry point to be used on warm reset. */ @@ -191,7 +194,8 @@ void qemu_pwr_domain_suspend_finish(const psci_power_state_t *target_state) ******************************************************************************/ static void __dead2 qemu_system_off(void) { - ERROR("QEMU System Off: operation not handled.\n"); + semihosting_exit(ADP_STOPPED_APPLICATION_EXIT, 0); + ERROR("QEMU System Off: semihosting call unexpectedly returned.\n"); panic(); } diff --git a/plat/qemu/qemu/platform.mk b/plat/qemu/qemu/platform.mk index 5fda2cd47..b95bf5a51 100644 --- a/plat/qemu/qemu/platform.mk +++ b/plat/qemu/qemu/platform.mk @@ -151,6 +151,8 @@ ifeq (${ARM_ARCH_MAJOR},8) BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ + lib/semihosting/semihosting.c \ + lib/semihosting/${ARCH}/semihosting_call.S \ plat/common/plat_psci_common.c \ ${PLAT_QEMU_COMMON_PATH}/qemu_pm.c \ ${PLAT_QEMU_COMMON_PATH}/topology.c \ @@ -186,5 +188,13 @@ endif # Process flags $(eval $(call add_define,BL32_RAM_LOCATION_ID)) +# Don't have the Linux kernel as a BL33 image by default +ARM_LINUX_KERNEL_AS_BL33 := 0 +$(eval $(call assert_boolean,ARM_LINUX_KERNEL_AS_BL33)) +$(eval $(call add_define,ARM_LINUX_KERNEL_AS_BL33)) + +ARM_PRELOADED_DTB_BASE := PLAT_QEMU_DT_BASE +$(eval $(call add_define,ARM_PRELOADED_DTB_BASE)) + # Do not enable SVE ENABLE_SVE_FOR_NS := 0 diff --git a/plat/qemu/qemu_sbsa/platform.mk b/plat/qemu/qemu_sbsa/platform.mk index 0d6047da1..51832d0ff 100644 --- a/plat/qemu/qemu_sbsa/platform.mk +++ b/plat/qemu/qemu_sbsa/platform.mk @@ -71,6 +71,8 @@ QEMU_GIC_SOURCES := drivers/arm/gic/v3/gicv3_helpers.c \ BL31_SOURCES += lib/cpus/aarch64/aem_generic.S \ lib/cpus/aarch64/cortex_a53.S \ lib/cpus/aarch64/cortex_a57.S \ + lib/semihosting/semihosting.c \ + lib/semihosting/${ARCH}/semihosting_call.S \ plat/common/plat_psci_common.c \ ${PLAT_QEMU_COMMON_PATH}/qemu_pm.c \ ${PLAT_QEMU_COMMON_PATH}/topology.c \ @@ -97,5 +99,13 @@ PRELOADED_BL33_BASE ?= 0x10000000 BL32_RAM_LOCATION_ID = SEC_SRAM_ID $(eval $(call add_define,BL32_RAM_LOCATION_ID)) +# Don't have the Linux kernel as a BL33 image by default +ARM_LINUX_KERNEL_AS_BL33 := 0 +$(eval $(call assert_boolean,ARM_LINUX_KERNEL_AS_BL33)) +$(eval $(call add_define,ARM_LINUX_KERNEL_AS_BL33)) + +ARM_PRELOADED_DTB_BASE := PLAT_QEMU_DT_BASE +$(eval $(call add_define,ARM_PRELOADED_DTB_BASE)) + # Do not enable SVE ENABLE_SVE_FOR_NS := 0 |