Do not try to create /dev/efi device node before devfs is initialized.

Split efirt.ko initialization into early stage where runtime services
KPI environment is created, to be used e.g. for RTC, and the later
devfs node creation stage, per module.

Switch the efi device to use make_dev_s(9) instead of make_dev(9).  At
least, this gracefully handles the duplicated device name issue.

Remove ARGSUSED comment from efidev_ioctl(), all unused arguments are
annotated with __unused attribute.

Reported by:	ambrisko, O. Hartmann <ohartman@zedat.fu-berlin.de>
Reviewed by:	imp
Sponsored by:	The FreeBSD Foundation
MFC after:	2 weeks
This commit is contained in:
kib 2016-10-16 06:07:43 +00:00
parent d1c11d5c41
commit eb0078e23d
3 changed files with 39 additions and 23 deletions

View File

@ -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();

View File

@ -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)
{
*cdev = make_dev(&efi_cdevsw, 0, UID_ROOT, GID_WHEEL, 0700,
"efi");
static struct cdev *efidev;
return (0);
static int
efidev_modevents(module_t m, int event, void *arg __unused)
{
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);
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);

View File

@ -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_ */