tech-kern archive

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

Re: modules item #14 revisited



In article <20191207024224.1B0D417FDB2%rebar.astron.com@localhost>,
Christos Zoulas <christos%zoulas.com@localhost> wrote:
>
>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

$ make && make install in src/share/mk

># build a new kernel and put it in /netbsd/kernel
>$ make && make install in src/sys/modules
>$ make && make install in 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