From ee94cc6fa6dc11229a53c3b66d2ce3487bb3b08f Mon Sep 17 00:00:00 2001 From: Andrew Thoelke <andrew.thoelke@arm.com> Date: Mon, 2 Jun 2014 12:38:12 +0100 Subject: [PATCH] Remove early_exceptions from BL3-1 The crash reporting support and early initialisation of the cpu_data allow the runtime_exception vectors to be used from the start in BL3-1, removing the need for the additional early_exception vectors and 2KB of code from BL3-1. Change-Id: I5f8997dabbaafd8935a7455910b7db174a25d871 --- bl31/aarch64/bl31_entrypoint.S | 8 +++++--- bl31/bl31.mk | 3 +-- bl31/bl31_main.c | 12 +----------- include/bl31/runtime_svc.h | 1 - services/std_svc/psci/psci_afflvl_on.c | 10 ---------- services/std_svc/psci/psci_afflvl_suspend.c | 9 --------- services/std_svc/psci/psci_entry.S | 6 ++---- 7 files changed, 9 insertions(+), 40 deletions(-) diff --git a/bl31/aarch64/bl31_entrypoint.S b/bl31/aarch64/bl31_entrypoint.S index 2e7476a17..e4dfea434 100644 --- a/bl31/aarch64/bl31_entrypoint.S +++ b/bl31/aarch64/bl31_entrypoint.S @@ -72,11 +72,13 @@ func bl31_entrypoint isb /* --------------------------------------------- - * Set the exception vector to something sane. + * Set the exception vector and zero tpidr_el3 + * until the crash reporting is set up * --------------------------------------------- */ - adr x1, early_exceptions + adr x1, runtime_exceptions msr vbar_el3, x1 + msr tpidr_el3, xzr /* --------------------------------------------------------------------- * The initial state of the Architectural feature trap register @@ -134,10 +136,10 @@ func bl31_entrypoint * Initialise cpu_data and crash reporting * --------------------------------------------- */ - bl init_cpu_data_ptr #if CRASH_REPORTING bl init_crash_reporting #endif + bl init_cpu_data_ptr /* --------------------------------------------- * Use SP_EL0 for the C runtime stack. diff --git a/bl31/bl31.mk b/bl31/bl31.mk index 4602e4113..5555c319c 100644 --- a/bl31/bl31.mk +++ b/bl31/bl31.mk @@ -38,8 +38,7 @@ BL31_SOURCES += bl31/bl31_main.c \ bl31/aarch64/context.S \ bl31/aarch64/cpu_data.S \ bl31/aarch64/runtime_exceptions.S \ - bl31/aarch64/crash_reporting.S \ - common/aarch64/early_exceptions.S \ + bl31/aarch64/crash_reporting.S \ lib/aarch64/cpu_helpers.S \ lib/locks/bakery/bakery_lock.c \ lib/locks/exclusive/spinlock.S \ diff --git a/bl31/bl31_main.c b/bl31/bl31_main.c index 5bb11ba3c..6f88e6562 100644 --- a/bl31/bl31_main.c +++ b/bl31/bl31_main.c @@ -71,7 +71,6 @@ void bl31_lib_init() ******************************************************************************/ void bl31_main(void) { - /* Perform remaining generic architectural setup from EL3 */ bl31_arch_setup(); @@ -89,16 +88,7 @@ void bl31_main(void) /* Clean caches before re-entering normal world */ dcsw_op_all(DCCSW); - /* - * Use the more complex exception vectors now that context - * management is setup. SP_EL3 should point to a 'cpu_context' - * structure which has an exception stack allocated. The PSCI - * service should have set the context. - */ - assert(cm_get_context(NON_SECURE)); - cm_set_next_eret_context(NON_SECURE); - write_vbar_el3((uint64_t) runtime_exceptions); - isb(); + /* By default run the non-secure BL3-3 image next */ next_image_type = NON_SECURE; /* diff --git a/include/bl31/runtime_svc.h b/include/bl31/runtime_svc.h index 3b84f060c..f3543d4f9 100644 --- a/include/bl31/runtime_svc.h +++ b/include/bl31/runtime_svc.h @@ -268,7 +268,6 @@ void runtime_svc_init(); extern uint64_t __RT_SVC_DESCS_START__; extern uint64_t __RT_SVC_DESCS_END__; void init_crash_reporting(void); -void runtime_exceptions(void); #endif /*__ASSEMBLY__*/ #endif /* __RUNTIME_SVC_H__ */ diff --git a/services/std_svc/psci/psci_afflvl_on.c b/services/std_svc/psci/psci_afflvl_on.c index 1c7a87725..e4d8f1f2a 100644 --- a/services/std_svc/psci/psci_afflvl_on.c +++ b/services/std_svc/psci/psci_afflvl_on.c @@ -372,16 +372,6 @@ static unsigned int psci_afflvl0_on_finish(unsigned long mpidr, */ bl31_arch_setup(); - /* - * Use the more complex exception vectors to enable SPD - * initialisation. SP_EL3 should point to a 'cpu_context' - * structure. The calling cpu should have set the - * context already - */ - assert(cm_get_context(NON_SECURE)); - cm_set_next_eret_context(NON_SECURE); - write_vbar_el3((uint64_t) runtime_exceptions); - /* * Call the cpu on finish handler registered by the Secure Payload * Dispatcher to let it do any bookeeping. If the handler encounters an diff --git a/services/std_svc/psci/psci_afflvl_suspend.c b/services/std_svc/psci/psci_afflvl_suspend.c index 3a1a419a9..993431048 100644 --- a/services/std_svc/psci/psci_afflvl_suspend.c +++ b/services/std_svc/psci/psci_afflvl_suspend.c @@ -490,15 +490,6 @@ static unsigned int psci_afflvl0_suspend_finish(unsigned long mpidr, cm_el3_sysregs_context_restore(NON_SECURE); rc = PSCI_E_SUCCESS; - /* - * Use the more complex exception vectors to enable SPD - * initialisation. SP_EL3 should point to a 'cpu_context' - * structure. The non-secure context should have been - * set on this cpu prior to suspension. - */ - cm_set_next_eret_context(NON_SECURE); - write_vbar_el3((uint64_t) runtime_exceptions); - /* * Call the cpu suspend finish handler registered by the Secure Payload * Dispatcher to let it do any bookeeping. If the handler encounters an diff --git a/services/std_svc/psci/psci_entry.S b/services/std_svc/psci/psci_entry.S index 037673ddb..5628d7917 100644 --- a/services/std_svc/psci/psci_entry.S +++ b/services/std_svc/psci/psci_entry.S @@ -67,12 +67,10 @@ psci_aff_common_finish_entry: bl init_cpu_data_ptr /* --------------------------------------------- - * Exceptions should not occur at this point. - * Set VBAR in order to handle and report any - * that do occur + * Set the exception vectors * --------------------------------------------- */ - adr x0, early_exceptions + adr x0, runtime_exceptions msr vbar_el3, x0 isb -- GitLab