Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc Add an ofw_bootstrap() function, called dur...



details:   https://anonhg.NetBSD.org/src/rev/0d4e7a98ceae
branches:  trunk
changeset: 959559:0d4e7a98ceae
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Thu Feb 18 18:31:22 2021 +0000

description:
Add an ofw_bootstrap() function, called during early bootstrap from
ofwinit() to perform additional early initialization in C code.  Use
this to get the memory config while we're still running in the OpenFirmware
client environment, rather than waiting until we've started fiddling with
the system state.

diffstat:

 sys/arch/powerpc/include/ofw_machdep.h |  38 ++++++++++++++++++++++++++
 sys/arch/powerpc/oea/ofw_subr.S        |  10 +++++-
 sys/arch/powerpc/powerpc/ofw_machdep.c |  49 +++++++++++++++++++++++----------
 3 files changed, 80 insertions(+), 17 deletions(-)

diffs (163 lines):

diff -r a8d13337f95a -r 0d4e7a98ceae sys/arch/powerpc/include/ofw_machdep.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/powerpc/include/ofw_machdep.h    Thu Feb 18 18:31:22 2021 +0000
@@ -0,0 +1,38 @@
+/* $NetBSD: ofw_machdep.h,v 1.1 2021/02/18 18:31:22 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _POWERPC_OFW_MACHDEP_H_
+#define _POWERPC_OFW_MACHDEP_H_
+
+#ifdef _KERNEL
+#include <machine/powerpc.h>
+
+void   ofw_bootstrap(void);
+#endif /* _KERNEL */
+
+#endif /* _POWERPC_OFW_MACHDEP_H_ */
diff -r a8d13337f95a -r 0d4e7a98ceae sys/arch/powerpc/oea/ofw_subr.S
--- a/sys/arch/powerpc/oea/ofw_subr.S   Thu Feb 18 18:27:24 2021 +0000
+++ b/sys/arch/powerpc/oea/ofw_subr.S   Thu Feb 18 18:31:22 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ofw_subr.S,v 1.14 2021/02/18 16:29:12 thorpej Exp $    */
+/*     $NetBSD: ofw_subr.S,v 1.15 2021/02/18 18:31:22 thorpej Exp $    */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -113,7 +113,13 @@
        lis     %r9,_C_LABEL(OF_buf)@ha
        stw     %r8,_C_LABEL(OF_buf)@l(%r9)
 
-       /* XXX Do other stuff in C code. */
+       /*
+        * Call into C code to perform additional early initialization.
+        */
+       lis     %r8,_C_LABEL(ofw_bootstrap)@ha
+       addi    %r8,%r8,_C_LABEL(ofw_bootstrap)@l
+       mtctr   %r8
+       bctrl
 
        /*
         * Jump off the trampoline for all subsequent calls
diff -r a8d13337f95a -r 0d4e7a98ceae sys/arch/powerpc/powerpc/ofw_machdep.c
--- a/sys/arch/powerpc/powerpc/ofw_machdep.c    Thu Feb 18 18:27:24 2021 +0000
+++ b/sys/arch/powerpc/powerpc/ofw_machdep.c    Thu Feb 18 18:31:22 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ofw_machdep.c,v 1.26 2021/01/27 03:17:24 thorpej Exp $ */
+/*     $NetBSD: ofw_machdep.c,v 1.27 2021/02/18 18:31:22 thorpej Exp $ */
 
 /*
  * Copyright (C) 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.26 2021/01/27 03:17:24 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_machdep.c,v 1.27 2021/02/18 18:31:22 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -50,6 +50,8 @@
 #include <machine/powerpc.h>
 #include <machine/autoconf.h>
 
+#include <powerpc/ofw_machdep.h>
+
 #ifdef DEBUG
 #define DPRINTF aprint_error
 #else
@@ -59,15 +61,8 @@
 #define        OFMEM_REGIONS   32
 static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3];
 
-/*
- * This is called during initppc, before the system is really initialized.
- * It shall provide the total and the available regions of RAM.
- * Both lists must have a zero-size entry as terminator.
- * The available regions need not take the kernel into account, but needs
- * to provide space for two additional entry beyond the terminating one.
- */
-void
-mem_regions(struct mem_region **memp, struct mem_region **availp)
+static void
+ofw_bootstrap_get_memory(void)
 {
        const char *macrisc[] = {"MacRISC", "MacRISC2", "MacRISC4", NULL};
        int hroot, hmem, i, cnt, memcnt, regcnt, acells, scells;
@@ -225,8 +220,6 @@
                }
        }
 
-       *memp = OFmem;
-       *availp = OFavail;
        return;
 
 error:
@@ -239,14 +232,40 @@
        OFavail[0].start = 0x3000;
        OFavail[0].size = 0x20000000 - 0x3000;
 
-       *memp = OFmem;
-       *availp = OFavail;
 #else
        panic("no memory?");
 #endif
        return;
 }
 
+/*
+ * Called from ofwinit() very early in bootstrap.  We are still
+ * running on the stack provided by OpenFirmware and in the same
+ * OpenFirmware client environment as the boot loader.  Our calls
+ * to OpenFirmware are direct, and not via the trampoline that
+ * saves / restores kernel state.
+ */
+void
+ofw_bootstrap(void)
+{
+       /* Get the system memory configuration. */
+       ofw_bootstrap_get_memory();
+}
+
+/*
+ * This is called during initppc, before the system is really initialized.
+ * It shall provide the total and the available regions of RAM.
+ * Both lists must have a zero-size entry as terminator.
+ * The available regions need not take the kernel into account, but needs
+ * to provide space for two additional entry beyond the terminating one.
+ */
+void
+mem_regions(struct mem_region **memp, struct mem_region **availp)
+{
+       *memp = OFmem;
+       *availp = OFavail;
+}
+
 void
 ppc_exit(void)
 {



Home | Main Index | Thread Index | Old Index