Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752703AbeAQJwY (ORCPT + 1 other); Wed, 17 Jan 2018 04:52:24 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:37510 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752422AbeAQJst (ORCPT ); Wed, 17 Jan 2018 04:48:49 -0500 From: Martin Schwidefsky To: linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org, kvm@vger.kernel.org Cc: Heiko Carstens , Paolo Bonzini , Cornelia Huck , Greg Kroah-Hartman , Jon Masters , Marcus Meissner , Jiri Kosina Subject: [PATCH 2/6] s390: implement nospec_[load|ptr] Date: Wed, 17 Jan 2018 10:48:35 +0100 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516182519-10623-1-git-send-email-schwidefsky@de.ibm.com> References: <1516182519-10623-1-git-send-email-schwidefsky@de.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18011709-0012-0000-0000-000005A4AAB9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18011709-0013-0000-0000-0000192020B8 Message-Id: <1516182519-10623-3-git-send-email-schwidefsky@de.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-01-17_03:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=2 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1801170141 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: Implement nospec_load() and nospec_ptr() for s390 with the new gmb() barrier between the boundary condition and the load that may not be done speculatively. Acked-by: Christian Borntraeger Signed-off-by: Martin Schwidefsky --- arch/s390/include/asm/barrier.h | 38 ++++++++++++++++++++++++++++++++++++++ arch/s390/kernel/alternative.c | 7 +++++++ 2 files changed, 45 insertions(+) diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index 1043260..b8836a6 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h @@ -8,6 +8,8 @@ #ifndef __ASM_BARRIER_H #define __ASM_BARRIER_H +#include + /* * Force strict CPU ordering. * And yes, this is required on UP too when we're talking @@ -23,6 +25,42 @@ #define mb() do { asm volatile(__ASM_BARRIER : : : "memory"); } while (0) +static inline void gmb(void) +{ + asm volatile( + ALTERNATIVE("", ".long 0xb2e8f000", 81) + : : : "memory"); +} +#define gmb gmb + +#define nospec_ptr(ptr, lo, hi) \ +({ \ + typeof (ptr) __ptr = (ptr); \ + typeof (ptr) __lo = (lo); \ + typeof (ptr) __hi = (hi); \ + typeof (ptr) __vptr = NULL; \ + \ + if (__lo <= __ptr && __ptr < __hi) { \ + gmb(); \ + __vptr = __ptr; \ + } \ + __vptr; \ +}) + +#define nospec_load(ptr, lo, hi) \ +({ \ + typeof (ptr) __ptr = (ptr); \ + typeof (ptr) __lo = (lo); \ + typeof (ptr) __hi = (hi); \ + typeof (*ptr) __v = (typeof(*__ptr))(unsigned long) 0; \ + \ + if (__lo <= __ptr && __ptr < __hi) { \ + gmb(); \ + __v = *__ptr; \ + } \ + __v; \ +}) + #define rmb() barrier() #define wmb() barrier() #define dma_rmb() mb() diff --git a/arch/s390/kernel/alternative.c b/arch/s390/kernel/alternative.c index 1abf4f3..33d2e88 100644 --- a/arch/s390/kernel/alternative.c +++ b/arch/s390/kernel/alternative.c @@ -15,6 +15,13 @@ static int __init disable_alternative_instructions(char *str) early_param("noaltinstr", disable_alternative_instructions); +static int __init nogmb_setup_early(char *str) +{ + __clear_facility(81, S390_lowcore.alt_stfle_fac_list); + return 0; +} +early_param("nogmb", nogmb_setup_early); + struct brcl_insn { u16 opc; s32 disp; -- 2.7.4