]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
target-s390x: Mask the SIGP order_code to 8bit.
authorPhilipp Kern <phil@philkern.de>
Tue, 18 Aug 2015 11:50:55 +0000 (13:50 +0200)
committerAlexander Graf <agraf@suse.de>
Tue, 25 Apr 2017 11:39:43 +0000 (13:39 +0200)
According to "CPU Signaling and Response", "Signal-Processor Orders",
the order field is bit position 56-63. Without this, the Linux
guest kernel is sometimes unable to stop emulation and enters
an infinite loop of "XXX unknown sigp: 0xffffffff00000005".

Signed-off-by: Philipp Kern <phil@philkern.de>
Reviewed-by: Thomas Huth <thuth@tuxfamily.org>
[agraf: add comment according to email]
Signed-off-by: Alexander Graf <agraf@suse.de>
target/s390x/misc_helper.c

index 93b0e61366d12cbcd49171b2b675ad0cd6b29847..83d38944d78a04cebe20345b660b8eea351425f9 100644 (file)
@@ -515,7 +515,8 @@ uint32_t HELPER(sigp)(CPUS390XState *env, uint64_t order_code, uint32_t r1,
     /* Remember: Use "R1 or R1 + 1, whichever is the odd-numbered register"
        as parameter (input). Status (output) is always R1. */
 
-    switch (order_code) {
+    /* sigp contains the order code in bit positions 56-63, mask it here. */
+    switch (order_code & 0xff) {
     case SIGP_SET_ARCH:
         /* switch arch */
         break;