diff --git a/usr.sbin/bhyve/acpi_device.h b/usr.sbin/bhyve/acpi_device.h --- a/usr.sbin/bhyve/acpi_device.h +++ b/usr.sbin/bhyve/acpi_device.h @@ -16,18 +16,22 @@ struct acpi_device; +struct acpi_device_emul { + const char *name; + const char *hid; +}; + /** * Creates an ACPI device. * * @param[out] new_dev Returns the newly create ACPI device. * @param[in] vm_ctx VM context the ACPI device is created in. - * @param[in] name Name of the ACPI device. Should always be a NULL - * terminated string. - * @param[in] hid Hardware ID of the ACPI device. Should always be a NULL - * terminated string. + * @param[in] emul Device emulation struct. It contains some information + * like the name of the ACPI device and some device specific + * functions. */ int acpi_device_create(struct acpi_device **new_dev, struct vmctx *vm_ctx, - const char *name, const char *hid); + const struct acpi_device_emul *emul); void acpi_device_destroy(struct acpi_device *dev); int acpi_device_add_res_fixed_ioport(struct acpi_device *dev, UINT16 port, diff --git a/usr.sbin/bhyve/acpi_device.c b/usr.sbin/bhyve/acpi_device.c --- a/usr.sbin/bhyve/acpi_device.c +++ b/usr.sbin/bhyve/acpi_device.c @@ -35,24 +35,23 @@ * Holds information about an ACPI device. * * @param vm_ctx VM context the ACPI device was created in. - * @param name Name of the ACPI device. - * @param hid Hardware ID of the ACPI device. + * @param emul Device emulation struct. It contains some information like the + name of the ACPI device and some device specific functions. * @param crs Current resources used by the ACPI device. */ struct acpi_device { struct vmctx *vm_ctx; - const char *name; - const char *hid; + const struct acpi_device_emul *emul; SLIST_HEAD(acpi_resource_list, acpi_resource_list_entry) crs; }; int acpi_device_create(struct acpi_device **const new_dev, - struct vmctx *const vm_ctx, const char *const name, const char *const hid) + struct vmctx *const vm_ctx, const struct acpi_device_emul *const emul) { - if (new_dev == NULL || vm_ctx == NULL || name == NULL || hid == NULL) { - return (EINVAL); - } + assert(new_dev != NULL); + assert(vm_ctx != NULL); + assert(emul != NULL); struct acpi_device *const dev = calloc(1, sizeof(*dev)); if (dev == NULL) { @@ -60,13 +59,8 @@ } dev->vm_ctx = vm_ctx; - dev->name = strdup(name); - dev->hid = strdup(hid); + dev->emul = emul; SLIST_INIT(&dev->crs); - if (dev->name == NULL || dev->hid == NULL) { - acpi_device_destroy(dev); - return (ENOMEM); - } const int error = acpi_tables_add_device(dev); if (error) { @@ -92,9 +86,7 @@ SLIST_REMOVE_HEAD(&dev->crs, chain); free(res); } - - free(__DECONST(void *, dev->hid)); - free(__DECONST(void *, dev->name)); + free(dev); } @@ -174,9 +166,9 @@ dsdt_line(""); dsdt_line(" Scope (\\_SB)"); dsdt_line(" {"); - dsdt_line(" Device (%s)", dev->name); + dsdt_line(" Device (%s)", dev->emul->name); dsdt_line(" {"); - dsdt_line(" Name (_HID, \"%s\")", dev->hid); + dsdt_line(" Name (_HID, \"%s\")", dev->emul->hid); dsdt_line(" Name (_STA, 0x0F)"); dsdt_line(" Name (_CRS, ResourceTemplate ()"); dsdt_line(" {"); diff --git a/usr.sbin/bhyve/qemu_fwcfg.c b/usr.sbin/bhyve/qemu_fwcfg.c --- a/usr.sbin/bhyve/qemu_fwcfg.c +++ b/usr.sbin/bhyve/qemu_fwcfg.c @@ -365,6 +365,11 @@ return (0); } +static const struct acpi_device_emul qemu_fwcfg_acpi_device_emul = { + .name = QEMU_FWCFG_ACPI_DEVICE_NAME, + .hid = QEMU_FWCFG_ACPI_HARDWARE_ID, +}; + int qemu_fwcfg_init(struct vmctx *const ctx) { @@ -378,7 +383,7 @@ */ if (strcmp(lpc_fwcfg(), "qemu") == 0) { error = acpi_device_create(&fwcfg_sc.acpi_dev, ctx, - QEMU_FWCFG_ACPI_DEVICE_NAME, QEMU_FWCFG_ACPI_HARDWARE_ID); + &qemu_fwcfg_acpi_device_emul); if (error) { warnx("%s: failed to create ACPI device for QEMU FwCfg", __func__);