Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-08 Thread Nick Desaulniers via
On Fri, Jan 8, 2021 at 1:45 AM David Hildenbrand  wrote:
>
> On 08.01.21 03:20, Nick Desaulniers wrote:
> > On Thu, Jan 7, 2021 at 3:27 PM David Hildenbrand  
> > wrote:
> >>
> >>
> >>> Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :
> >>>
> >>> On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  
> >>> wrote:
> 
>  RISBHG is broken and currently hinders clang builds of upstream kernels
>  from booting: the kernel crashes early, while decompressing the image.
> 
>   [...]
>    Kernel fault: interruption code 0005 ilc:2
>    Kernel random base: 
>    PSW : 20018000 00017a1e
>  R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
>    GPRS: 0001 000c 0003fff4 
>  fff0
>   fff4 000c 
>  fff0
>  fffc  fff8 
>  008e25a8
>  0009 0002 0008 
>  bce0
> 
>  One example of a buggy instruction is:
> 
> 17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
> 
>  With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, 
>  however,
>  results in %r1 = 0.
> 
>  Let's interpret values of i3/i4 as documented in the PoP and make
>  computation of "mask" only based on i3 and i4 and use "pmask" only at the
>  very end to make sure wrapping is only applied to the high/low 
>  doubleword.
> 
>  With this patch, I can successfully boot a v5.10 kernel built with
>  clang, and gcc builds keep on working.
> 
>  Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
>  Reported-by: Nick Desaulniers 
>  Cc: Guenter Roeck 
>  Cc: Christian Borntraeger 
>  Signed-off-by: David Hildenbrand 
>  ---
> 
>  This BUG was a nightmare to debug and the code a nightmare to understand.
> 
>  To make clang/gcc builds boot, the following fix is required as well on
>  top of current master: "[PATCH] target/s390x: Fix ALGSI"
>  https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com
> >>>
> >>> In that case, a huge thank you!!! for this work! ++beers_owed.
> >>>
> >>
> >> :) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu 
> >> type.
> >
> > Hmm...so I don't think clang can build a Linux kernel image with
> > CONFIG_MARCH_Z13=y just yet; just defconfig.  Otherwise looks like
> > clang barfs on some of the inline asm constraints.
> >
>
> Ah, right. I overwrote my manual config by a temporary defconfig :)
>
>
> So, I'm on x86-64 F33.
>
> clang version 11.0.0 (Fedora 11.0.0-2.fc33)
> LLVM version 11.0.0
>
> I cannot directly use "LLVM=1" for cross-compilation, as I keep getting
> "error: unknown emulation: elf64_s390" from ld.lld and "error: invalid
> output format: 'elf64-s390'" from llvm-objcopy. I assume that's fixed in
> llvm12?

Right, I suspect that even if ld.lld understood that emulation mode
target, it would still fail due to lack of big endian support.  We've
been building with simply `CC=clang` for s390 linux kernels.
Via: https://www.kernel.org/doc/html/latest/kbuild/llvm.html#llvm-utilities
we usually start with `make CC=clang` then work our way up to `make
LLVM=1`.  So you shouldn't need the below patching, just use
`CC=clang`.

>
> 1. I patch around it (strange, I remember CC= .. used to work, but it no
> longer does)
>
> ---
>
> index e30cf02da8b8..89c57062ed5d 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -427,13 +427,13 @@ KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
>  CPP= $(CC) -E
>  ifneq ($(LLVM),)
>  CC = clang
> -LD = ld.lld
> -AR = llvm-ar
> -NM = llvm-nm
> -OBJCOPY= llvm-objcopy
> -OBJDUMP= llvm-objdump
> -READELF= llvm-readelf
> -STRIP  = llvm-strip
> +LD = $(CROSS_COMPILE)ld
> +AR = $(CROSS_COMPILE)ar
> +NM = $(CROSS_COMPILE)nm
> +OBJCOPY= $(CROSS_COMPILE)objcopy
> +OBJDUMP= $(CROSS_COMPILE)objdump
> +READELF= $(CROSS_COMPILE)readelf
> +STRIP  = $(CROSS_COMPILE)strip
>  else
>  CC = $(CROSS_COMPILE)gcc
>  LD = $(CROSS_COMPILE)ld
>
> ---

