Module Name: src
Committed By: martin
Date: Mon May 28 19:24:30 UTC 2012
Modified Files:
src/sys/arch/sparc/include: bootinfo.h
src/sys/arch/sparc/sparc: autoconf.c
src/sys/arch/sparc/stand/boot: boot.c
src/sys/arch/sparc/stand/ofwboot: boot.c
src/sys/arch/sparc64/include: bootinfo.h
src/sys/arch/sparc64/sparc64: autoconf.c
Log Message:
Pass the "boothowto" from the bootloader to the kernel.
If (an old) bootloader did not pass the flags, check explicitly if we
missed RB_USERCONF and invoke userconf_prompt() in MD code, as MI code
already missed it.
This fixes PR 46466.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/sparc/include/bootinfo.h
cvs rdiff -u -r1.242 -r1.243 src/sys/arch/sparc/sparc/autoconf.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/sparc/stand/boot/boot.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/sparc/stand/ofwboot/boot.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/sparc64/include/bootinfo.h
cvs rdiff -u -r1.185 -r1.186 src/sys/arch/sparc64/sparc64/autoconf.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc/include/bootinfo.h
diff -u src/sys/arch/sparc/include/bootinfo.h:1.5 src/sys/arch/sparc/include/bootinfo.h:1.6
--- src/sys/arch/sparc/include/bootinfo.h:1.5 Sat Mar 4 03:39:02 2006
+++ src/sys/arch/sparc/include/bootinfo.h Mon May 28 19:24:29 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bootinfo.h,v 1.5 2006/03/04 03:39:02 uwe Exp $ */
+/* $NetBSD: bootinfo.h,v 1.6 2012/05/28 19:24:29 martin Exp $ */
/*
* Copyright (c) 1997
@@ -42,6 +42,7 @@ struct btinfo_common {
#define BTINFO_MAGIC 1
#define BTINFO_SYMTAB 2
#define BTINFO_KERNELFILE 3
+#define BTINFO_BOOTHOWTO 4
struct btinfo_magic {
struct btinfo_common common;
@@ -60,6 +61,11 @@ struct btinfo_kernelfile {
char name[1]; /* variable length */
};
+struct btinfo_boothowto {
+ struct btinfo_common common;
+ int boothowto;
+};
+
#ifdef _KERNEL
void *lookup_bootinfo(int);
#endif
Index: src/sys/arch/sparc/sparc/autoconf.c
diff -u src/sys/arch/sparc/sparc/autoconf.c:1.242 src/sys/arch/sparc/sparc/autoconf.c:1.243
--- src/sys/arch/sparc/sparc/autoconf.c:1.242 Sun Jul 17 23:18:23 2011
+++ src/sys/arch/sparc/sparc/autoconf.c Mon May 28 19:24:29 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.242 2011/07/17 23:18:23 mrg Exp $ */
+/* $NetBSD: autoconf.c,v 1.243 2012/05/28 19:24:29 martin Exp $ */
/*
* Copyright (c) 1996
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.242 2011/07/17 23:18:23 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.243 2012/05/28 19:24:29 martin Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -75,6 +75,7 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v
#include <sys/msgbuf.h>
#include <sys/boot_flag.h>
#include <sys/ksyms.h>
+#include <sys/userconf.h>
#include <net/if.h>
#include <net/if_ether.h>
@@ -270,6 +271,7 @@ bootstrap(void)
#else
extern int end[];
#endif
+ struct btinfo_boothowto *bi_howto;
prom_init();
@@ -352,6 +354,11 @@ bootstrap(void)
(void*)bi_sym->esym);
}
#endif
+
+ if ((bi_howto = lookup_bootinfo(BTINFO_BOOTHOWTO)) != NULL) {
+ boothowto = bi_howto->boothowto;
+printf("initialized boothowt from bootloader: %x\n", boothowto);
+ }
}
#if defined(SUN4M) && !defined(MSIIEP)
@@ -915,12 +922,21 @@ void
cpu_configure(void)
{
struct pcb *pcb0;
+ bool userconf = (boothowto & RB_USERCONF) != 0;
/* initialise the softintr system */
sparc_softintr_init();
/* build the bootpath */
bootpath_build();
+ if (((boothowto & RB_USERCONF) != 0) && !userconf)
+ /*
+ * Old bootloaders do not pass boothowto, and MI code
+ * has already handled userconfig before we get here
+ * and finally fetch the right options. So if we missed
+ * it, just do it here.
+ */
+ userconf_prompt();
#if defined(SUN4)
if (CPU_ISSUN4) {
Index: src/sys/arch/sparc/stand/boot/boot.c
diff -u src/sys/arch/sparc/stand/boot/boot.c:1.27 src/sys/arch/sparc/stand/boot/boot.c:1.28
--- src/sys/arch/sparc/stand/boot/boot.c:1.27 Sat Jan 22 19:19:23 2011
+++ src/sys/arch/sparc/stand/boot/boot.c Mon May 28 19:24:29 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.27 2011/01/22 19:19:23 joerg Exp $ */
+/* $NetBSD: boot.c,v 1.28 2012/05/28 19:24:29 martin Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993
@@ -244,6 +244,7 @@ main(void)
const char *k;
u_long marks[MARK_MAX], bootinfo;
struct btinfo_symtab bi_sym;
+ struct btinfo_boothowto bi_howto;
void *arg;
#ifdef HEAP_VARIABLE
@@ -337,6 +338,10 @@ main(void)
bi_sym.esym = marks[MARK_END] & loadaddrmask;
bi_add(&bi_sym, BTINFO_SYMTAB, sizeof(bi_sym));
+ /* Add boothowto */
+ bi_howto.boothowto = boothowto;
+ bi_add(&bi_howto, BTINFO_BOOTHOWTO, sizeof(bi_howto));
+
/* Add kernel path to bootinfo */
i = sizeof(struct btinfo_common) + strlen(kernel) + 1;
/* Impose limit (somewhat arbitrary) */
Index: src/sys/arch/sparc/stand/ofwboot/boot.c
diff -u src/sys/arch/sparc/stand/ofwboot/boot.c:1.28 src/sys/arch/sparc/stand/ofwboot/boot.c:1.29
--- src/sys/arch/sparc/stand/ofwboot/boot.c:1.28 Sat May 21 15:50:42 2011
+++ src/sys/arch/sparc/stand/ofwboot/boot.c Mon May 28 19:24:30 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.28 2011/05/21 15:50:42 tsutsui Exp $ */
+/* $NetBSD: boot.c,v 1.29 2012/05/28 19:24:30 martin Exp $ */
/*
* Copyright (c) 1997, 1999 Eduardo E. Horvath. All rights reserved.
@@ -251,7 +251,8 @@ ksyms_copyout(void **ssym, void **esym)
* Prepare boot information and jump directly to the kernel.
*/
static void
-jump_to_kernel(u_long *marks, char *kernel, char *args, void *ofw)
+jump_to_kernel(u_long *marks, char *kernel, char *args, void *ofw,
+ int boothowto)
{
int l, machine_tag;
long newargs[4];
@@ -259,6 +260,7 @@ jump_to_kernel(u_long *marks, char *kern
vaddr_t bootinfo;
struct btinfo_symtab bi_sym;
struct btinfo_kernend bi_kend;
+ struct btinfo_boothowto bi_howto;
char *cp;
char bootline[PROM_MAX_PATH * 2];
@@ -279,6 +281,8 @@ jump_to_kernel(u_long *marks, char *kern
bi_add(&bi_sym, BTINFO_SYMTAB, sizeof(bi_sym));
bi_kend.addr= bootinfo + BOOTINFO_SIZE;
bi_add(&bi_kend, BTINFO_KERNEND, sizeof(bi_kend));
+ bi_howto.boothowto = boothowto;
+ bi_add(&bi_howto, BTINFO_BOOTHOWTO, sizeof(bi_howto));
if (bootinfo_pass_bootdev) {
struct {
struct btinfo_common common;
@@ -355,7 +359,8 @@ jump_to_kernel(u_long *marks, char *kern
}
static void
-start_kernel(char *kernel, char *bootline, void *ofw, int isfloppy)
+start_kernel(char *kernel, char *bootline, void *ofw, int isfloppy,
+ int boothowto)
{
int fd;
u_long marks[MARK_MAX];
@@ -381,7 +386,7 @@ start_kernel(char *kernel, char *bootlin
if (fdloadfile(fd, marks, flags) != -1) {
close(fd);
- jump_to_kernel(marks, kernel, bootline, ofw);
+ jump_to_kernel(marks, kernel, bootline, ofw, boothowto);
}
}
(void)printf("Failed to load '%s'.\n", kernel);
@@ -496,7 +501,7 @@ check_boot_config(void)
void
main(void *ofw)
{
- int boothowto, i = 0, isfloppy;
+ int boothowto, i = 0, isfloppy, kboothowto;
char kernel[PROM_MAX_PATH];
char bootline[PROM_MAX_PATH];
@@ -509,7 +514,8 @@ main(void *ofw)
/* Figure boot arguments */
strncpy(bootdev, prom_getbootpath(), sizeof(bootdev) - 1);
- boothowto = bootoptions(prom_getbootargs(), bootdev, kernel, bootline);
+ kboothowto = boothowto =
+ bootoptions(prom_getbootargs(), bootdev, kernel, bootline);
isfloppy = bootdev_isfloppy(bootdev);
for (;; *kernel = '\0') {
@@ -549,7 +555,7 @@ main(void *ofw)
}
check_boot_config();
- start_kernel(kernel, bootline, ofw, isfloppy);
+ start_kernel(kernel, bootline, ofw, isfloppy, kboothowto);
/*
* Try next name from kernel name list if not in askname mode,
Index: src/sys/arch/sparc64/include/bootinfo.h
diff -u src/sys/arch/sparc64/include/bootinfo.h:1.5 src/sys/arch/sparc64/include/bootinfo.h:1.6
--- src/sys/arch/sparc64/include/bootinfo.h:1.5 Fri Apr 2 18:34:16 2010
+++ src/sys/arch/sparc64/include/bootinfo.h Mon May 28 19:24:30 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: bootinfo.h,v 1.5 2010/04/02 18:34:16 martin Exp $ */
+/* $NetBSD: bootinfo.h,v 1.6 2012/05/28 19:24:30 martin Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -98,6 +98,7 @@
#define BTINFO_ITLB 103
#define BTINFO_KERNEND 104
#define BTINFO_BOOTDEV 105
+#define BTINFO_BOOTHOWTO 106
#define LOOKUP_BOOTINFO(btp, info) \
do { \
@@ -131,4 +132,9 @@ struct btinfo_bootdev {
char name[1];
};
+struct btinfo_boothowto {
+ struct btinfo_common common;
+ int boothowto;
+};
+
#endif /* _BOOTINFO_H_ */
Index: src/sys/arch/sparc64/sparc64/autoconf.c
diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.185 src/sys/arch/sparc64/sparc64/autoconf.c:1.186
--- src/sys/arch/sparc64/sparc64/autoconf.c:1.185 Mon Jan 30 12:19:45 2012
+++ src/sys/arch/sparc64/sparc64/autoconf.c Mon May 28 19:24:30 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.185 2012/01/30 12:19:45 martin Exp $ */
+/* $NetBSD: autoconf.c,v 1.186 2012/05/28 19:24:30 martin Exp $ */
/*
* Copyright (c) 1996
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.185 2012/01/30 12:19:45 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.186 2012/05/28 19:24:30 martin Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -73,6 +73,7 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v
#include <sys/boot_flag.h>
#include <sys/ksyms.h>
#include <sys/kauth.h>
+#include <sys/userconf.h>
#include <prop/proplib.h>
#include <net/if.h>
@@ -273,6 +274,7 @@ bootstrap(void *o0, void *bootargs, void
struct btinfo_count *bi_count;
struct btinfo_kernend *bi_kend;
struct btinfo_tlb *bi_tlb;
+ struct btinfo_boothowto *bi_howto;
extern void *romtba;
extern void* get_romtba(void);
@@ -348,6 +350,10 @@ die_old_boot_loader:
cputyp = CPU_SUN4V;
}
+ bi_howto = lookup_bootinfo(BTINFO_BOOTHOWTO);
+ if (bi_howto)
+ boothowto = bi_howto->boothowto;
+
LOOKUP_BOOTINFO(bi_count, BTINFO_DTLB_SLOTS);
kernel_tlb_slots = bi_count->count;
LOOKUP_BOOTINFO(bi_tlb, BTINFO_DTLB);
@@ -465,9 +471,18 @@ get_bootpath_from_prom(void)
void
cpu_configure(void)
{
+ bool userconf = (boothowto & RB_USERCONF) != 0;
/* fetch boot device settings */
get_bootpath_from_prom();
+ if (((boothowto & RB_USERCONF) != 0) && !userconf)
+ /*
+ * Old bootloaders do not pass boothowto, and MI code
+ * has already handled userconfig before we get here
+ * and finally fetch the right options. So if we missed
+ * it, just do it here.
+ */
+ userconf_prompt();
/* block clock interrupts and anything below */
splclock();