diff options
Diffstat (limited to 'sys/dev/efidev')
-rw-r--r-- | sys/dev/efidev/efidev.c | 19 | ||||
-rw-r--r-- | sys/dev/efidev/efirt.c | 80 | ||||
-rw-r--r-- | sys/dev/efidev/efirtc.c | 4 |
3 files changed, 58 insertions, 45 deletions
diff --git a/sys/dev/efidev/efidev.c b/sys/dev/efidev/efidev.c index 14712cf3c7bf..18bdaaa234f4 100644 --- a/sys/dev/efidev/efidev.c +++ b/sys/dev/efidev/efidev.c @@ -52,12 +52,13 @@ efidev_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t addr, 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(&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 @@ efidev_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t addr, } 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 @@ efidev_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t addr, } 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 @@ vg_out: } 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 @@ vg_out: } 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 index 2d45b4d6ac66..b0fa33daeca7 100644 --- a/sys/dev/efidev/efirt.c +++ b/sys/dev/efidev/efirt.c @@ -123,11 +123,20 @@ efi_status_to_errno(efi_status status) } static struct mtx efi_lock; -static SYSCTL_NODE(_hw, OID_AUTO, efi, CTLFLAG_RWTUN | CTLFLAG_MPSAFE, NULL, +SYSCTL_NODE(_hw, OID_AUTO, efi, CTLFLAG_RWTUN | CTLFLAG_MPSAFE, NULL, "EFI"); static bool efi_poweroff = true; SYSCTL_BOOL(_hw_efi, OID_AUTO, poweroff, CTLFLAG_RWTUN, &efi_poweroff, 0, "If true, use EFI runtime services to power off in preference to ACPI"); +extern int print_efirt_faults; +SYSCTL_INT(_hw_efi, OID_AUTO, print_faults, CTLFLAG_RWTUN, + &print_efirt_faults, 0, + "Print fault information upon trap from EFIRT calls: " + "0 - never, 1 - once, 2 - always"); +extern u_long cnt_efirt_faults; +SYSCTL_ULONG(_hw_efi, OID_AUTO, total_faults, CTLFLAG_RD, + &cnt_efirt_faults, 0, + "Total number of faults that occurred during EFIRT calls"); static bool efi_is_in_map(struct efi_md *map, int ndesc, int descsz, vm_offset_t addr) @@ -167,7 +176,6 @@ efi_init(void) struct efi_map_header *efihdr; struct efi_md *map; struct efi_rt *rtdm; - caddr_t kmdp; size_t efisz; int ndesc, rt_disabled; @@ -197,10 +205,7 @@ efi_init(void) printf("EFI config table is not present\n"); } - kmdp = preload_search_by_type("elf kernel"); - if (kmdp == NULL) - kmdp = preload_search_by_type("elf64 kernel"); - efihdr = (struct efi_map_header *)preload_search_info(kmdp, + efihdr = (struct efi_map_header *)preload_search_info(preload_kmdp, MODINFO_METADATA | MODINFOMD_EFI_MAP); if (efihdr == NULL) { if (bootverbose) @@ -309,6 +314,9 @@ efi_enter(void) fpu_kern_leave(td, NULL); mtx_unlock(&efi_lock); PMAP_UNLOCK(curpmap); + } else { + MPASS((td->td_pflags & TDP_EFIRT) == 0); + td->td_pflags |= TDP_EFIRT; } return (error); } @@ -319,17 +327,20 @@ efi_leave(void) struct thread *td; pmap_t curpmap; + td = curthread; + MPASS((td->td_pflags & TDP_EFIRT) != 0); + td->td_pflags &= ~TDP_EFIRT; + efi_arch_leave(); curpmap = &curproc->p_vmspace->vm_pmap; - td = curthread; fpu_kern_leave(td, NULL); mtx_unlock(&efi_lock); PMAP_UNLOCK(curpmap); } static int -get_table(struct uuid *uuid, void **ptr) +get_table(efi_guid_t *guid, void **ptr) { struct efi_cfgtbl *ct; u_long count; @@ -343,7 +354,7 @@ get_table(struct uuid *uuid, void **ptr) count = efi_systbl->st_entries; ct = efi_cfgtbl; while (count--) { - if (!bcmp(&ct->ct_uuid, uuid, sizeof(*uuid))) { + if (!bcmp(&ct->ct_guid, guid, sizeof(*guid))) { *ptr = ct->ct_data; efi_leave(); return (0); @@ -362,13 +373,13 @@ get_table_length(enum efi_table_type type, size_t *table_len, void **taddr) case TYPE_ESRT: { struct efi_esrt_table *esrt = NULL; - struct uuid uuid = EFI_TABLE_ESRT; + efi_guid_t guid = EFI_TABLE_ESRT; uint32_t fw_resource_count = 0; size_t len = sizeof(*esrt); int error; void *buf; - error = efi_get_table(&uuid, (void **)&esrt); + error = efi_get_table(&guid, (void **)&esrt); if (error != 0) return (error); @@ -404,14 +415,14 @@ get_table_length(enum efi_table_type type, size_t *table_len, void **taddr) } case TYPE_PROP: { - struct uuid uuid = EFI_PROPERTIES_TABLE; + efi_guid_t guid = EFI_PROPERTIES_TABLE; struct efi_prop_table *prop; size_t len = sizeof(*prop); uint32_t prop_len; int error; void *buf; - error = efi_get_table(&uuid, (void **)&prop); + error = efi_get_table(&guid, (void **)&prop); if (error != 0) return (error); @@ -439,10 +450,10 @@ get_table_length(enum efi_table_type type, size_t *table_len, void **taddr) } static int -copy_table(struct uuid *uuid, void **buf, size_t buf_len, size_t *table_len) +copy_table(efi_guid_t *guid, void **buf, size_t buf_len, size_t *table_len) { static const struct known_table { - struct uuid uuid; + efi_guid_t guid; enum efi_table_type type; } tables[] = { { EFI_TABLE_ESRT, TYPE_ESRT }, @@ -453,7 +464,7 @@ copy_table(struct uuid *uuid, void **buf, size_t buf_len, size_t *table_len) int rc; for (table_idx = 0; table_idx < nitems(tables); table_idx++) { - if (!bcmp(&tables[table_idx].uuid, uuid, sizeof(*uuid))) + if (!bcmp(&tables[table_idx].guid, guid, sizeof(*guid))) break; } @@ -484,31 +495,32 @@ efi_rt_arch_call_nofault(struct efirt_callinfo *ec) switch (ec->ec_argcnt) { case 0: - ec->ec_efi_status = ((register_t (*)(void))ec->ec_fptr)(); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(void)) + ec->ec_fptr)(); break; case 1: - ec->ec_efi_status = ((register_t (*)(register_t))ec->ec_fptr) - (ec->ec_arg1); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(register_t)) + ec->ec_fptr)(ec->ec_arg1); break; case 2: - ec->ec_efi_status = ((register_t (*)(register_t, register_t)) - ec->ec_fptr)(ec->ec_arg1, ec->ec_arg2); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(register_t, + register_t))ec->ec_fptr)(ec->ec_arg1, ec->ec_arg2); break; case 3: - ec->ec_efi_status = ((register_t (*)(register_t, register_t, - register_t))ec->ec_fptr)(ec->ec_arg1, ec->ec_arg2, - ec->ec_arg3); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(register_t, + register_t, register_t))ec->ec_fptr)(ec->ec_arg1, + ec->ec_arg2, ec->ec_arg3); break; case 4: - ec->ec_efi_status = ((register_t (*)(register_t, register_t, - register_t, register_t))ec->ec_fptr)(ec->ec_arg1, - ec->ec_arg2, ec->ec_arg3, ec->ec_arg4); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(register_t, + register_t, register_t, register_t))ec->ec_fptr)( + ec->ec_arg1, ec->ec_arg2, ec->ec_arg3, ec->ec_arg4); break; case 5: - ec->ec_efi_status = ((register_t (*)(register_t, register_t, - register_t, register_t, register_t))ec->ec_fptr)( - ec->ec_arg1, ec->ec_arg2, ec->ec_arg3, ec->ec_arg4, - ec->ec_arg5); + ec->ec_efi_status = ((register_t EFIABI_ATTR (*)(register_t, + register_t, register_t, register_t, register_t)) + ec->ec_fptr)(ec->ec_arg1, ec->ec_arg2, ec->ec_arg3, + ec->ec_arg4, ec->ec_arg5); break; default: panic("efi_rt_arch_call: %d args", (int)ec->ec_argcnt); @@ -718,7 +730,7 @@ set_time(struct efi_tm *tm) } 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; @@ -742,7 +754,7 @@ var_get(efi_char *name, struct uuid *vendor, uint32_t *attrib, } 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; @@ -763,7 +775,7 @@ var_nextname(size_t *namesize, efi_char *name, struct uuid *vendor) } 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/efidev/efirtc.c b/sys/dev/efidev/efirtc.c index a7baff673c1c..69d2c0b1af9f 100644 --- a/sys/dev/efidev/efirtc.c +++ b/sys/dev/efidev/efirtc.c @@ -52,9 +52,9 @@ efirtc_identify(driver_t *driver, device_t parent) /* Don't add the driver unless we have working runtime services. */ if (efi_rt_ok() != 0) return; - if (device_find_child(parent, "efirtc", -1) != NULL) + if (device_find_child(parent, "efirtc", DEVICE_UNIT_ANY) != NULL) return; - if (BUS_ADD_CHILD(parent, 0, "efirtc", -1) == NULL) + if (BUS_ADD_CHILD(parent, 0, "efirtc", DEVICE_UNIT_ANY) == NULL) device_printf(parent, "add child failed\n"); } |