Index: arch/i386/conf/files.i386 =================================================================== RCS file: /cvsroot/src/sys/arch/i386/conf/files.i386,v retrieving revision 1.309 diff -u -r1.309 files.i386 --- arch/i386/conf/files.i386 15 Jun 2007 23:02:20 -0000 1.309 +++ arch/i386/conf/files.i386 21 Jun 2007 10:53:11 -0000 @@ -79,6 +79,7 @@ file arch/i386/i386/ipkdb_glue.c ipkdb file arch/i386/i386/kgdb_machdep.c kgdb file arch/i386/i386/machdep.c +file arch/i386/i386/kopt_machdep.c file arch/i386/i386/identcpu.c file arch/i386/i386/math_emulate.c math_emulate file arch/i386/i386/mem.c @@ -159,17 +160,17 @@ include "dev/pci/files.agp" file arch/x86/pci/agp_machdep.c agp file arch/i386/pci/pcibios.c pcibios -file arch/i386/pci/pci_intr_fixup.c pcibios & pci_intr_fixup -file arch/i386/pci/piix.c pcibios & pci_intr_fixup -file arch/i386/pci/opti82c558.c pcibios & pci_intr_fixup -file arch/i386/pci/opti82c700.c pcibios & pci_intr_fixup -file arch/i386/pci/sis85c503.c pcibios & pci_intr_fixup -file arch/i386/pci/via82c586.c pcibios & pci_intr_fixup -file arch/i386/pci/via8231.c pcibios & pci_intr_fixup -file arch/i386/pci/amd756.c pcibios & pci_intr_fixup -file arch/i386/pci/ali1543.c pcibios & pci_intr_fixup -file arch/i386/pci/pci_bus_fixup.c pci_bus_fixup -file arch/i386/pci/pci_addr_fixup.c pci_addr_fixup +file arch/i386/pci/pci_intr_fixup.c pcibios +file arch/i386/pci/piix.c pcibios +file arch/i386/pci/opti82c558.c pcibios +file arch/i386/pci/opti82c700.c pcibios +file arch/i386/pci/sis85c503.c pcibios +file arch/i386/pci/via82c586.c pcibios +file arch/i386/pci/via8231.c pcibios +file arch/i386/pci/amd756.c pcibios +file arch/i386/pci/ali1543.c pcibios +file arch/i386/pci/pci_bus_fixup.c +file arch/i386/pci/pci_addr_fixup.c defparam PCI_CONF_MODE file arch/i386/pci/pcic_pci_machdep.c pcic_pci Index: kern/kern_bootprops.c =================================================================== RCS file: kern/kern_bootprops.c diff -N kern/kern_bootprops.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ kern/kern_bootprops.c 21 Jun 2007 10:53:11 -0000 @@ -0,0 +1,207 @@ +/* $NetBSD$ */ + +/*- + * Copyright (c) 2007 Jared D. McNeill + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jared D. McNeill. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD$"); + +#include +#include +#include +#include +#include + +#include + +#define BOOTPROPS_DICT_KOPTS "kernel-options" + +static prop_dictionary_t bootprops = NULL; +static char *bootprops_plist = NULL; +static char bootprops_empty_plist[1] = ""; + +static prop_object_t bootprops_get(prop_dictionary_t, const char *); +static int sysctl_kern_bootprops(SYSCTLFN_PROTO); + +SYSCTL_SETUP(sysctl_bootprops_setup, "sysctl kern.bootprops setup") +{ + + sysctl_createv(clog, 0, NULL, NULL, CTLFLAG_PERMANENT, + CTLTYPE_NODE, "kern", NULL, NULL, 0, NULL, 0, + CTL_KERN, CTL_EOL); + + sysctl_createv(clog, 0, NULL, NULL, CTLFLAG_PERMANENT, + CTLTYPE_STRING, "bootprops", NULL, sysctl_kern_bootprops, + 0, NULL, 0, CTL_KERN, CTL_CREATE, CTL_EOL); + +} + +int +sysctl_kern_bootprops(SYSCTLFN_ARGS) +{ + struct sysctlnode node; + char *plist; + + if (bootprops != NULL) { + if (bootprops_plist != NULL) + free(bootprops_plist, M_TEMP); + + bootprops_plist = prop_dictionary_externalize(bootprops); + } + + if (bootprops_plist == NULL) + plist = bootprops_empty_plist; + else + plist = bootprops_plist; + + node = *rnode; + node.sysctl_data = plist; + node.sysctl_size = strlen(plist) + 1; + return (sysctl_lookup(SYSCTLFN_CALL(&node))); +} + +boolean_t +bootprops_init(const char *data) +{ + prop_dictionary_t kopts; + + printf("%s\n", data); + + bootprops = prop_dictionary_internalize(data); + if (bootprops == NULL) + bootprops = prop_dictionary_create(); + + if (bootprops == NULL) + return false; + + kopts = prop_dictionary_get(bootprops, BOOTPROPS_DICT_KOPTS); + if (kopts == NULL) { + kopts = prop_dictionary_create(); + prop_dictionary_set(bootprops, BOOTPROPS_DICT_KOPTS, kopts); + } + + return true; +} + +prop_dictionary_t +bootprops_get_dictionary(const char *namespace) +{ + prop_object_t obj; + + if (bootprops == NULL) + return NULL; + if (namespace == NULL) + return bootprops; + obj = prop_dictionary_get(bootprops, namespace); + if (obj == NULL) + return NULL; + if (prop_object_type(obj) != PROP_TYPE_DICTIONARY) + return NULL; + return (prop_dictionary_t)obj; +} + +static prop_object_t +bootprops_get(prop_dictionary_t dict, const char *key) +{ + + if (bootprops == NULL) + return NULL; + if (dict == NULL) + dict = bootprops; + return prop_dictionary_get(dict, key); +} + +prop_string_t +bootprops_get_string(prop_dictionary_t dict, const char *key) +{ + prop_object_t obj; + + obj = bootprops_get(dict, key); + if (obj == NULL || prop_object_type(obj) != PROP_TYPE_STRING) + return NULL; + return (prop_string_t)obj; +} + +prop_number_t +bootprops_get_number(prop_dictionary_t dict, const char *key) +{ + prop_object_t obj; + + obj = bootprops_get(dict, key); + if (obj == NULL || prop_object_type(obj) != PROP_TYPE_NUMBER) + return NULL; + return (prop_number_t)obj; +} + +prop_array_t +bootprops_get_array(prop_dictionary_t dict, const char *key) +{ + prop_object_t obj; + + obj = bootprops_get(dict, key); + if (obj == NULL || prop_object_type(obj) != PROP_TYPE_ARRAY) + return NULL; + return (prop_array_t)obj; +} + +prop_bool_t +bootprops_get_bool(prop_dictionary_t dict, const char *key) +{ + prop_object_t obj; + + obj = bootprops_get(dict, key); + if (obj == NULL || prop_object_type(obj) != PROP_TYPE_BOOL) + return NULL; + + return (prop_bool_t)obj; +} + +/* + * kernel options namespace + */ +boolean_t +bootprops_kopt_true(const char *key) +{ + prop_dictionary_t kopts; + prop_bool_t val; + + kopts = bootprops_get(BOOTPROPS_DEFAULT_DICTIONARY, + BOOTPROPS_DICT_KOPTS); + if (kopts == NULL) + return false; + + val = bootprops_get_bool(kopts, key); + if (val == NULL) + return false; + + return prop_bool_true(val); +} Index: kern/subr_autoconf.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_autoconf.c,v retrieving revision 1.117 diff -u -r1.117 subr_autoconf.c --- kern/subr_autoconf.c 5 Mar 2007 20:32:45 -0000 1.117 +++ kern/subr_autoconf.c 21 Jun 2007 10:53:11 -0000 @@ -243,6 +243,7 @@ config_init(); #ifdef USERCONF + user_autoconfig(); if (boothowto & RB_USERCONF) user_config(); #endif Index: kern/subr_userconf.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_userconf.c,v retrieving revision 1.18 diff -u -r1.18 subr_userconf.c --- kern/subr_userconf.c 11 Dec 2005 12:24:30 -0000 1.18 +++ kern/subr_userconf.c 21 Jun 2007 10:53:12 -0000 @@ -46,9 +46,12 @@ #include #include +#include +#include extern struct cfdata cfdata[]; +static int userconf_autoconfig = 0; static int userconf_base = 16; /* Base for "large" numbers */ static int userconf_maxdev = -1; /* # of used device slots */ static int userconf_totdev = -1; /* # of device slots */ @@ -67,6 +70,10 @@ static int getsn(char *, int); +static void userconf_bootprops_disable(const char *); +static void userconf_bootprops_enable(const char *); +static void userconf_bootprops_set(const char *, const char *); + #define UC_CHANGE 'c' #define UC_DISABLE 'd' #define UC_ENABLE 'e' @@ -91,15 +98,21 @@ static void userconf_init(void) { + static int initted = 0; int i; struct cfdata *cf; + if (initted) + return; + i = 0; for (cf = cfdata; cf->cf_name; cf++) i++; userconf_maxdev = i - 1; userconf_totdev = i - 1; + + initted = 1; } static int @@ -302,6 +315,23 @@ return (0); } +static char * +userconf_create_cmd(const char *cmd, const char *dev) +{ + static char uccmd[128]; + + if (cmd == NULL || dev == NULL || cmd[0] == '\0' || dev[0] == '\0') + return NULL; + + memset(uccmd, 0, 128); + snprintf(uccmd, 127, "%s %s", cmd, dev); + + if (userconf_autoconfig) + printf("[debug:uccmd=%s]\n", uccmd); + + return uccmd; +} + static int userconf_device(char *cmd, int *len, short *unit, short *state) { @@ -435,7 +465,7 @@ } static void -userconf_disable(int devno) +userconf_disable(char *dev, int devno) { int done = 0; @@ -456,24 +486,28 @@ break; } - printf("[%3d] ", devno); - userconf_pdevnam(devno); + if (!userconf_autoconfig) { + printf("[%3d] ", devno); + userconf_pdevnam(devno); + } if (done) { - printf(" already"); + if (!userconf_autoconfig) printf(" already"); } else { /* XXX add cmd 'd' eoc */ userconf_hist_cmd('d'); userconf_hist_int(devno); userconf_hist_eoc(); + + userconf_bootprops_disable(dev); } - printf(" disabled\n"); + if (!userconf_autoconfig) printf(" disabled\n"); } else { printf("Unknown devno (max is %d)\n", userconf_maxdev); } } static void -userconf_enable(int devno) +userconf_enable(char *dev, int devno) { int done = 0; @@ -494,17 +528,21 @@ break; } - printf("[%3d] ", devno); - userconf_pdevnam(devno); + if (!userconf_autoconfig) { + printf("[%3d] ", devno); + userconf_pdevnam(devno); + } if (done) { - printf(" already"); + if (!userconf_autoconfig) printf(" already"); } else { /* XXX add cmd 'e' eoc */ userconf_hist_cmd('d'); userconf_hist_int(devno); userconf_hist_eoc(); + + userconf_bootprops_enable(dev); } - printf(" enabled\n"); + if (!userconf_autoconfig) printf(" enabled\n"); } else { printf("Unknown devno (max is %d)\n", userconf_maxdev); } @@ -615,10 +653,10 @@ userconf_change(i); break; case UC_ENABLE: - userconf_enable(i); + userconf_enable(dev, i); break; case UC_DISABLE: - userconf_disable(i); + userconf_disable(dev, i); break; case UC_FIND: userconf_pdev(i); @@ -755,7 +793,7 @@ if (*c == '\0') printf("Attr, DevNo or Dev expected\n"); else if (userconf_number(c, &a) == 0) - userconf_disable(a); + userconf_disable(NULL, a); else if (userconf_device(c, &a, &unit, &state) == 0) userconf_common_dev(c, a, unit, state, UC_DISABLE); else @@ -765,7 +803,7 @@ if (*c == '\0') printf("Attr, DevNo or Dev expected\n"); else if (userconf_number(c, &a) == 0) - userconf_enable(a); + userconf_enable(NULL, a); else if (userconf_device(c, &a, &unit, &state) == 0) userconf_common_dev(c, a, unit, state, UC_ENABLE); else @@ -805,6 +843,7 @@ } extern void user_config(void); +extern void user_autoconfig(void); void user_config(void) @@ -823,6 +862,82 @@ printf("Continuing...\n"); } +void +user_autoconfig(void) +{ + prop_dictionary_t uc; + prop_dictionary_keysym_t key; + prop_string_t str; + prop_object_iterator_t it; + + userconf_init(); + + uc = bootprops_get_dictionary("userconf"); + if (uc == NULL) + return; + + printf("userconf: loading settings from boot plist\n"); + + it = prop_dictionary_iterator(uc); + if (it == NULL) + return; + + userconf_autoconfig = 1; + while ((key = prop_object_iterator_next(it)) != NULL) { + const char *k, *v; + + k = prop_dictionary_keysym_cstring_nocopy(key); + str = prop_dictionary_get_keysym(uc, key); + if (k == NULL || str == NULL) + continue; + v = prop_string_cstring_nocopy(str); + + if (strcmp(v, "disabled") == 0) + userconf_parse(userconf_create_cmd("disable", k)); + else if (strcmp(v, "enabled") == 0) + userconf_parse(userconf_create_cmd("enable", k)); + } + prop_object_iterator_release(it); + userconf_autoconfig = 0; + + return; +} + +static void +userconf_bootprops_disable(const char *dev) +{ + userconf_bootprops_set(dev, "disabled"); +} + +static void +userconf_bootprops_enable(const char *dev) +{ + userconf_bootprops_set(dev, "enabled"); +} + +static void +userconf_bootprops_set(const char *dev, const char *state) +{ + prop_dictionary_t bootprops, uc; + + if (userconf_autoconfig || dev == NULL || dev[0] == '\0') + return; + + bootprops = bootprops_get_dictionary(BOOTPROPS_DEFAULT_DICTIONARY); + if (bootprops == NULL) + return; + + uc = bootprops_get_dictionary("userconf"); + if (uc == NULL) { + uc = prop_dictionary_create(); + if (uc == NULL) + return; + prop_dictionary_set(bootprops, "userconf", uc); + } + + prop_dictionary_set(uc, dev, prop_string_create_cstring(state)); +} + /* * XXX shouldn't this be a common function? */ Index: sys/bootprops.h =================================================================== RCS file: sys/bootprops.h diff -N sys/bootprops.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sys/bootprops.h 21 Jun 2007 10:53:12 -0000 @@ -0,0 +1,68 @@ +/* $NetBSD$ */ + +/*- + * Copyright (c) 2007 Jared D. McNeill + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Jared D. McNeill. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 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 _SYS_BOOTPROPS_H +#define _SYS_BOOTPROPS_H + +#include + +#define BOOTPROPS_DEFAULT_DICTIONARY NULL + +/* basic bootprops functions */ +boolean_t bootprops_init(const char *); +prop_dictionary_t bootprops_get_dictionary(const char *); +prop_string_t bootprops_get_string(prop_dictionary_t, const char *); +prop_number_t bootprops_get_number(prop_dictionary_t, const char *); +prop_array_t bootprops_get_array(prop_dictionary_t, const char *); +prop_bool_t bootprops_get_bool(prop_dictionary_t, const char *); + +/* kernel option helpers */ +boolean_t bootprops_kopt_true(const char *); + +#define KOPT_DEFAULT_BOOL(k, v) \ + do { \ + prop_dictionary_t _kopt; \ + _kopt = bootprops_get_dictionary("kernel-options"); \ + if (_kopt) { \ + prop_object_t obj; \ + obj = prop_dictionary_get(_kopt, (k)); \ + if (obj == NULL) { \ + prop_dictionary_set(_kopt, (k), \ + prop_bool_create((v))); \ + } \ + } \ + } while (0) +#define KOPT_TRUE(k) bootprops_kopt_true((k)) + +#endif /* !_SYS_BOOTPROPS_H */ Index: sys/userconf.h =================================================================== RCS file: /cvsroot/src/sys/sys/userconf.h,v retrieving revision 1.4 diff -u -r1.4 userconf.h --- sys/userconf.h 11 Dec 2005 12:25:21 -0000 1.4 +++ sys/userconf.h 21 Jun 2007 10:53:12 -0000 @@ -37,5 +37,6 @@ #define _SYS_USERCONF_H_ void user_config(void); +void user_autoconfig(void); #endif /* !_SYS_USERCONF_H_ */ Index: arch/i386/i386/kopt_machdep.c =================================================================== RCS file: arch/i386/i386/kopt_machdep.c diff -N arch/i386/i386/kopt_machdep.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ arch/i386/i386/kopt_machdep.c 21 Jun 2007 10:53:12 -0000 @@ -0,0 +1,36 @@ +/* $NetBSD$ */ + +#include +#include +#include +#include + +#include "opt_pcifixup.h" + +/* XXX should this be auto-generated by config? */ +void kopt_machdep_init(void); + +void +kopt_machdep_init(void) +{ +#ifdef PCI_BUS_FIXUP + KOPT_DEFAULT_BOOL("PCI_BUS_FIXUP", true); +#else + KOPT_DEFAULT_BOOL("PCI_BUS_FIXUP", false); +#endif +#ifdef PCI_INTR_FIXUP + KOPT_DEFAULT_BOOL("PCI_INTR_FIXUP", true); +#else + KOPT_DEFAULT_BOOL("PCI_INTR_FIXUP", false); +#endif +#ifdef PCI_ADDR_FIXUP + KOPT_DEFAULT_BOOL("PCI_ADDR_FIXUP", true); +#else + KOPT_DEFAULT_BOOL("PCI_ADDR_FIXUP", false); +#endif +#ifdef PCI_INTR_FIXUP_FORCE + KOPT_DEFAULT_BOOL("PCI_INTR_FIXUP_FORCE", true); +#else + KOPT_DEFAULT_BOOL("PCI_INTR_FIXUP_FORCE", false); +#endif +} Index: arch/i386/i386/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v retrieving revision 1.603 diff -u -r1.603 machdep.c --- arch/i386/i386/machdep.c 17 May 2007 14:51:21 -0000 1.603 +++ arch/i386/i386/machdep.c 21 Jun 2007 10:53:13 -0000 @@ -206,6 +206,9 @@ #include /* XXX */ #endif /* XXX */ +#include +extern void kopt_machdep_init(void); + /* the following is used externally (sysctl_hw) */ char machine[] = "i386"; /* CPU "architecture" */ char machine_arch[] = "i386"; /* machine == machine_arch */ @@ -409,6 +412,7 @@ vaddr_t minaddr, maxaddr; psize_t sz; char pbuf[9]; + struct btinfo_bootprops *bp; /* * For console drivers that require uvm and pmap to be initialized, @@ -493,6 +497,12 @@ i386_proc0_tss_ldt_init(); x86_init(); + + bp = lookup_bootinfo(BTINFO_BOOTPROPS); + if (bp != NULL) { + bootprops_init(bp->xml); + kopt_machdep_init(); + } } /* Index: arch/i386/i386/mainbus.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/mainbus.c,v retrieving revision 1.71 diff -u -r1.71 mainbus.c --- arch/i386/i386/mainbus.c 5 Mar 2007 16:51:02 -0000 1.71 +++ arch/i386/i386/mainbus.c 21 Jun 2007 10:53:13 -0000 @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -91,13 +92,9 @@ #endif #if NPCI > 0 -#if defined(PCI_BUS_FIXUP) #include -#if defined(PCI_ADDR_FIXUP) #include #endif -#endif -#endif int mainbus_match(struct device *, struct cfdata *, void *); void mainbus_attach(struct device *, struct device *, void *); @@ -191,9 +188,7 @@ #if NACPI > 0 || defined(MPBIOS) int numioapics = 0; #endif -#if defined(PCI_BUS_FIXUP) int pci_maxbus = 0; -#endif int mpacpi_active = 0; int numcpus = 0; @@ -209,18 +204,16 @@ * ACPI needs to be able to access PCI configuration space. */ pci_mode = pci_mode_detect(); -#if defined(PCI_BUS_FIXUP) - if (pci_mode != 0) { + if (KOPT_TRUE("PCI_BUS_FIXUP") && pci_mode != 0) { pci_maxbus = pci_bus_fixup(NULL, 0); aprint_debug("PCI bus max, after pci_bus_fixup: %i\n", pci_maxbus); -#if defined(PCI_ADDR_FIXUP) - pciaddr.extent_port = NULL; - pciaddr.extent_mem = NULL; - pci_addr_fixup(NULL, pci_maxbus); -#endif + if (KOPT_TRUE("PCI_ADDR_FIXUP")) { + pciaddr.extent_port = NULL; + pciaddr.extent_mem = NULL; + pci_addr_fixup(NULL, pci_maxbus); + } } #endif -#endif #if NACPI > 0 if (acpi_check(self, "acpibus")) Index: arch/i386/i386/rbus_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/rbus_machdep.c,v retrieving revision 1.21 diff -u -r1.21 rbus_machdep.c --- arch/i386/i386/rbus_machdep.c 20 Jan 2007 14:46:21 -0000 1.21 +++ arch/i386/i386/rbus_machdep.c 21 Jun 2007 10:53:13 -0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include @@ -52,9 +53,7 @@ #include #include -#if defined(PCI_ADDR_FIXUP) #include -#endif #ifndef RBUS_IO_BASE #define RBUS_IO_BASE 0x4000 @@ -137,10 +136,8 @@ extern struct extent *iomem_ex; struct extent *ex = iomem_ex; -#if defined(PCI_ADDR_FIXUP) - if (pciaddr.extent_mem != NULL) + if (KOPT_TRUE("PCI_ADDR_FIXUP") && pciaddr.extent_mem != NULL) ex = pciaddr.extent_mem; -#endif start = ex->ex_start; @@ -176,10 +173,8 @@ extern struct extent *ioport_ex; struct extent *ex = ioport_ex; -#if defined(PCI_ADDR_FIXUP) - if (pciaddr.extent_port != NULL) + if (KOPT_TRUE("PCI_ADDR_FIXUP") && pciaddr.extent_port != NULL) ex = pciaddr.extent_port; -#endif start = RBUS_IO_BASE; size = RBUS_IO_SIZE; Index: arch/x86/include/bootinfo.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/bootinfo.h,v retrieving revision 1.11 diff -u -r1.11 bootinfo.h --- arch/x86/include/bootinfo.h 3 Feb 2006 11:08:24 -0000 1.11 +++ arch/x86/include/bootinfo.h 21 Jun 2007 10:53:13 -0000 @@ -42,6 +42,7 @@ #define BTINFO_SYMTAB 8 #define BTINFO_MEMMAP 9 #define BTINFO_BOOTWEDGE 10 +#define BTINFO_BOOTPROPS 11 struct btinfo_bootpath { struct btinfo_common common; @@ -74,6 +75,12 @@ uint8_t matchhash[16]; /* MD5 hash */ } __attribute__((packed)); +struct btinfo_bootprops { + struct btinfo_common common; + uint8_t len; + char xml[1]; +}; + struct btinfo_netif { struct btinfo_common common; char ifname[16];