Browse Source

s390x: do a subsystem reset before the unprotect on reboot

Bound APQNs have to be reset before tearing down the secure config via
s390_machine_unprotect(). Otherwise the Ultravisor will return a error
code.

So let's do a subsystem_reset() which includes a AP reset before the
unprotect call. We'll do a full device_reset() afterwards which will
reset some devices twice. That's ok since we can't move the
device_reset() before the unprotect as it includes a CPU clear reset
which the Ultravisor does not expect at that point in time.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Message-ID: <20230901114851.154357-1-frankja@linux.ibm.com>
Tested-by: Viktor Mihajlovski <mihajlov@linux.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Janosch Frank 2 years ago
parent
commit
ef1535901a
1 changed files with 10 additions and 0 deletions
  1. 10 0
      hw/s390x/s390-virtio-ccw.c

+ 10 - 0
hw/s390x/s390-virtio-ccw.c

@@ -438,10 +438,20 @@ static void s390_machine_reset(MachineState *machine, ShutdownCause reason)
     switch (reset_type) {
     switch (reset_type) {
     case S390_RESET_EXTERNAL:
     case S390_RESET_EXTERNAL:
     case S390_RESET_REIPL:
     case S390_RESET_REIPL:
+        /*
+         * Reset the subsystem which includes a AP reset. If a PV
+         * guest had APQNs attached the AP reset is a prerequisite to
+         * unprotecting since the UV checks if all APQNs are reset.
+         */
+        subsystem_reset();
         if (s390_is_pv()) {
         if (s390_is_pv()) {
             s390_machine_unprotect(ms);
             s390_machine_unprotect(ms);
         }
         }
 
 
+        /*
+         * Device reset includes CPU clear resets so this has to be
+         * done AFTER the unprotect call above.
+         */
         qemu_devices_reset(reason);
         qemu_devices_reset(reason);
         s390_crypto_reset();
         s390_crypto_reset();