From 76c6caad52244ab9a14151620a80ff0f71035b6c Mon Sep 17 00:00:00 2001 From: Gedare Bloom Date: Tue, 22 Jun 2021 20:01:17 -0600 Subject: bsps/aarch64: add non-secure mode and versal support --- bsps/aarch64/shared/start/start.S | 18 +++++++++++++++-- bsps/shared/dev/irq/arm-gicv3.c | 23 ++++++++++++++++++++-- spec/build/bsps/aarch64/a53/grp.yml | 2 ++ spec/build/bsps/aarch64/a72/grp.yml | 2 ++ spec/build/bsps/aarch64/optisns.yml | 20 +++++++++++++++++++ .../bsps/aarch64/xilinx-versal/bspqemuilp32.yml | 4 +--- .../bsps/aarch64/xilinx-versal/bspqemulp64.yml | 4 +--- spec/build/bsps/aarch64/xilinx-versal/grp.yml | 6 ++++++ spec/build/bsps/aarch64/xilinx-versal/grp_qemu.yml | 18 +++++++++++++++++ spec/build/bsps/aarch64/xilinx-zynqmp/grp.yml | 2 ++ spec/build/bsps/optstartmon.yml | 16 +++++++++++++++ 11 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 spec/build/bsps/aarch64/optisns.yml create mode 100644 spec/build/bsps/aarch64/xilinx-versal/grp_qemu.yml create mode 100644 spec/build/bsps/optstartmon.yml diff --git a/bsps/aarch64/shared/start/start.S b/bsps/aarch64/shared/start/start.S index d0d9c2160a..338c51f7d0 100644 --- a/bsps/aarch64/shared/start/start.S +++ b/bsps/aarch64/shared/start/start.S @@ -98,7 +98,7 @@ _start: #endif msr SCTLR_EL1, x0 -#ifdef BSP_START_IN_MON_SUPPORT +#ifdef BSP_START_IN_EL3_MONITOR_MODE_SUPPORT /* Drop from EL3 to EL2 */ /* Initialize HCR_EL2 and SCTLR_EL2 */ @@ -108,21 +108,35 @@ _start: mrs x0, SCR_EL3 /* Set EL2 to AArch64 */ orr x0, x0, #(1<<10) +#ifdef AARCH64_IS_NONSECURE /* Set EL1 to NS */ orr x0, x0, #1 +#endif msr SCR_EL3, x0 /* set EL2h mode for eret */ +#ifdef AARCH64_IS_NONSECURE mov x0, #0b01001 +#else + mov x0, #0b00101 +#endif + msr SPSR_EL3, x0 /* Set EL2 entry point */ +#ifdef AARCH64_IS_NONSECURE adr x0, _el2_start +#else + adr x0, _el1_start +#endif msr ELR_EL3, x0 eret #endif -#if defined(BSP_START_IN_HYP_SUPPORT) || defined(BSP_START_IN_MON_SUPPORT) +#if defined(BSP_START_IN_HYP_SUPPORT) || \ + ( defined(BSP_START_IN_EL3_MONITOR_MODE_SUPPORT) && \ + defined(AARCH64_IS_NONSECURE) \ + ) _el2_start: /* Drop from EL2 to EL1 */ diff --git a/bsps/shared/dev/irq/arm-gicv3.c b/bsps/shared/dev/irq/arm-gicv3.c index 7a0d42b27b..d216f4f5f7 100644 --- a/bsps/shared/dev/irq/arm-gicv3.c +++ b/bsps/shared/dev/irq/arm-gicv3.c @@ -175,6 +175,15 @@ void bsp_interrupt_vector_enable(rtems_vector_number vector) } else { volatile gic_sgi_ppi *sgi_ppi = gicv3_get_sgi_ppi(_SMP_Get_current_processor()); + /* Set interrupt group to 1 in the current security mode */ +#if defined(AARCH64_IS_NONSECURE) + sgi_ppi->icspigrpr[0] |= 1 << (vector % 32); + sgi_ppi->icspigrpmodr[0] &= ~(1 << (vector % 32)); +#else + sgi_ppi->icspigrpr[0] &= ~(1 << (vector % 32)); + sgi_ppi->icspigrpmodr[0] |= 1 << (vector % 32); +#endif + /* Set enable */ sgi_ppi->icspiser[0] = 1 << (vector % 32); } } @@ -217,10 +226,15 @@ static void gicv3_init_cpu_interface(void) waker &= ~waker_mask; redist->icrwaker = waker; - /* Set interrupt group to 1NS for SGI/PPI interrupts routed through the redistributor */ volatile gic_sgi_ppi *sgi_ppi = gicv3_get_sgi_ppi(cpu_index); + /* Set interrupt group to 1 in the current security mode */ +#if defined(AARCH64_IS_NONSECURE) sgi_ppi->icspigrpr[0] = 0xffffffff; sgi_ppi->icspigrpmodr[0] = 0; +#else + sgi_ppi->icspigrpr[0] = 0x0; + sgi_ppi->icspigrpmodr[0] = 0xffffffff; +#endif for (int id = 0; id < 32; id++) { sgi_ppi->icspiprior[id] = PRIORITY_DEFAULT; } @@ -247,9 +261,14 @@ rtems_status_code bsp_interrupt_facility_initialize(void) /* Disable all interrupts */ dist->icdicer[id / 32] = 0xffffffff; - /* Set interrupt group to 1NS for all interrupts */ + /* Set interrupt group to 1 in the current security mode */ +#if defined(AARCH64_IS_NONSECURE) dist->icdigr[id / 32] = 0xffffffff; dist->icdigmr[id / 32] = 0; +#else + dist->icdigr[id / 32] = 0; + dist->icdigmr[id / 32] = 0xffffffff; +#endif } for (id = 0; id < id_count; ++id) { diff --git a/spec/build/bsps/aarch64/a53/grp.yml b/spec/build/bsps/aarch64/a53/grp.yml index 19935d5a7a..9853c6deb7 100644 --- a/spec/build/bsps/aarch64/a53/grp.yml +++ b/spec/build/bsps/aarch64/a53/grp.yml @@ -11,6 +11,8 @@ links: uid: ../grp - role: build-dependency uid: ../start +- role: build-dependency + uid: ../optisns - role: build-dependency uid: abi - role: build-dependency diff --git a/spec/build/bsps/aarch64/a72/grp.yml b/spec/build/bsps/aarch64/a72/grp.yml index 0f3e717a94..7544a47f9f 100644 --- a/spec/build/bsps/aarch64/a72/grp.yml +++ b/spec/build/bsps/aarch64/a72/grp.yml @@ -11,6 +11,8 @@ links: uid: ../grp - role: build-dependency uid: ../start +- role: build-dependency + uid: ../optisns - role: build-dependency uid: abi - role: build-dependency diff --git a/spec/build/bsps/aarch64/optisns.yml b/spec/build/bsps/aarch64/optisns.yml new file mode 100644 index 0000000000..8db901604b --- /dev/null +++ b/spec/build/bsps/aarch64/optisns.yml @@ -0,0 +1,20 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +actions: +- get-boolean: null +- define-condition: null +build-type: option +copyrights: +- Copyright (C) 2021 Gedare Bloom +default: true +default-by-variant: +- value: false + variants: + - aarch64/xilinx_versal_lp64_qemu + - aarch64/xilinx_versal_ilp32_qemu +description: | + If set to true, then the processor starts and stays in the non-secure mode, + otherwise it will be in the secure mode. +enabled-by: true +links: [] +name: AARCH64_IS_NONSECURE +type: build diff --git a/spec/build/bsps/aarch64/xilinx-versal/bspqemuilp32.yml b/spec/build/bsps/aarch64/xilinx-versal/bspqemuilp32.yml index 85d508a6f4..cdad919b1c 100644 --- a/spec/build/bsps/aarch64/xilinx-versal/bspqemuilp32.yml +++ b/spec/build/bsps/aarch64/xilinx-versal/bspqemuilp32.yml @@ -12,9 +12,7 @@ includes: [] install: [] links: - role: build-dependency - uid: grp -- role: build-dependency - uid: tstqemu + uid: grp_qemu - role: build-dependency uid: linkcmds_ilp32 source: [] diff --git a/spec/build/bsps/aarch64/xilinx-versal/bspqemulp64.yml b/spec/build/bsps/aarch64/xilinx-versal/bspqemulp64.yml index 5df2483d34..bd8dab6a6e 100644 --- a/spec/build/bsps/aarch64/xilinx-versal/bspqemulp64.yml +++ b/spec/build/bsps/aarch64/xilinx-versal/bspqemulp64.yml @@ -12,9 +12,7 @@ includes: [] install: [] links: - role: build-dependency - uid: grp -- role: build-dependency - uid: tstqemu + uid: grp_qemu - role: build-dependency uid: linkcmds_lp64 source: [] diff --git a/spec/build/bsps/aarch64/xilinx-versal/grp.yml b/spec/build/bsps/aarch64/xilinx-versal/grp.yml index 7c7dea0fef..977c732506 100644 --- a/spec/build/bsps/aarch64/xilinx-versal/grp.yml +++ b/spec/build/bsps/aarch64/xilinx-versal/grp.yml @@ -13,6 +13,12 @@ links: uid: ../start - role: build-dependency uid: ../optmmupages +- role: build-dependency + uid: ../optisns +- role: build-dependency + uid: ../optgtusevirt +- role: build-dependency + uid: ../optgtuseps - role: build-dependency uid: abi - role: build-dependency diff --git a/spec/build/bsps/aarch64/xilinx-versal/grp_qemu.yml b/spec/build/bsps/aarch64/xilinx-versal/grp_qemu.yml new file mode 100644 index 0000000000..71d8c9ac49 --- /dev/null +++ b/spec/build/bsps/aarch64/xilinx-versal/grp_qemu.yml @@ -0,0 +1,18 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +build-type: group +copyrights: +- Copyright (C) 2021 Gedare Bloom +enabled-by: true +includes: [] +install: [] +ldflags: [] +links: +- role: build-dependency + uid: grp +- role: build-dependency + uid: ../../optstartmon +- role: build-dependency + uid: tstqemu +type: build +use-after: [] +use-before: [] diff --git a/spec/build/bsps/aarch64/xilinx-zynqmp/grp.yml b/spec/build/bsps/aarch64/xilinx-zynqmp/grp.yml index 16e2b8a7e9..03ccdbbc8b 100644 --- a/spec/build/bsps/aarch64/xilinx-zynqmp/grp.yml +++ b/spec/build/bsps/aarch64/xilinx-zynqmp/grp.yml @@ -13,6 +13,8 @@ links: uid: ../start - role: build-dependency uid: ../optmmupages +- role: build-dependency + uid: ../optisns - role: build-dependency uid: abi - role: build-dependency diff --git a/spec/build/bsps/optstartmon.yml b/spec/build/bsps/optstartmon.yml new file mode 100644 index 0000000000..9c48aad926 --- /dev/null +++ b/spec/build/bsps/optstartmon.yml @@ -0,0 +1,16 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +actions: +- get-boolean: null +- define-condition: null +build-type: option +copyrights: +- Copyright (C) 2021 Gedare Bloom +default: true +default-by-variant: [] +description: | + If set to true, then a system start in monitor mode (EL3) is + supported, otherwise it is unsupported. +enabled-by: true +links: [] +name: BSP_START_IN_EL3_MONITOR_MODE_SUPPORT +type: build -- cgit v1.2.3