Module Name: src Committed By: thorpej Date: Thu Feb 18 18:31:22 UTC 2021
Modified Files: src/sys/arch/powerpc/oea: ofw_subr.S src/sys/arch/powerpc/powerpc: ofw_machdep.c Added Files: src/sys/arch/powerpc/include: ofw_machdep.h Log Message: 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. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/arch/powerpc/include/ofw_machdep.h cvs rdiff -u -r1.14 -r1.15 src/sys/arch/powerpc/oea/ofw_subr.S cvs rdiff -u -r1.26 -r1.27 src/sys/arch/powerpc/powerpc/ofw_machdep.c 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/powerpc/oea/ofw_subr.S diff -u src/sys/arch/powerpc/oea/ofw_subr.S:1.14 src/sys/arch/powerpc/oea/ofw_subr.S:1.15 --- src/sys/arch/powerpc/oea/ofw_subr.S:1.14 Thu Feb 18 16:29:12 2021 +++ src/sys/arch/powerpc/oea/ofw_subr.S Thu Feb 18 18:31:22 2021 @@ -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 @@ ENTRY_NOPROFILE(ofwinit) 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 Index: src/sys/arch/powerpc/powerpc/ofw_machdep.c diff -u src/sys/arch/powerpc/powerpc/ofw_machdep.c:1.26 src/sys/arch/powerpc/powerpc/ofw_machdep.c:1.27 --- src/sys/arch/powerpc/powerpc/ofw_machdep.c:1.26 Wed Jan 27 03:17:24 2021 +++ src/sys/arch/powerpc/powerpc/ofw_machdep.c Thu Feb 18 18:31:22 2021 @@ -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 @@ __KERNEL_RCSID(0, "$NetBSD: ofw_machdep. #include <machine/powerpc.h> #include <machine/autoconf.h> +#include <powerpc/ofw_machdep.h> + #ifdef DEBUG #define DPRINTF aprint_error #else @@ -59,15 +61,8 @@ __KERNEL_RCSID(0, "$NetBSD: ofw_machdep. #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 @@ mem_regions(struct mem_region **memp, st } } - *memp = OFmem; - *availp = OFavail; return; error: @@ -239,14 +232,40 @@ error: 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) { Added files: Index: src/sys/arch/powerpc/include/ofw_machdep.h diff -u /dev/null src/sys/arch/powerpc/include/ofw_machdep.h:1.1 --- /dev/null Thu Feb 18 18:31:22 2021 +++ src/sys/arch/powerpc/include/ofw_machdep.h Thu Feb 18 18:31:22 2021 @@ -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_ */