Module Name: src
Committed By: jmcneill
Date: Wed Jan 24 21:53:35 UTC 2024
Modified Files:
src/distrib/utils/embedded/files: evbppc_wii_meta.xml
src/sys/arch/evbppc/include: wii.h
src/sys/arch/evbppc/wii: autoconf.c machdep.c wii_locore.S
Log Message:
wii: Add support for passing boot options to the kernel.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/distrib/utils/embedded/files/evbppc_wii_meta.xml
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/evbppc/include/wii.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbppc/wii/autoconf.c \
src/sys/arch/evbppc/wii/wii_locore.S
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbppc/wii/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/distrib/utils/embedded/files/evbppc_wii_meta.xml
diff -u src/distrib/utils/embedded/files/evbppc_wii_meta.xml:1.1 src/distrib/utils/embedded/files/evbppc_wii_meta.xml:1.2
--- src/distrib/utils/embedded/files/evbppc_wii_meta.xml:1.1 Sat Jan 20 21:35:59 2024
+++ src/distrib/utils/embedded/files/evbppc_wii_meta.xml Wed Jan 24 21:53:34 2024
@@ -6,5 +6,8 @@
<release_date></release_date>
<short_description>Free Unix-like operating system.</short_description>
<long_description>NetBSD is a free, fast, secure, and highly portable Unix-like Open Source operating system.</long_description>
+ <arguments>
+ <arg>root=ld0</arg>
+ </arguments>
<ahb_access/>
</app>
Index: src/sys/arch/evbppc/include/wii.h
diff -u src/sys/arch/evbppc/include/wii.h:1.5 src/sys/arch/evbppc/include/wii.h:1.6
--- src/sys/arch/evbppc/include/wii.h:1.5 Tue Jan 23 21:48:12 2024
+++ src/sys/arch/evbppc/include/wii.h Wed Jan 24 21:53:34 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: wii.h,v 1.5 2024/01/23 21:48:12 jmcneill Exp $ */
+/* $NetBSD: wii.h,v 1.6 2024/01/24 21:53:34 jmcneill Exp $ */
/*-
* Copyright (c) 2024 Jared McNeill <[email protected]>
@@ -125,6 +125,15 @@
#define GPIO_SHUTDOWN 1
#define GPIO_SLOT_LED 5
+/* Command line protocol */
+#define WII_ARGV_MAGIC 0x5f617267
+struct wii_argv {
+ uint32_t magic;
+ uint32_t cmdline;
+ uint32_t length;
+ uint32_t unused[3];
+};
+
/* Blink the slot LED forever at the specified interval. */
static inline void __dead
wii_slot_led_blink(u_int interval_us)
Index: src/sys/arch/evbppc/wii/autoconf.c
diff -u src/sys/arch/evbppc/wii/autoconf.c:1.1 src/sys/arch/evbppc/wii/autoconf.c:1.2
--- src/sys/arch/evbppc/wii/autoconf.c:1.1 Sat Jan 20 21:36:00 2024
+++ src/sys/arch/evbppc/wii/autoconf.c Wed Jan 24 21:53:34 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.1 2024/01/20 21:36:00 jmcneill Exp $ */
+/* $NetBSD: autoconf.c,v 1.2 2024/01/24 21:53:34 jmcneill Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -44,7 +44,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.1 2024/01/20 21:36:00 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.2 2024/01/24 21:53:34 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -53,19 +53,25 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v
#include <sys/conf.h>
#include <sys/reboot.h>
#include <sys/device.h>
+#include <sys/boot_flag.h>
#include <powerpc/pte.h>
+#include <machine/wii.h>
+
void findroot(void);
void disable_intr(void);
void enable_intr(void);
+static void parse_cmdline(void);
+
/*
* Determine i/o configuration for a machine.
*/
void
cpu_configure(void)
{
+ parse_cmdline();
if (config_rootfound("mainbus", NULL) == NULL)
panic("configure: mainbus not configured");
@@ -87,21 +93,40 @@ cpu_rootconf(void)
void
findroot(void)
{
- device_t dev;
-
- if (booted_device != NULL) {
- return;
- }
+}
- if ((dev = device_find_by_driver_unit("ld", 0)) != NULL) {
+void
+device_register(device_t dev, void *aux)
+{
+ if (bootspec != NULL && strcmp(device_xname(dev), bootspec) == 0) {
booted_device = dev;
booted_partition = 0;
- return;
}
}
-void
-device_register(device_t dev, void *aux)
+static void
+parse_cmdline(void)
{
- /* do nothing */
+ static char bootspec_buf[64];
+ extern char wii_cmdline[];
+ const char *cmdline = wii_cmdline;
+
+ while (*cmdline != '\0') {
+ const char *cp = cmdline;
+
+ if (*cp == '-') {
+ for (cp++; *cp != '\0'; cp++) {
+ BOOT_FLAG(*cp, boothowto);
+ }
+ } else if (strncmp(cp, "root=", 5) == 0) {
+ snprintf(bootspec_buf, sizeof(bootspec_buf), "%s",
+ cp + 5);
+ if (bootspec_buf[0] != '\0') {
+ bootspec = bootspec_buf;
+ booted_method = "bootinfo/rootdevice";
+ }
+ }
+
+ cmdline += strlen(cmdline) + 1;
+ }
}
Index: src/sys/arch/evbppc/wii/wii_locore.S
diff -u src/sys/arch/evbppc/wii/wii_locore.S:1.1 src/sys/arch/evbppc/wii/wii_locore.S:1.2
--- src/sys/arch/evbppc/wii/wii_locore.S:1.1 Sat Jan 20 21:36:00 2024
+++ src/sys/arch/evbppc/wii/wii_locore.S Wed Jan 24 21:53:34 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: wii_locore.S,v 1.1 2024/01/20 21:36:00 jmcneill Exp $ */
+/* $NetBSD: wii_locore.S,v 1.2 2024/01/24 21:53:34 jmcneill Exp $ */
/* $OpenBSD: locore.S,v 1.4 1997/01/26 09:06:38 rahnds Exp $ */
/*
@@ -34,8 +34,6 @@
#include "opt_ddb.h"
#include "opt_kgdb.h"
-#include "opt_multiprocessor.h"
-#include "opt_openpic.h"
#include "opt_ppcparam.h"
#include "assym.h"
@@ -79,7 +77,22 @@ _C_LABEL(kernel_text):
.text
.globl __start
__start:
+ b __mmu_init
+ /*
+ * Command-line argument protocol supported by HBC.
+ */
+ .long 0x5f617267 /* WII_ARGV_MAGIC */
+ .globl _C_LABEL(wii_argv)
+_C_LABEL(wii_argv):
+ .long 0 /* argv magic, set by loader */
+ .long 0 /* command line */
+ .long 0 /* command line length */
+ .long 0 /* argc */
+ .long 0 /* argv */
+ .long 0 /* end of argv */
+
+__mmu_init:
/* reset MMU to a known state */
#include "wii_mmuinit.S"
Index: src/sys/arch/evbppc/wii/machdep.c
diff -u src/sys/arch/evbppc/wii/machdep.c:1.3 src/sys/arch/evbppc/wii/machdep.c:1.4
--- src/sys/arch/evbppc/wii/machdep.c:1.3 Mon Jan 22 21:28:15 2024
+++ src/sys/arch/evbppc/wii/machdep.c Wed Jan 24 21:53:34 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.3 2024/01/22 21:28:15 jmcneill Exp $ */
+/* $NetBSD: machdep.c,v 1.4 2024/01/24 21:53:34 jmcneill Exp $ */
/*
* Copyright (c) 2002, 2024 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
#define _POWERPC_BUS_DMA_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.3 2024/01/22 21:28:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.4 2024/01/24 21:53:34 jmcneill Exp $");
#include "opt_compat_netbsd.h"
#include "opt_ddb.h"
@@ -214,6 +214,7 @@ struct powerpc_bus_dma_tag wii_mem2_bus_
* Global variables used here and there
*/
struct mem_region physmemr[3], availmemr[3];
+char wii_cmdline[1024];
void initppc(u_int, u_int, u_int, void *); /* Called from locore */
void wii_dolphin_elf_loader_id(void);
@@ -226,11 +227,19 @@ initppc(u_int startkernel, u_int endkern
{
extern u_long ticks_per_sec;
extern unsigned char edata[], end[];
+ extern struct wii_argv wii_argv;
uint32_t mem2_size;
register_t scratch;
memset(&edata, 0, end - edata); /* clear BSS */
+ if (wii_argv.magic == WII_ARGV_MAGIC) {
+ void *ptr = (void *)(uintptr_t)(wii_argv.cmdline & ~0x80000000);
+ if (ptr != NULL) {
+ memcpy(wii_cmdline, ptr, wii_argv.length);
+ }
+ }
+
mem2_size = in32(GLOBAL_MEM2_SIZE);
/* MEM1 24MB 1T-SRAM */