Re: [PATCH] s390/test_unwind: use raw opcode instead of invalid instruction

From: Christian Borntraeger
Date: Fri Nov 19 2021 - 05:57:23 EST




Am 19.11.21 um 11:54 schrieb Heiko Carstens:
On Fri, Nov 19, 2021 at 10:39:15AM +0100, Christian Borntraeger wrote:
So if I understand
https://sourceware.org/binutils/docs/as/s390-Directives.html#s390-Directives
https://sourceware.org/binutils/docs/as/s390-Formats.html
that `e,` prefix is for 16B opcodes?

e is an instruction format as specified by the architecture.
See http://publibfp.dhe.ibm.com/epubs/pdf/a227832c.pdf
without any parameters.
Normally RR would be the right thing for MVCL, but since
we try to build an invalid opcode without the assembler
noticing (ab)using e seem like a safer approach.

LGTM, thanks again.
Suggested-by: Ulrich Weigand <Ulrich.Weigand@xxxxxxxxxx>
Reviewed-by: Nick Desaulniers <ndesaulniers@xxxxxxxxxx>

added those and added my RB. applied to the s390 tree. Thanks
..
diff --git a/arch/s390/lib/test_unwind.c b/arch/s390/lib/test_unwind.c
index cfc5f5557c06..d342bc884b94 100644
--- a/arch/s390/lib/test_unwind.c
+++ b/arch/s390/lib/test_unwind.c
@@ -176,7 +176,7 @@ static noinline int unwindme_func4(struct unwindme *u)
* trigger specification exception
*/
asm volatile(
- " mvcl %%r1,%%r1\n"
+ " .insn e,0x0e11\n" /* mvcl %%r1,%%r1" */

Sorry, I disagree with this. As you said above rr would be the correct
format for this instruction. If we go for the e format then we should
also use an instruction with e format.
Which in this case would simply be an illegal opcode, which would be
sufficient for what this code is good for: ".insn e,0x0000".

Why not simply use .short then?