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 @@ -41,16 +41,15 @@ */ 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) { + if (new_dev == NULL || vm_ctx == NULL || emul == NULL) { return (EINVAL); } @@ -60,8 +59,7 @@ } 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); @@ -174,9 +172,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 @@ -349,6 +349,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) { @@ -361,8 +366,8 @@ * tables and register io ports for fwcfg, if it's used. */ 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); + error = acpi_device_create(&sc.acpi_dev, ctx, + &qemu_fwcfg_acpi_device_emul); if (error) { warnx("%s: failed to create ACPI device for QEMU FwCfg", __func__);