public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Heiko Carstens <hca@linux.ibm.com>
To: Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Jonas Paulsson <paulsson@linux.vnet.ibm.com>,
	Ulrich Weigand <ulrich.weigand@de.ibm.com>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Alexander Egorenkov <egorenar@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>,
	Andreas Krebbel <krebbel@linux.ibm.com>,
	Nathan Chancellor <natechancellor@gmail.com>,
	Nick Desaulniers <ndesaulniers@google.com>,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [PATCH 6/8] s390/boot: workaround llvm IAS bug
Date: Wed, 11 May 2022 14:05:30 +0200	[thread overview]
Message-ID: <20220511120532.2228616-7-hca@linux.ibm.com> (raw)
In-Reply-To: <20220511120532.2228616-1-hca@linux.ibm.com>

For at least the mvc and clc instructions llvm's integrated assembler can
generate incorrect code. In particular this happens with decompressor boot
code. The reason seems to be that relocations for the second displacement
of each instruction are at incorrect locations (-/+: gas vs llvm IAS):

mvc     __LC_IO_NEW_PSW(16),.Lnewpsw

results in

        4:      d2 0f 01 f0 00 00       mvc     496(16,%r0),0
-                       8: R_390_12     .head.text+0x10
+                       6: R_390_12     .head.text+0x10

and
clc     0(3,%r4),.L_hdr
results in

      258:      d5 02 40 00 00 00       clc     0(3,%r4),0
-                       25c: R_390_12   .head.text+0x324
+                       25a: R_390_12   .head.text+0x324

Workaround this by writing the code in a different way.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
 arch/s390/boot/head.S | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/arch/s390/boot/head.S b/arch/s390/boot/head.S
index 2ced90172680..8402e1cd133b 100644
--- a/arch/s390/boot/head.S
+++ b/arch/s390/boot/head.S
@@ -42,7 +42,8 @@ ipl_start:
 # subroutine to wait for end I/O
 #
 .Lirqwait:
-	mvc	__LC_IO_NEW_PSW(16),.Lnewpsw	# set up IO interrupt psw
+	larl	%r13,.Lnewpsw		# set up IO interrupt psw
+	mvc	__LC_IO_NEW_PSW(16),0(%r13)
 	lpsw	.Lwaitpsw
 .Lioint:
 	br	%r14
@@ -155,9 +156,11 @@ ipl_start:
 	lr	%r2,%r3
 .Lnotrunc:
 	l	%r4,.Linitrd
-	clc	0(3,%r4),.L_hdr		# if it is HDRx
+	larl	%r13,.L_hdr
+	clc	0(3,%r4),0(%r13)	# if it is HDRx
 	bz	.Lagain1		# skip dataset header
-	clc	0(3,%r4),.L_eof		# if it is EOFx
+	larl	%r13,.L_eof
+	clc	0(3,%r4),0(%r13)	# if it is EOFx
 	bz	.Lagain1		# skip dateset trailer
 
 	lr	%r5,%r2
@@ -181,9 +184,11 @@ ipl_start:
 .Lrdcont:
 	l	%r2,.Linitrd
 
-	clc	0(3,%r2),.L_hdr		# skip HDRx and EOFx
+	larl	%r13,.L_hdr		# skip HDRx and EOFx
+	clc	0(3,%r2),0(%r13)
 	bz	.Lagain2
-	clc	0(3,%r2),.L_eof
+	larl	%r13,.L_eof
+	clc	0(3,%r2),0(%r13)
 	bz	.Lagain2
 
 #
@@ -260,20 +265,23 @@ SYM_CODE_START_LOCAL(startup_normal)
 	.fill	16,4,0x0
 0:	lmh	%r0,%r15,0(%r13)	# clear high-order half of gprs
 	sam64				# switch to 64 bit addressing mode
-	basr	%r13,0			# get base
-.LPG0:
-	mvc	__LC_EXT_NEW_PSW(16),.Lext_new_psw-.LPG0(%r13)
-	mvc	__LC_PGM_NEW_PSW(16),.Lpgm_new_psw-.LPG0(%r13)
-	mvc	__LC_IO_NEW_PSW(16),.Lio_new_psw-.LPG0(%r13)
+	larl	%r13,.Lext_new_psw
+	mvc	__LC_EXT_NEW_PSW(16),0(%r13)
+	larl	%r13,.Lpgm_new_psw
+	mvc	__LC_PGM_NEW_PSW(16),0(%r13)
+	larl	%r13,.Lio_new_psw
+	mvc	__LC_IO_NEW_PSW(16),0(%r13)
 	xc	0x200(256),0x200	# partially clear lowcore
 	xc	0x300(256),0x300
 	xc	0xe00(256),0xe00
 	xc	0xf00(256),0xf00