Pulling from your github branch, everything looks good; buildroot
support looks good. I'll wire this up to our CI so that we can help
report regressions!
-- 
Thanks,
~Nick Desaulniers



Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-08 Thread David Hildenbrand
On 08.01.21 11:19, David Hildenbrand wrote:
> On 08.01.21 10:44, David Hildenbrand wrote:
>> On 08.01.21 03:20, Nick Desaulniers wrote:
>>> On Thu, Jan 7, 2021 at 3:27 PM David Hildenbrand  
>>> wrote:


> Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :
>
> On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  
> wrote:
>>
>> RISBHG is broken and currently hinders clang builds of upstream kernels
>> from booting: the kernel crashes early, while decompressing the image.
>>
>>  [...]
>>   Kernel fault: interruption code 0005 ilc:2
>>   Kernel random base: 
>>   PSW : 20018000 00017a1e
>> R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
>>   GPRS: 0001 000c 0003fff4 
>> fff0
>>  fff4 000c 
>> fff0
>> fffc  fff8 
>> 008e25a8
>> 0009 0002 0008 
>> bce0
>>
>> One example of a buggy instruction is:
>>
>>17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
>>
>> With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, 
>> however,
>> results in %r1 = 0.
>>
>> Let's interpret values of i3/i4 as documented in the PoP and make
>> computation of "mask" only based on i3 and i4 and use "pmask" only at the
>> very end to make sure wrapping is only applied to the high/low 
>> doubleword.
>>
>> With this patch, I can successfully boot a v5.10 kernel built with
>> clang, and gcc builds keep on working.
>>
>> Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
>> Reported-by: Nick Desaulniers 
>> Cc: Guenter Roeck 
>> Cc: Christian Borntraeger 
>> Signed-off-by: David Hildenbrand 
>> ---
>>
>> This BUG was a nightmare to debug and the code a nightmare to understand.
>>
>> To make clang/gcc builds boot, the following fix is required as well on
>> top of current master: "[PATCH] target/s390x: Fix ALGSI"
>> https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com
>
> In that case, a huge thank you!!! for this work! ++beers_owed.
>

 :) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu 
 type.
>>>
>>> Hmm...so I don't think clang can build a Linux kernel image with
>>> CONFIG_MARCH_Z13=y just yet; just defconfig.  Otherwise looks like
>>> clang barfs on some of the inline asm constraints.
>>>
>>
>> Ah, right. I overwrote my manual config by a temporary defconfig :)
>>
>>
>> So, I'm on x86-64 F33.
>>
>> clang version 11.0.0 (Fedora 11.0.0-2.fc33)
>> LLVM version 11.0.0
>>
>> I cannot directly use "LLVM=1" for cross-compilation, as I keep getting
>> "error: unknown emulation: elf64_s390" from ld.lld and "error: invalid
>> output format: 'elf64-s390'" from llvm-objcopy. I assume that's fixed in
>> llvm12?
>>
>> 1. I patch around it (strange, I remember CC= .. used to work, but it no
>> longer does)
>>
>> ---
>>
>> index e30cf02da8b8..89c57062ed5d 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -427,13 +427,13 @@ KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
>>  CPP= $(CC) -E
>>  ifneq ($(LLVM),)
>>  CC = clang
>> -LD = ld.lld
>> -AR = llvm-ar
>> -NM = llvm-nm
>> -OBJCOPY= llvm-objcopy
>> -OBJDUMP= llvm-objdump
>> -READELF= llvm-readelf
>> -STRIP  = llvm-strip
>> +LD = $(CROSS_COMPILE)ld
>> +AR = $(CROSS_COMPILE)ar
>> +NM = $(CROSS_COMPILE)nm
>> +OBJCOPY= $(CROSS_COMPILE)objcopy
>> +OBJDUMP= $(CROSS_COMPILE)objdump
>> +READELF= $(CROSS_COMPILE)readelf
>> +STRIP  = $(CROSS_COMPILE)strip
>>  else
>>  CC = $(CROSS_COMPILE)gcc
>>  LD = $(CROSS_COMPILE)ld
>>
>> ---
>>
>> 2. Compile using clang
>>
>>
>> Using latest linux-next (1c925d2030afd354a02c23500386e620e662622b) +
>> above patch
>>
>> ---
>>
>> #!/bin/bash
>> export ARCH=s390;
>> export CROSS_COMPILE=s390x-linux-gnu-
>> export LLVM=1
>> make distclean
>> make defconfig
>>
>> # Make F32 initrd boot without inserting modules
>> ./scripts/config -e CONFIG_SCSI_ISCSI_ATTRS
>> ./scripts/config -e CONFIG_ISCSI_TCP
>>
>> make -j40 > /dev/null
>>
>> ---
>>
>> 3. Run it via QEMU. I boot a full Fedora 32 using the cloud-image +
>> initrd from Fedora 32 (tried to stick to your cmdline where possible)
>>
>> ./build/qemu-system-s390x \
>> -m 512M \
>> -cpu qemu \
>> -display none \
>> -nodefaults \
>> -kernel ../linux-cross/arch/s390/boot/bzImage \
>> -append "root=/dev/vda1 conmode=sclp console=ttyS0" \
>> -initrd ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \
>> -hda ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \

Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-08 Thread David Hildenbrand
On 08.01.21 10:44, David Hildenbrand wrote:
> On 08.01.21 03:20, Nick Desaulniers wrote:
>> On Thu, Jan 7, 2021 at 3:27 PM David Hildenbrand  wrote:
>>>
>>>
 Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :

 On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  wrote:
