From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755490AbbEUI7k (ORCPT ); Thu, 21 May 2015 04:59:40 -0400 Received: from mail-bl2on0145.outbound.protection.outlook.com ([65.55.169.145]:41280 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751722AbbEUI7h (ORCPT ); Thu, 21 May 2015 04:59:37 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; intel.com; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NOOZN8-07-LHX-02 X-M-MSG: Date: Thu, 21 May 2015 16:54:29 +0800 From: Huang Rui To: Borislav Petkov CC: Len Brown , "Rafael J. Wysocki" , Thomas Gleixner , "x86@kernel.org" , "linux-kernel@vger.kernel.org" , Fengguang Wu , Aaron Lu , "Li, Tony" Subject: Re: [RFC PATCH 1/4] x86, mwaitt: add monitorx and mwaitx instruction Message-ID: <20150521085428.GB20838@hr-slim.amd.com> References: <1432022472-2224-1-git-send-email-ray.huang@amd.com> <1432022472-2224-2-git-send-email-ray.huang@amd.com> <20150519112945.GC4819@pd.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20150519112945.GC4819@pd.tnic> User-Agent: Mutt/1.5.21 (2010-09-15) X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD042;1:LDlSHPCNCNBVPyCwHc028S16DqVHwBHGthl0CfQP//EQe7KTSDie0sXHCWjqH5SdFfvq6qGIZ6e/AcH35CHp9Ef2E+AKRXsZbVHsXEh5Txe2dgcZtztww/KunKnVTQHyXHtOl+KJM3r4rN3Z/Xy8MwMERCuiRAC/S7TECrxt8LkQYEV6f3qPldL/+A3LCBIrIzQjOX9OtSHQ6wZoaNPqdhhhLCEpZBt4ErH4Of11Bz3YD1VfZDARFCn4Ee+k2IyhOZ17ZYD0GSwCPZ5uQAZY6Z7F1s8+ga2SZWaX3c/eOgR3QRUVf4yDFHYZ3GVhCWX6qP+kmxhomfkMwOgr7Zjy2w== X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(428002)(51704005)(199003)(189002)(164054003)(24454002)(5001830100001)(105586002)(97736004)(87936001)(62966003)(77156002)(5001860100001)(50986999)(54356999)(76176999)(97756001)(4001350100001)(92566002)(4001540100001)(83506001)(23726002)(86362001)(46406003)(575784001)(101416001)(47776003)(50466002)(19580395003)(19580405001)(64706001)(53416004)(33656002)(106466001)(2950100001)(189998001)(77096005)(46102003)(110136002)(68736005)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR02MB241;H:atltwp01.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB241; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BLUPR02MB241;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB241; X-Forefront-PRVS: 0583A86C08 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 May 2015 08:59:33.3124 (UTC) X-MS-Exchange-CrossTenant-Id: fde4dada-be84-483f-92cc-e026cbee8e96 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fde4dada-be84-483f-92cc-e026cbee8e96;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR02MB241 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 19, 2015 at 07:29:45PM +0800, Borislav Petkov wrote: > On Tue, May 19, 2015 at 04:01:09PM +0800, Huang Rui wrote: > > On AMD Carrizo processors (Family 15h, Model 60h-6fh), there is a new > > feature called MWAITT (Mwait with a timer) as an extension of > > Monitor/Mwait. > > > > MWAITT, another name is MWAITX (MWAIT with extensions), has a configurable > > timer that causes MWAITX to exit on expiration. > > > > Compared with MONITOR/MWAIT, there are minor differences in opcode and > > input parameters. > > > > MWAITX ECX[1]: enable timer if set > > MWAITX EBX[31:0]: max wait time expressed in SW P0 clocks > > What's the behavior if you set EBX to some value but don't enable the > timer with ECX? Normal MWAIT? > Apology to late reply. I was having some AMD internal discussions and collecting more data about this feature these two days. EBX will be unused if disable timer. You're right, then the behavior is like normal MWAIT. :) > > The software P0 frequency is the same as the TSC frequency. > > > > Max timeout = EBX/(TSC frequency) > > That's max timeout in seconds then. > Actually, timeout = EBX * TSC cycle, EBX is the loop number that timer counts. This is 32-bit counter, and the maximum value is 0xffffffff. > > Signed-off-by: Huang Rui > > --- > > arch/x86/include/asm/cpufeature.h | 1 + > > arch/x86/include/asm/mwait.h | 25 +++++++++++++++++++++++++ > > 2 files changed, 26 insertions(+) > > > > diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h > > index 3d6606f..3ef1f6e 100644 > > --- a/arch/x86/include/asm/cpufeature.h > > +++ b/arch/x86/include/asm/cpufeature.h > > @@ -176,6 +176,7 @@ > > #define X86_FEATURE_PERFCTR_NB ( 6*32+24) /* NB performance counter extensions */ > > #define X86_FEATURE_BPEXT (6*32+26) /* data breakpoint extension */ > > #define X86_FEATURE_PERFCTR_L2 ( 6*32+28) /* L2 performance counter extensions */ > > +#define X86_FEATURE_MWAITT ( 6*32+29) /* Mwait extension (MonitorX/MwaitX) */ > > > > /* > > * Auxiliary flags: Linux defined - For features scattered in various > > diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h > > index 653dfa7..b91136f 100644 > > --- a/arch/x86/include/asm/mwait.h > > +++ b/arch/x86/include/asm/mwait.h > > @@ -23,6 +23,14 @@ static inline void __monitor(const void *eax, unsigned long ecx, > > :: "a" (eax), "c" (ecx), "d"(edx)); > > } > > > > +static inline void __monitorx(const void *eax, unsigned long ecx, > > + unsigned long edx) > > +{ > > + /* "monitorx %eax, %ecx, %edx;" */ > > + asm volatile(".byte 0x0f, 0x01, 0xfa;" > > Ah ok, ModRM extension to secondary opcode 0x1. Simply filling out the > empty slots after SWAPGS, RDTSCP, ... :) > Sorry, I might not get your meaning. Should it update like below: asm volatile(".byte 0x0f, 0x01, 0xfa;" :: "a" (eax), "c" (ecx), "d" (edx)); ^^^ > > + :: "a" (eax), "c" (ecx), "d"(edx)); > > +} > > + > > static inline void __mwait(unsigned long eax, unsigned long ecx) > > { > > /* "mwait %eax, %ecx;" */ > > @@ -30,6 +38,14 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) > > :: "a" (eax), "c" (ecx)); > > } > > > > +static inline void __mwaitx(unsigned long eax, unsigned long ebx, > > + unsigned long ecx) > > +{ > > + /* "mwaitx %eax, %ebx, %ecx;" */ > > + asm volatile(".byte 0x0f, 0x01, 0xfb;" > > + :: "a" (eax), "b" (ebx), "c" (ecx)); > > +} > > + > > static inline void __sti_mwait(unsigned long eax, unsigned long ecx) > > { > > trace_hardirqs_on(); > > @@ -38,6 +54,15 @@ static inline void __sti_mwait(unsigned long eax, unsigned long ecx) > > :: "a" (eax), "c" (ecx)); > > } > > > > +static inline void __sti_mwaitx(unsigned long eax, unsigned long ebx, > > + unsigned long ecx) > > Please align the argument on the new line to the opening brace: > > static inline void __sti_mwaitx(unsigned long eax, unsigned long ebx, > unsigned long ecx) Got it, thanks. Thanks, Rui