On 2025-04-28 11:22, Janis Schoetterl-Glausch wrote:
On Thu, 2025-04-10 at 17:09 +0200, Shalini Chellathurai Saroja wrote:
Implement the Service-Call Logical Processor (SCLP) event
type Control-Program Identification (CPI) in QEMU. This
event is used to send CPI identifiers from the guest to the
host. The CPI identifiers are: system type, system name,
system level and sysplex name.

System type: operating system of the guest (e.g. "LINUX").
System name: user configurable name of the guest (e.g. "TESTVM").
System level: distribution and kernel version, if the system type is Linux
(e.g. 0x50e00).
Sysplex name: name of the cluster which the guest belongs to (if any)
(e.g. "PLEX").

Signed-off-by: Shalini Chellathurai Saroja <shal...@linux.ibm.com>
Reviewed-by: Thomas Huth <th...@redhat.com>
---
 hw/s390x/event-facility.c         |  2 +
 hw/s390x/meson.build              |  1 +
 hw/s390x/s390-virtio-ccw.c        | 14 +++++
hw/s390x/sclpcpi.c | 92 +++++++++++++++++++++++++++++++
 include/hw/s390x/event-facility.h | 13 +++++
 5 files changed, 122 insertions(+)
 create mode 100644 hw/s390x/sclpcpi.c

diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c
index 2b0332c20e..60237b8581 100644
--- a/hw/s390x/event-facility.c
+++ b/hw/s390x/event-facility.c
@@ -4,6 +4,7 @@
  *       handles SCLP event types
  *          - Signal Quiesce - system power down
  *          - ASCII Console Data - VT220 read and write
+ * - Control-Program Identification - Send OS data from guest to host
  *
  * Copyright IBM, Corp. 2012
  *
@@ -40,6 +41,7 @@ struct SCLPEventFacility {
     SysBusDevice parent_obj;
     SCLPEventsBus sbus;
     SCLPEvent quiesce, cpu_hotplug;
+    SCLPEventCPI cpi;
     /* guest's receive mask */
     union {
         uint32_t receive_mask_pieces[2];
diff --git a/hw/s390x/meson.build b/hw/s390x/meson.build
index 3bbebfd817..eb7950489c 100644
--- a/hw/s390x/meson.build
+++ b/hw/s390x/meson.build
@@ -13,6 +13,7 @@ s390x_ss.add(files(
   's390-skeys.c',
   's390-stattrib.c',
   'sclp.c',
+  'sclpcpi.c',
   'sclpcpu.c',
   'sclpquiesce.c',
   'tod.c',
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 75b32182eb..7f28cbd1de 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -260,6 +260,17 @@ static void s390_create_sclpconsole(SCLPDevice *sclp,
     qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);
 }

+static void s390_create_sclpcpi(SCLPDevice *sclp)
+{
+    SCLPEventFacility *ef = sclp->event_facility;
+    BusState *ev_fac_bus = sclp_get_event_facility_bus(ef);
+    DeviceState *dev;
+
+    dev = qdev_new(TYPE_SCLP_EVENT_CPI);
+    object_property_add_child(OBJECT(ef), "sclpcpi", OBJECT(dev));
+    qdev_realize_and_unref(dev, ev_fac_bus, &error_fatal);

I wonder if we should drop this and add control-program-id directly
on the event facility. I don't see what purpose having the intermediate
level sclpcpi serves.


Hello Nina,

sclpcpi is the qemu device which handles the SCLP event type Control-Program Identification by performing the following. 1. The sclpcpi device indicates to the guest OS that QEMU is able to process the event buffers of the SCLP event type Control-Program Identification. 2. The sclpcpi device receives the data from the event buffers of the SCLP event type Control-Program Identification sent by the guest OS. The received data is stored in control-program-id, which is the property of the device sclpcpi. So, the sclpcpi device cannot be dropped.

In addition, Thomas Huth told that the migration data of a device must be stored in the device itself during his review of the previous versions of this patch series. So control-program-id cannot be stored in the event facility.

It is possible to add the identifiers directly as the properties of sclpcpi (eg. system type as shown below) and remove the control-program-id.

virsh # qemu-monitor-command vm --pretty '{"execute":"qom-list","arguments": {"path": "/machine/sclp/s390-sclp-event-facility/sclpcpi"}}'
{
  "return": [
    {
      "name": "type",
      "type": "string"
    },
    {
      "name": "parent_bus",
      "type": "link<bus>"
    },
    {
      "name": "realized",
      "type": "bool"
    },
    {
      "name": "hotplugged",
      "type": "bool"
    },
    {
      "name": "hotpluggable",
      "type": "bool"
    },
    {
      "name": "system_type",
      "type": "string"
    },
    {
      "name": "control-program-id",
      "type": "S390ControlProgramId"
    }
  ],
  "id": "libvirt-16"
}

virsh # qemu-monitor-command vm --pretty '{"execute":"qom-get", "arguments":{"path":"/machine/sclp/s390-sclp-event-facility/sclpcpi", "property":"system_type"}}'
{
  "return": "LINUX   ",
  "id": "libvirt-17"
}

However, Hendrik Brückner suggested to group the identifiers together during the initial discussion of this line item. So, I would prefer to leave this as it is. Please let me know if you still think otherwise.

+}

[...]

diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h
index ff874e792d..ef469e62ae 100644
--- a/include/hw/s390x/event-facility.h
+++ b/include/hw/s390x/event-facility.h

[...]
   I.
+struct SCLPEventCPI {
+    DeviceState qdev;
+    SCLPEvent event;

I think you should just inherit from SCLPEvent, which in turn inherits
from DeviceState.
So without the qdev.


Ok, I will do so. Thank you very much for the review.

+};
+
 #define TYPE_SCLP_EVENT_FACILITY "s390-sclp-event-facility"
 typedef struct SCLPEventFacility SCLPEventFacility;
 typedef struct SCLPEventFacilityClass SCLPEventFacilityClass;

--
Mit freundlichen Grüßen / Kind regards
Shalini Chellathurai Saroja
Software Developer
Linux on IBM Z & KVM Development
IBM Deutschland Research & Development GmbH
Dept 1419, Schoenaicher Str. 220, 71032 Boeblingen
Vorsitzender des Aufsichtsrats: Wolfgang Wendt
Geschäftsführung: David Faller
Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294

Reply via email to