>
> RISBHG is broken and currently hinders clang builds of upstream kernels
> from booting: the kernel crashes early, while decompressing the image.
>
>  [...]
>   Kernel fault: interruption code 0005 ilc:2
>   Kernel random base: 
>   PSW : 20018000 00017a1e
> R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
>   GPRS: 0001 000c 0003fff4 
> fff0
>  fff4 000c 
> fff0
> fffc  fff8 
> 008e25a8
> 0009 0002 0008 
> bce0
>
> One example of a buggy instruction is:
>
>17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
>
> With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
> results in %r1 = 0.
>
> Let's interpret values of i3/i4 as documented in the PoP and make
> computation of "mask" only based on i3 and i4 and use "pmask" only at the
> very end to make sure wrapping is only applied to the high/low doubleword.
>
> With this patch, I can successfully boot a v5.10 kernel built with
> clang, and gcc builds keep on working.
>
> Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
> Reported-by: Nick Desaulniers 
> Cc: Guenter Roeck 
> Cc: Christian Borntraeger 
> Signed-off-by: David Hildenbrand 
> ---
>
> This BUG was a nightmare to debug and the code a nightmare to understand.
>
> To make clang/gcc builds boot, the following fix is required as well on
> top of current master: "[PATCH] target/s390x: Fix ALGSI"
> https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com

 In that case, a huge thank you!!! for this work! ++beers_owed.

>>>
>>> :) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu 
>>> type.
>>
>> Hmm...so I don't think clang can build a Linux kernel image with
>> CONFIG_MARCH_Z13=y just yet; just defconfig.  Otherwise looks like
>> clang barfs on some of the inline asm constraints.
>>
> 
> Ah, right. I overwrote my manual config by a temporary defconfig :)
> 
> 
> So, I'm on x86-64 F33.
> 
> clang version 11.0.0 (Fedora 11.0.0-2.fc33)
> LLVM version 11.0.0
> 
> I cannot directly use "LLVM=1" for cross-compilation, as I keep getting
> "error: unknown emulation: elf64_s390" from ld.lld and "error: invalid
> output format: 'elf64-s390'" from llvm-objcopy. I assume that's fixed in
> llvm12?
> 
> 1. I patch around it (strange, I remember CC= .. used to work, but it no
> longer does)
> 
> ---
> 
> index e30cf02da8b8..89c57062ed5d 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -427,13 +427,13 @@ KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
>  CPP= $(CC) -E
>  ifneq ($(LLVM),)
>  CC = clang
> -LD = ld.lld
> -AR = llvm-ar
> -NM = llvm-nm
> -OBJCOPY= llvm-objcopy
> -OBJDUMP= llvm-objdump
> -READELF= llvm-readelf
> -STRIP  = llvm-strip
> +LD = $(CROSS_COMPILE)ld
> +AR = $(CROSS_COMPILE)ar
> +NM = $(CROSS_COMPILE)nm
> +OBJCOPY= $(CROSS_COMPILE)objcopy
> +OBJDUMP= $(CROSS_COMPILE)objdump
> +READELF= $(CROSS_COMPILE)readelf
> +STRIP  = $(CROSS_COMPILE)strip
>  else
>  CC = $(CROSS_COMPILE)gcc
>  LD = $(CROSS_COMPILE)ld
> 
> ---
> 
> 2. Compile using clang
> 
> 
> Using latest linux-next (1c925d2030afd354a02c23500386e620e662622b) +
> above patch
> 
> ---
> 
> #!/bin/bash
> export ARCH=s390;
> export CROSS_COMPILE=s390x-linux-gnu-
> export LLVM=1
> make distclean
> make defconfig
> 
> # Make F32 initrd boot without inserting modules
> ./scripts/config -e CONFIG_SCSI_ISCSI_ATTRS
> ./scripts/config -e CONFIG_ISCSI_TCP
> 
> make -j40 > /dev/null
> 
> ---
> 
> 3. Run it via QEMU. I boot a full Fedora 32 using the cloud-image +
> initrd from Fedora 32 (tried to stick to your cmdline where possible)
> 
> ./build/qemu-system-s390x \
> -m 512M \
> -cpu qemu \
> -display none \
> -nodefaults \
> -kernel ../linux-cross/arch/s390/boot/bzImage \
> -append "root=/dev/vda1 conmode=sclp console=ttyS0" \
> -initrd ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \
> -hda ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \

