mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 23:27:06 +00:00
s390/checksum: always use cksm instruction
Commitdfe843dce7
("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:dfe843dce7
("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>
This commit is contained in:
parent
b94c0ebb1e
commit
e42ac7789d
2 changed files with 2 additions and 11 deletions
|
@ -26,10 +26,6 @@ config GENERIC_BUG
|
||||||
config GENERIC_BUG_RELATIVE_POINTERS
|
config GENERIC_BUG_RELATIVE_POINTERS
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
config GENERIC_CSUM
|
|
||||||
bool
|
|
||||||
default y if KASAN
|
|
||||||
|
|
||||||
config GENERIC_LOCKBREAK
|
config GENERIC_LOCKBREAK
|
||||||
def_bool y if PREEMPTION
|
def_bool y if PREEMPTION
|
||||||
|
|
||||||
|
|
|
@ -12,12 +12,7 @@
|
||||||
#ifndef _S390_CHECKSUM_H
|
#ifndef _S390_CHECKSUM_H
|
||||||
#define _S390_CHECKSUM_H
|
#define _S390_CHECKSUM_H
|
||||||
|
|
||||||
#ifdef CONFIG_GENERIC_CSUM
|
#include <linux/kasan-checks.h>
|
||||||
|
|
||||||
#include <asm-generic/checksum.h>
|
|
||||||
|
|
||||||
#else /* CONFIG_GENERIC_CSUM */
|
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/in6.h>
|
#include <linux/in6.h>
|
||||||
|
|
||||||
|
@ -40,6 +35,7 @@ static inline __wsum csum_partial(const void *buff, int len, __wsum sum)
|
||||||
.odd = (unsigned long) len,
|
.odd = (unsigned long) len,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
kasan_check_read(buff, len);
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"0: cksm %[sum],%[rp]\n"
|
"0: cksm %[sum],%[rp]\n"
|
||||||
" jo 0b\n"
|
" jo 0b\n"
|
||||||
|
@ -135,5 +131,4 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||||
return csum_fold((__force __wsum)(sum >> 32));
|
return csum_fold((__force __wsum)(sum >> 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_GENERIC_CSUM */
|
|
||||||
#endif /* _S390_CHECKSUM_H */
|
#endif /* _S390_CHECKSUM_H */
|
||||||
|
|
Loading…
Reference in a new issue