Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp139442pxa; Tue, 4 Aug 2020 19:12:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzKBFgzSKhepoqL5jyF+xUiFU0wWyzFoikM29e3HE3aK1Edu+FcFU1OkX3RbtzgT/gfYkeD X-Received: by 2002:a17:906:e87:: with SMTP id p7mr977969ejf.547.1596593520155; Tue, 04 Aug 2020 19:12:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596593520; cv=none; d=google.com; s=arc-20160816; b=vNqsE45q/KP3Ojfp5kwc9PK0e6QXLbk8xpIrcL81KajDDlKHUzsdX2P4BPG4//KXjW KcH7ThYE65zAoGfHRGPKM3WEMO7VYZEqpjD4TWPNkqRlfuiwUy+RXgBLFIMnPLabOzis buBnU1SuJYi/zfSAs+tP9SctbyDcSL6ZOsmX+2t/i6Zp87lFXXnJBj94fr9/jl9Biy7N KA5+EUdHgdcSyS0z287eQTfv6jlqdJUJ+7JQa247qVMejNXzOeIqyvI+479ntPb84Ra5 CcSc2plUUcJICQCp2NfN18lbwp+7ooUti2MbMoynI3pUQuHQiQGQ9gxtb47OqfyoVQ94 PzAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=DH9f7hT2SXyvfDysbsL8zG2d1R/7okk2CTdx9rom5z8=; b=yCiegFWUoFGvstmf2XWbZGZjNd4/mZ8q8zDCHxeFqH2xiePKe/Pa81GpASfvXlmeUH RBEHb2Cg/8rpXxW0xFpfS7cTWkAakD995zT4aF3byznPIyQsPy32efiqOYWVbdtUWYaf tA41yOpClJDgm5vaXgZYsNYgEP8oN6bFuGUbZA2qZ1SfRkTU5MOtLigT8ywEnRABw493 GRCzD4kEy3KTbP1rp4gm+O6NfnWfbCqSSqdziVMN0UzL+I0e4BcJXVLW01IIDaC8jYU2 CU9DwZi29IKsYF0gX5AoigGyt6ZVkDOpkqgPyrHwDklAUDeppmEAYWUjOYtMS32lh95V yt3g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a7si380702ejg.108.2020.08.04.19.11.37; Tue, 04 Aug 2020 19:12:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726130AbgHECL1 (ORCPT + 99 others); Tue, 4 Aug 2020 22:11:27 -0400 Received: from mga17.intel.com ([192.55.52.151]:55732 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725864AbgHECL1 (ORCPT ); Tue, 4 Aug 2020 22:11:27 -0400 IronPort-SDR: 3CoqdszJAmEkmZm16I/Z4L0T/QtF9f57ymX4mbDM2DyIfHaeFSp+U+1JTA1ScaBsLrj9BYID69 i/kqkY2wELxQ== X-IronPort-AV: E=McAfee;i="6000,8403,9703"; a="132527039" X-IronPort-AV: E=Sophos;i="5.75,436,1589266800"; d="scan'208";a="132527039" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2020 19:11:26 -0700 IronPort-SDR: 7YZv9kSyXHYI1/6wKsTsJNloUdG9Cga/wALKClNATycnIJE6k2WjwseoQyZ1ZcyItT6NMQwClN hE46hxDjbpYg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,436,1589266800"; d="scan'208";a="322962027" Received: from ranerica-svr.sc.intel.com ([172.25.110.23]) by orsmga008.jf.intel.com with ESMTP; 04 Aug 2020 19:11:26 -0700 From: Ricardo Neri To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Andy Lutomirski , x86@kernel.org, "Peter Zijlstra (Intel)" Cc: Dave Hansen , Tony Luck , Cathy Zhang , Fenghua Yu , "H. Peter Anvin" , Kyung Min Park , "Ravi V. Shankar" , Sean Christopherson , linux-kernel@vger.kernel.org, Ricardo Neri , Ricardo Neri , Dave Hansen , linux-edac@vger.kernel.org Subject: [PATCH v2] x86/cpu: Use SERIALIZE in sync_core() when available Date: Tue, 4 Aug 2020 19:10:59 -0700 Message-Id: <20200805021059.1331-1-ricardo.neri-calderon@linux.intel.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The SERIALIZE instruction gives software a way to force the processor to complete all modifications to flags, registers and memory from previous instructions and drain all buffered writes to memory before the next instruction is fetched and executed. Thus, it serves the purpose of sync_core(). Use it when available. Commit 7117f16bf460 ("objtool: Fix ORC vs alternatives") enforced stack invariance in alternatives. The iret-to-self does not comply with such invariance. Thus, it cannot be used inside alternative code. Instead, use an alternative that jumps to SERIALIZE when available. Cc: Andy Lutomirski Cc: Cathy Zhang Cc: Dave Hansen Cc: Fenghua Yu Cc: "H. Peter Anvin" Cc: Kyung Min Park Cc: Peter Zijlstra Cc: "Ravi V. Shankar" Cc: Sean Christopherson Cc: linux-edac@vger.kernel.org Cc: linux-kernel@vger.kernel.org Suggested-by: Andy Lutomirski Signed-off-by: Ricardo Neri --- This is a v2 from my initial submission [1]. The first three patches of the series have been merged in Linus' tree. Hence, I am submitting only this patch for review. [1]. https://lkml.org/lkml/2020/7/27/8 Changes since v1: * Support SERIALIZE using alternative runtime patching. (Peter Zijlstra, H. Peter Anvin) * Added a note to specify which version of binutils supports SERIALIZE. (Peter Zijlstra) * Verified that (::: "memory") is used. (H. Peter Anvin) --- arch/x86/include/asm/special_insns.h | 2 ++ arch/x86/include/asm/sync_core.h | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h index 59a3e13204c3..25cd67801dda 100644 --- a/arch/x86/include/asm/special_insns.h +++ b/arch/x86/include/asm/special_insns.h @@ -10,6 +10,8 @@ #include #include +/* Instruction opcode for SERIALIZE; supported in binutils >= 2.35. */ +#define __ASM_SERIALIZE ".byte 0xf, 0x1, 0xe8" /* * Volatile isn't enough to prevent the compiler from reordering the * read/write functions for the control registers and messing everything up. diff --git a/arch/x86/include/asm/sync_core.h b/arch/x86/include/asm/sync_core.h index fdb5b356e59b..201ea3d9a6bd 100644 --- a/arch/x86/include/asm/sync_core.h +++ b/arch/x86/include/asm/sync_core.h @@ -5,15 +5,19 @@ #include #include #include +#include #ifdef CONFIG_X86_32 static inline void iret_to_self(void) { asm volatile ( + ALTERNATIVE("", "jmp 2f", X86_FEATURE_SERIALIZE) "pushfl\n\t" "pushl %%cs\n\t" "pushl $1f\n\t" "iret\n\t" + "2:\n\t" + __ASM_SERIALIZE "\n" "1:" : ASM_CALL_CONSTRAINT : : "memory"); } @@ -23,6 +27,7 @@ static inline void iret_to_self(void) unsigned int tmp; asm volatile ( + ALTERNATIVE("", "jmp 2f", X86_FEATURE_SERIALIZE) "mov %%ss, %0\n\t" "pushq %q0\n\t" "pushq %%rsp\n\t" @@ -32,6 +37,8 @@ static inline void iret_to_self(void) "pushq %q0\n\t" "pushq $1f\n\t" "iretq\n\t" + "2:\n\t" + __ASM_SERIALIZE "\n" "1:" : "=&r" (tmp), ASM_CALL_CONSTRAINT : : "cc", "memory"); } @@ -54,7 +61,8 @@ static inline void iret_to_self(void) static inline void sync_core(void) { /* - * There are quite a few ways to do this. IRET-to-self is nice + * Hardware can do this for us if SERIALIZE is available. Otherwise, + * there are quite a few ways to do this. IRET-to-self is nice * because it works on every CPU, at any CPL (so it's compatible * with paravirtualization), and it never exits to a hypervisor. * The only down sides are that it's a bit slow (it seems to be -- 2.17.1