ddf19c
From 53053ea2e6c757e5d044655c8b61c485e0aad4ed Mon Sep 17 00:00:00 2001
ddf19c
From: Thomas Huth <thuth@redhat.com>
ddf19c
Date: Fri, 29 May 2020 05:53:59 -0400
ddf19c
Subject: [PATCH 17/42] s390/ipl: sync back loadparm
ddf19c
MIME-Version: 1.0
ddf19c
Content-Type: text/plain; charset=UTF-8
ddf19c
Content-Transfer-Encoding: 8bit
ddf19c
ddf19c
RH-Author: Thomas Huth <thuth@redhat.com>
ddf19c
Message-id: <20200529055420.16855-18-thuth@redhat.com>
ddf19c
Patchwork-id: 97039
ddf19c
O-Subject: [RHEL-8.3.0 qemu-kvm PATCH v2 17/38] s390/ipl: sync back loadparm
ddf19c
Bugzilla: 1828317
ddf19c
RH-Acked-by: Claudio Imbrenda <cimbrend@redhat.com>
ddf19c
RH-Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
ddf19c
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
ddf19c
RH-Acked-by: David Hildenbrand <david@redhat.com>
ddf19c
ddf19c
From: Halil Pasic <pasic@linux.ibm.com>
ddf19c
ddf19c
We expose loadparm as a r/w machine property, but if loadparm is set by
ddf19c
the guest via DIAG 308, we don't update the property. Having a
ddf19c
disconnect between the guest view and the QEMU property is not nice in
ddf19c
itself, but things get even worse for SCSI, where under certain
ddf19c
circumstances (see 789b5a401b "s390: Ensure IPL from SCSI works as
ddf19c
expected" for details) we call s390_gen_initial_iplb() on resets
ddf19c
effectively overwriting the guest/user supplied loadparm with the stale
ddf19c
value.
ddf19c
ddf19c
Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
ddf19c
Fixes: 7104bae9de ("hw/s390x: provide loadparm property for the machine")
ddf19c
Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
ddf19c
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
ddf19c
Reviewed-by: Viktor Mihajlovski <mihajlov@linux.ibm.com>
ddf19c
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
ddf19c
Reviewed-by: David Hildenbrand <david@redhat.com>
ddf19c
Message-Id: <20200309133223.100491-1-pasic@linux.ibm.com>
ddf19c
[borntraeger@de.ibm.com: use reverse xmas tree]
ddf19c
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
ddf19c
(cherry picked from commit 0a01e082a428b921e48b5314881b1f23a7b0fe50)
ddf19c
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ddf19c
---
ddf19c
 hw/s390x/ipl.c | 25 +++++++++++++++++++++++++
ddf19c
 1 file changed, 25 insertions(+)
ddf19c
ddf19c
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
ddf19c
index 0b7548a549..f25339c503 100644
ddf19c
--- a/hw/s390x/ipl.c
ddf19c
+++ b/hw/s390x/ipl.c
ddf19c
@@ -529,6 +529,30 @@ static bool is_virtio_scsi_device(IplParameterBlock *iplb)
ddf19c
     return is_virtio_ccw_device_of_type(iplb, VIRTIO_ID_SCSI);
ddf19c
 }
ddf19c
 
ddf19c
+static void update_machine_ipl_properties(IplParameterBlock *iplb)
ddf19c
+{
ddf19c
+    Object *machine = qdev_get_machine();
ddf19c
+    Error *err = NULL;
ddf19c
+
ddf19c
+    /* Sync loadparm */
ddf19c
+    if (iplb->flags & DIAG308_FLAGS_LP_VALID) {
ddf19c
+        uint8_t *ebcdic_loadparm = iplb->loadparm;
ddf19c
+        char ascii_loadparm[8];
ddf19c
+        int i;
ddf19c
+
ddf19c
+        for (i = 0; i < 8 && ebcdic_loadparm[i]; i++) {
ddf19c
+            ascii_loadparm[i] = ebcdic2ascii[(uint8_t) ebcdic_loadparm[i]];
ddf19c
+        }
ddf19c
+        ascii_loadparm[i] = 0;
ddf19c
+        object_property_set_str(machine, ascii_loadparm, "loadparm", &err;;
ddf19c
+    } else {
ddf19c
+        object_property_set_str(machine, "", "loadparm", &err;;
ddf19c
+    }
ddf19c
+    if (err) {
ddf19c
+        warn_report_err(err);
ddf19c
+    }
ddf19c
+}
ddf19c
+
ddf19c
 void s390_ipl_update_diag308(IplParameterBlock *iplb)
ddf19c
 {
ddf19c
     S390IPLState *ipl = get_ipl_device();
ddf19c
@@ -536,6 +560,7 @@ void s390_ipl_update_diag308(IplParameterBlock *iplb)
ddf19c
     ipl->iplb = *iplb;
ddf19c
     ipl->iplb_valid = true;
ddf19c
     ipl->netboot = is_virtio_net_device(iplb);
ddf19c
+    update_machine_ipl_properties(iplb);
ddf19c
 }
ddf19c
 
ddf19c
 IplParameterBlock *s390_ipl_get_iplb(void)
ddf19c
-- 
ddf19c
2.27.0
ddf19c