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 <jmcne...@invisible.ca>
@@ -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 */

Reply via email to