88 lines
3.2 KiB
Diff
88 lines
3.2 KiB
Diff
|
From c6f62870f27ece45e944d1818f6aa04b3e024959 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Huth <thuth@redhat.com>
|
||
|
Date: Thu, 10 Dec 2020 08:32:41 -0500
|
||
|
Subject: [PATCH 5/5] pc-bios: s390x: Clear out leftover S390EP string
|
||
|
|
||
|
RH-Author: Thomas Huth <thuth@redhat.com>
|
||
|
Message-id: <20201210083241.173509-5-thuth@redhat.com>
|
||
|
Patchwork-id: 100369
|
||
|
O-Subject: [RHEL-8.4.0 qemu-kvm PATCH 4/4] pc-bios: s390x: Clear out leftover S390EP string
|
||
|
Bugzilla: 1903135
|
||
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||
|
RH-Acked-by: Jens Freimann <jfreimann@redhat.com>
|
||
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
||
|
|
||
|
From: Eric Farman <farman@linux.ibm.com>
|
||
|
|
||
|
A Linux binary will have the string "S390EP" at address 0x10008,
|
||
|
which is important in getting the guest up off the ground. In the
|
||
|
case of a reboot (specifically chreipl going to a new device),
|
||
|
we should defer to the PSW at address zero for the new config,
|
||
|
which will re-write "S390EP" from the new image.
|
||
|
|
||
|
Let's clear it out at this point so that a reipl to, say, a DASD
|
||
|
passthrough device drives the IPL path from scratch without disrupting
|
||
|
disrupting the order of operations for other boots.
|
||
|
|
||
|
Rather than hardcoding the address of this magic (again), let's
|
||
|
define it somewhere so that the two users are visibly related.
|
||
|
|
||
|
Signed-off-by: Eric Farman <farman@linux.ibm.com>
|
||
|
Message-Id: <20201120160117.59366-3-farman@linux.ibm.com>
|
||
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||
|
(cherry picked from commit 3d6519968bb10260fc724c491fb4275f7c0b78ac)
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
pc-bios/s390-ccw/jump2ipl.c | 2 +-
|
||
|
pc-bios/s390-ccw/main.c | 6 ++++++
|
||
|
pc-bios/s390-ccw/s390-arch.h | 3 +++
|
||
|
3 files changed, 10 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c
|
||
|
index 767012bf0c9..6c6823b5db8 100644
|
||
|
--- a/pc-bios/s390-ccw/jump2ipl.c
|
||
|
+++ b/pc-bios/s390-ccw/jump2ipl.c
|
||
|
@@ -78,7 +78,7 @@ void jump_to_low_kernel(void)
|
||
|
* kernel start address (when jumping to the PSW-at-zero address instead,
|
||
|
* the kernel startup code fails when we booted from a network device).
|
||
|
*/
|
||
|
- if (!memcmp((char *)0x10008, "S390EP", 6)) {
|
||
|
+ if (!memcmp((char *)S390EP, "S390EP", 6)) {
|
||
|
jump_to_IPL_code(KERN_IMAGE_START);
|
||
|
}
|
||
|
|
||
|
diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
|
||
|
index e3a1a3053d0..c04b910082b 100644
|
||
|
--- a/pc-bios/s390-ccw/main.c
|
||
|
+++ b/pc-bios/s390-ccw/main.c
|
||
|
@@ -185,6 +185,12 @@ static void boot_setup(void)
|
||
|
memcpy(lpmsg + 10, loadparm_str, 8);
|
||
|
sclp_print(lpmsg);
|
||
|
|
||
|
+ /*
|
||
|
+ * Clear out any potential S390EP magic (see jump_to_low_kernel()),
|
||
|
+ * so we don't taint our decision-making process during a reboot.
|
||
|
+ */
|
||
|
+ memset((char *)S390EP, 0, 6);
|
||
|
+
|
||
|
have_iplb = store_iplb(&iplb);
|
||
|
}
|
||
|
|
||
|
diff --git a/pc-bios/s390-ccw/s390-arch.h b/pc-bios/s390-ccw/s390-arch.h
|
||
|
index 6da44d4436c..a741488aaa1 100644
|
||
|
--- a/pc-bios/s390-ccw/s390-arch.h
|
||
|
+++ b/pc-bios/s390-ccw/s390-arch.h
|
||
|
@@ -95,6 +95,9 @@ typedef struct LowCore {
|
||
|
|
||
|
extern LowCore *lowcore;
|
||
|
|
||
|
+/* Location of "S390EP" in a Linux binary (see arch/s390/boot/head.S) */
|
||
|
+#define S390EP 0x10008
|
||
|
+
|
||
|
static inline void set_prefix(uint32_t address)
|
||
|
{
|
||
|
asm volatile("spx %0" : : "m" (address) : "memory");
|
||
|
--
|
||
|
2.27.0
|
||
|
|