tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

modules item #14 revisited



Hi,

This is a quick and dirty implementation of:

http://mail-index.NetBSD.org/current-users/2009/05/10/msg009372.html

to use:
$ echo KERNEL_DIR=yes >> /etc/mk.conf
# apply the enclosed patch
$ mv /netbsd{,.old}
$ mkdir -p /netbsd/modules
# build a new kernel and put it in /netbsd/kernel
$ make && make install in src/sys/modules
$ make && make install sys/arch/i386/stand/boot
$ cp /usr/mdec/boot /

There are quite a few open issues:
- All ports need to provide get_booted_kernel()
  Are there ports where we can't get the booted kernel name? What do we do
  there?
- Make install in modules always overwrites the modules in /netbsd/
- Does each kernel.tgz need to pack all the modules in the sets or
  do we keep the modules.tgz that unpacks in /netbsd/modules?
- How about the other kernels? do they unpack in /KERNEL-NAME/kernel?
- Right now there is fallback code in the boot blocks for just the
  kernel but not the old module path (this is intentional to keep things
  simple). You can always boot a kernel by name from a file.

christos

Index: share/mk/bsd.kmodule.mk
===================================================================
RCS file: /cvsroot/src/share/mk/bsd.kmodule.mk,v
retrieving revision 1.63
diff -u -p -u -r1.63 bsd.kmodule.mk
--- share/mk/bsd.kmodule.mk	1 Dec 2019 20:24:47 -0000	1.63
+++ share/mk/bsd.kmodule.mk	7 Dec 2019 02:26:01 -0000
@@ -172,7 +172,13 @@ ${PROG}: ${OBJS} ${DPADD} ${KMODSCRIPT}
 ##### Install rules
 .if !target(kmodinstall)
 .if !defined(KMODULEDIR)
+.if ${KERNEL_DIR:Uno} == "yes"
+KMODULEDIR=	${DESTDIR}/netbsd/modules/${KMOD}
+_INST_DIRS=	${DESTDIR}/netbsd
+_INST_DIRS+=	${DESTDIR}/netbsd/modules
+_INST_DIRS+=	${DESTDIR}/netbsd/modules/${KMOD}
 _OSRELEASE!=	${HOST_SH} $S/conf/osrelease.sh -k
+.else
 # Ensure these are recorded properly in METALOG on unprived installes:
 KMODULEARCHDIR?= ${MACHINE}
 _INST_DIRS=	${DESTDIR}/stand/${KMODULEARCHDIR}
