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