Module Name: src
Committed By: nisimura
Date: Wed Aug 23 13:02:14 UTC 2017
Modified Files:
src/sys/arch/aarch64/aarch64: vectors.S
Log Message:
- don't use ENTRY() for exception entries.
- correct section definition.
- designate long pointer ldr.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/aarch64/aarch64/vectors.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/aarch64/aarch64/vectors.S
diff -u src/sys/arch/aarch64/aarch64/vectors.S:1.3 src/sys/arch/aarch64/aarch64/vectors.S:1.4
--- src/sys/arch/aarch64/aarch64/vectors.S:1.3 Tue Aug 22 18:35:09 2017
+++ src/sys/arch/aarch64/aarch64/vectors.S Wed Aug 23 13:02:14 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vectors.S,v 1.3 2017/08/22 18:35:09 nisimura Exp $ */
+/* $NetBSD: vectors.S,v 1.4 2017/08/23 13:02:14 nisimura Exp $ */
#include <aarch64/asm.h>
#include "assym.h"
@@ -18,6 +18,9 @@ lr .req x30 /* link register */
.macro VECT_INVAL, el, cause, regsize = 64
.align 7
/* small enough to fit 32 instrunction slot */
+ .if \el == 1
+ sub sp, sp, #TF_SIZE
+ .endif
stp x0, x1, [sp, #TF_X0]
stp x2, x3, [sp, #TF_X2]
stp x4, x5, [sp, #TF_X4]
@@ -37,7 +40,7 @@ lr .req x30 /* link register */
.if \el == 0
mrs x20, sp_el0
.else
- mrs x20, sp_el1
+ mov x20, sp
.endif
mrs x21, elr_el1
mrs x22, spsr_el1
@@ -48,10 +51,11 @@ lr .req x30 /* link register */
mrs x24, far_el1
str x23, [sp, #TF_ESR]
str x24, [sp, #TF_FAR]
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
mov x1, #\cause
b trap
+ /* !!! beware about remaining slot !!! */
.endm
.macro exception_entry, el, regsize = 64
@@ -79,7 +83,7 @@ lr .req x30 /* link register */
mov x29, xzr /* fp pointed to user-space */
mrs x20, sp_el0
.else
- mrs x20, sp_el1
+ mov x20, sp
.endif
mrs x21, elr_el1
mrs x22, spsr_el1
@@ -92,11 +96,12 @@ lr .req x30 /* link register */
str x24, [sp, #TF_FAR]
.endm
- .pushsection ".entry.text", "ax"
+ .pushsection ".vectors", "ax"
+ .global _C_LABEL(el1_vectors)
.p2align 11
-ENTRY(el1_vectors)
+_C_LABEL(el1_vectors):
/*
- * A64 exception taken from current Exception Level with SP_EL1.
+ * Exception taken from current Exception Level with SP_EL1.
* (These shouldn't happen)
*/
VECT_INVAL 1, BAD_SYNC /* Synchronous EL1t */
@@ -104,71 +109,73 @@ ENTRY(el1_vectors)
VECT_INVAL 1, BAD_FIQ /* FIQ EL1t */
VECT_INVAL 1, BAD_ERROR /* Error EL1t */
/*
- * A64 exception taken from current Exception Level with SP.
- * EL1 (kernel exceptions)
+ * Exception taken from current Exception Level with SP.
+ * There are entries for exceptions caused in EL1 (kernel exceptions).
*/
VECT_ENTRY el1_sync /* Synchronous EL1h */
VECT_ENTRY el1_irq /* IRQ EL1h */
VECT_INVAL 1, BAD_FIQ /* FIQ EL1h */
VECT_INVAL 1, BAD_ERROR /* Error EL1h */
/*
- * A64 exception taken from lower Exception Level.
- * EL0 (native user exceptions)
+ * Exception taken from lower Exception Level which is using AArch64
+ * There are entries for exceptions caused in EL0 (native user exceptions).
*/
VECT_ENTRY el0_sync /* Synchronous 64bit EL0 */
VECT_ENTRY el0_irq /* IRQ 64bit EL0 */
VECT_INVAL 0, BAD_FIQ /* FIQ 64bit EL0 */
VECT_INVAL 0, BAD_ERROR /* Error 64bit EL0 */
/*
- * A32 exception taken from lower Exception Level.
- * EL0 (compat user exceptions)
+ * Exception taken from lower Exception Level which is using AArch32
+ * There are entries for exceptions caused in EL0 (compat user exceptions).
*/
VECT_ENTRY el0_32sync /* Synchronous 32bit EL0 */
VECT_ENTRY el0_32irq /* IRQ 32bit EL0 */
VECT_INVAL 0, BAD_FIQ, 32 /* FIQ 32bit EL0 */
VECT_INVAL 0, BAD_ERROR, 32 /* Error 32bit EL0 */
-ENTRY(el1_sync)
+_C_LABEL(el1_sync):
+ sub sp, sp, #TF_SIZE
exception_entry 1
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
mov x1, xzr
b trap
END(el1_sync)
-ENTRY(el1_irq)
+_C_LABEL(el1_irq):
+ sub sp, sp, #TF_SIZE
exception_entry 1
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
b interrupt
END(el1_irq)
-ENTRY(el0_sync)
+_C_LABEL(el0_sync):
exception_entry 0
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
mov x1, xzr
b trap
END(el0_sync)
-ENTRY(el0_irq)
+_C_LABEL(el0_irq):
exception_entry 0
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
b interrupt
END(el0_irq)
-ENTRY(el0_32sync)
+_C_LABEL(el0_32sync):
exception_entry 0, 32
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
mov x1, xzr
b trap
END(el0_32sync)
-ENTRY(el0_32irq)
+_C_LABEL(el0_32irq):
exception_entry 0, 32
- adr lr, exception_trap_exit
+ ldr lr, =exception_trap_exit
mov x0, sp
b interrupt
END(el0_32irq)