@@ -180,6 +186,7 @@ _INST_DIRS+=	${DESTDIR}/stand/${KMODULEA
 _INST_DIRS+=	${DESTDIR}/stand/${KMODULEARCHDIR}/${_OSRELEASE}/modules
 KMODULEDIR=	${DESTDIR}/stand/${KMODULEARCHDIR}/${_OSRELEASE}/modules/${KMOD}
 .endif
+.endif
 _PROG:=		${KMODULEDIR}/${PROG} # installed path
 
 .if ${MKUPDATE} == "no"
Index: sys/arch/i386/stand/boot/Makefile.boot
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/boot/Makefile.boot,v
retrieving revision 1.73
diff -u -p -u -r1.73 Makefile.boot
--- sys/arch/i386/stand/boot/Makefile.boot	13 Sep 2019 02:19:45 -0000	1.73
+++ sys/arch/i386/stand/boot/Makefile.boot	7 Dec 2019 02:26:01 -0000
@@ -53,6 +53,10 @@ CFLAGS+= -Wall -Wmissing-prototypes -Wst
 CPPFLAGS+= -nostdinc -D_STANDALONE
 CPPFLAGS+= -I$S
 
+.if ${KERNEL_DIR:Uno} == "yes"
+CPPFLAGS+= -DKERNEL_DIR
+.endif
+
 CPPFLAGS+= -DSUPPORT_PS2
 CPPFLAGS+= -DDIRECT_SERIAL
 CPPFLAGS+= -DSUPPORT_SERIAL=boot_params.bp_consdev
Index: sys/arch/i386/stand/boot/boot2.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/boot/boot2.c,v
retrieving revision 1.72
diff -u -p -u -r1.72 boot2.c
--- sys/arch/i386/stand/boot/boot2.c	2 Sep 2019 06:10:24 -0000	1.72
+++ sys/arch/i386/stand/boot/boot2.c	7 Dec 2019 02:26:01 -0000
@@ -279,6 +279,12 @@ bootit(const char *filename, int howto)
 	if (howto & AB_VERBOSE)
 		printf("booting %s (howto 0x%x)\n", sprint_bootsel(filename),
 		    howto);
+#ifdef KERNEL_DIR
+	char path[512];
+	strcpy(path, filename);
+	strcat(path, "/kernel");
+	(void)exec_netbsd(path, 0, howto, boot_biosdev < 0x80, clearit);
+#endif
 
 	if (exec_netbsd(filename, 0, howto, boot_biosdev < 0x80, clearit) < 0)
 		printf("boot: %s: %s\n", sprint_bootsel(filename),
Index: sys/arch/i386/stand/lib/exec.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/lib/exec.c,v
retrieving revision 1.74
diff -u -p -u -r1.74 exec.c
--- sys/arch/i386/stand/lib/exec.c	13 Sep 2019 02:19:46 -0000	1.74
+++ sys/arch/i386/stand/lib/exec.c	7 Dec 2019 02:26:01 -0000
@@ -151,7 +151,7 @@ static void	module_add_common(const char
 static void	userconf_init(void);
 
 static void	extract_device(const char *, char *, size_t);
-static void	module_base_path(char *, size_t);
+static void	module_base_path(char *, size_t, const char *);
 static int	module_open(boot_module_t *, int, const char *, const char *,
 		    bool);
 
@@ -653,8 +653,18 @@ module_open(boot_module_t *bm, int mode,
 }
 
 static void
-module_base_path(char *buf, size_t bufsize)
+module_base_path(char *buf, size_t bufsize, const char *kernel_path)
 {
+#ifdef KERNEL_DIR
+	/* we cheat here, because %.* does not work with the mini printf */
+	char *ptr = strrchr(kernel_path, '/');
+	if (*ptr)
+		*ptr = '\0';
+
+	snprintf(buf, bufsize, "%s/modules", kernel_path);
+	if (*ptr)
+		*ptr = '/';
+#else
 	const char *machine;
 
 	switch (netbsd_elf_class) {
@@ -682,6 +692,7 @@ module_base_path(char *buf, size_t bufsi
 		    netbsd_version / 100000000,
 		    netbsd_version / 1000000 % 100);
 	}
+#endif
 }
 
 static void
@@ -697,7 +708,7 @@ module_init(const char *kernel_path)
 	int err, fd, nfail = 0;
 
 	extract_device(kernel_path, kdev, sizeof(kdev));
-	module_base_path(module_base, sizeof(module_base));
+	module_base_path(module_base, sizeof(module_base), kernel_path);
 
 	/* First, see which modules are valid and calculate btinfo size */
 	len = sizeof(struct btinfo_modulelist);
Index: sys/arch/x86/x86/x86_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/x86_machdep.c,v
retrieving revision 1.133
diff -u -p -u -r1.133 x86_machdep.c
--- sys/arch/x86/x86/x86_machdep.c	3 Dec 2019 15:20:59 -0000	1.133
+++ sys/arch/x86/x86/x86_machdep.c	7 Dec 2019 02:26:01 -0000
@@ -1092,6 +1092,13 @@ x86_startup(void)
 #endif
 }
 
+const char *
+get_booted_kernel(void)
+{
+	const struct btinfo_bootpath *bibp = lookup_bootinfo(BTINFO_BOOTPATH);
+	return bibp ? bibp->bootpath : NULL;
+}
+
 /* 
  * machine dependent system variables.
  */
Index: sys/conf/Makefile.kern.inc
===================================================================
RCS file: /cvsroot/src/sys/conf/Makefile.kern.inc,v
retrieving revision 1.268
diff -u -p -u -r1.268 Makefile.kern.inc
--- sys/conf/Makefile.kern.inc	5 Feb 2019 08:33:25 -0000	1.268
+++ sys/conf/Makefile.kern.inc	7 Dec 2019 02:26:01 -0000
@@ -66,6 +66,9 @@ CPPFLAGS+=	${INCLUDES} ${IDENT} -D_KERNE
 .if !defined(COVERITY_TOP_CONFIG)
 CPPFLAGS+=	-std=gnu99
 .endif
+.if ${KERNEL_DIR:Uno} == "yes"
+CPPFLAGS+=	-DKERNEL_DIR
+.endif
 DEFCOPTS?=	-O2
 COPTS?=		${DEFCOPTS}
 DBG=		# might contain unwanted -Ofoo
@@ -413,10 +416,17 @@ install: install-kernel-${MACHINE_NAME}
 .if !target(install-kernel-${MACHINE_NAME})
 install-kernel-${MACHINE_NAME}:
 .for _K in ${KERNIMAGES}
+.if ${KERNEL_DIR:Uno} == "yes"
+	rm -fr ${DESTDIR}/o${_K}
+	mv ${DESTDIR}/${_K} ${DESTDIR}/o${_K}
+	mkdir -p ${DESTDIR}/${_K}
+	cp ${_K} ${DESTDIR}/${_K}/kernel
+.else
 	rm -f ${DESTDIR}/o${_K}
 	ln ${DESTDIR}/${_K} ${DESTDIR}/o${_K}
 	cp ${_K} ${DESTDIR}/n${_K}
 	mv ${DESTDIR}/n${_K} ${DESTDIR}/${_K}
+.endif
 .endfor
 .endif
 .endif
Index: sys/kern/kern_module.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_module.c,v
retrieving revision 1.138
diff -u -p -u -r1.138 kern_module.c
--- sys/kern/kern_module.c	8 Aug 2019 18:08:41 -0000	1.138
+++ sys/kern/kern_module.c	7 Dec 2019 02:31:15 -0000
@@ -418,6 +418,12 @@ module_init(void)
 	module_init_md();
 #endif
 
+#ifdef KERNEL_DIR
+	const char *booted_kernel = get_booted_kernel();
+	char *ptr = strrchr(booted_kernel, '/');
+	snprintf(module_base, sizeof(module_base), "/%.*s/modules",
+	    (int)(ptr - booted_kernel), booted_kernel);
+#else
 	if (!module_machine)
 		module_machine = machine;
 #if __NetBSD_Version__ / 1000000 % 100 == 99	/* -current */
@@ -428,6 +434,7 @@ module_init(void)
 	    module_machine, __NetBSD_Version__ / 100000000,
 	    __NetBSD_Version__ / 1000000 % 100);
 #endif
+#endif
 
 	module_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
 	    module_listener_cb, NULL);
Index: sys/sys/systm.h
===================================================================
RCS file: /cvsroot/src/sys/sys/systm.h,v
retrieving revision 1.291
diff -u -p -u -r1.291 systm.h
--- sys/sys/systm.h	15 Nov 2019 12:18:46 -0000	1.291
+++ sys/sys/systm.h	7 Dec 2019 02:26:02 -0000
@@ -167,6 +167,8 @@ extern int boothowto;		/* reboot flags, 
 #define	bootverbose	(boothowto & AB_VERBOSE)
 #define	bootquiet	(boothowto & AB_QUIET)
 
+extern const char *get_booted_kernel(void);
+
 extern void (*v_putc)(int); /* Virtual console putc routine */
 
 /*


Home | Main Index | Thread Index | Old Index