diff options
author | Jens Wiklander <jens.wiklander@linaro.org> | 2019-08-13 12:25:20 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome.forissier@linaro.org> | 2019-08-26 13:49:26 +0200 |
commit | e9f46c7402aaf2fc39bb7a4174ad691b38cbbe81 (patch) | |
tree | f1a90d2f5976e9bef6c94a48f89d690e14c30fad | |
parent | 612791d01ca4d6aa33a97953e7716b74d3d653e9 (diff) |
core: replace thread_nintr_handler_ptr with weak function
Removes registration of platform specific secure interrupt handler in
thread_nintr_handler_ptr. Instead a __weak overridable
itr_core_handler() is provided. Platforms which expects to receive
secure interrupts must override the default function. The default
function calls panic() if called.
With this also nintr is removed from struct thread_handlers and
consequently all platforms are updated to stop using that field.
Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
32 files changed, 66 insertions, 182 deletions
diff --git a/core/arch/arm/include/kernel/thread.h b/core/arch/arm/include/kernel/thread.h index d938b5c2..3e4c0e70 100644 --- a/core/arch/arm/include/kernel/thread.h +++ b/core/arch/arm/include/kernel/thread.h @@ -212,22 +212,10 @@ struct thread_specific_data { #endif /*__ASSEMBLER__*/ #ifndef __ASSEMBLER__ -typedef void (*thread_nintr_handler_t)(void); typedef unsigned long (*thread_pm_handler_t)(unsigned long a0, unsigned long a1); struct thread_handlers { /* - * fiq is called as a regular function and normal ARM Calling - * Convention applies. - * - * This handler handles native interrupts which can't be preemted. This - * handler is executed with a limited stack. This handler must not cause - * any aborts or reenenable native interrupts which are temporarily - * masked while executing this handler. - */ - thread_nintr_handler_t nintr; - - /* * Power management handlers triggered from ARM Trusted Firmware. * Not used when using internal monitor. */ diff --git a/core/arch/arm/kernel/thread.c b/core/arch/arm/kernel/thread.c index 63823c42..54d72932 100644 --- a/core/arch/arm/kernel/thread.c +++ b/core/arch/arm/kernel/thread.c @@ -114,7 +114,6 @@ const uint32_t stack_tmp_stride = sizeof(stack_tmp[0]); KEEP_PAGER(stack_tmp_export); KEEP_PAGER(stack_tmp_stride); -thread_nintr_handler_t thread_nintr_handler_ptr __nex_bss; thread_pm_handler_t thread_cpu_on_handler_ptr __nex_bss; thread_pm_handler_t thread_cpu_off_handler_ptr __nex_bss; thread_pm_handler_t thread_cpu_suspend_handler_ptr __nex_bss; @@ -762,7 +761,6 @@ int thread_get_id(void) static void init_handlers(const struct thread_handlers *handlers) { - thread_nintr_handler_ptr = handlers->nintr; thread_cpu_on_handler_ptr = handlers->cpu_on; thread_cpu_off_handler_ptr = handlers->cpu_off; thread_cpu_suspend_handler_ptr = handlers->cpu_suspend; diff --git a/core/arch/arm/kernel/thread_a32.S b/core/arch/arm/kernel/thread_a32.S index 1c095da3..47d63875 100644 --- a/core/arch/arm/kernel/thread_a32.S +++ b/core/arch/arm/kernel/thread_a32.S @@ -433,9 +433,7 @@ END_FUNC thread_unwind_user_mode .endif bl thread_check_canaries - ldr lr, =thread_nintr_handler_ptr - ldr lr, [lr] - blx lr + bl itr_core_handler mrs r0, spsr cmp_spsr_user_mode r0 diff --git a/core/arch/arm/kernel/thread_a64.S b/core/arch/arm/kernel/thread_a64.S index 12bd89e6..e7dbe944 100644 --- a/core/arch/arm/kernel/thread_a64.S +++ b/core/arch/arm/kernel/thread_a64.S @@ -947,9 +947,7 @@ END_FUNC el0_sync_abort stp x30, x2, [sp, #ELX_NINTR_REC_LR] bl thread_check_canaries - adr x16, thread_nintr_handler_ptr - ldr x16, [x16] - blr x16 + bl itr_core_handler /* * Restore registers diff --git a/core/arch/arm/kernel/thread_optee_smc_a32.S b/core/arch/arm/kernel/thread_optee_smc_a32.S index 97834fa7..cb7fbfaf 100644 --- a/core/arch/arm/kernel/thread_optee_smc_a32.S +++ b/core/arch/arm/kernel/thread_optee_smc_a32.S @@ -49,10 +49,7 @@ UNWIND( .fnstart) UNWIND( .cantunwind) /* Secure Monitor received a FIQ and passed control to us. */ bl thread_check_canaries - ldr lr, =thread_nintr_handler_ptr - ldr lr, [lr] - blx lr - mov r1, r0 + bl itr_core_handler ldr r0, =TEESMC_OPTEED_RETURN_FIQ_DONE smc #0 b . /* SMC should not return */ diff --git a/core/arch/arm/kernel/thread_optee_smc_a64.S b/core/arch/arm/kernel/thread_optee_smc_a64.S index d95c6db1..49aa05b3 100644 --- a/core/arch/arm/kernel/thread_optee_smc_a64.S +++ b/core/arch/arm/kernel/thread_optee_smc_a64.S @@ -46,9 +46,7 @@ END_FUNC vector_fast_smc_entry LOCAL_FUNC vector_fiq_entry , : /* Secure Monitor received a FIQ and passed control to us. */ bl thread_check_canaries - adr x16, thread_nintr_handler_ptr - ldr x16, [x16] - blr x16 + bl itr_core_handler ldr x0, =TEESMC_OPTEED_RETURN_FIQ_DONE smc #0 b . /* SMC should not return */ diff --git a/core/arch/arm/kernel/thread_private.h b/core/arch/arm/kernel/thread_private.h index c0b3a856..cf9153ae 100644 --- a/core/arch/arm/kernel/thread_private.h +++ b/core/arch/arm/kernel/thread_private.h @@ -121,7 +121,6 @@ struct thread_ctx { extern const void *stack_tmp_export; extern const uint32_t stack_tmp_stride; extern struct thread_ctx threads[]; -extern thread_nintr_handler_t thread_nintr_handler_ptr; extern thread_pm_handler_t thread_cpu_on_handler_ptr; extern thread_pm_handler_t thread_cpu_off_handler_ptr; extern thread_pm_handler_t thread_cpu_suspend_handler_ptr; diff --git a/core/arch/arm/plat-bcm/main.c b/core/arch/arm/plat-bcm/main.c index 930a0ef6..5e31f8e8 100644 --- a/core/arch/arm/plat-bcm/main.c +++ b/core/arch/arm/plat-bcm/main.c @@ -7,6 +7,7 @@ #include <drivers/gic.h> #include <drivers/serial8250_uart.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> #include <mm/core_memprot.h> @@ -16,10 +17,7 @@ #include <tee/entry_fast.h> #include <tee/entry_std.h> -static void secure_intr_handler(void); - static const struct thread_handlers handlers = { - .nintr = secure_intr_handler, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -65,7 +63,7 @@ void console_init(void) register_serial_console(&console_data.chip); } -static void secure_intr_handler(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-d02/main.c b/core/arch/arm/plat-d02/main.c index 020827d4..a4f418a8 100644 --- a/core/arch/arm/plat-d02/main.c +++ b/core/arch/arm/plat-d02/main.c @@ -15,10 +15,7 @@ #include <tee/entry_std.h> #include <tee/entry_fast.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -37,11 +34,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { hi16xx_uart_init(&console_data, CONSOLE_UART_BASE, diff --git a/core/arch/arm/plat-hikey/main.c b/core/arch/arm/plat-hikey/main.c index 7a7bf6d9..90ca77a3 100644 --- a/core/arch/arm/plat-hikey/main.c +++ b/core/arch/arm/plat-hikey/main.c @@ -24,10 +24,7 @@ #include <tee/entry_std.h> #include <tee/entry_fast.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -62,11 +59,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { pl011_init(&console_data, CONSOLE_UART_BASE, CONSOLE_UART_CLK_IN_HZ, diff --git a/core/arch/arm/plat-hisilicon/main.c b/core/arch/arm/plat-hisilicon/main.c index b8f6ca9a..b7dff433 100644 --- a/core/arch/arm/plat-hisilicon/main.c +++ b/core/arch/arm/plat-hisilicon/main.c @@ -16,10 +16,7 @@ #include <tee/entry_std.h> #include <tee/entry_fast.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, @@ -45,11 +42,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { pl011_init(&console_data, CONSOLE_UART_BASE, diff --git a/core/arch/arm/plat-imx/main.c b/core/arch/arm/plat-imx/main.c index 76b4f534..d7994d50 100644 --- a/core/arch/arm/plat-imx/main.c +++ b/core/arch/arm/plat-imx/main.c @@ -32,26 +32,24 @@ #include <console.h> #include <drivers/gic.h> #include <drivers/imx_uart.h> -#include <io.h> #include <imx.h> +#include <io.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> -#include <mm/core_mmu.h> #include <mm/core_memprot.h> +#include <mm/core_mmu.h> #include <platform_config.h> -#include <stdint.h> #include <sm/optee_smc.h> +#include <stdint.h> #include <tee/entry_fast.h> #include <tee/entry_std.h> - -static void main_fiq(void); static struct gic_data gic_data; static const struct thread_handlers handlers = { - .nintr = main_fiq, #if defined(CFG_WITH_ARM_TRUSTED_FW) .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, @@ -125,7 +123,7 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-k3/main.c b/core/arch/arm/plat-k3/main.c index 85c84cc9..60515e39 100644 --- a/core/arch/arm/plat-k3/main.c +++ b/core/arch/arm/plat-k3/main.c @@ -10,6 +10,7 @@ #include <drivers/gic.h> #include <drivers/serial8250_uart.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> #include <mm/core_memprot.h> @@ -47,13 +48,12 @@ void main_secondary_init_gic(void) gic_cpu_init(&gic_data); } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, diff --git a/core/arch/arm/plat-ls/main.c b/core/arch/arm/plat-ls/main.c index 4303ec5c..6ad1664d 100644 --- a/core/arch/arm/plat-ls/main.c +++ b/core/arch/arm/plat-ls/main.c @@ -51,10 +51,7 @@ #include <kernel/tee_common_otp.h> #include <mm/core_mmu.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, #if defined(CFG_WITH_ARM_TRUSTED_FW) .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, @@ -88,11 +85,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - #ifdef CFG_ARM32_core void plat_cpu_reset_late(void) { diff --git a/core/arch/arm/plat-marvell/main.c b/core/arch/arm/plat-marvell/main.c index 2e4715b6..ddbd2053 100644 --- a/core/arch/arm/plat-marvell/main.c +++ b/core/arch/arm/plat-marvell/main.c @@ -36,9 +36,10 @@ #endif #include <keep.h> #include <kernel/generic_boot.h> -#include <kernel/pm_stubs.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> +#include <kernel/pm_stubs.h> #include <kernel/tee_time.h> #include <mm/core_memprot.h> #include <mm/core_mmu.h> @@ -48,10 +49,7 @@ #include <tee/entry_fast.h> #include <tee/entry_std.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -97,7 +95,7 @@ void main_init_gic(void) } #endif -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-mediatek/main.c b/core/arch/arm/plat-mediatek/main.c index bb8253b4..6a38e58c 100644 --- a/core/arch/arm/plat-mediatek/main.c +++ b/core/arch/arm/plat-mediatek/main.c @@ -14,13 +14,10 @@ #include <tee/entry_std.h> #include <tee/entry_fast.h> -static void main_fiq(void); - register_phys_mem_pgdir(MEM_AREA_IO_NSEC, CONSOLE_UART_BASE, SERIAL8250_UART_REG_SIZE); static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -36,11 +33,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { serial8250_uart_init(&console_data, CONSOLE_UART_BASE, diff --git a/core/arch/arm/plat-poplar/main.c b/core/arch/arm/plat-poplar/main.c index 4d3c46ed..a048518c 100644 --- a/core/arch/arm/plat-poplar/main.c +++ b/core/arch/arm/plat-poplar/main.c @@ -18,10 +18,7 @@ #include <tee/entry_std.h> #include <tee/entry_fast.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -41,11 +38,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { pl011_init(&console_data, CONSOLE_UART_BASE, diff --git a/core/arch/arm/plat-rcar/main.c b/core/arch/arm/plat-rcar/main.c index 7964b135..de902285 100644 --- a/core/arch/arm/plat-rcar/main.c +++ b/core/arch/arm/plat-rcar/main.c @@ -51,10 +51,7 @@ register_dynamic_shm(NSEC_DDR_2_BASE, NSEC_DDR_2_SIZE); register_dynamic_shm(NSEC_DDR_3_BASE, NSEC_DDR_3_SIZE); #endif -static void main_fiq(void); - static const struct thread_handlers handlers __nex_data = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -70,11 +67,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void console_init(void) { scif_uart_init(&console_data, CONSOLE_UART_BASE); diff --git a/core/arch/arm/plat-rockchip/main.c b/core/arch/arm/plat-rockchip/main.c index ef7d9169..62d1b1b0 100644 --- a/core/arch/arm/plat-rockchip/main.c +++ b/core/arch/arm/plat-rockchip/main.c @@ -45,13 +45,7 @@ static struct serial8250_uart_data console_data; register_phys_mem_pgdir(MEM_AREA_IO_SEC, PERIPH_BASE, PERIPH_SIZE); register_phys_mem_pgdir(MEM_AREA_IO_NSEC, ISRAM_BASE, ISRAM_SIZE); -static void main_fiq(void) -{ - panic(); -} - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_do_nothing, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, diff --git a/core/arch/arm/plat-rpi3/main.c b/core/arch/arm/plat-rpi3/main.c index 9b68dc13..5196c762 100644 --- a/core/arch/arm/plat-rpi3/main.c +++ b/core/arch/arm/plat-rpi3/main.c @@ -41,13 +41,7 @@ register_phys_mem_pgdir(MEM_AREA_IO_NSEC, CONSOLE_UART_BASE, SERIAL8250_UART_REG_SIZE); -static void main_fiq(void) -{ - panic(); -} - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, diff --git a/core/arch/arm/plat-sam/main.c b/core/arch/arm/plat-sam/main.c index 65c89263..7a806bbf 100644 --- a/core/arch/arm/plat-sam/main.c +++ b/core/arch/arm/plat-sam/main.c @@ -47,13 +47,7 @@ #include <tee/entry_std.h> #include <tz_matrix.h> -static void main_fiq(void) -{ - panic(); -} - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, diff --git a/core/arch/arm/plat-sprd/main.c b/core/arch/arm/plat-sprd/main.c index 754214bf..dffb3c57 100644 --- a/core/arch/arm/plat-sprd/main.c +++ b/core/arch/arm/plat-sprd/main.c @@ -28,13 +28,14 @@ #include <drivers/gic.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> #include <mm/core_memprot.h> #include <platform_config.h> -#include <trace.h> #include <tee/entry_fast.h> #include <tee/entry_std.h> +#include <trace.h> register_phys_mem_pgdir(MEM_AREA_IO_NSEC, ROUNDDOWN(CONSOLE_UART_BASE, CORE_MMU_PGDIR_SIZE), @@ -48,10 +49,7 @@ register_phys_mem_pgdir(MEM_AREA_IO_SEC, ROUNDDOWN(GIC_BASE + GICD_OFFSET, CORE_MMU_PGDIR_SIZE), CORE_MMU_PGDIR_SIZE); -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -84,7 +82,7 @@ void main_init_gic(void) itr_init(&gic_data.chip); } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-stm/main.c b/core/arch/arm/plat-stm/main.c index ca31b11a..763c1691 100644 --- a/core/arch/arm/plat-stm/main.c +++ b/core/arch/arm/plat-stm/main.c @@ -9,16 +9,17 @@ #include <drivers/stih_asc.h> #include <io.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> #include <kernel/tz_ssvce_pl310.h> -#include <mm/core_mmu.h> #include <mm/core_memprot.h> +#include <mm/core_mmu.h> #include <platform_config.h> #include <stdint.h> -#include <tee/entry_std.h> #include <tee/entry_fast.h> +#include <tee/entry_std.h> #include <trace.h> #include <util.h> @@ -36,8 +37,6 @@ register_ddr(DRAM1_BASE, DRAM1_SIZE); static struct gic_data gic_data; static struct stih_asc_pd console_data; -static void main_fiq(void); - #if defined(PLATFORM_FLAVOR_b2260) static bool ns_resources_ready(void) { @@ -61,7 +60,6 @@ uint32_t tee_entry_std(struct optee_msg_arg *arg, uint32_t num_params) #endif static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, @@ -176,7 +174,7 @@ void main_secondary_init_gic(void) gic_cpu_init(&gic_data); } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-stm32mp1/main.c b/core/arch/arm/plat-stm32mp1/main.c index abb7c7f9..166e78d2 100644 --- a/core/arch/arm/plat-stm32mp1/main.c +++ b/core/arch/arm/plat-stm32mp1/main.c @@ -8,11 +8,12 @@ #include <console.h> #include <drivers/gic.h> #include <drivers/stm32_etzpc.h> -#include <drivers/stm32_uart.h> #include <drivers/stm32mp1_etzpc.h> +#include <drivers/stm32_uart.h> #include <dt-bindings/clock/stm32mp1-clks.h> -#include <kernel/generic_boot.h> #include <kernel/dt.h> +#include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> @@ -21,8 +22,8 @@ #include <platform_config.h> #include <sm/psci.h> #include <stm32_util.h> -#include <tee/entry_std.h> #include <tee/entry_fast.h> +#include <tee/entry_std.h> #include <trace.h> #ifdef CFG_WITH_NSEC_GPIOS @@ -54,10 +55,7 @@ register_phys_mem_pgdir(MEM_AREA_IO_SEC, RNG1_BASE, SMALL_PAGE_SIZE); register_phys_mem_pgdir(MEM_AREA_IO_SEC, TAMP_BASE, SMALL_PAGE_SIZE); register_phys_mem_pgdir(MEM_AREA_IO_SEC, USART1_BASE, SMALL_PAGE_SIZE); -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, @@ -181,7 +179,7 @@ service_init_late(init_console_from_dt); */ static struct gic_data gic_data; -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-sunxi/main.c b/core/arch/arm/plat-sunxi/main.c index 7c0f2cd2..15b62b8f 100644 --- a/core/arch/arm/plat-sunxi/main.c +++ b/core/arch/arm/plat-sunxi/main.c @@ -93,13 +93,7 @@ static struct gic_data gic_data; static void tzpc_init(void); #endif -static void main_fiq(void) -{ - panic(); -} - static const struct thread_handlers handlers = { - .nintr = main_fiq, #if defined(CFG_WITH_ARM_TRUSTED_FW) .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, diff --git a/core/arch/arm/plat-synquacer/main.c b/core/arch/arm/plat-synquacer/main.c index 67129066..28c8748d 100644 --- a/core/arch/arm/plat-synquacer/main.c +++ b/core/arch/arm/plat-synquacer/main.c @@ -9,6 +9,7 @@ #include <drivers/pl011.h> #include <io.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> @@ -16,15 +17,12 @@ #include <kernel/timer.h> #include <mm/core_memprot.h> #include <platform_config.h> +#include <rng_pta.h> #include <sm/optee_smc.h> #include <tee/entry_fast.h> #include <tee/entry_std.h> -#include <rng_pta.h> - -static void main_fiq(void); static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, .cpu_suspend = pm_do_nothing, @@ -47,7 +45,7 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-ti/main.c b/core/arch/arm/plat-ti/main.c index 761c3373..8cd68062 100644 --- a/core/arch/arm/plat-ti/main.c +++ b/core/arch/arm/plat-ti/main.c @@ -3,28 +3,28 @@ * Copyright (c) 2015, Linaro Limited */ -#include <platform_config.h> -#include <console.h> -#include <stdint.h> -#include <string.h> +#include <arm.h> #include <assert.h> +#include <console.h> #include <drivers/gic.h> #include <drivers/serial8250_uart.h> -#include <arm.h> #include <kernel/generic_boot.h> -#include <kernel/panic.h> -#include <kernel/pm_stubs.h> -#include <trace.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/mutex.h> -#include <kernel/tee_time.h> +#include <kernel/panic.h> +#include <kernel/pm_stubs.h> #include <kernel/tee_common_otp.h> -#include <mm/core_mmu.h> +#include <kernel/tee_time.h> #include <mm/core_memprot.h> -#include <tee/entry_std.h> -#include <tee/entry_fast.h> -#include <console.h> +#include <mm/core_mmu.h> +#include <platform_config.h> #include <sm/sm.h> +#include <stdint.h> +#include <string.h> +#include <tee/entry_fast.h> +#include <tee/entry_std.h> +#include <trace.h> #define PLAT_HW_UNIQUE_KEY_LENGTH 32 @@ -59,13 +59,12 @@ void main_secondary_init_gic(void) gic_cpu_init(&gic_data); } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, diff --git a/core/arch/arm/plat-vexpress/main.c b/core/arch/arm/plat-vexpress/main.c index 0016b884..1b0e583c 100644 --- a/core/arch/arm/plat-vexpress/main.c +++ b/core/arch/arm/plat-vexpress/main.c @@ -12,6 +12,7 @@ #include <initcall.h> #include <keep.h> #include <kernel/generic_boot.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> #include <kernel/panic.h> #include <kernel/pm_stubs.h> @@ -26,10 +27,7 @@ #include <tee/entry_std.h> #include <trace.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, #if defined(CFG_WITH_ARM_TRUSTED_FW) .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, @@ -105,7 +103,7 @@ void main_secondary_init_gic(void) #endif -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/arch/arm/plat-zynq7k/main.c b/core/arch/arm/plat-zynq7k/main.c index 6c9a60ef..ae0753da 100644 --- a/core/arch/arm/plat-zynq7k/main.c +++ b/core/arch/arm/plat-zynq7k/main.c @@ -46,10 +46,7 @@ #include <tee/entry_fast.h> #include <tee/entry_std.h> -static void main_fiq(void); - static const struct thread_handlers handlers = { - .nintr = main_fiq, .cpu_on = pm_panic, .cpu_off = pm_panic, .cpu_suspend = pm_panic, @@ -72,11 +69,6 @@ const struct thread_handlers *generic_boot_get_handlers(void) return &handlers; } -static void main_fiq(void) -{ - panic(); -} - void plat_cpu_reset_late(void) { if (!get_core_pos()) { diff --git a/core/arch/arm/plat-zynqmp/main.c b/core/arch/arm/plat-zynqmp/main.c index f39cdda2..5c182c92 100644 --- a/core/arch/arm/plat-zynqmp/main.c +++ b/core/arch/arm/plat-zynqmp/main.c @@ -37,15 +37,15 @@ #include <arm.h> #include <console.h> #include <kernel/generic_boot.h> -#include <kernel/pm_stubs.h> +#include <kernel/interrupt.h> #include <kernel/misc.h> +#include <kernel/pm_stubs.h> #include <kernel/tee_time.h> #include <mm/core_memprot.h> #include <tee/entry_fast.h> #include <tee/entry_std.h> #include <trace.h> -static void main_fiq(void); static struct gic_data gic_data; static struct cdns_uart_data console_data; @@ -62,7 +62,6 @@ register_phys_mem_pgdir(MEM_AREA_IO_SEC, CORE_MMU_PGDIR_SIZE); static const struct thread_handlers handlers = { - .nintr = main_fiq, #if defined(CFG_WITH_ARM_TRUSTED_FW) .cpu_on = cpu_on_handler, .cpu_off = pm_do_nothing, @@ -97,7 +96,7 @@ void main_init_gic(void) gic_init_base_addr(&gic_data, gicc_base, gicd_base); } -static void main_fiq(void) +void itr_core_handler(void) { gic_it_handle(&gic_data); } diff --git a/core/include/kernel/interrupt.h b/core/include/kernel/interrupt.h index d7b8abdf..e85f7fcb 100644 --- a/core/include/kernel/interrupt.h +++ b/core/include/kernel/interrupt.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /* - * Copyright (c) 2016, Linaro Limited + * Copyright (c) 2016-2019, Linaro Limited */ #ifndef __KERNEL_INTERRUPT_H #define __KERNEL_INTERRUPT_H @@ -57,4 +57,11 @@ void itr_raise_sgi(size_t it, uint8_t cpu_mask); */ void itr_set_affinity(size_t it, uint8_t cpu_mask); +/* + * __weak overridable function which is called when a secure interrupt is + * received. The default function calls panic() immediately, platforms which + * expects to receive secure interrupts should override this function. + */ +void itr_core_handler(void); + #endif /*__KERNEL_INTERRUPT_H*/ diff --git a/core/kernel/interrupt.c b/core/kernel/interrupt.c index cff1f809..d17662d5 100644 --- a/core/kernel/interrupt.c +++ b/core/kernel/interrupt.c @@ -1,9 +1,10 @@ // SPDX-License-Identifier: BSD-2-Clause /* - * Copyright (c) 2016, Linaro Limited + * Copyright (c) 2016-2019, Linaro Limited */ #include <kernel/interrupt.h> +#include <kernel/panic.h> #include <trace.h> /* @@ -78,3 +79,9 @@ void itr_set_affinity(size_t it, uint8_t cpu_mask) { itr_chip->ops->set_affinity(itr_chip, it, cpu_mask); } + +/* This function is supposed to be overridden in platform specific code */ +void __weak __noreturn itr_core_handler(void) +{ + panic("Secure interrupt handler not defined"); +} |