From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751643AbbHEDe7 (ORCPT ); Tue, 4 Aug 2015 23:34:59 -0400 Received: from mail-bn1on0134.outbound.protection.outlook.com ([157.56.110.134]:15040 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751295AbbHEDe5 (ORCPT ); Tue, 4 Aug 2015 23:34:57 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.222) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NSLAL1-08-2NV-02 X-M-MSG: From: Huang Rui To: Borislav Petkov , Andy Lutomirski , Thomas Gleixner , Peter Zijlstra , Ingo Molnar , "Rafael J. Wysocki" , "Len Brown" , John Stultz , =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Weisbecker?= CC: , , Andreas Herrmann , Borislav Petkov , Fengguang Wu , Aaron Lu , "Tony Li" , Huang Rui , Andreas Herrmann Subject: [PATCH v6 1/2] x86, mwaitt: add monitorx and mwaitx instruction Date: Wed, 5 Aug 2015 11:18:51 +0800 Message-ID: <1438744732-1459-2-git-send-email-ray.huang@amd.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1438744732-1459-1-git-send-email-ray.huang@amd.com> References: <1438744732-1459-1-git-send-email-ray.huang@amd.com> MIME-Version: 1.0 Content-Type: text/plain X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11OLC016;1:HkriaEOA8QGWTsOvtc6fAzmrCqRPhvlGr5WucidX8nnxmvsLgE+Yh8y64PWdM/6UB1RidSKiyqShsk5wxqcG/et/bhNyOfiZqGHTsTykpMisurvngh73Jxov9dxSWBIEEBbhY8F+gZS4HxEuo0nuwY16yZDexr2eq2dTDiXjbG9S1Ra6rlfQ6Hez/oJWuRsahDdl/uETis7gS80Hkdqk2VwkVXU5qA6zdfTs/TmGBX3D6VhR7aWdu+WCG1/n2CM9HN/JtvUNx3dUwFW1r3XzNUEyAtA3jVuBvNwva0yLjU9l3DXlyQA6pepo07Zm/HKosxzbmmABlrGFazQd36DVKQ== X-Forefront-Antispam-Report: CIP:165.204.84.222;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(428002)(189002)(199003)(575784001)(189998001)(46102003)(77096005)(19580395003)(101416001)(64706001)(5003940100001)(106466001)(47776003)(68736005)(2950100001)(5003600100002)(36756003)(4001540100001)(105586002)(48376002)(19580405001)(62966003)(33646002)(76176999)(53416004)(229853001)(77156002)(92566002)(50226001)(97736004)(5001770100001)(5001830100001)(5001860100001)(87936001)(50466002)(86362001)(50986999);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR02MB1150;H:atltwp02.amd.com;FPR:;SPF:None;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1150;2:C/PiJmZuI3sSXf1+OO3P7ntLMGJmeL6Zk/U9dnHxolRI/3W5QXkadODE/2ypDBckLuTTidPrzPZ7bFm0r7nTTv7nzNd3qL9TMkgdpN9fhQXjb6U5lkSTaXUIcEq0f81z2OvwYS6bkDmW5GnUf412r9b19tEYYnINr1hBd7rxyFI=;3:udnuWhA58giRNsdV2jaiPs3QGscRW1o23LyL18sqgu0RhuDWpZS3NiDAhNK8H0cNar+i2Q7r+XuvWnTpc2DoPIFTLU0mO4eYYQyS+thGSKOikehW2ALNur9jKvsO814MpJyeml8IWbqhmsH0r2FxVQJsswZYZOLo9pG3WVN0wCgqELWH89BPVNZO5LyP1cjO7cLoSKxVLf8lk/ToJetq64kh4wXXlgMByB0xtv80jWHEz6dG9zu/YTuWWSWzJebA;25:04oZOvQ5sRMgLSsyLPMMqT1YZRSkDUSPKZziCB8gqa5rrD+f9bqkvrI9ioL9YVNi33KaR9+E5K2CVzscu7BKull6R+KQgcs4WzjlFw6MOlcL43vdJprCeSO43ahA8j1ugTLK9lW/hppVVL/5RbIltqaQJVgdGonVIuCSZ0KTGaAuABTivvVdFxzYLGA3hh0ulN9N9RM8x0Zg6IoHerB8jEKaPFHS72yxnT3DCFzlgC20bn4qwwhVxbnxNBt1pbt0+f+VLr1KSF7dYE6NkQlJPw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1150; X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1150;20:QVwEvY8IYrj3sxgJQAShWSg0R85i0WrxyVvqKR1w0XaaDs8n+CtO/5xqmhrofjpZCC0ER9K8xjPn52rc9FHoXRrqH7bR74vunDFBtzQzQ6tmMrxM9BzjoeFTpX1K6exFsLWqPFbWeJRpSWFIsEIUwQaxlHjpCc88T/DE8qfqjoFzPY/lRsUU/fkHX3BHh2M9zX6QeRcvKcxBlzZcd1FI/b23TwEw77YkvBrcrTd2sgSgviwCzeuSWWWGl/FzE50mHJJw8fTvS3O5II4LjQ/ayuuq4/kVx4CmhOzqwiuNwvwxDUg/YfjKDxH4CaGZFXnu1iUp/8aNmqTdNFMSbS1GVAWxPOlpZEYAZUKgSUgwbHPhKDCvl20f59NP1Koc7WeMVF+OD2+w6OcknCaASfURsOirHm3mFMhTyt2kIP5JZugbdjXx0qiioiD3PtR4/LuAvIwcj9TNx7NLvuloePqX+vFs3LomPYObLYENwnyAc+KhjjRIyeAQA2mQPpFYMMv1;4:glusRe7N37XeK+5WNa/M/qN0U6s4JNt1R0LK8SokJl+MdW22HXYvj2agzFXBGrfdM8XsmQzvr+lks9sSmJGNinUWkK9SyEwcRSlDpr23XqLXnJiOjW8p54uBeMSkWetYXOcOKbGhPZ6weo8OkuLzJ9Hx9yhxVc/yqHBqDfDJrVxJpoyZtHK3GkWGWUYLqfH64TJZHF0oUkn/GLERCDX1QMjO3bW8tiAlT8DaPn3SPn5pBGCdzIghA4fDfQw0sx8ChMH2HPElLnUui/FGggAjDOEuVox0HnaP8ia2Ozoaa4Y= 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:CY1PR02MB1150;BCL:0;PCL:0;RULEID:;SRVR:CY1PR02MB1150; X-Forefront-PRVS: 06592CCE58 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR02MB1150;23:UVR3/U9C3YjVdMkOCPUhFaofyhdaaUmRHCguDiuTT?= =?us-ascii?Q?WMod8qe+I1SrTMW4LNW1DY2OPc4F7zY+yDEWrkc5viLDJgA0jR6AYd4WxtjV?= =?us-ascii?Q?ZR2961jJYr5j/ggds7EHUhnhDWacLs2c886MivoV4Kr7fe5VxXiSgeDRtgqg?= =?us-ascii?Q?Q1YCD0hhi6+PyCtHUro1Bmn+DqUG0AMV1sygBHi5uAy0KOf8S14E/AGA01j4?= =?us-ascii?Q?Bl0NH3FmGy0j+jg9H1eX8p1BqeAz4yRPritHWTervcrRtYu8P+QeregjZOr+?= =?us-ascii?Q?ZuaOJdKYha1eZOtX91SPmO9EPZAxPS2uajZuxIyA6vl/HGaXGINcDss2RzCm?= =?us-ascii?Q?I21pKqdusjcaLk1NqK3oMR2KVwh5rrY+ZZcXnsZHmtyJyPUxVdLumDc2c5YV?= =?us-ascii?Q?Plg+ab/7sCZaX40cPm5qyfZicQrUlSy03AlSgUoqRhQ93VANKyHi6nXBOJHC?= =?us-ascii?Q?646GQYvyWIgndDlj731LgL7xuWHR23nkG++gLVdkUCRa+oBAOILMb+16Ke8+?= =?us-ascii?Q?aNKp/i82EHemPT/V4pDPoVcsTAp7IiDKgdauiiZaoNoZ0RlbHCEWtNTO/T8a?= =?us-ascii?Q?TlFN3WpRN84u0snWltKyfEhHkmvjZ1OYxsuCVIUiWyjV2xP3qiRAxp+F6Uff?= =?us-ascii?Q?EfGqkQDqh2L5P9Rza0YLg6D69TOmubDGp6n8Mvopcd38RWlOCZTdD/pxcb3i?= =?us-ascii?Q?pd1Y3f1dRo6VI3viCSKzUpdpYNnB02NPwBWv1Ro45AbGpSuysSQrCJoKD/mA?= =?us-ascii?Q?s3VlVCo1nrpu9I7aVgprid28DluccNfJdQbXVGiHAFGIPXlRJBM+siVq7REP?= =?us-ascii?Q?soNxUH1sNNmYUw+G5ipgglUPFA1SLAR61oWhclH8ITC0pR9q6CS+I5dIRtgc?= =?us-ascii?Q?RkwOnCNg73uIZ7/FeqSjTz/moTsjUsHSLRouJ8C71+OkSBQUsZMphAliNeRG?= =?us-ascii?Q?J271EA5U7wumitTQJVXS5mw5uCqfVcDYVIquim396QQer2xsigTiGQhD/MNc?= =?us-ascii?Q?He2MAaIbsj5NtDz2r7aLANvUzxnxCgh7H0Z4Wkku08JPKLzSahbCR9beAHGd?= =?us-ascii?Q?MvlpkA=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR02MB1150;5:frk5C/gjFJkUrUtMiOL8vGC9yRncxM1v+EpOa2+s1/dG+IqZYBkgJf3WA64r4JG66/L4FNz7gYLwaEzPoZb7JuiNq2a2VBrds3BrghncncFW7XiWBFf6bxo8dlIeZfDDYZybkQVbou6Wut4xUKUaTA==;24:7MFfD10ehlrA1ute+MNrS6TEBOIAcgAAqHoMjGozH6ga+1vUYk0rLnpWDLDYkIwmnE9hw4p/PCJ0yRfu/2ZsnohlkjHXxFrO8i1JvVTCbmg=;20:xXsvT+n5O+jHPRC0iCE664+OOP4Mo+N29A94Ht865LRuG085gYOAn4+2xcU5ZIrgGaackDQkyprdHj+CN4qLTA== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Aug 2015 03:19:51.7775 (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.222];Helo=[atltwp02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB1150 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 MWAIT MWAITX opcode 0f 01 c9 | 0f 01 fb ECX[0] value of RFLAGS.IF seen by instruction ECX[1] unused/#GP if set | enable timer if set ECX[31:2] unused/#GP if set EAX unused (reserve for hint) EBX[31:0] unused | max wait time (loops) MONITOR MONITORX opcode 0f 01 c8 | 0f 01 fa EAX (logical) address to monitor ECX #GP if not zero The software P0 frequency is the same as the TSC frequency. Max timeout = EBX/(TSC frequency) Signed-off-by: Huang Rui Cc: Borislav Petkov Cc: Andy Lutomirski Cc: Peter Zijlstra Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Andreas Herrmann --- arch/x86/include/asm/cpufeature.h | 1 + arch/x86/include/asm/mwait.h | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 4b11974..9978a98 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -177,6 +177,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..47f3540 100644 --- a/arch/x86/include/asm/mwait.h +++ b/arch/x86/include/asm/mwait.h @@ -14,6 +14,9 @@ #define CPUID5_ECX_INTERRUPT_BREAK 0x2 #define MWAIT_ECX_INTERRUPT_BREAK 0x1 +#define MWAITX_ECX_TIMER_ENABLE BIT(1) +#define MWAITX_MAX_LOOPS ((u32)-1) +#define MWAITX_DISABLE_CSTATES 0xf static inline void __monitor(const void *eax, unsigned long ecx, unsigned long edx) @@ -23,6 +26,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;" + :: "a" (eax), "c" (ecx), "d"(edx)); +} + static inline void __mwait(unsigned long eax, unsigned long ecx) { /* "mwait %eax, %ecx;" */ @@ -30,6 +41,38 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) :: "a" (eax), "c" (ecx)); } +/* + * MWAITT allows for both a timer value to get you out of the MWAIT as + * well as the normal exit conditions. + * + * MWAITX ECX[1]: enable timer if set + * MWAITX EBX[31:0]: max wait time expressed in SW P0 clocks + * + * Below is the compared data between MWAIT and MWAITX on AMD + * processors: + * MWAIT MWAITX + * opcode 0f 01 c9 | 0f 01 fb + * ECX[0] value of RFLAGS.IF seen by instruction + * ECX[1] unused/#GP if set | enable timer if set + * ECX[31:2] unused/#GP if set + * EAX unused (reserve for hint) + * EBX[31:0] unused | max wait time (loops) + * + * MONITOR MONITORX + * opcode 0f 01 c8 | 0f 01 fa + * EAX (logical) address to monitor + * ECX #GP if not zero + * + * The software P0 frequency is the same as the TSC frequency. + */ +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(); -- 1.9.1