armv8: Fix abort when disabled handling
authorDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Wed, 7 Aug 2019 14:37:01 +0000 (16:37 +0200)
committerDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Fri, 22 Nov 2019 15:31:48 +0000 (16:31 +0100)
The PC wasn't correctly saved to the trap area

Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>

kernel/arch/armv8/exceptions.S

index c167bff..fa67a60 100644 (file)
@@ -148,7 +148,7 @@ el0_aarch64_sync:
     cmp x14, x12
     ccmp x15, x12, #0, ls
     ldr w14, [x13, #OFFSETOF_DISP_DISABLED]
-    ccmp x14, xzr, #0, ls
+    ccmp w14, wzr, #0, ls
     /* NE <-> (low <= PC && PC < high) || disabled != 0 */
 
     /* Figure out what sort of exception we've got.  All paths need this. */
@@ -214,7 +214,7 @@ el0_aarch64_irq:
      * need to test R (is the disabled flag 0), giving either EQ or NE.  If
      * P /\ Q holds, we skip the test, as it doesn't affect the result, and
      * instead set the condition code directly NE, i.e. disabled=1. */
-    ccmp x0, xzr, #0, ls
+    ccmp w0, wzr, #0, ls
     /* NE <-> (low <= PC && PC < high) || disabled != 0 */
 
     /* x1 = EPC, x3 = dispatcher_shared_aarch64 */
@@ -446,7 +446,7 @@ el0_abort_disabled:
 
     /* User PC and SP */
     mrs x20, sp_el0
-    stp x20, x9, [x13, #(32 * 8)]
+    stp x20, x12, [x13, #(31 * 8)]
 
     /* x12 = EPC, x13 = base of save area, x14 = EC */