^ -hda ../Fedora-Cloud-Base-32-1.6.x86_64.qcow2 \


-- 
Thanks,

David / dhildenb




Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-08 Thread David Hildenbrand
On 08.01.21 03:20, Nick Desaulniers wrote:
> On Thu, Jan 7, 2021 at 3:27 PM David Hildenbrand  wrote:
>>
>>
>>> Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :
>>>
>>> On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  wrote:

 RISBHG is broken and currently hinders clang builds of upstream kernels
 from booting: the kernel crashes early, while decompressing the image.

  [...]
   Kernel fault: interruption code 0005 ilc:2
   Kernel random base: 
   PSW : 20018000 00017a1e
 R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
   GPRS: 0001 000c 0003fff4 fff0
  fff4 000c fff0
 fffc  fff8 008e25a8
 0009 0002 0008 bce0

 One example of a buggy instruction is:

17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32

 With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
 results in %r1 = 0.

 Let's interpret values of i3/i4 as documented in the PoP and make
 computation of "mask" only based on i3 and i4 and use "pmask" only at the
 very end to make sure wrapping is only applied to the high/low doubleword.

 With this patch, I can successfully boot a v5.10 kernel built with
 clang, and gcc builds keep on working.

 Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
 Reported-by: Nick Desaulniers 
 Cc: Guenter Roeck 
 Cc: Christian Borntraeger 
 Signed-off-by: David Hildenbrand 
 ---

 This BUG was a nightmare to debug and the code a nightmare to understand.

 To make clang/gcc builds boot, the following fix is required as well on
 top of current master: "[PATCH] target/s390x: Fix ALGSI"
 https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com
>>>
>>> In that case, a huge thank you!!! for this work! ++beers_owed.
>>>
>>
>> :) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu 
>> type.
> 
> Hmm...so I don't think clang can build a Linux kernel image with
> CONFIG_MARCH_Z13=y just yet; just defconfig.  Otherwise looks like
> clang barfs on some of the inline asm constraints.
> 

Ah, right. I overwrote my manual config by a temporary defconfig :)


So, I'm on x86-64 F33.

clang version 11.0.0 (Fedora 11.0.0-2.fc33)
LLVM version 11.0.0

I cannot directly use "LLVM=1" for cross-compilation, as I keep getting
"error: unknown emulation: elf64_s390" from ld.lld and "error: invalid
output format: 'elf64-s390'" from llvm-objcopy. I assume that's fixed in
llvm12?

1. I patch around it (strange, I remember CC= .. used to work, but it no
longer does)

---

index e30cf02da8b8..89c57062ed5d 100644
--- a/Makefile
+++ b/Makefile
@@ -427,13 +427,13 @@ KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
 CPP= $(CC) -E
 ifneq ($(LLVM),)
 CC = clang
-LD = ld.lld
-AR = llvm-ar
-NM = llvm-nm
-OBJCOPY= llvm-objcopy
-OBJDUMP= llvm-objdump
-READELF= llvm-readelf
-STRIP  = llvm-strip
+LD = $(CROSS_COMPILE)ld
+AR = $(CROSS_COMPILE)ar
+NM = $(CROSS_COMPILE)nm
+OBJCOPY= $(CROSS_COMPILE)objcopy
+OBJDUMP= $(CROSS_COMPILE)objdump
+READELF= $(CROSS_COMPILE)readelf
+STRIP  = $(CROSS_COMPILE)strip
 else
 CC = $(CROSS_COMPILE)gcc
 LD = $(CROSS_COMPILE)ld

---

