Move the cpu_setup() call to the end of initarm(). On Cortex-A53 processors
authorkettenis <kettenis@openbsd.org>
Mon, 8 Aug 2016 19:27:12 +0000 (19:27 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 8 Aug 2016 19:27:12 +0000 (19:27 +0000)
atomic instructions don't work unless the data cache is enabled.  This happens
in cpu_setup(), but that gets currently called from cpu_startup() which runs
after a number of kernel subsystems have been initialized.  Since some of
these subsystems use locks, which need atomic instructions, we fault on
Cortex-A53.  Since at the end of initarm() we're done setting up the pmap
and initializing other low-level sense, calling cpu_setup() here makes much
more sense.

Remove setting up proc0paddr as well from cpu_startup(), since that already
happens in initarm().

Tested on zaurus by deraadt@.

ok jsg@, patrick@

sys/arch/arm/arm/arm32_machdep.c
sys/arch/armish/armish/armish_machdep.c
sys/arch/armv7/armv7/armv7_machdep.c
sys/arch/zaurus/zaurus/zaurus_machdep.c

index 0149df7..1551f9d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: arm32_machdep.c,v 1.48 2016/01/31 00:14:50 jsg Exp $  */
+/*     $OpenBSD: arm32_machdep.c,v 1.49 2016/08/08 19:27:12 kettenis Exp $     */
 /*     $NetBSD: arm32_machdep.c,v 1.42 2003/12/30 12:33:15 pk Exp $    */
 
 /*
@@ -165,7 +165,7 @@ arm32_vector_init(vaddr_t va, int which)
                 *
                 * Note: This has to be done here (and not just in
                 * cpu_setup()) because the vector page needs to be
-                * accessible *before* cpu_startup() is called.
+                * accessible *before* main() is called.
                 * Think ddb(9) ...
                 *
                 * NOTE: If the CPU control register is not readable,
@@ -237,12 +237,6 @@ cpu_startup()
        paddr_t minaddr;
        paddr_t maxaddr;
 
-       proc0paddr = (struct user *)kernelstack.pv_va;
-       proc0.p_addr = proc0paddr;
-
-       /* Set the cpu control register */
-       cpu_setup();
-
        /* Lock down zero page */
        vector_page_setprot(PROT_READ | PROT_EXEC);
 
index ec3279c..a73b54e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: armish_machdep.c,v 1.39 2015/05/10 15:56:28 jsg Exp $ */
+/*     $OpenBSD: armish_machdep.c,v 1.40 2016/08/08 19:27:12 kettenis Exp $ */
 /*     $NetBSD: lubbock_machdep.c,v 1.2 2003/07/15 00:25:06 lukem Exp $ */
 
 /*
@@ -770,6 +770,8 @@ initarm(void *arg0, void *arg1, void *arg2)
                Debugger();
 #endif
     
+       cpu_setup();
+
        /* We return the new stack pointer address */
        return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
 }
index 11b2af1..8c1bda5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: armv7_machdep.c,v 1.34 2016/07/30 08:07:01 kettenis Exp $ */
+/*     $OpenBSD: armv7_machdep.c,v 1.35 2016/08/08 19:27:12 kettenis Exp $ */
 /*     $NetBSD: lubbock_machdep.c,v 1.2 2003/07/15 00:25:06 lukem Exp $ */
 
 /*
@@ -795,6 +795,8 @@ initarm(void *arg0, void *arg1, void *arg2)
 #endif
        printf("board type: %u\n", board_id);
 
+       cpu_setup();
+
        /* We return the new stack pointer address */
        return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
 }
index af987a9..f214816 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: zaurus_machdep.c,v 1.59 2015/05/10 15:56:28 jsg Exp $ */
+/*     $OpenBSD: zaurus_machdep.c,v 1.60 2016/08/08 19:27:12 kettenis Exp $    */
 /*     $NetBSD: lubbock_machdep.c,v 1.2 2003/07/15 00:25:06 lukem Exp $ */
 
 /*
@@ -1110,6 +1110,8 @@ initarm(void *arg0, void *arg1, void *arg2)
                Debugger();
 #endif
 
+       cpu_setup();
+
        /* We return the new stack pointer address */
        return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
 }