Miroslav Franc eaf6fd
From: Vasily Gorbik <gor@linux.ibm.com>
Miroslav Franc eaf6fd
Date: Wed, 17 Jun 2020 15:05:49 +0200
Miroslav Franc eaf6fd
Subject: s390/kasan: fix early pgm check handler execution
Miroslav Franc eaf6fd
Git-commit: 998f5bbe3dbdab81c1cfb1aef7c3892f5d24f6c7
Miroslav Franc eaf6fd
Patch-mainline: v5.8-rc3
Miroslav Franc eaf6fd
References: git-fixes bsc#1211360
Miroslav Franc eaf6fd
Miroslav Franc eaf6fd
Currently if early_pgm_check_handler is called it ends up in pgm check
Miroslav Franc eaf6fd
loop. The problem is that early_pgm_check_handler is instrumented by
Miroslav Franc eaf6fd
KASAN but executed without DAT flag enabled which leads to addressing
Miroslav Franc eaf6fd
exception when KASAN checks try to access shadow memory.
Miroslav Franc eaf6fd
Miroslav Franc eaf6fd
Fix that by executing early handlers with DAT flag on under KASAN as
Miroslav Franc eaf6fd
expected.
Miroslav Franc eaf6fd
Miroslav Franc eaf6fd
Reported-and-tested-by: Alexander Egorenkov <egorenar@linux.ibm.com>
Miroslav Franc eaf6fd
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Miroslav Franc eaf6fd
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Miroslav Franc eaf6fd
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Miroslav Franc eaf6fd
Acked-by: Miroslav Franc <mfranc@suse.cz>
Miroslav Franc eaf6fd
---
Miroslav Franc eaf6fd
 arch/s390/kernel/early.c | 2 ++
Miroslav Franc eaf6fd
 1 file changed, 2 insertions(+)
Miroslav Franc eaf6fd
Miroslav Franc eaf6fd
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c
Miroslav Franc eaf6fd
index cd241ee66eff..078277231858 100644
Miroslav Franc eaf6fd
--- a/arch/s390/kernel/early.c
Miroslav Franc eaf6fd
+++ b/arch/s390/kernel/early.c
Miroslav Franc eaf6fd
@@ -170,6 +170,8 @@ static noinline __init void setup_lowcore_early(void)
Miroslav Franc eaf6fd
 	psw_t psw;
Miroslav Franc eaf6fd
 
Miroslav Franc eaf6fd
 	psw.mask = PSW_MASK_BASE | PSW_DEFAULT_KEY | PSW_MASK_EA | PSW_MASK_BA;
Miroslav Franc eaf6fd
+	if (IS_ENABLED(CONFIG_KASAN))
Miroslav Franc eaf6fd
+		psw.mask |= PSW_MASK_DAT;
Miroslav Franc eaf6fd
 	psw.addr = (unsigned long) s390_base_ext_handler;
Miroslav Franc eaf6fd
 	S390_lowcore.external_new_psw = psw;
Miroslav Franc eaf6fd
 	psw.addr = (unsigned long) s390_base_pgm_handler;
Miroslav Franc eaf6fd