2. Compile using clang


Using latest linux-next (1c925d2030afd354a02c23500386e620e662622b) +
above patch

---

#!/bin/bash
export ARCH=s390;
export CROSS_COMPILE=s390x-linux-gnu-
export LLVM=1
make distclean
make defconfig

# Make F32 initrd boot without inserting modules
./scripts/config -e CONFIG_SCSI_ISCSI_ATTRS
./scripts/config -e CONFIG_ISCSI_TCP

make -j40 > /dev/null

---

3. Run it via QEMU. I boot a full Fedora 32 using the cloud-image +
initrd from Fedora 32 (tried to stick to your cmdline where possible)

./build/qemu-system-s390x \
-m 512M \
-cpu qemu \
-display none \
-nodefaults \
-kernel ../linux-cross/arch/s390/boot/bzImage \
-append "root=/dev/vda1 conmode=sclp console=ttyS0" \
-initrd ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \
-hda ../Fedora-Cloud-Base-32-1.6.x86_64-initrd.img \
-serial mon:stdio


KASLR disabled: CPU has no PRNG
[0.408769] Linux version 5.11.0-rc2-next-20210108-dirty
(dhildenb@desktop) (clang version 11.0.0 (Fedora 11.0.0-2.fc33), GNU ld
version 2.35.1-1.fc33) #1 SMP Fri Jan 8 10:23:01 CET 2021
[0.410266] setup: Linux is running under KVM in 64-bit mode
[0.415840] setup: The maximum memory size is 512MB
[0.417278] cpu: 1 configured CPUs, 0 standby CPUs

...

Fedora 32 (Cloud Edition)
Kernel 5.11.0-rc2-next-20210108-dirty on 

Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-07 Thread Nick Desaulniers via
On Thu, Jan 7, 2021 at 3:27 PM David Hildenbrand  wrote:
>
>
> > Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :
> >
> > On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  wrote:
> >>
> >> RISBHG is broken and currently hinders clang builds of upstream kernels
> >> from booting: the kernel crashes early, while decompressing the image.
> >>
> >>  [...]
> >>   Kernel fault: interruption code 0005 ilc:2
> >>   Kernel random base: 
> >>   PSW : 20018000 00017a1e
> >> R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
> >>   GPRS: 0001 000c 0003fff4 fff0
> >>  fff4 000c fff0
> >> fffc  fff8 008e25a8
> >> 0009 0002 0008 bce0
> >>
> >> One example of a buggy instruction is:
> >>
> >>17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
> >>
> >> With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
> >> results in %r1 = 0.
> >>
> >> Let's interpret values of i3/i4 as documented in the PoP and make
> >> computation of "mask" only based on i3 and i4 and use "pmask" only at the
> >> very end to make sure wrapping is only applied to the high/low doubleword.
> >>
> >> With this patch, I can successfully boot a v5.10 kernel built with
> >> clang, and gcc builds keep on working.
> >>
> >> Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
> >> Reported-by: Nick Desaulniers 
> >> Cc: Guenter Roeck 
> >> Cc: Christian Borntraeger 
> >> Signed-off-by: David Hildenbrand 
> >> ---
> >>
> >> This BUG was a nightmare to debug and the code a nightmare to understand.
> >>
> >> To make clang/gcc builds boot, the following fix is required as well on
> >> top of current master: "[PATCH] target/s390x: Fix ALGSI"
> >> https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com
> >
> > In that case, a huge thank you!!! for this work! ++beers_owed.
> >
>
> :) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu type.

Hmm...so I don't think clang can build a Linux kernel image with
CONFIG_MARCH_Z13=y just yet; just defconfig.  Otherwise looks like
clang barfs on some of the inline asm constraints.

It looks like with your patch applied we get further into the boot!
I'm not seeing any output with:
$ /android0/qemu/build/qemu-system-s390x -cpu qemu -append
'conmode=sclp console=ttyS0' -display none -initrd
//boot-utils/images/s390/rootfs.cpio -kernel
arch/s390/boot/bzImage -m 512m -nodefaults -serial mon:stdio

