]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
s390: Revert support for DCACHE_WORD_ACCESS
authorHeiko Carstens <hca@linux.ibm.com>
Thu, 11 Jun 2026 15:37:46 +0000 (17:37 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Fri, 12 Jun 2026 09:30:25 +0000 (11:30 +0200)
load_unaligned_zeropad() reads eight bytes from unaligned addresses and may
cross page boundaries. It handles exceptions which may happen if reading
from the second page results in an exception.

For pages which are donated to the Ultravisor for secure execution purposes
the do_secure_storage_access() exception handler however does not handle
such exceptions correctly. Such an exception may result in an endless
exception loop which will never be resolved.

An attempt to fix this [1] turned out to be not sufficient. For now revert
load_unaligned_zeropad() until this problem has been resolved in a proper
way.

Note that the implementation of load_unaligned_zeropad() itself is
correct. The revert is just a temporary workaround until there is complete
fix for secure storage access exceptions.

[1] commit b00be77302d7 ("s390/mm: Add missing secure storage access fixups for donated memory")

Fixes: 802ba53eefc5 ("s390: add support for DCACHE_WORD_ACCESS")
Cc: stable@vger.kernel.org
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/Kconfig
arch/s390/include/asm/asm-extable.h
arch/s390/include/asm/word-at-a-time.h
arch/s390/mm/extable.c

index fe5eebaecb7c5317e685e8b1b53d20a7956751ba..33988cc96af1d81ba2220c991935db7f4df06f52 100644 (file)
@@ -166,7 +166,6 @@ config S390
        select ARCH_WANTS_THP_SWAP
        select BUILDTIME_TABLE_SORT
        select CLONE_BACKWARDS2
-       select DCACHE_WORD_ACCESS if !KMSAN
        select DYNAMIC_FTRACE if FUNCTION_TRACER
        select FUNCTION_ALIGNMENT_8B if CC_IS_GCC
        select FUNCTION_ALIGNMENT_16B if !CC_IS_GCC
index d23ea0c94e4ea643be85575ba653856bf2d0a733..99748c20e76713d002faa303d85f55af8c7f523c 100644 (file)
@@ -12,7 +12,6 @@
 #define EX_TYPE_UA_FAULT       3
 #define EX_TYPE_UA_LOAD_REG    5
 #define EX_TYPE_UA_LOAD_REGPAIR        6
-#define EX_TYPE_ZEROPAD                7
 #define EX_TYPE_FPC            8
 #define EX_TYPE_UA_MVCOS_TO    9
 #define EX_TYPE_UA_MVCOS_FROM  10
@@ -80,9 +79,6 @@
 #define EX_TABLE_UA_LOAD_REGPAIR(_fault, _target, _regerr, _regzero)   \
        __EX_TABLE(__ex_table, _fault, _target, EX_TYPE_UA_LOAD_REGPAIR, _regerr, _regzero, 0)
 
-#define EX_TABLE_ZEROPAD(_fault, _target, _regdata, _regaddr)          \
-       __EX_TABLE(__ex_table, _fault, _target, EX_TYPE_ZEROPAD, _regdata, _regaddr, 0)
-
 #define EX_TABLE_FPC(_fault, _target)                                  \
        __EX_TABLE(__ex_table, _fault, _target, EX_TYPE_FPC, __stringify(%%r0), __stringify(%%r0), 0)
 
index eaa19dee7699415b4d27236be3bb4224f5806155..e9287036392d08b2a992277e77e5c30cc61165a9 100644 (file)
@@ -4,7 +4,6 @@
 
 #include <linux/bitops.h>
 #include <linux/wordpart.h>
-#include <asm/asm-extable.h>
 #include <asm/bitsperlong.h>
 
 struct word_at_a_time {
@@ -41,25 +40,4 @@ static inline unsigned long zero_bytemask(unsigned long data)
        return ~1UL << data;
 }
 
-/*
- * Load an unaligned word from kernel space.
- *
- * In the (very unlikely) case of the word being a page-crosser
- * and the next page not being mapped, take the exception and
- * return zeroes in the non-existing part.
- */
-static inline unsigned long load_unaligned_zeropad(const void *addr)
-{
-       unsigned long data;
-
-       asm_inline volatile(
-               "0:     lg      %[data],0(%[addr])\n"
-               "1:     nopr    %%r7\n"
-               EX_TABLE_ZEROPAD(0b, 1b, %[data], %[addr])
-               EX_TABLE_ZEROPAD(1b, 1b, %[data], %[addr])
-               : [data] "=d" (data)
-               : [addr] "a" (addr), "m" (*(unsigned long *)addr));
-       return data;
-}
-
 #endif /* _ASM_WORD_AT_A_TIME_H */
index 7498e858c401950714d5fa02adb12e8b28a2fd98..063b4346742d9656803d2e40a66b87b5c7a8d385 100644 (file)
@@ -50,22 +50,6 @@ static bool ex_handler_ua_load_reg(const struct exception_table_entry *ex,
        return true;
 }
 
-static bool ex_handler_zeropad(const struct exception_table_entry *ex, struct pt_regs *regs)
-{
-       unsigned int reg_addr = FIELD_GET(EX_DATA_REG_ADDR, ex->data);
-       unsigned int reg_data = FIELD_GET(EX_DATA_REG_ERR, ex->data);
-       unsigned long data, addr, offset;
-
-       addr = regs->gprs[reg_addr];
-       offset = addr & (sizeof(unsigned long) - 1);
-       addr &= ~(sizeof(unsigned long) - 1);
-       data = *(unsigned long *)addr;
-       data <<= BITS_PER_BYTE * offset;
-       regs->gprs[reg_data] = data;
-       regs->psw.addr = extable_fixup(ex);
-       return true;
-}
-
 static bool ex_handler_fpc(const struct exception_table_entry *ex, struct pt_regs *regs)
 {
        fpu_sfpc(0);
@@ -134,8 +118,6 @@ bool fixup_exception(struct pt_regs *regs)
                return ex_handler_ua_load_reg(ex, false, regs);
        case EX_TYPE_UA_LOAD_REGPAIR:
                return ex_handler_ua_load_reg(ex, true, regs);
-       case EX_TYPE_ZEROPAD:
-               return ex_handler_zeropad(ex, regs);
        case EX_TYPE_FPC:
                return ex_handler_fpc(ex, regs);
        case EX_TYPE_UA_MVCOS_TO: