Merge pull request #1054 from jwerner-chromium/JW_crash_x30

Fix x30 reporting for unhandled exceptions
diff --git a/bl31/aarch64/runtime_exceptions.S b/bl31/aarch64/runtime_exceptions.S
index 45b0213..d8fbb9b 100644
--- a/bl31/aarch64/runtime_exceptions.S
+++ b/bl31/aarch64/runtime_exceptions.S
@@ -49,7 +49,8 @@
 	b.eq	smc_handler64
 
 	/* Other kinds of synchronous exceptions are not handled */
-	no_ret	report_unhandled_exception
+	ldr	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
+	b	report_unhandled_exception
 	.endm
 
 
@@ -152,7 +153,7 @@
 	 */
 vector_entry sync_exception_sp_el0
 	/* We don't expect any synchronous exceptions from EL3 */
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size sync_exception_sp_el0
 
 vector_entry irq_sp_el0
@@ -160,17 +161,17 @@
 	 * EL3 code is non-reentrant. Any asynchronous exception is a serious
 	 * error. Loop infinitely.
 	 */
-	no_ret	report_unhandled_interrupt
+	b	report_unhandled_interrupt
 	check_vector_size irq_sp_el0
 
 
 vector_entry fiq_sp_el0
-	no_ret	report_unhandled_interrupt
+	b	report_unhandled_interrupt
 	check_vector_size fiq_sp_el0
 
 
 vector_entry serror_sp_el0
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size serror_sp_el0
 
 	/* ---------------------------------------------------------------------
@@ -184,19 +185,19 @@
 	 * synchronous exception. There is a high probability that SP_EL3 is
 	 * corrupted.
 	 */
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size sync_exception_sp_elx
 
 vector_entry irq_sp_elx
-	no_ret	report_unhandled_interrupt
+	b	report_unhandled_interrupt
 	check_vector_size irq_sp_elx
 
 vector_entry fiq_sp_elx
-	no_ret	report_unhandled_interrupt
+	b	report_unhandled_interrupt
 	check_vector_size fiq_sp_elx
 
 vector_entry serror_sp_elx
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size serror_sp_elx
 
 	/* ---------------------------------------------------------------------
@@ -226,7 +227,7 @@
 	 * SError exceptions from lower ELs are not currently supported.
 	 * Report their occurrence.
 	 */
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size serror_aarch64
 
 	/* ---------------------------------------------------------------------
@@ -256,7 +257,7 @@
 	 * SError exceptions from lower ELs are not currently supported.
 	 * Report their occurrence.
 	 */
-	no_ret	report_unhandled_exception
+	b	report_unhandled_exception
 	check_vector_size serror_aarch32
 
 
diff --git a/bl32/tsp/aarch64/tsp_exceptions.S b/bl32/tsp/aarch64/tsp_exceptions.S
index 96d958e..4b2ad75 100644
--- a/bl32/tsp/aarch64/tsp_exceptions.S
+++ b/bl32/tsp/aarch64/tsp_exceptions.S
@@ -81,19 +81,19 @@
 	 * -----------------------------------------------------
 	 */
 vector_entry sync_exception_sp_el0
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size sync_exception_sp_el0
 
 vector_entry irq_sp_el0
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size irq_sp_el0
 
 vector_entry fiq_sp_el0
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size fiq_sp_el0
 
 vector_entry serror_sp_el0
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size serror_sp_el0
 
 
@@ -103,7 +103,7 @@
 	 * -----------------------------------------------------
 	 */
 vector_entry sync_exception_sp_elx
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size sync_exception_sp_elx
 
 vector_entry irq_sp_elx
@@ -115,7 +115,7 @@
 	check_vector_size fiq_sp_elx
 
 vector_entry serror_sp_elx
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size serror_sp_elx
 
 
@@ -125,19 +125,19 @@
 	 * -----------------------------------------------------
 	 */
 vector_entry sync_exception_aarch64
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size sync_exception_aarch64
 
 vector_entry irq_aarch64
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size irq_aarch64
 
 vector_entry fiq_aarch64
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size fiq_aarch64
 
 vector_entry serror_aarch64
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size serror_aarch64
 
 
@@ -147,17 +147,17 @@
 	 * -----------------------------------------------------
 	 */
 vector_entry sync_exception_aarch32
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size sync_exception_aarch32
 
 vector_entry irq_aarch32
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size irq_aarch32
 
 vector_entry fiq_aarch32
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size fiq_aarch32
 
 vector_entry serror_aarch32
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 	check_vector_size serror_aarch32
diff --git a/common/aarch32/debug.S b/common/aarch32/debug.S
index 2e60bd5..583ee4a 100644
--- a/common/aarch32/debug.S
+++ b/common/aarch32/debug.S
@@ -51,7 +51,7 @@
 
 1:
 	mov	lr, r6
-	no_ret	plat_panic_handler
+	b	plat_panic_handler
 endfunc do_panic
 
 	/***********************************************************
diff --git a/common/aarch64/debug.S b/common/aarch64/debug.S
index fe6a9a2..d794d12 100644
--- a/common/aarch64/debug.S
+++ b/common/aarch64/debug.S
@@ -175,6 +175,6 @@
 _panic_handler:
 	/* Pass to plat_panic_handler the address from where el3_panic was
 	 * called, not the address of the call from el3_panic. */
-	mov	x30,x6
-	no_ret	plat_panic_handler
+	mov	x30, x6
+	b	plat_panic_handler
 endfunc do_panic