[PATCH 033/103] qemu: command: Introduce JSON equivalent of qemuBuildDeviceAddressStr
Ján Tomko
jtomko at redhat.com
Fri Oct 8 12:24:27 UTC 2021
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 at redhat.com>
>---
> 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 at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20211008/b7888a5b/attachment-0001.sig>
More information about the libvir-list
mailing list