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 */