From f73b18e03c6758500bf367b1575205772d1f878f Mon Sep 17 00:00:00 2001 From: Thomas Huth 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 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 RH-Acked-by: Cornelia Huck RH-Acked-by: David Hildenbrand 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 Message-Id: <20191217150642.27946-1-thuth@redhat.com> Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck (cherry picked from commit 5afec76fbe2c07d03fd8c9ac525140059499637a) Signed-off-by: Danilo C. L. de Paula --- 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