options EFIRT: immediate crash of CURRENT

Konstantin Belousov kostikbel at gmail.com
Sat Oct 15 13:21:43 UTC 2016


On Sat, Oct 15, 2016 at 02:00:59PM +0200, Hartmann, O. wrote:
> 
> Playing around with some EFI related options and putting 
> 
> options EFIRT
> 
> into the kernel config, results in an immediate crash after booting,
> see screenshot attached.
> 
> This happens on non-EFI booting systems as well as EFI capable systems.
> The screenshot is taken from a box with UEFI firmware, but disabled and
> used via CSM/BIOS, but with option enabled.
There is no screenshot.

Anyway, I have a guess, possibly similar issue was reported already,
you might try this patch.

diff --git a/sys/amd64/amd64/efirt.c b/sys/amd64/amd64/efirt.c
index 4c0454c..4540625 100644
--- a/sys/amd64/amd64/efirt.c
+++ b/sys/amd64/amd64/efirt.c
@@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$");
 static struct efi_systbl *efi_systbl;
 static struct efi_cfgtbl *efi_cfgtbl;
 static struct efi_rt *efi_runtime;
-static struct cdev *efi_cdev;
 
 static int efi_status2err[25] = {
 	0,		/* EFI_SUCCESS */
@@ -403,15 +402,13 @@ efi_init(void)
 		return (ENXIO);
 	}
 
-	return (efidev_init(&efi_cdev));
+	return (0);
 }
 
 static void
 efi_uninit(void)
 {
 
-	efidev_uninit(efi_cdev);
-
 	efi_destroy_1t1_map();
 
 	efi_systbl = NULL;
@@ -566,7 +563,6 @@ efirt_modevents(module_t m, int event, void *arg __unused)
 	switch (event) {
 	case MOD_LOAD:
 		return (efi_init());
-		break;
 
 	case MOD_UNLOAD:
 		efi_uninit();
diff --git a/sys/dev/efidev/efidev.c b/sys/dev/efidev/efidev.c
index abceec8..d6e0e06 100644
--- a/sys/dev/efidev/efidev.c
+++ b/sys/dev/efidev/efidev.c
@@ -47,7 +47,6 @@ static struct cdevsw efi_cdevsw = {
 	.d_ioctl = efidev_ioctl,
 };
 	
-/* ARGSUSED */
 static int
 efidev_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t addr,
     int flags __unused, struct thread *td __unused)
@@ -173,21 +172,45 @@ vs_out:
 	return (error);
 }
 
-int
-efidev_init(struct cdev **cdev)
+static struct cdev *efidev;
+
+static int
+efidev_modevents(module_t m, int event, void *arg __unused)
 {
-	
-	*cdev = make_dev(&efi_cdevsw, 0, UID_ROOT, GID_WHEEL, 0700,
-	    "efi");
+	struct make_dev_args mda;
+	int error;
+
+	switch (event) {
+	case MOD_LOAD:
+		make_dev_args_init(&mda);
+		mda.mda_flags = MAKEDEV_WAITOK | MAKEDEV_CHECKNAME;
+		mda.mda_devsw = &efi_cdevsw;
+		mda.mda_uid = UID_ROOT;
+		mda.mda_gid = GID_WHEEL;
+		mda.mda_mode = 0700;
+		error = make_dev_s(&mda, &efidev, "efi");
+		return (error);
+
+	case MOD_UNLOAD:
+		if (efidev != NULL)
+			destroy_dev(efidev);
+		efidev = NULL;
+		return (0);
+
+	case MOD_SHUTDOWN:
+		return (0);
 
-	return (0);
+	default:
+		return (EOPNOTSUPP);
+	}
 }
 
-int
-efidev_uninit(struct cdev *cdev)
-{
-	
-	destroy_dev(cdev);
+static moduledata_t efidev_moddata = {
+	.name = "efidev",
+	.evhand = efidev_modevents,
+	.priv = NULL,
+};
 
-	return (0);
-}
+DECLARE_MODULE(efidev, efidev_moddata, SI_SUB_DEVFS, SI_ORDER_ANY);
+MODULE_VERSION(efidev, 1);
+MODULE_DEPEND(efidev, efirt, 1, 1, 1);
diff --git a/sys/sys/efi.h b/sys/sys/efi.h
index 81c6fd3..68fc281 100644
--- a/sys/sys/efi.h
+++ b/sys/sys/efi.h
@@ -165,9 +165,6 @@ struct efi_systbl {
 
 #ifdef _KERNEL
 extern vm_paddr_t efi_systbl_phys;
-struct cdev;
-int efidev_init(struct cdev **);
-int efidev_uninit(struct cdev *);
 #endif	/* _KERNEL */
 
 #endif /* _SYS_EFI_H_ */


More information about the freebsd-current mailing list