diff --git a/sys/dev/efidev/efidev.c b/sys/dev/efidev/efidev.c --- a/sys/dev/efidev/efidev.c +++ b/sys/dev/efidev/efidev.c @@ -52,12 +52,13 @@ switch (cmd) { case EFIIOC_GET_TABLE: { - struct efi_get_table_ioc *egtioc = - (struct efi_get_table_ioc *)addr; + struct efi_get_table_ioctl *egtioc = + (struct efi_get_table_ioctl *)addr; void *buf = NULL; - error = efi_copy_table((efi_guid_t *)&egtioc->uuid, egtioc->buf ? &buf : NULL, - egtioc->buf_len, &egtioc->table_len); + error = efi_copy_table(&egtioc->guid, + egtioc->buf != NULL ? &buf : NULL, egtioc->buf_len, + &egtioc->table_len); if (error != 0 || egtioc->buf == NULL) break; @@ -89,7 +90,7 @@ } case EFIIOC_GET_WAKETIME: { - struct efi_waketime_ioc *wt = (struct efi_waketime_ioc *)addr; + struct efi_waketime_ioctl *wt = (struct efi_waketime_ioctl *)addr; error = efi_get_waketime(&wt->enabled, &wt->pending, &wt->waketime); @@ -97,14 +98,14 @@ } case EFIIOC_SET_WAKETIME: { - struct efi_waketime_ioc *wt = (struct efi_waketime_ioc *)addr; + struct efi_waketime_ioctl *wt = (struct efi_waketime_ioctl *)addr; error = efi_set_waketime(wt->enabled, &wt->waketime); break; } case EFIIOC_VAR_GET: { - struct efi_var_ioc *ev = (struct efi_var_ioc *)addr; + struct efi_var_ioctl *ev = (struct efi_var_ioctl *)addr; void *data; efi_char *name; @@ -140,7 +141,7 @@ } case EFIIOC_VAR_NEXT: { - struct efi_var_ioc *ev = (struct efi_var_ioc *)addr; + struct efi_var_ioctl *ev = (struct efi_var_ioctl *)addr; efi_char *name; name = malloc(ev->namesize, M_TEMP, M_WAITOK); @@ -162,7 +163,7 @@ } case EFIIOC_VAR_SET: { - struct efi_var_ioc *ev = (struct efi_var_ioc *)addr; + struct efi_var_ioctl *ev = (struct efi_var_ioctl *)addr; void *data = NULL; efi_char *name; diff --git a/sys/dev/efidev/efirt.c b/sys/dev/efidev/efirt.c --- a/sys/dev/efidev/efirt.c +++ b/sys/dev/efidev/efirt.c @@ -730,7 +730,7 @@ } static int -var_get(efi_char *name, struct uuid *vendor, uint32_t *attrib, +var_get(efi_char *name, efi_guid_t *vendor, uint32_t *attrib, size_t *datasize, void *data) { struct efirt_callinfo ec; @@ -754,7 +754,7 @@ } static int -var_nextname(size_t *namesize, efi_char *name, struct uuid *vendor) +var_nextname(size_t *namesize, efi_char *name, efi_guid_t *vendor) { struct efirt_callinfo ec; int error; @@ -775,7 +775,7 @@ } static int -var_set(efi_char *name, struct uuid *vendor, uint32_t attrib, +var_set(efi_char *name, efi_guid_t *vendor, uint32_t attrib, size_t datasize, void *data) { struct efirt_callinfo ec; diff --git a/sys/dev/xen/efi/pvefi.c b/sys/dev/xen/efi/pvefi.c --- a/sys/dev/xen/efi/pvefi.c +++ b/sys/dev/xen/efi/pvefi.c @@ -122,7 +122,7 @@ } static int -var_get(efi_char *name, struct uuid *vendor, uint32_t *attrib, +var_get(efi_char *name, efi_guid_t *vendor, uint32_t *attrib, size_t *datasize, void *data) { struct xen_platform_op op = { @@ -151,7 +151,7 @@ } static int -var_nextname(size_t *namesize, efi_char *name, struct uuid *vendor) +var_nextname(size_t *namesize, efi_char *name, efi_guid_t *vendor) { struct xen_platform_op op = { .cmd = XENPF_efi_runtime_call, @@ -177,7 +177,7 @@ } static int -var_set(efi_char *name, struct uuid *vendor, uint32_t attrib, +var_set(efi_char *name, efi_guid_t *vendor, uint32_t attrib, size_t datasize, void *data) { struct xen_platform_op op = { diff --git a/sys/sys/efi.h b/sys/sys/efi.h --- a/sys/sys/efi.h +++ b/sys/sys/efi.h @@ -151,7 +151,7 @@ }; struct efi_esrt_entry_v1 { - struct uuid fw_class; + efi_guid_t fw_class; uint32_t fw_type; uint32_t fw_version; uint32_t lowest_supported_fw_version; @@ -181,11 +181,11 @@ efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, struct efi_md *) EFIABI_ATTR; efi_status (*rt_cvtptr)(u_long, void **) EFIABI_ATTR; - efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, + efi_status (*rt_getvar)(efi_char *, efi_guid_t *, uint32_t *, u_long *, void *) EFIABI_ATTR; - efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *) + efi_status (*rt_scanvar)(u_long *, efi_char *, efi_guid_t *) EFIABI_ATTR; - efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, + efi_status (*rt_setvar)(efi_char *, efi_guid_t *, uint32_t, u_long, void *) EFIABI_ATTR; efi_status (*rt_gethicnt)(uint32_t *) EFIABI_ATTR; efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, @@ -267,10 +267,10 @@ int (*get_waketime)(uint8_t *enabled, uint8_t *pending, struct efi_tm *tm); int (*set_waketime)(uint8_t enable, struct efi_tm *tm); - int (*var_get)(uint16_t *, struct uuid *, uint32_t *, size_t *, + int (*var_get)(uint16_t *, efi_guid_t *, uint32_t *, size_t *, void *); - int (*var_nextname)(size_t *, uint16_t *, struct uuid *); - int (*var_set)(uint16_t *, struct uuid *, uint32_t, size_t, void *); + int (*var_nextname)(size_t *, uint16_t *, efi_guid_t *); + int (*var_set)(uint16_t *, efi_guid_t *, uint32_t, size_t, void *); }; extern const struct efi_ops *active_efi_ops; @@ -347,7 +347,7 @@ return (active_efi_ops->set_waketime(enable, tm)); } -static inline int efi_var_get(uint16_t *name, struct uuid *vendor, +static inline int efi_var_get(uint16_t *name, efi_guid_t *vendor, uint32_t *attrib, size_t *datasize, void *data) { @@ -357,7 +357,7 @@ } static inline int efi_var_nextname(size_t *namesize, uint16_t *name, - struct uuid *vendor) + efi_guid_t *vendor) { if (active_efi_ops->var_nextname == NULL) @@ -365,7 +365,7 @@ return (active_efi_ops->var_nextname(namesize, name, vendor)); } -static inline int efi_var_set(uint16_t *name, struct uuid *vendor, +static inline int efi_var_set(uint16_t *name, efi_guid_t *vendor, uint32_t attrib, size_t datasize, void *data) { diff --git a/sys/sys/efiio.h b/sys/sys/efiio.h --- a/sys/sys/efiio.h +++ b/sys/sys/efiio.h @@ -30,38 +30,79 @@ #include #include -struct efi_get_table_ioc +/* + * The EFI world chose not to use the typical uuid_t defines for its global + * universal identifiers. But the textual representation is the same, and we can + * use the uuid_* routines to parse and print them. However, all EFI interfaces + * for this need to be efi_guid_t so we can share code with EDK2, so the *_ioc + * structures in this file are converted to _ioctl structure to transition to + * this new requirement. This library is little used outside of FreeBSD and they + * will be dropped in 16. + */ +_Static_assert(sizeof(struct uuid) == sizeof(efi_guid_t), + "uuid_t and efi_guid_t are same bytes, but different elements"); +#if __FreeBSD_version < 1600000 && !defined(_KERNEL) +#define _WANT_EFI_IOC +#endif + +struct efi_get_table_ioctl { void *buf; /* Pointer to userspace buffer */ - struct uuid uuid; /* UUID to look up */ + efi_guid_t guid; /* GUID to look up */ size_t table_len; /* Table size */ size_t buf_len; /* Size of the buffer */ }; -struct efi_var_ioc +struct efi_var_ioctl { efi_char *name; /* User pointer to name, in wide chars */ size_t namesize; /* Number of wide characters in name */ - struct uuid vendor; /* Vendor's UUID for variable */ + efi_guid_t vendor; /* Vendor's GUID for variable */ uint32_t attrib; /* Attributes */ void *data; /* User pointer to the data */ size_t datasize; /* Number of *bytes* in the data */ }; -struct efi_waketime_ioc +struct efi_waketime_ioctl { struct efi_tm waketime; uint8_t enabled; uint8_t pending; }; -#define EFIIOC_GET_TABLE _IOWR('E', 1, struct efi_get_table_ioc) +#define EFIIOC_GET_TABLE _IOWR('E', 1, struct efi_get_table_ioctl) #define EFIIOC_GET_TIME _IOR('E', 2, struct efi_tm) #define EFIIOC_SET_TIME _IOW('E', 3, struct efi_tm) -#define EFIIOC_VAR_GET _IOWR('E', 4, struct efi_var_ioc) -#define EFIIOC_VAR_NEXT _IOWR('E', 5, struct efi_var_ioc) -#define EFIIOC_VAR_SET _IOWR('E', 6, struct efi_var_ioc) -#define EFIIOC_GET_WAKETIME _IOR('E', 7, struct efi_waketime_ioc) -#define EFIIOC_SET_WAKETIME _IOW('E', 8, struct efi_waketime_ioc) +#define EFIIOC_VAR_GET _IOWR('E', 4, struct efi_var_ioctl) +#define EFIIOC_VAR_NEXT _IOWR('E', 5, struct efi_var_ioctl) +#define EFIIOC_VAR_SET _IOWR('E', 6, struct efi_var_ioctl) +#define EFIIOC_GET_WAKETIME _IOR('E', 7, struct efi_waketime_ioctl) +#define EFIIOC_SET_WAKETIME _IOW('E', 8, struct efi_waketime_ioctl) + +#ifdef _WANT_EFI_IOC +struct efi_get_table_ioc +{ + void *buf; /* Pointer to userspace buffer */ + struct uuid uuid; /* GUID to look up */ + size_t table_len; /* Table size */ + size_t buf_len; /* Size of the buffer */ +}; + +struct efi_var_ioc +{ + efi_char *name; /* User pointer to name, in wide chars */ + size_t namesize; /* Number of wide characters in name */ + struct uuid vendor; /* Vendor's GUID for variable */ + uint32_t attrib; /* Attributes */ + void *data; /* User pointer to the data */ + size_t datasize; /* Number of *bytes* in the data */ +}; + +_Static_assert(sizeof(struct efi_get_table_ioc) == sizeof(struct efi_get_table_ioctl), + "Old and new struct table defines must be the same size"); +_Static_assert(sizeof(struct efi_var_ioc) == sizeof(struct efi_var_ioctl), + "Old and new struct var defines must be the same size"); +#define efi_waketime_ioc efi_waketime_ioctl +#endif #endif /* _SYS_EFIIO_H_ */