Example /etc/userconf file:
disable usb
Example boot.cfg entry:
menu=Disable usb and boot:userconf /etc/userconf;boot
Index: sys/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
--- sys/kern/subr_userconf.c 11 Dec 2005 12:24:30 -0000 1.18
+++ sys/kern/subr_userconf.c 23 Oct 2008 20:15:49 -0000
@@ -45,6 +45,8 @@
#include <sys/malloc.h>
#include <sys/time.h>
+#include <machine/bootinfo.h>
+
#include <dev/cons.h>
extern struct cfdata cfdata[];
@@ -810,16 +812,47 @@
user_config(void)
{
char prompt[] = "uc> ";
-
+#ifdef BI_MODULE_USERCONF
+ int num;
+ struct btinfo_modulelist *bim;
+ struct bi_modulelist_entry *bme;
+ char *com, *buf, *end;
+#endif
+
userconf_init();
printf("userconf: configure system autoconfiguration:\n");
-
- while (1) {
- printf(prompt);
- if (getsn(userconf_cmdbuf, sizeof(userconf_cmdbuf)) > 0 &&
- userconf_parse(userconf_cmdbuf))
- break;
+#ifdef BI_MODULE_USERCONF
+ if ((bim = lookup_bootinfo(BTINFO_MODULELIST)) != NULL) {
+ num = 0;
+ bme = (struct bi_modulelist_entry *)((uint8_t *)bim +
+ sizeof(struct btinfo_modulelist));
+ for (; num < bim->num; num++, bme++) {
+ if (bme->type != BI_MODULE_USERCONF)
+ continue;
+ buf = (char *)(bme->base + KERNBASE);
+ end = buf + bme->len;
+ for (; buf < end; ) {
+ com = buf;
+ for (; buf < end && *buf != '\n'; buf++)
+ ;
+ if (*buf == '\n') {
+ *buf++ = '\0';
+ printf("%s%s\n", prompt, com);
+ userconf_parse(com);
+ }
+ }
+ }
+ } else {
+#endif /* BI_MODULE_USERCONF */
+ while (1) {
+ printf(prompt);
+ if (getsn(userconf_cmdbuf, sizeof(userconf_cmdbuf)) > 0 &&
+ userconf_parse(userconf_cmdbuf))
+ break;
+ }
+#ifdef BI_MODULE_USERCONF
}
+#endif /* BI_MODULE_USERCONF */
printf("Continuing...\n");
}
Index: sys/arch/x86/include/bootinfo.h
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/include/bootinfo.h,v
retrieving revision 1.14
diff -u -r1.14 bootinfo.h
--- sys/arch/x86/include/bootinfo.h 9 Sep 2008 12:09:31 -0000 1.14
+++ sys/arch/x86/include/bootinfo.h 23 Oct 2008 20:15:49 -0000
@@ -172,6 +172,7 @@
};
#define BI_MODULE_NONE 0x00
#define BI_MODULE_ELF 0x01
+#define BI_MODULE_USERCONF 0x02
struct btinfo_modulelist {
struct btinfo_common common;
Index: sys/arch/i386/stand/boot/boot2.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/boot/boot2.c,v
retrieving revision 1.38
diff -u -r1.38 boot2.c
--- sys/arch/i386/stand/boot/boot2.c 11 Oct 2008 11:06:19 -0000 1.38
+++ sys/arch/i386/stand/boot/boot2.c 23 Oct 2008 20:15:50 -0000
@@ -78,6 +78,7 @@
#include <libi386.h>
#include "devopen.h"
#include "bootmod.h"
+#include "bootinfo.h"
#ifdef SUPPORT_PS2
#include <biosmca.h>
@@ -118,7 +119,7 @@
void bootit(const char *, int, int);
void print_banner(void);
void boot2(int, u_int);
-
+void blob_load(char *, int);
#ifndef SMALL
void parsebootconf(const char *);
void doboottypemenu(void);
@@ -134,6 +135,7 @@
void command_modules(char *);
void command_load(char *);
void command_multiboot(char *);
+void command_userconf(char *);
const struct bootblk_command commands[] = {
{ "help", command_help },
@@ -146,6 +148,7 @@
{ "modules", command_modules },
{ "load", command_load },
{ "multiboot", command_multiboot },
+ { "userconf", command_userconf },
{ NULL, NULL },
};
@@ -688,6 +691,7 @@
"modules {enabled|disabled}\n"
"load {path_to_module}\n"
"multiboot [xdNx:][filename] [<args>]\n"
+ "userconf {path_to_script}\n"
"help|?\n"
"quit\n");
}
@@ -799,6 +803,18 @@
void
command_load(char *arg)
{
+ blob_load(arg, BI_MODULE_ELF);
+}
+
+void
+command_userconf(char *arg)
+{
+ blob_load(arg, BI_MODULE_USERCONF);
+}
+
+void
+blob_load(char *arg, int type)
+{
boot_module_t *bm, *bmp;
size_t len;
char *str;
@@ -816,6 +832,7 @@
memcpy(str, arg, len);
bm->bm_path = str;
bm->bm_next = NULL;
+ bm->bm_type = type;
if (boot_modules == NULL)
boot_modules = bm;
else {
Index: sys/arch/i386/stand/lib/bootmod.h
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/lib/bootmod.h,v
retrieving revision 1.3
diff -u -r1.3 bootmod.h
--- sys/arch/i386/stand/lib/bootmod.h 5 May 2008 00:12:49 -0000 1.3
+++ sys/arch/i386/stand/lib/bootmod.h 23 Oct 2008 20:15:50 -0000
@@ -32,6 +32,7 @@
typedef struct boot_module {
char *bm_path;
ssize_t bm_len;
+ int bm_type;
struct boot_module *bm_next;
} boot_module_t;
Index: sys/arch/i386/stand/lib/exec.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/lib/exec.c,v
retrieving revision 1.33
diff -u -r1.33 exec.c
--- sys/arch/i386/stand/lib/exec.c 11 Oct 2008 11:06:20 -0000 1.33
+++ sys/arch/i386/stand/lib/exec.c 23 Oct 2008 20:15:51 -0000
@@ -133,7 +133,7 @@
static uint32_t image_end;
static char module_base[64] = "/";
-static void module_init(void);
+static void module_init(int *);
static int
common_load_kernel(const char *file, u_long *basemem, u_long *extmem,
@@ -239,7 +239,6 @@
if (common_load_kernel(file, &basemem, &extmem, loadaddr, floppy, marks))
goto out;
- boot_argv[0] = boothowto;
boot_argv[1] = 0;
boot_argv[2] = vtophys(bootinfo); /* old cyl offset */
boot_argv[3] = marks[MARK_END];
@@ -248,12 +247,13 @@
/* pull in any modules if necessary */
if (boot_modules_enabled) {
- module_init();
+ module_init(&boothowto);
if (btinfo_modulelist) {
BI_ADD(btinfo_modulelist, BTINFO_MODULELIST,
btinfo_modulelist_size);
}
}
+ boot_argv[0] = boothowto;
#ifdef DEBUG
printf("Start @ 0x%lx [%ld=0x%lx-0x%lx]...\n", marks[MARK_ENTRY],
@@ -321,7 +321,7 @@
}
static void
-module_init(void)
+module_init(int *boothowto)
{
struct bi_modulelist_entry *bi;
struct stat st;
@@ -412,7 +412,20 @@
strncpy(bi->path, bm->bm_path, sizeof(bi->path) - 1);
bi->base = image_end;
bi->len = len;
- bi->type = BI_MODULE_ELF;
+ bi->type = bm->bm_type;
+ switch(bi->type) {
+ case BI_MODULE_ELF:
+ printf(" (ELF module)");
+ break;
+ case BI_MODULE_USERCONF:
+ if (boothowto != NULL)
+ *boothowto |= RB_USERCONF;
+ printf(" (userconf script)");
+ break;
+ default:
+ printf(" (unknown type)");
+ break;
+ }
printf(" \n");
}
if (len > 0)
@@ -453,7 +466,7 @@
/* pull in any modules if necessary */
if (boot_modules_enabled) {
- module_init();
+ module_init(NULL);
if (btinfo_modulelist) {
mbm = alloc(sizeof(struct multiboot_module) *
btinfo_modulelist->num);