From c6f62870f27ece45e944d1818f6aa04b3e024959 Mon Sep 17 00:00:00 2001 From: Thomas Huth 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 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 RH-Acked-by: Jens Freimann RH-Acked-by: David Hildenbrand From: Eric Farman 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 Message-Id: <20201120160117.59366-3-farman@linux.ibm.com> Signed-off-by: Thomas Huth (cherry picked from commit 3d6519968bb10260fc724c491fb4275f7c0b78ac) Signed-off-by: Danilo C. L. de Paula --- 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