Skip to content

Commit

Permalink
s390/checksum: always use cksm instruction
Browse files Browse the repository at this point in the history
[ Upstream commit e42ac77 ]

Commit dfe843d ("s390/checksum: support GENERIC_CSUM, enable it for
KASAN") switched s390 to use the generic checksum functions, so that KASAN
instrumentation also works checksum functions by avoiding architecture
specific inline assemblies.

There is however the problem that the generic csum_partial() function
returns a 32 bit value with a 16 bit folded checksum, while the original
s390 variant does not fold to 16 bit. This in turn causes that the
ipib_checksum in lowcore contains different values depending on kernel
config options.

The ipib_checksum is used by system dumpers to verify if pointers in
lowcore point to valid data. Verification is done by comparing checksum
values. The system dumpers still use 32 bit checksum values which are not
folded, and therefore the checksum verification fails (incorrectly).

Symptom is that reboot after dump does not work anymore when a KASAN
instrumented kernel is dumped.

Fix this by not using the generic checksum implementation. Instead add an
explicit kasan_check_read() so that KASAN knows about the read access from
within the inline assembly.

Reported-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Fixes: dfe843d ("s390/checksum: support GENERIC_CSUM, enable it for KASAN")
Tested-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
hcahca authored and gregkh committed May 11, 2023
1 parent 3ee6d31 commit bd62631
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 11 deletions.
4 changes: 0 additions & 4 deletions arch/s390/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ config GENERIC_BUG
config GENERIC_BUG_RELATIVE_POINTERS
def_bool y

config GENERIC_CSUM
bool
default y if KASAN

config GENERIC_LOCKBREAK
def_bool y if PREEMPTION

Expand Down
9 changes: 2 additions & 7 deletions arch/s390/include/asm/checksum.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,7 @@
#ifndef _S390_CHECKSUM_H
#define _S390_CHECKSUM_H

#ifdef CONFIG_GENERIC_CSUM

#include <asm-generic/checksum.h>

#else /* CONFIG_GENERIC_CSUM */

#include <linux/kasan-checks.h>
#include <linux/uaccess.h>
#include <linux/in6.h>

Expand All @@ -40,6 +35,7 @@ static inline __wsum csum_partial(const void *buff, int len, __wsum sum)
.odd = (unsigned long) len,
};

kasan_check_read(buff, len);
asm volatile(
"0: cksm %[sum],%[rp]\n"
" jo 0b\n"
Expand Down Expand Up @@ -135,5 +131,4 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
return csum_fold((__force __wsum)(sum >> 32));
}

#endif /* CONFIG_GENERIC_CSUM */
#endif /* _S390_CHECKSUM_H */

0 comments on commit bd62631

Please sign in to comment.