From f5c8cf9e0ef5376374e83899d6d73f1aaaafc254 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Wed, 25 Nov 2020 12:06:46 +0100 Subject: [PATCH] qemu: agent: Store CCW address in qemuAgentDiskInfo if provided by the guest Newer versions of the QEMU guest agent will provide the CCW address of devices on s390x. Store this information in the qemuAgentDiskInfo so that we can use this later. We also map the CSSID 0 from the guest to the value 0xfe on the host, see https://www.qemu.org/docs/master/system/s390x/css.html for details. Signed-off-by: Thomas Huth Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- src/qemu/qemu_agent.c | 10 ++++++++++ src/qemu/qemu_agent.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index d4530dcd7a..b155896e78 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1866,6 +1866,7 @@ static qemuAgentDiskAddressPtr qemuAgentGetDiskAddress(virJSONValuePtr json) { virJSONValuePtr pci; + virJSONValuePtr ccw; g_autoptr(qemuAgentDiskAddress) addr = NULL; addr = g_new0(qemuAgentDiskAddress, 1); @@ -1896,6 +1897,15 @@ qemuAgentGetDiskAddress(virJSONValuePtr json) GET_DISK_ADDR(pci, &addr->pci_controller.bus, "bus"); GET_DISK_ADDR(pci, &addr->pci_controller.slot, "slot"); GET_DISK_ADDR(pci, &addr->pci_controller.function, "function"); + + if ((ccw = virJSONValueObjectGet(json, "ccw-address"))) { + addr->has_ccw_address = true; + GET_DISK_ADDR(ccw, &addr->ccw_addr.cssid, "cssid"); + if (addr->ccw_addr.cssid == 0) /* Guest CSSID 0 is 0xfe on host */ + addr->ccw_addr.cssid = 0xfe; + GET_DISK_ADDR(ccw, &addr->ccw_addr.ssid, "ssid"); + GET_DISK_ADDR(ccw, &addr->ccw_addr.devno, "devno"); + } #undef GET_DISK_ADDR return g_steal_pointer(&addr); diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index 74f1410760..4ea9b9dc1e 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -77,6 +77,8 @@ struct _qemuAgentDiskAddress { unsigned int target; unsigned int unit; char *devnode; + bool has_ccw_address; + virDomainDeviceCCWAddress ccw_addr; }; void qemuAgentDiskAddressFree(qemuAgentDiskAddressPtr addr); G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentDiskAddress, qemuAgentDiskAddressFree);