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