On a Thursday in 2021, Peter Krempa wrote:
Upcoming patches will start converting the formatting of arguments for -device from a string to JSON so that we can keep proper types around when using it via QMP. This means we will need an equivalet for the device address builder
*equivalent
function. 'qemuBuildDeviceAddressProps' provides equal functionality, but the output differs for fields where a number is expected, where we've previously formatted a hex value but now end up with a decimal value per JSON standard. For given address types I've selected an example device and used '-device $DEV,help' to obtain the current types recognized by qemu: Note that 'bus' is not shown below, but it's already a string so we can keep using it as a string. VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI (virtio-balloon-pci) acpi-index=<uint32> - (default: 0) addr=<int32> - Slot and optional function number, example: 06.0 or 06 (default: -1) multifunction=<bool> - on/off (default: false) Note that 'addr' is here defined as 'int32' but in fact internally in qemu is an alternate type between a number and a string so we can keep using strings here. VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB (usb-tablet) port=<str> VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO (spapr-vty) reg=<uint32> - (default: 4294967295) VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW (virtio-blk-cww) devno=<str> - Identifier of an I/O device in the channel subsystem, example: fe.1.23ab VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA (isa-serial) iobase=<uint32> - (default: 4294967295) irq=<uint32> - (default: 4294967295) VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM (pc-dimm) slot=<int32> - (default: -1) addr=<uint64> - (default: 0) Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_command.c | 101 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 56acd9a109..565b1970dc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -416,7 +416,7 @@ qemuBuildDeviceAddressPCIStr(virBuffer *buf, } -static int +static int G_GNUC_UNUSED qemuBuildDeviceAddressStr(virBuffer *buf, const virDomainDef *domainDef, virDomainDeviceInfo *info) @@ -484,6 +484,105 @@ qemuBuildDeviceAddressStr(virBuffer *buf, } +static int G_GNUC_UNUSED +qemuBuildDeviceAddressProps(virJSONValue *props, + const virDomainDef *domainDef, + virDomainDeviceInfo *info) +{ + switch ((virDomainDeviceAddressType) info->type) { + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: { + g_autofree char *pciaddr = NULL; + + if (info->addr.pci.function != 0) + pciaddr = g_strdup_printf("0x%x.0x%x", info->addr.pci.slot, info->addr.pci.function); + else + pciaddr = g_strdup_printf("0x%x", info->addr.pci.slot); + + if (virJSONValueObjectAdd(props, + "F:bus", qemuBuildDeviceAddressPCIGetBus(domainDef, info),
Without the '[fF]' patch, this only needs one autofree'd variable.
+ "T:multifunction", info->addr.pci.multi, + "s:addr", pciaddr, + "p:acpi-index", info->acpiIndex, + NULL) < 0) + return -1; + + return 0; + } + break; + + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: { + const char *contAlias = NULL; + g_auto(virBuffer) port = VIR_BUFFER_INITIALIZER; + + if (!(contAlias = virDomainControllerAliasFind(domainDef, + VIR_DOMAIN_CONTROLLER_TYPE_USB, + info->addr.usb.bus))) + return -1; + + virDomainUSBAddressPortFormatBuf(&port, info->addr.usb.port); + + if (virJSONValueObjectAdd(props, + "f:bus", g_strdup_printf("%s.0", contAlias),
Here too.
+ "S:port", virBufferCurrentContent(&port), + NULL) < 0) + return -1;
Reviewed-by: Ján Tomko <jtomko@xxxxxxxxxx> Jano
Attachment:
signature.asc
Description: PGP signature