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