Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/macppc - When starting the boot program, cache a bu...
details: https://anonhg.NetBSD.org/src/rev/b09e155aa924
branches: trunk
changeset: 959911:b09e155aa924
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Feb 28 20:27:40 2021 +0000
description:
- When starting the boot program, cache a bunch of OFW frequently used
ihandles / phandles, rather than fetching them all the time.
- Change the signature of OF_call_method() to take an array of cells for
the inputs and outputs, rather than using variadic arguments. This
makes it much easier to use OF_call_method() when the format of the
arguments passed to a given method are determined at run-time
(due to e.g. #address-cells).
- Properly inform OpenFirmware where the kernel is loaded by using
"claim" on /chosen/memory and, if running in virtual-mode, using
"claim" on /chosen/mmu to reserve the VA, and "map" on /chosen/mmu
to enter the translation. (The kernel is still always mapped VA==PA.)
diffstat:
sys/arch/macppc/include/loadfile_machdep.h | 14 +-
sys/arch/macppc/stand/ofwboot/Locore.c | 138 +++++-
sys/arch/macppc/stand/ofwboot/Makefile | 5 +-
sys/arch/macppc/stand/ofwboot/boot.c | 38 +-
sys/arch/macppc/stand/ofwboot/loadfile_machdep.c | 452 +++++++++++++++++++++++
sys/arch/macppc/stand/ofwboot/ofdev.c | 13 +-
sys/arch/macppc/stand/ofwboot/openfirm.h | 18 +-
sys/arch/macppc/stand/ofwboot/version | 3 +-
8 files changed, 631 insertions(+), 50 deletions(-)
diffs (truncated from 914 to 300 lines):
diff -r d5ed8377cb5f -r b09e155aa924 sys/arch/macppc/include/loadfile_machdep.h
--- a/sys/arch/macppc/include/loadfile_machdep.h Sun Feb 28 20:17:13 2021 +0000
+++ b/sys/arch/macppc/include/loadfile_machdep.h Sun Feb 28 20:27:40 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: loadfile_machdep.h,v 1.6 2014/08/06 21:57:50 joerg Exp $ */
+/* $NetBSD: loadfile_machdep.h,v 1.7 2021/02/28 20:27:40 thorpej Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -36,9 +36,21 @@
#define LOADADDR(a) (((u_long)(a)) + offset)
#define ALIGNENTRY(a) ((u_long)(a))
+
+#ifdef _STANDALONE
+ssize_t macppc_read(int, void *, size_t);
+void * macppc_memcpy(void *, const void *, size_t);
+void * macppc_memset(void *, int, size_t);
+
+#define READ(f, b, c) macppc_read((f), (void *)LOADADDR(b), (c))
+#define BCOPY(s, d, c) macppc_memcpy((void *)LOADADDR(d), (void *)(s), (c))
+#define BZERO(d, c) macppc_memset((void *)LOADADDR(d), 0, (c))
+#else
#define READ(f, b, c) read((f), (void *)LOADADDR(b), (c))
#define BCOPY(s, d, c) memcpy((void *)LOADADDR(d), (void *)(s), (c))
#define BZERO(d, c) memset((void *)LOADADDR(d), 0, (c))
+#endif /* _STANDALONE */
+
#define WARN(a) do { \
(void)printf a; \
if (errno) \
diff -r d5ed8377cb5f -r b09e155aa924 sys/arch/macppc/stand/ofwboot/Locore.c
--- a/sys/arch/macppc/stand/ofwboot/Locore.c Sun Feb 28 20:17:13 2021 +0000
+++ b/sys/arch/macppc/stand/ofwboot/Locore.c Sun Feb 28 20:27:40 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: Locore.c,v 1.34 2020/04/15 13:33:13 rin Exp $ */
+/* $NetBSD: Locore.c,v 1.35 2021/02/28 20:27:40 thorpej Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -201,6 +201,34 @@
}
#endif
+int ofw_real_mode;
+int ofw_address_cells;
+int ofw_size_cells;
+
+int ofw_root; /* / */
+int ofw_options; /* /options */
+int ofw_openprom; /* /openprom */
+int ofw_chosen; /* /chosen (package) */
+int ofw_stdin; /* /chosen/stdin */
+int ofw_stdout; /* /chosen/stdout */
+int ofw_memory_ihandle; /* /chosen/memory */
+int ofw_mmu_ihandle; /* /chosen/mmu */
+
+bool
+ofw_option_truefalse(const char *prop, int proplen)
+{
+ /* These are all supposed to be strings. */
+ switch (prop[0]) {
+ case 'y':
+ case 'Y':
+ case 't':
+ case 'T':
+ case '1':
+ return true;
+ }
+ return false;
+}
+
static void
startup(void *vpd, int res, int (*openfirm)(void *), char *arg, int argl)
{
@@ -623,9 +651,9 @@
#endif
int
-OF_call_method(const char *method, int ihandle, int nargs, int nreturns, ...)
+OF_call_method(const char *method, int ihandle, int nargs, int nreturns,
+ int *cells)
{
- va_list ap;
static struct {
const char *name;
int nargs;
@@ -642,47 +670,47 @@
if (nargs > 6)
return -1;
+
args.nargs = nargs + 2;
args.nreturns = nreturns + 1;
args.method = method;
args.ihandle = ihandle;
- va_start(ap, nreturns);
+
for (ip = args.args_n_results + (n = nargs); --n >= 0;)
- *--ip = va_arg(ap, int);
+ *--ip = *cells++;
if (openfirmware(&args) == -1) {
- va_end(ap);
return -1;
}
+
if (args.args_n_results[nargs]) {
- va_end(ap);
return args.args_n_results[nargs];
}
+
for (ip = args.args_n_results + nargs + (n = args.nreturns); --n > 0;)
- *va_arg(ap, int *) = *--ip;
- va_end(ap);
+ *cells++ = *--ip;
+
return 0;
}
-static int stdin;
-static int stdout;
-
static void
setup(void)
{
- int chosen;
+ char prop[32];
+ int proplen;
+ const char *reason = NULL;
- if ((chosen = OF_finddevice("/chosen")) == -1)
+ if ((ofw_chosen = OF_finddevice("/chosen")) == -1)
OF_exit();
- if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) !=
- sizeof(stdin) ||
- OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) !=
- sizeof(stdout))
+ if (OF_getprop(ofw_chosen, "stdin", &ofw_stdin, sizeof(ofw_stdin)) !=
+ sizeof(ofw_stdin) ||
+ OF_getprop(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) !=
+ sizeof(ofw_stdout))
OF_exit();
- if (stdout == 0) {
+ if (ofw_stdout == 0) {
/* screen should be console, but it is not open */
- stdout = OF_open("screen");
+ ofw_stdout = OF_open("screen");
}
#ifdef HEAP_VARIABLE
@@ -699,6 +727,72 @@
setheap(heapspace, heapspace + HEAP_SIZE);
#endif /* HEAP_VARIABLE */
+
+ ofw_root = OF_finddevice("/");
+ ofw_options = OF_finddevice("/options");
+ ofw_openprom = OF_finddevice("/openprom");
+ ofw_chosen = OF_finddevice("/chosen");
+
+ if (ofw_root == -1) {
+ reason = "No root node";
+ goto bad_environment;
+ }
+ if (ofw_chosen == -1) {
+ reason = "No chosen node";
+ goto bad_environment;
+ }
+
+ if (ofw_options != -1) {
+ proplen = OF_getprop(ofw_options, "real-mode?", prop,
+ sizeof(prop));
+ if (proplen > 0) {
+ ofw_real_mode = ofw_option_truefalse(prop, proplen);
+ }
+ }
+
+ /*
+ * Get #address-cells and #size-cells.
+ */
+ ofw_address_cells = 1;
+ ofw_size_cells = 1;
+ OF_getprop(ofw_root, "#address-cells", &ofw_address_cells,
+ sizeof(ofw_address_cells));
+ OF_getprop(ofw_root, "#size-cells", &ofw_size_cells,
+ sizeof(ofw_size_cells));
+
+ /* See loadfile_machdep.c */
+ if (ofw_size_cells != 1) {
+ printf("#size-cells = %d not yet supported\n", ofw_size_cells);
+ reason = "unsupported #size-cells";
+ goto bad_environment;
+ }
+
+ /*
+ * Get the ihandle on /chosen/memory and /chosen/mmu.
+ */
+ ofw_memory_ihandle = -1;
+ ofw_mmu_ihandle = -1;
+ OF_getprop(ofw_chosen, "memory", &ofw_memory_ihandle,
+ sizeof(ofw_memory_ihandle));
+ OF_getprop(ofw_chosen, "mmu", &ofw_mmu_ihandle,
+ sizeof(ofw_mmu_ihandle));
+ if (ofw_memory_ihandle == -1) {
+ reason = "no /chosen/memory";
+ goto bad_environment;
+ }
+ if (ofw_mmu_ihandle == -1) {
+ reason = "no /chosen/mmu";
+ goto bad_environment;
+ }
+
+ return;
+
+ bad_environment:
+ if (reason == NULL) {
+ reason = "unknown reason";
+ }
+ printf("Invalid Openfirmware environment: %s\n", reason);
+ OF_exit();
}
void
@@ -708,7 +802,7 @@
if (c == '\n')
putchar('\r');
- OF_write(stdout, &ch, 1);
+ OF_write(ofw_stdout, &ch, 1);
}
int
@@ -717,7 +811,7 @@
unsigned char ch = '\0';
int l;
- while ((l = OF_read(stdin, &ch, 1)) != 1)
+ while ((l = OF_read(ofw_stdin, &ch, 1)) != 1)
if (l != -2 && l != 0)
return -1;
return ch;
diff -r d5ed8377cb5f -r b09e155aa924 sys/arch/macppc/stand/ofwboot/Makefile
--- a/sys/arch/macppc/stand/ofwboot/Makefile Sun Feb 28 20:17:13 2021 +0000
+++ b/sys/arch/macppc/stand/ofwboot/Makefile Sun Feb 28 20:27:40 2021 +0000
@@ -1,10 +1,11 @@
-# $NetBSD: Makefile,v 1.59 2018/06/06 22:56:25 uwe Exp $
+# $NetBSD: Makefile,v 1.60 2021/02/28 20:27:40 thorpej Exp $
S= ${.CURDIR}/../../../..
PROG= ofwboot
FILES= ${PROG}.elf ${PROG}.xcf
-SRCS= Locore.c boot.c ofdev.c hfs.c net.c netif_of.c
+SRCS= Locore.c boot.c ofdev.c hfs.c net.c netif_of.c \
+ loadfile_machdep.c
XCOFFXTRA= Xcoffxtra.c
XCOFFXTRAOBJ= Xcoffxtra.o
CFLAGS+= -ffreestanding
diff -r d5ed8377cb5f -r b09e155aa924 sys/arch/macppc/stand/ofwboot/boot.c
--- a/sys/arch/macppc/stand/ofwboot/boot.c Sun Feb 28 20:17:13 2021 +0000
+++ b/sys/arch/macppc/stand/ofwboot/boot.c Sun Feb 28 20:27:40 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.30 2020/04/23 00:12:28 joerg Exp $ */
+/* $NetBSD: boot.c,v 1.31 2021/02/28 20:27:40 thorpej Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -211,8 +211,8 @@
main(void)
{
extern char bootprog_name[], bootprog_rev[];
- int chosen, options, openprom;
char bootline[512]; /* Should check size? */
+ char prop[32];
char *cp;
u_long marks[MARK_MAX];
u_int32_t entry;
@@ -224,25 +224,24 @@
/*
* Figure out what version of Open Firmware...
*/
- if ((openprom = OF_finddevice("/openprom")) != -1) {
- char model[32];
-
- memset(model, 0, sizeof model);
- OF_getprop(openprom, "model", model, sizeof model);
- for (cp = model; *cp; cp++)
+ if (ofw_openprom != -1) {
+ memset(prop, 0, sizeof prop);
+ OF_getprop(ofw_openprom, "model", prop, sizeof prop);
+ for (cp = prop; *cp; cp++)
if (*cp >= '0' && *cp <= '9') {
ofw_version = *cp - '0';
break;
}
- DPRINTF(">> Open Firmware version %d.x\n", ofw_version);
+ printf(">> Open Firmware version %d.x\n", ofw_version);
}
Home |
Main Index |
Thread Index |
Old Index