(Based on a quick skim through
https://www.ibm.com/support/knowledgecenter/en/linuxonibm/com.ibm.linux.z.ludd/ludd_r_lmtkernelparameter.html).
Do I have all of those right?

If I attach GDB to QEMU running that kernel image, I was able to view
the print banner once via `lx-dmesg` gdb macro in the kernel, but it
seems on subsequent runs control flow gets diverted unexpected post
entry to start_kernel() always to `s390_base_pgm_handler` ...errr..at
least when I try to single step in GDB.  Tried with linux-5.10.y,
mainline, and linux-next.

qemu: 470dd6bd360782f5137f7e3376af6a44658eb1d3 + your patch
llvm: 106e66f3f555c8f887e82c5f04c3e77bdaf345e8
linux-5.10.y: d1988041d19dc8b532579bdbb7c4a978391c0011
linux: 71c061d2443814de15e177489d5cc00a4a253ef3
linux-next: f87684f6470f5f02bd47d4afb900366e5d2f31b6


(gdb) hbreak setup_arch
Hardware assisted breakpoint 1 at 0x142229e: file
arch/s390/kernel/setup.c, line 1091.
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x014222a0 in setup_arch (cmdline_p=0x11d7ed8) at
arch/s390/kernel/setup.c:1091
1091if (MACHINE_IS_VM)
(gdb) lx-dmesg
[0.376351] Linux version 5.11.0-rc2-00157-ga2885c701c30
(ndesaulni...@ndesaulniers1.mtv.corp.google.com) (Nick Desaulniers
clang version 12.0.0 (g...@github.com:llvm/llvm-project.git
e75fec2b238f0e26cfb7645f2208baebe3440d41), GNU ld (GNU Binutils for
Debian) 2.35.1) #81 SMP Thu Jan 7 17:57:34 PST 2021

>
> >>
> >> ---
> >> target/s390x/translate.c | 18 --
> >> 1 file changed, 8 insertions(+), 10 deletions(-)
> >>
> >> diff --git a/target/s390x/translate.c b/target/s390x/translate.c
> >> index 3d5c0d6106..39e33eeb67 100644
> >> --- a/target/s390x/translate.c
> >> +++ b/target/s390x/translate.c
> >> @@ -3815,22 +3815,23 @@ static DisasJumpType op_risbg(DisasContext *s, 
> >> DisasOps *o)
> >> pmask = 0xull;
> >> break;
> >> case 0x51: /* risblg */
> >> -i3 &= 31;
> >> -i4 &= 31;
> >> +i3 = (i3 & 31) + 32;
> >> +i4 = (i4 & 31) + 32;
> >> pmask = 0xull;
> >> break;
> >> default:
> >> g_assert_not_reached();
> >> }
> >>
> >> -/* MASK is the set of bits to be inserted from R2.
> >> -   Take care for I3/I4 wraparound.  */
> >> -mask = pmask >> i3;
> >> +/

Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-07 Thread Nick Desaulniers via
On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  wrote:
>
> RISBHG is broken and currently hinders clang builds of upstream kernels
> from booting: the kernel crashes early, while decompressing the image.
>
>   [...]
>Kernel fault: interruption code 0005 ilc:2
>Kernel random base: 
>PSW : 20018000 00017a1e
>  R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
>GPRS: 0001 000c 0003fff4 fff0
>   fff4 000c fff0
>  fffc  fff8 008e25a8
>  0009 0002 0008 bce0
>
> One example of a buggy instruction is:
>
> 17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
>
> With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
> results in %r1 = 0.
>
> Let's interpret values of i3/i4 as documented in the PoP and make
> computation of "mask" only based on i3 and i4 and use "pmask" only at the
> very end to make sure wrapping is only applied to the high/low doubleword.
>
> With this patch, I can successfully boot a v5.10 kernel built with
> clang, and gcc builds keep on working.
>
> Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
> Reported-by: Nick Desaulniers 
> Cc: Guenter Roeck 
> Cc: Christian Borntraeger 
> Signed-off-by: David Hildenbrand 
> ---
>
> This BUG was a nightmare to debug and the code a nightmare to understand.
>
> To make clang/gcc builds boot, the following fix is required as well on
> top of current master: "[PATCH] target/s390x: Fix ALGSI"
> https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com

In that case, a huge thank you!!! for this work! ++beers_owed.

