Setup VBAR_EL3 incrementally

This patch ensures that VBAR_EL3 points to the simple stack-less
'early_exceptions' when the C runtime stack is not correctly setup to
use the more complex 'runtime_exceptions'. It is initialised to
'runtime_exceptions' once this is done.

This patch also moves all exception vectors into a '.vectors' section
and modifies linker scripts to place all such sections together. This
will minimize space wastage from alignment restrictions.

Change-Id: I8c3e596ea3412c8bd582af9e8d622bb1cb2e049d
diff --git a/bl31/aarch64/bl31_entrypoint.S b/bl31/aarch64/bl31_entrypoint.S
index 57f6551..cd0c023 100644
--- a/bl31/aarch64/bl31_entrypoint.S
+++ b/bl31/aarch64/bl31_entrypoint.S
@@ -58,7 +58,7 @@
 	 * Set the exception vector to something sane.
 	 * ---------------------------------------------
 	 */
-	adr	x1, runtime_exceptions
+	adr	x1, early_exceptions
 	msr	vbar_el3, x1
 
 	/* ---------------------------------------------------------------------
@@ -155,6 +155,14 @@
 	bl	platform_set_stack
 
 	/* ---------------------------------------------
+	 * Use the more complex exception vectors now
+	 * the stacks are setup.
+	 * ---------------------------------------------
+	 */
+	adr	x1, runtime_exceptions
+	msr	vbar_el3, x1
+
+	/* ---------------------------------------------
 	 * Use SP_EL0 to initialize BL31. It allows us
 	 * to jump to the next image without having to
 	 * come back here to ensure all of the stack's
diff --git a/bl31/aarch64/runtime_exceptions.S b/bl31/aarch64/runtime_exceptions.S
index ce0af74..92835dc 100644
--- a/bl31/aarch64/runtime_exceptions.S
+++ b/bl31/aarch64/runtime_exceptions.S
@@ -37,8 +37,8 @@
 #include <asm_macros.S>
 
 
-	.section	.text, "ax"; .align 11
-	
+	.section	.vectors, "ax"; .align 11
+
 	.align	7
 runtime_exceptions:
 	/* -----------------------------------------------------
diff --git a/bl31/bl31.ld.S b/bl31/bl31.ld.S
index 7cc8527..2583c9a 100644
--- a/bl31/bl31.ld.S
+++ b/bl31/bl31.ld.S
@@ -50,6 +50,7 @@
         *bl31_entrypoint.o(.text)
         *(.text)
         *(.rodata*)
+        *(.vectors)
         __RO_END_UNALIGNED__ = .;
         /*
          * Memory page(s) mapped to this section will be marked as read-only,
diff --git a/bl31/bl31.mk b/bl31/bl31.mk
index 5c374aa..f7c2168 100644
--- a/bl31/bl31.mk
+++ b/bl31/bl31.mk
@@ -62,7 +62,8 @@
 				spinlock.o				\
 				gic_v3_sysregs.o			\
 				bakery_lock.o				\
-				runtime_svc.o
+				runtime_svc.o				\
+				early_exceptions.o
 
 BL31_ENTRY_POINT	:=	bl31_entrypoint
 BL31_MAPFILE		:=	bl31.map