|
@@ -10,6 +10,47 @@
|
|
|
#include <config.h>
|
|
|
#include <linux/linkage.h>
|
|
|
|
|
|
+/*
|
|
|
+ * Default/weak exception vectors relocation routine
|
|
|
+ *
|
|
|
+ * This routine covers the standard ARM cases: normal (0x00000000),
|
|
|
+ * high (0xffff0000) and VBAR. SoCs which do not comply with any of
|
|
|
+ * the standard cases must provide their own, strong, version.
|
|
|
+ */
|
|
|
+
|
|
|
+ .section .text.relocate_vectors,"ax",%progbits
|
|
|
+ .weak relocate_vectors
|
|
|
+
|
|
|
+ENTRY(relocate_vectors)
|
|
|
+
|
|
|
+#ifdef CONFIG_HAS_VBAR
|
|
|
+ /*
|
|
|
+ * If the ARM processor has the security extensions,
|
|
|
+ * use VBAR to relocate the exception vectors.
|
|
|
+ */
|
|
|
+ ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
|
|
|
+ mcr p15, 0, r0, c12, c0, 0 /* Set VBAR */
|
|
|
+#else
|
|
|
+ /*
|
|
|
+ * Copy the relocated exception vectors to the
|
|
|
+ * correct address
|
|
|
+ * CP15 c1 V bit gives us the location of the vectors:
|
|
|
+ * 0x00000000 or 0xFFFF0000.
|
|
|
+ */
|
|
|
+ ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
|
|
|
+ mrc p15, 0, r2, c1, c0, 0 /* V bit (bit[13]) in CP15 c1 */
|
|
|
+ ands r2, r2, #(1 << 13)
|
|
|
+ ldreq r1, =0x00000000 /* If V=0 */
|
|
|
+ ldrne r1, =0xFFFF0000 /* If V=1 */
|
|
|
+ ldmia r0!, {r2-r8,r10}
|
|
|
+ stmia r1!, {r2-r8,r10}
|
|
|
+ ldmia r0!, {r2-r8,r10}
|
|
|
+ stmia r1!, {r2-r8,r10}
|
|
|
+#endif
|
|
|
+ bx lr
|
|
|
+
|
|
|
+ENDPROC(relocate_vectors)
|
|
|
+
|
|
|
/*
|
|
|
* void relocate_code(addr_moni)
|
|
|
*
|
|
@@ -54,34 +95,6 @@ fixnext:
|
|
|
cmp r2, r3
|
|
|
blo fixloop
|
|
|
|
|
|
- /*
|
|
|
- * Relocate the exception vectors
|
|
|
- */
|
|
|
-#ifdef CONFIG_HAS_VBAR
|
|
|
- /*
|
|
|
- * If the ARM processor has the security extensions,
|
|
|
- * use VBAR to relocate the exception vectors.
|
|
|
- */
|
|
|
- ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
|
|
|
- mcr p15, 0, r0, c12, c0, 0 /* Set VBAR */
|
|
|
-#else
|
|
|
- /*
|
|
|
- * Copy the relocated exception vectors to the
|
|
|
- * correct address
|
|
|
- * CP15 c1 V bit gives us the location of the vectors:
|
|
|
- * 0x00000000 or 0xFFFF0000.
|
|
|
- */
|
|
|
- ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
|
|
|
- mrc p15, 0, r2, c1, c0, 0 /* V bit (bit[13]) in CP15 c1 */
|
|
|
- ands r2, r2, #(1 << 13)
|
|
|
- ldreq r1, =0x00000000 /* If V=0 */
|
|
|
- ldrne r1, =0xFFFF0000 /* If V=1 */
|
|
|
- ldmia r0!, {r2-r8,r10}
|
|
|
- stmia r1!, {r2-r8,r10}
|
|
|
- ldmia r0!, {r2-r8,r10}
|
|
|
- stmia r1!, {r2-r8,r10}
|
|
|
-#endif
|
|
|
-
|
|
|
relocate_done:
|
|
|
|
|
|
#ifdef __XSCALE__
|