>
> ---
>  target/s390x/translate.c | 18 --
>  1 file changed, 8 insertions(+), 10 deletions(-)
>
> diff --git a/target/s390x/translate.c b/target/s390x/translate.c
> index 3d5c0d6106..39e33eeb67 100644
> --- a/target/s390x/translate.c
> +++ b/target/s390x/translate.c
> @@ -3815,22 +3815,23 @@ static DisasJumpType op_risbg(DisasContext *s, 
> DisasOps *o)
>  pmask = 0xull;
>  break;
>  case 0x51: /* risblg */
> -i3 &= 31;
> -i4 &= 31;
> +i3 = (i3 & 31) + 32;
> +i4 = (i4 & 31) + 32;
>  pmask = 0xull;
>  break;
>  default:
>  g_assert_not_reached();
>  }
>
> -/* MASK is the set of bits to be inserted from R2.
> -   Take care for I3/I4 wraparound.  */
> -mask = pmask >> i3;
> +/* MASK is the set of bits to be inserted from R2. */
>  if (i3 <= i4) {
> -mask ^= pmask >> i4 >> 1;
> +/* [0...i3---i4...63] */
> +mask = (-1ull >> i3) & (-1ull << (63 - i4));
>  } else {
> -mask |= ~(pmask >> i4 >> 1);
> +/* [0---i4...i3---63] */
> +mask = (-1ull >> i3) | (-1ull << (63 - i4));
>  }

The expression evaluated looks the same to me for both sides of the
conditional, but the comments differ. Intentional?

> +/* For RISBLG/RISBHG, the wrapping is limited to the high/low 
> doubleword. */
>  mask &= pmask;
>
>  /* IMASK is the set of bits to be kept from R1.  In the case of the 
> high/low
> @@ -3843,9 +3844,6 @@ static DisasJumpType op_risbg(DisasContext *s, DisasOps 
> *o)
>  len = i4 - i3 + 1;
>  pos = 63 - i4;
>  rot = i5 & 63;
> -if (s->fields.op2 == 0x5d) {
> -pos += 32;
> -}
>
>  /* In some cases we can implement this with extract.  */
>  if (imask == 0 && pos == 0 && len > 0 && len <= rot) {
> --
> 2.29.2
>


-- 
Thanks,
~Nick Desaulniers



Re: [PATCH v1] s390x/tcg: Fix RISBHG

2021-01-07 Thread David Hildenbrand

> Am 08.01.2021 um 00:21 schrieb Nick Desaulniers :
> 
> On Thu, Jan 7, 2021 at 3:13 PM David Hildenbrand  wrote:
>> 
>> RISBHG is broken and currently hinders clang builds of upstream kernels
>> from booting: the kernel crashes early, while decompressing the image.
>> 
>>  [...]
>>   Kernel fault: interruption code 0005 ilc:2
>>   Kernel random base: 
>>   PSW : 20018000 00017a1e
>> R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
>>   GPRS: 0001 000c 0003fff4 fff0
>>  fff4 000c fff0
>> fffc  fff8 008e25a8
>> 0009 0002 0008 bce0
>> 
>> One example of a buggy instruction is:
>> 
>>17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32
>> 
>> With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
>> results in %r1 = 0.
>> 
>> Let's interpret values of i3/i4 as documented in the PoP and make
>> computation of "mask" only based on i3 and i4 and use "pmask" only at the
>> very end to make sure wrapping is only applied to the high/low doubleword.
>> 
>> With this patch, I can successfully boot a v5.10 kernel built with
>> clang, and gcc builds keep on working.
>> 
>> Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
>> Reported-by: Nick Desaulniers 
>> Cc: Guenter Roeck 
>> Cc: Christian Borntraeger 
>> Signed-off-by: David Hildenbrand 
>> ---
>> 
>> This BUG was a nightmare to debug and the code a nightmare to understand.
>> 
>> To make clang/gcc builds boot, the following fix is required as well on
>> top of current master: "[PATCH] target/s390x: Fix ALGSI"
>> https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com
> 
> In that case, a huge thank you!!! for this work! ++beers_owed.
> 

:) a kernel build for z13 should work with the (default) „-cpu qemu“ cpu type.

