The x86 bootloader, and the MI efiboot, are unable to find modules
when the kernel version is 9.99.100 -- they try
/stand/$ARCH/9.99.0/modules instead, because of this logic:

/* sys/arch/i386/stand/lib/exec.c */
                snprintf(buf, bufsize,
                    "/stand/%s/%d.%d.%d/modules", machine,
                    netbsd_version / 100000000,
                    netbsd_version / 1000000 % 100,
                    netbsd_version / 100 % 100);                /* XXX */

/* sys/stand/efiboot/module.c */
        const u_int vmajor = netbsd_version / 100000000;
        const u_int vminor = netbsd_version / 1000000 % 100;
        const u_int vpatch = netbsd_version / 100 % 100;        /* XXX */

I will try the attached patch to do `% 10000' instead of `% 100' on
the lines marked XXX.  Likely other bootloaders will need to be
adjusted to handle this.  Loading modules from the bootloader in a
>=9.99.100 kernel will require updating the bootloader.

(After boot, module loading works fine because the kernel's module
loader uses the `osrelease' string instead of doing arithmetic on
__NetBSD_Version__.)
>From 40c19f9c5a6dc16cbc869f88bfaca70b064d314c Mon Sep 17 00:00:00 2001
From: Taylor R Campbell <riastr...@netbsd.org>
Date: Wed, 21 Sep 2022 11:42:25 +0000
Subject: [PATCH 1/2] i386/stand: Handle 9.99.100 by taking four, not two,
 digits.

We haven't used the revision part of __NetBSD_Version__ = MMmmrrpp00
in almos two decades so we're apparently reclaiming it as MMmmpppp00.
---
 sys/arch/i386/stand/lib/exec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sys/arch/i386/stand/lib/exec.c b/sys/arch/i386/stand/lib/exec.c
index 89acb0536fea..6a7ee70cf179 100644
--- a/sys/arch/i386/stand/lib/exec.c
+++ b/sys/arch/i386/stand/lib/exec.c
@@ -684,7 +684,7 @@ module_base_path(char *buf, size_t bufsize, const char 
*kernel_path)
                    "/stand/%s/%d.%d.%d/modules", machine,
                    netbsd_version / 100000000,
                    netbsd_version / 1000000 % 100,
-                   netbsd_version / 100 % 100);
+                   netbsd_version / 100 % 10000);
        } else if (netbsd_version != 0) {
                /* release */
                snprintf(buf, bufsize,

>From 4de556562376b9a50f9f70984a937451f46c5773 Mon Sep 17 00:00:00 2001
From: Taylor R Campbell <riastr...@netbsd.org>
Date: Wed, 21 Sep 2022 11:45:04 +0000
Subject: [PATCH 2/2] efiboot: Handle 9.99.100 by taking four, not two, digits.

We haven't used the revision part of __NetBSD_Version__ = MMmmrrpp00
in almos two decades so we're apparently reclaiming it as MMmmpppp00.
---
 sys/stand/efiboot/module.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sys/stand/efiboot/module.c b/sys/stand/efiboot/module.c
index 48023ccb0ca2..918f5345ce54 100644
--- a/sys/stand/efiboot/module.c
+++ b/sys/stand/efiboot/module.c
@@ -62,7 +62,7 @@ module_set_prefix(const char *kernel_path)
 #else
        const u_int vmajor = netbsd_version / 100000000;
        const u_int vminor = netbsd_version / 1000000 % 100;
-       const u_int vpatch = netbsd_version / 100 % 100;
+       const u_int vpatch = netbsd_version / 100 % 10000;
 
        if (vminor == 99) {
                snprintf(module_prefix, sizeof(module_prefix),

Reply via email to