aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Wiklander <jens.wiklander@linaro.org>2019-08-13 12:25:20 +0200
committerJérôme Forissier <jerome.forissier@linaro.org>2019-08-26 13:49:26 +0200
commite9f46c7402aaf2fc39bb7a4174ad691b38cbbe81 (patch)
treef1a90d2f5976e9bef6c94a48f89d690e14c30fad
parent612791d01ca4d6aa33a97953e7716b74d3d653e9 (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>
-rw-r--r--core/arch/arm/include/kernel/thread.h12
-rw-r--r--core/arch/arm/kernel/thread.c2
-rw-r--r--core/arch/arm/kernel/thread_a32.S4
-rw-r--r--core/arch/arm/kernel/thread_a64.S4
-rw-r--r--core/arch/arm/kernel/thread_optee_smc_a32.S5
-rw-r--r--core/arch/arm/kernel/thread_optee_smc_a64.S4
-rw-r--r--core/arch/arm/kernel/thread_private.h1
-rw-r--r--core/arch/arm/plat-bcm/main.c6
-rw-r--r--core/arch/arm/plat-d02/main.c8
-rw-r--r--core/arch/arm/plat-hikey/main.c8
-rw-r--r--core/arch/arm/plat-hisilicon/main.c8
-rw-r--r--core/arch/arm/plat-imx/main.c12
-rw-r--r--core/arch/arm/plat-k3/main.c4
-rw-r--r--core/arch/arm/plat-ls/main.c8
-rw-r--r--core/arch/arm/plat-marvell/main.c8
-rw-r--r--core/arch/arm/plat-mediatek/main.c8
-rw-r--r--core/arch/arm/plat-poplar/main.c8
-rw-r--r--core/arch/arm/plat-rcar/main.c8
-rw-r--r--core/arch/arm/plat-rockchip/main.c6
-rw-r--r--core/arch/arm/plat-rpi3/main.c6
-rw-r--r--core/arch/arm/plat-sam/main.c6
-rw-r--r--core/arch/arm/plat-sprd/main.c8
-rw-r--r--core/arch/arm/plat-stm/main.c10
-rw-r--r--core/arch/arm/plat-stm32mp1/main.c12
-rw-r--r--core/arch/arm/plat-sunxi/main.c6
-rw-r--r--core/arch/arm/plat-synquacer/main.c8
-rw-r--r--core/arch/arm/plat-ti/main.c29
-rw-r--r--core/arch/arm/plat-vexpress/main.c6
-rw-r--r--core/arch/arm/plat-zynq7k/main.c8
-rw-r--r--core/arch/arm/plat-zynqmp/main.c7
-rw-r--r--core/include/kernel/interrupt.h9
-rw-r--r--core/kernel/interrupt.c9
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");
+}