>> 
>> ---
>> target/s390x/translate.c | 18 --
>> 1 file changed, 8 insertions(+), 10 deletions(-)
>> 
>> diff --git a/target/s390x/translate.c b/target/s390x/translate.c
>> index 3d5c0d6106..39e33eeb67 100644
>> --- a/target/s390x/translate.c
>> +++ b/target/s390x/translate.c
>> @@ -3815,22 +3815,23 @@ static DisasJumpType op_risbg(DisasContext *s, 
>> DisasOps *o)
>> pmask = 0xull;
>> break;
>> case 0x51: /* risblg */
>> -i3 &= 31;
>> -i4 &= 31;
>> +i3 = (i3 & 31) + 32;
>> +i4 = (i4 & 31) + 32;
>> pmask = 0xull;
>> break;
>> default:
>> g_assert_not_reached();
>> }
>> 
>> -/* MASK is the set of bits to be inserted from R2.
>> -   Take care for I3/I4 wraparound.  */
>> -mask = pmask >> i3;
>> +/* MASK is the set of bits to be inserted from R2. */
>> if (i3 <= i4) {
>> -mask ^= pmask >> i4 >> 1;
>> +/* [0...i3---i4...63] */
>> +mask = (-1ull >> i3) & (-1ull << (63 - i4));
>> } else {
>> -mask |= ~(pmask >> i4 >> 1);
>> +/* [0---i4...i3---63] */
>> +mask = (-1ull >> i3) | (-1ull << (63 - i4));
>> }
> 
> The expression evaluated looks the same to me for both sides of the
> conditional, but the comments differ. Intentional?

& vs |, so the result differs.

Cheers!

[PATCH v1] s390x/tcg: Fix RISBHG

2021-01-07 Thread David Hildenbrand
RISBHG is broken and currently hinders clang builds of upstream kernels
from booting: the kernel crashes early, while decompressing the image.

  [...]
   Kernel fault: interruption code 0005 ilc:2
   Kernel random base: 
   PSW : 20018000 00017a1e
 R:0 T:0 IO:0 EX:0 Key:0 M:0 W:0 P:0 AS:0 CC:2 PM:0 RI:0 EA:3
   GPRS: 0001 000c 0003fff4 fff0
  fff4 000c fff0
 fffc  fff8 008e25a8
 0009 0002 0008 bce0

One example of a buggy instruction is:

17dde:   ec 1e 00 9f 20 5d   risbhg  %r1,%r14,0,159,32

With %r14 = 0x9 and %r1 = 0x7 should result in %r1 = 0x90007, however,
results in %r1 = 0.

Let's interpret values of i3/i4 as documented in the PoP and make
computation of "mask" only based on i3 and i4 and use "pmask" only at the
very end to make sure wrapping is only applied to the high/low doubleword.

With this patch, I can successfully boot a v5.10 kernel built with
clang, and gcc builds keep on working.

Fixes: 2d6a869833d9 ("target-s390: Implement RISBG")
Reported-by: Nick Desaulniers 
Cc: Guenter Roeck 
Cc: Christian Borntraeger 
Signed-off-by: David Hildenbrand 
---

This BUG was a nightmare to debug and the code a nightmare to understand.

To make clang/gcc builds boot, the following fix is required as well on
top of current master: "[PATCH] target/s390x: Fix ALGSI"
https://lkml.kernel.org/r/20210107202135.52379-1-da...@redhat.com

---
 target/s390x/translate.c | 18 --
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index 3d5c0d6106..39e33eeb67 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -3815,22 +3815,23 @@ static DisasJumpType op_risbg(DisasContext *s, DisasOps 
*o)
 pmask = 0xull;
 break;
 case 0x51: /* risblg */
-i3 &= 31;
-i4 &= 31;
+i3 = (i3 & 31) + 32;
+i4 = (i4 & 31) + 32;
 pmask = 0xull;
 break;
 default:
 g_assert_not_reached();
 }
 
-/* MASK is the set of bits to be inserted from R2.
-   Take care for I3/I4 wraparound.  */
-mask = pmask >> i3;
+/* MASK is the set of bits to be inserted from R2. */
 if (i3 <= i4) {
-mask ^= pmask >> i4 >> 1;
+/* [0...i3---i4...63] */
+mask = (-1ull >> i3) & (-1ull << (63 - i4));
 } else {
-mask |= ~(pmask >> i4 >> 1);
+/* [0---i4...i3---63] */
+mask = (-1ull >> i3) | (-1ull << (63 - i4));
 }
+/* For RISBLG/RISBHG, the wrapping is limited to the high/low doubleword. 
*/
 mask &= pmask;
 
 /* IMASK is the set of bits to be kept from R1.  In the case of the 
high/low
@@ -3843,9 +3844,6 @@ static DisasJumpType op_risbg(DisasContext *s, DisasOps 
*o)
 len = i4 - i3 + 1;
 pos = 63 - i4;
 rot = i5 & 63;
-if (s->fields.op2 == 0x5d) {
-pos += 32;
-}
 
 /* In some cases we can implement this with extract.  */
 if (imask == 0 && pos == 0 && len > 0 && len <= rot) {
-- 
2.29.2