Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390: select ARCH_SUPPORTS_INT128

s390 has instructions to support 128 bit arithmetics, e.g. a 64 bit
multiply instruction with a 128 bit result. Also 128 bit integer
artithmetics are already used in s390 specific architecture code (see
e.g. read_persistent_clock64()).

Therefore select ARCH_SUPPORTS_INT128.

However limit this to clang for now, since gcc generates inefficient code,
which may lead to stack overflows, when compiling
lib/crypto/curve25519-hacl64.c which depends on ARCH_SUPPORTS_INT128. The
gcc generated functions have 6kb stack frames, compared to only 1kb of the
code generated with clang.

If the kernel is compiled with -Os library calls for __ashlti3(),
__ashrti3(), and __lshrti3() may be generated. Similar to arm64
and riscv provide assembler implementations for these functions.

Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>

authored by

Heiko Carstens and committed by
Alexander Gordeev
fbac266f 1f2597cd

+69 -1
+1
arch/s390/Kconfig
··· 117 117 select ARCH_SUPPORTS_ATOMIC_RMW 118 118 select ARCH_SUPPORTS_DEBUG_PAGEALLOC 119 119 select ARCH_SUPPORTS_HUGETLBFS 120 + select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && CC_IS_CLANG 120 121 select ARCH_SUPPORTS_NUMA_BALANCING 121 122 select ARCH_SUPPORTS_PER_VMA_LOCK 122 123 select ARCH_USE_BUILTIN_BSWAP
+4
arch/s390/include/asm/asm-prototypes.h
··· 6 6 #include <asm/fpu/api.h> 7 7 #include <asm-generic/asm-prototypes.h> 8 8 9 + __int128_t __ashlti3(__int128_t a, int b); 10 + __int128_t __ashrti3(__int128_t a, int b); 11 + __int128_t __lshrti3(__int128_t a, int b); 12 + 9 13 #endif /* _ASM_S390_PROTOTYPES_H */
+1 -1
arch/s390/lib/Makefile
··· 3 3 # Makefile for s390-specific library files.. 4 4 # 5 5 6 - lib-y += delay.o string.o uaccess.o find.o spinlock.o 6 + lib-y += delay.o string.o uaccess.o find.o spinlock.o tishift.o 7 7 obj-y += mem.o xor.o 8 8 lib-$(CONFIG_KPROBES) += probes.o 9 9 lib-$(CONFIG_UPROBES) += probes.o
+63
arch/s390/lib/tishift.S
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + 3 + #include <linux/linkage.h> 4 + #include <asm/nospec-insn.h> 5 + #include <asm/export.h> 6 + 7 + .section .noinstr.text, "ax" 8 + 9 + GEN_BR_THUNK %r14 10 + 11 + SYM_FUNC_START(__ashlti3) 12 + lmg %r0,%r1,0(%r3) 13 + cije %r4,0,1f 14 + lhi %r3,64 15 + sr %r3,%r4 16 + jnh 0f 17 + srlg %r3,%r1,0(%r3) 18 + sllg %r0,%r0,0(%r4) 19 + sllg %r1,%r1,0(%r4) 20 + ogr %r0,%r3 21 + j 1f 22 + 0: sllg %r0,%r1,-64(%r4) 23 + lghi %r1,0 24 + 1: stmg %r0,%r1,0(%r2) 25 + BR_EX %r14 26 + SYM_FUNC_END(__ashlti3) 27 + EXPORT_SYMBOL(__ashlti3) 28 + 29 + SYM_FUNC_START(__ashrti3) 30 + lmg %r0,%r1,0(%r3) 31 + cije %r4,0,1f 32 + lhi %r3,64 33 + sr %r3,%r4 34 + jnh 0f 35 + sllg %r3,%r0,0(%r3) 36 + srlg %r1,%r1,0(%r4) 37 + srag %r0,%r0,0(%r4) 38 + ogr %r1,%r3 39 + j 1f 40 + 0: srag %r1,%r0,-64(%r4) 41 + srag %r0,%r0,63 42 + 1: stmg %r0,%r1,0(%r2) 43 + BR_EX %r14 44 + SYM_FUNC_END(__ashrti3) 45 + EXPORT_SYMBOL(__ashrti3) 46 + 47 + SYM_FUNC_START(__lshrti3) 48 + lmg %r0,%r1,0(%r3) 49 + cije %r4,0,1f 50 + lhi %r3,64 51 + sr %r3,%r4 52 + jnh 0f 53 + sllg %r3,%r0,0(%r3) 54 + srlg %r1,%r1,0(%r4) 55 + srlg %r0,%r0,0(%r4) 56 + ogr %r1,%r3 57 + j 1f 58 + 0: srlg %r1,%r0,-64(%r4) 59 + lghi %r0,0 60 + 1: stmg %r0,%r1,0(%r2) 61 + BR_EX %r14 62 + SYM_FUNC_END(__lshrti3) 63 + EXPORT_SYMBOL(__lshrti3)