Blame SOURCES/kvm-tests-boot-sector-Fix-the-bad-s390x-assembler-code.patch

ddf19c
From f73b18e03c6758500bf367b1575205772d1f878f Mon Sep 17 00:00:00 2001
ddf19c
From: Thomas Huth <thuth@redhat.com>
ddf19c
Date: Fri, 29 May 2020 05:53:52 -0400
ddf19c
Subject: [PATCH 10/42] tests/boot-sector: Fix the bad s390x assembler code
ddf19c
ddf19c
RH-Author: Thomas Huth <thuth@redhat.com>
ddf19c
Message-id: <20200529055420.16855-11-thuth@redhat.com>
ddf19c
Patchwork-id: 97031
ddf19c
O-Subject: [RHEL-8.3.0 qemu-kvm PATCH v2 10/38] tests/boot-sector: Fix the bad s390x assembler code
ddf19c
Bugzilla: 1828317
ddf19c
RH-Acked-by: Claudio Imbrenda <cimbrend@redhat.com>
ddf19c
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
ddf19c
RH-Acked-by: David Hildenbrand <david@redhat.com>
ddf19c
ddf19c
There are currently two bugs in s390x_code[]: First, the initial jump
ddf19c
uses the wrong offset, so it was jumping to 0x10014 instead of 0x10010.
ddf19c
Second, LHI only loads the lower 32-bit of the register.
ddf19c
ddf19c
Everything worked fine as long as the s390-ccw bios code was jumping
ddf19c
here with r3 containing zeroes in the uppermost 48 bit - which just
ddf19c
happened to be the case so far by accident. But we can not rely on this
ddf19c
fact, and indeed one of the recent suggested patches to jump2ipl.c cause
ddf19c
the newer GCCs to put different values into r3. In that case the code
ddf19c
from s390x_code[] crashes very ungracefully.
ddf19c
ddf19c
Thus let's make sure to jump to the right instruction, and use LGHI
ddf19c
instead of LHI to make sure that we always zero out the upper bits
ddf19c
of the register.
ddf19c
ddf19c
Signed-off-by: Thomas Huth <thuth@redhat.com>
ddf19c
Message-Id: <20191217150642.27946-1-thuth@redhat.com>
ddf19c
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
ddf19c
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
ddf19c
(cherry picked from commit 5afec76fbe2c07d03fd8c9ac525140059499637a)
ddf19c
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ddf19c
---
ddf19c
 tests/boot-sector.c | 4 ++--
ddf19c
 1 file changed, 2 insertions(+), 2 deletions(-)
ddf19c
ddf19c
diff --git a/tests/boot-sector.c b/tests/boot-sector.c
ddf19c
index 7824286b9a..9e66c6d013 100644
ddf19c
--- a/tests/boot-sector.c
ddf19c
+++ b/tests/boot-sector.c
ddf19c
@@ -75,11 +75,11 @@ static const uint8_t s390x_psw_and_magic[] = {
ddf19c
     0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40   /* in the s390-ccw bios */
ddf19c
 };
ddf19c
 static const uint8_t s390x_code[] = {
ddf19c
-    0xa7, 0xf4, 0x00, 0x0a,                                /* j 0x10010 */
ddf19c
+    0xa7, 0xf4, 0x00, 0x08,                                /* j 0x10010 */
ddf19c
     0x00, 0x00, 0x00, 0x00,
ddf19c
     'S', '3', '9', '0',
ddf19c
     'E', 'P', 0x00, 0x01,
ddf19c
-    0xa7, 0x38, HIGH(SIGNATURE_ADDR), LOW(SIGNATURE_ADDR), /* lhi r3,0x7c10 */
ddf19c
+    0xa7, 0x39, HIGH(SIGNATURE_ADDR), LOW(SIGNATURE_ADDR), /* lghi r3,0x7c10 */
ddf19c
     0xa7, 0x48, LOW(SIGNATURE), HIGH(SIGNATURE),           /* lhi r4,0xadde */
ddf19c
     0x40, 0x40, 0x30, 0x00,                                /* sth r4,0(r3) */
ddf19c
     0xa7, 0xf4, 0xff, 0xfa                                 /* j 0x10010 */
ddf19c
-- 
ddf19c
2.27.0
ddf19c