-	lctlg	%c0,%c15,.Lctl-.LPG0(%r13)	# load control registers
+	larl	%r13,.Lctl
+	lctlg	%c0,%c15,0(%r13)	# load control registers
 	stcke	__LC_BOOT_CLOCK
 	mvc	__LC_LAST_UPDATE_CLOCK(8),__LC_BOOT_CLOCK+1
-	spt	6f-.LPG0(%r13)
-	mvc	__LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
+	larl	%r13,6f
+	spt	0(%r13)
+	mvc	__LC_LAST_UPDATE_TIMER(8),0(%r13)
 	larl	%r15,_stack_end-STACK_FRAME_OVERHEAD
 	brasl	%r14,sclp_early_setup_buffer
 	brasl	%r14,verify_facilities
-- 
2.32.0


  parent reply	other threads:[~2022-05-11 12:07 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-11 12:05 [PATCH 0/8] s390: allow to build with llvm's integrated assembler Heiko Carstens
2022-05-11 12:05 ` [PATCH 1/8] s390/alternatives: provide identical sized orginal/alternative sequences Heiko Carstens
2022-05-13  9:17   ` Vasily Gorbik
2022-05-11 12:05 ` [PATCH 2/8] s390/alternatives: remove padding generation code Heiko Carstens
2022-05-11 17:02   ` Heiko Carstens
2022-05-13  9:18   ` Vasily Gorbik
2022-05-11 12:05 ` [PATCH 3/8] s390/entry: shorten OUTSIDE macro Heiko Carstens
2022-05-12 15:59   ` kernel test robot
2022-05-12 16:20   ` kernel test robot
2022-05-12 17:21   ` Heiko Carstens
2022-05-12 18:00     ` Nick Desaulniers
2022-05-12 19:15       ` Heiko Carstens
2022-05-12 19:25         ` Nick Desaulniers
2022-05-13 12:29           ` Heiko Carstens
2022-05-11 12:05 ` [PATCH 4/8] s390/entry: workaround llvm's IAS limitations Heiko Carstens
2022-05-11 17:30   ` Nathan Chancellor
2022-05-12 17:24     ` Heiko Carstens
2022-05-12 19:06       ` Nathan Chancellor
2022-05-12 19:16         ` Heiko Carstens
2022-05-16  9:07       ` Alexander Gordeev
2022-05-16 10:19         ` Heiko Carstens
2022-05-16 10:42           ` Jonas Paulsson
2022-05-16 11:11           ` Alexander Gordeev
2022-05-16 14:05             ` Heiko Carstens
2022-05-11 12:05 ` [PATCH 5/8] s390/purgatory: " Heiko Carstens
2022-05-11 19:54   ` Nick Desaulniers
2022-05-12 17:26     ` Heiko Carstens
2022-05-12 17:25   ` Heiko Carstens
2022-05-11 12:05 ` Heiko Carstens [this message]
2022-05-11 19:50   ` [PATCH 6/8] s390/boot: workaround llvm IAS bug Nick Desaulniers
2022-05-11 12:05 ` [PATCH 7/8] s390/boot: do not emit debug info for assembly with llvm's IAS Heiko Carstens
2022-05-11 19:40   ` Nick Desaulniers
2022-05-12 17:30     ` Heiko Carstens
2022-05-11 12:05 ` [PATCH 8/8] scripts/min-tool-version.sh: raise minimum clang version to 14.0.0 for s390 Heiko Carstens
2022-05-11 19:27   ` Nick Desaulniers
2022-05-11 19:56     ` Nick Desaulniers
2022-05-12 19:06       ` Heiko Carstens
2022-05-11 19:48 ` [PATCH 0/8] s390: allow to build with llvm's integrated assembler Nick Desaulniers
2022-05-12 19:04   ` Heiko Carstens
2022-05-11 20:52 ` Nathan Chancellor
2022-05-12 19:03   ` Heiko Carstens

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220511120532.2228616-7-hca@linux.ibm.com \
    --to=hca@linux.ibm.com \
    --cc=agordeev@linux.ibm.com \
    --cc=egorenar@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=krebbel@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=natechancellor@gmail.com \
    --cc=ndesaulniers@google.com \
    --cc=paulsson@linux.vnet.ibm.com \
    --cc=svens@linux.ibm.com \
    --cc=ulrich.weigand@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox