From: Heiko Carstens Date: Sun, 2 Jul 2023 19:20:09 +0000 (+0200) Subject: s390/diag: handle diag 204 subcode 4 address correctly X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=c83cd4fe31d52bca0587370d9e98f00072aefa27;p=linux.git s390/diag: handle diag 204 subcode 4 address correctly Diagnose 204 subcode 4 requires a real (physical) address, but a virtual address is passed to the inline assembly. Convert the address to a physical address for only this specific case. Acked-by: Alexander Gordeev Reviewed-by: Christian Borntraeger Signed-off-by: Heiko Carstens --- diff --git a/arch/s390/include/asm/diag.h b/arch/s390/include/asm/diag.h index fb5a886ff47ff..bed804137537b 100644 --- a/arch/s390/include/asm/diag.h +++ b/arch/s390/include/asm/diag.h @@ -109,6 +109,8 @@ enum diag204_sc { DIAG204_SUBC_STIB7 = 7 }; +#define DIAG204_SUBCODE_MASK 0xffff + /* The two available diag 204 data formats */ enum diag204_format { DIAG204_INFO_SIMPLE = 0, diff --git a/arch/s390/kernel/diag.c b/arch/s390/kernel/diag.c index cca56b649ca3b..f3a0f39cbd6cc 100644 --- a/arch/s390/kernel/diag.c +++ b/arch/s390/kernel/diag.c @@ -171,6 +171,8 @@ static inline int __diag204(unsigned long *subcode, unsigned long size, void *ad int diag204(unsigned long subcode, unsigned long size, void *addr) { diag_stat_inc(DIAG_STAT_X204); + if ((subcode & DIAG204_SUBCODE_MASK) == DIAG204_SUBC_STIB4) + addr = (void *)__pa(addr); size = __diag204(&subcode, size, addr); if (subcode) return -1;