Skip to content

Commit

Permalink
vmgenid: replace x-write-pointer-available hack
Browse files Browse the repository at this point in the history
This compat property sole function is to prevent the device from being
instantiated. Instead of requiring an extra compat property, check if
fw_cfg has DMA enabled.

fw_cfg is a built-in device that is initialized very early by the
machine init code.  We have at least one other device that also
assumes fw_cfg_find() can be safely used on realize: pvpanic.

This has the additional benefit of handling other cases properly, like:

  $ qemu-system-x86_64 -device vmgenid -machine none
  qemu-system-x86_64: -device vmgenid: vmgenid requires DMA write support in fw_cfg, which this machine type does not provide
  $ qemu-system-x86_64 -device vmgenid -machine pc-i440fx-2.9 -global fw_cfg.dma_enabled=off
  qemu-system-x86_64: -device vmgenid: vmgenid requires DMA write support in fw_cfg, which this machine type does not provide
  $ qemu-system-x86_64 -device vmgenid -machine pc-i440fx-2.6 -global fw_cfg.dma_enabled=on
  [boots normally]

Suggested-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Ben Warren <ben@skyportsystems.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
elmarco authored and mstsirkin committed Sep 8, 2017
1 parent 672339f commit c838955
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 13 deletions.
10 changes: 10 additions & 0 deletions hw/acpi/bios-linker-loader.c
Expand Up @@ -168,6 +168,16 @@ bios_linker_find_file(const BIOSLinker *linker, const char *name)
return NULL;
}

/*
* board code must realize fw_cfg first, as a fixed device, before
* another device realize function call bios_linker_loader_can_write_pointer()
*/
bool bios_linker_loader_can_write_pointer(void)
{
FWCfgState *fw_cfg = fw_cfg_find();
return fw_cfg && fw_cfg_dma_enabled(fw_cfg);
}

/*
* bios_linker_loader_alloc: ask guest to load file into guest memory.
*
Expand Down
9 changes: 1 addition & 8 deletions hw/acpi/vmgenid.c
Expand Up @@ -205,17 +205,11 @@ static void vmgenid_handle_reset(void *opaque)
memset(vms->vmgenid_addr_le, 0, ARRAY_SIZE(vms->vmgenid_addr_le));
}

static Property vmgenid_properties[] = {
DEFINE_PROP_BOOL("x-write-pointer-available", VmGenIdState,
write_pointer_available, true),
DEFINE_PROP_END_OF_LIST(),
};

static void vmgenid_realize(DeviceState *dev, Error **errp)
{
VmGenIdState *vms = VMGENID(dev);

if (!vms->write_pointer_available) {
if (!bios_linker_loader_can_write_pointer()) {
error_setg(errp, "%s requires DMA write support in fw_cfg, "
"which this machine type does not provide", VMGENID_DEVICE);
return;
Expand All @@ -239,7 +233,6 @@ static void vmgenid_device_class_init(ObjectClass *klass, void *data)
dc->vmsd = &vmstate_vmgenid;
dc->realize = vmgenid_realize;
dc->hotpluggable = false;
dc->props = vmgenid_properties;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);

object_class_property_add_str(klass, VMGENID_GUID, NULL,
Expand Down
2 changes: 2 additions & 0 deletions include/hw/acpi/bios-linker-loader.h
Expand Up @@ -7,6 +7,8 @@ typedef struct BIOSLinker {
GArray *file_list;
} BIOSLinker;

bool bios_linker_loader_can_write_pointer(void);

BIOSLinker *bios_linker_loader_init(void);

void bios_linker_loader_alloc(BIOSLinker *linker,
Expand Down
1 change: 0 additions & 1 deletion include/hw/acpi/vmgenid.h
Expand Up @@ -21,7 +21,6 @@ typedef struct VmGenIdState {
DeviceClass parent_obj;
QemuUUID guid; /* The 128-bit GUID seen by the guest */
uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little-endian) */
bool write_pointer_available;
} VmGenIdState;

/* returns NULL unless there is exactly one device */
Expand Down
4 changes: 0 additions & 4 deletions include/hw/compat.h
Expand Up @@ -153,10 +153,6 @@
.driver = "fw_cfg_io",\
.property = "dma_enabled",\
.value = "off",\
},{\
.driver = "vmgenid",\
.property = "x-write-pointer-available",\
.value = "off",\
},

#define HW_COMPAT_2_3 \
Expand Down

0 comments on commit c838955

Please sign in to comment.