From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753242AbdBJMCa (ORCPT ); Fri, 10 Feb 2017 07:02:30 -0500 Received: from mail-eopbgr50118.outbound.protection.outlook.com ([40.107.5.118]:51468 "EHLO EUR03-VE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752532AbdBJMCT (ORCPT ); Fri, 10 Feb 2017 07:02:19 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, Dmitry Safonov , Shuah Khan , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Andy Lutomirski , Borislav Petkov , , Subject: [PATCHv2] x86/selftests: add clobbers for int80 on x86_64 Date: Fri, 10 Feb 2017 14:58:14 +0300 Message-ID: <20170210115814.29737-1-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0101CA0009.eurprd01.prod.exchangelabs.com (10.168.141.147) To DB6PR0801MB1736.eurprd08.prod.outlook.com (10.169.227.7) X-MS-Office365-Filtering-Correlation-Id: 3deeda21-b507-422c-51d8-08d451ac9ebc X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1736; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;3:B1Fvr1eliOwDF3VcA0wj4dgAXjObj1xQDq6uf81aIZiAFBiTj4B1PXhuqhCMUuZH5Jai+dyurvdrUFiYSmuHI5WRcHgwjivwiOU7SEInD2aLtdAS6cDpDiswOJtD3NUYvUVol0vQjX/0Gy04Hb4QIaaACvt/TIviR+4uIHaxzEH+tly6i9Y7dG4d47Vx/RRgAGcVXApVhPE5QoUF/aVyuI/Vi1Ai8ll2ynaIiOAa0Ie0A4JIUbszdUykiJ492062BduSPsQMqZr6+b9xo0+hDQ==;25:4qF+4+jhjc2omUkar/7rYzRhp1zWeSSy4o+ViLNDJBbzNbn4JowuT57aulzkrH+NNlH5G14g00tXWKets/8Z2w+zwr7GKm9Xvrf7MVtCYpj4/8T5biE5gXGLhv32lZkvw8xJkMZLMMckVnbxZvCDzN5tlAyPbNcmXYWvVbs6jRu4wpb5L1IEe/NXw35UuWE4rQ9T1wQ6JTCg0qMNLSy7o3yQAeUdYnqf+pZ6Z1hobQBq6pErtUHrl9ttmpurGnLtyLIt8bdV/4p/Q/5Zo8g78UfFubW7/GxQHXC0ZmTJAVF8d85MP2Hfrbsf9LV2RAk1sL/8nUQ5VJcarrlWEGRABERNDhQ5mBTUehgFzAt8Lnp6ti6Aql46jauDUO+ElCy46xpiu1vdKQI5idX6Sdre2sQljmpieu4fiiIlIyR3mHvhTq41OO3r6EL4NtHJ0MDfEBAUBUnX8uEyocyiqTmRmA== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;31:AaY2GFzaJFTnPqTsBZPU3RXXQHu+VABj+AP2iQMZA540QAFHwbKDtnxFduVr6sjTGIibCiVWL2SYye9+v00LWYm2NmGAVnXCWhQF/wnMj9WAYbi0vc32H4KjZAJH0JUVGPTYXcrNESxVeo0PiBcsutR0k7Ca4EsV6Ma1zzY/7288quLc6yeR65zut8gnGOwW7AzGu6jP6axjhsF5hLJIVbj8rWJ9GNPcTdTmS5mK5fODeT0rod3tWXEQtOgNVdEW;20:DxauFx2//b21GbMk3vXjg50tI8MDF8crXQPuWZ6Cy7tr/vwABHI3YCd/NK+FfG7fkX2DFpSJrn0ZSJ6MPw3EQ2G7pNSTj4dQgy5a7p+CGdrEwkNvsRIiITNqCSHpgxrZ3eXAjIiOAun5CJSqBFYRAuL006hObeXLmzXW0wxOkDKnYxFmmxjPS6yZEAO7bSuS1rshJCITXZI8Ac1NpOb+7aN8c0dttx9P26bSnbZltFgSTWfBfl02OSBQLccsaV+IpedUGTHGM/nA/pk8F8XzVWmBxG9fB0CM2Yu/55oJmuLxwa/oBVg5DqzuCsWJIzhXfr1a859M0ZDJaSxqoERL0C6c+fOpk9/JreCYSK4tM/4xqwvecxMc1nSRlWZy3+l9n/wyM/blhf0j50zoFpxxry0tTksJhbZCNCU64+p+vhU= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(166708455590820)(9452136761055); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123564025)(20161123562025)(20161123558025)(20161123555025)(20161123560025)(6072148);SRVR:DB6PR0801MB1736;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1736; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;4:nWTKV6PbbycdyikXMu0Ogs2R3ak09iMO/S3sLTrgSLInrbf2xSskNQpg9cr4SvvL6Ygk9X8oM/jYftLqYjXpW4zV+xLw+qFSwwH1s9sNGWas6//hxoRaPFQ+liz/orlokg/tFwccu9k7Rx+iSwXNtz1KCxUPfpHSVHXHWc70PHzdimUZTgzZHSYvx2gzBoMRYZMFxiS/cQraidt3bw4csMROmA0OB9UlW/gFYBBz1H0HrQXhO1nsuA4f5eAJWv1QIuZ+8aMh5YSTAMGJx2JSTbnY2IlsgyhULcQUPWStoKiH1Lzjc+qdXceiW8a7cZDHrUGPLVShg9qcEaLIVeKFt9GTmu0b8HHe8c++TtJgMsp1YjNxZ7T72o92cnC6RHOPqfkHBacQMJg1yyvAi268bk7ts7cNx67g2EaVXt4Agu6UJxTg0GkEWsmw8SAU0ZPa0oSSkUyHYbE8k16MEPND5qo47GMD51PdK/nBCF59ZCyuRDL7Wb124ojfD1nWKhwyrML84tue/fuuo/katHm1j5MaOuFmDc+yo41NgM0itAz+g5+cL5vo/eoSQ18mt4o90+J2nPpc/M8gQGankoaARm9txtBlqI5vG0gNt0o6sxH02KqxeUUlffsMOAqr7pcOUct4CM4nZfQDJm6xcfdfBf9cyyvzmYuzJPHzNmyy97B+0ceh8/ITQB3RMhTJJKyZ X-Forefront-PRVS: 0214EB3F68 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(199003)(189002)(47776003)(1076002)(92566002)(305945005)(7736002)(189998001)(66066001)(97736004)(6116002)(86362001)(3846002)(6512007)(38730400002)(110136004)(6306002)(4326007)(54906002)(53936002)(68736007)(39060400001)(25786008)(2906002)(6486002)(6506006)(5660300001)(101416001)(42186005)(7416002)(6916009)(105586002)(106356001)(48376002)(5003940100001)(50466002)(36756003)(6666003)(50986999)(2351001)(53416004)(33646002)(69596002)(50226002)(81156014)(81166006)(8676002);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1736;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1736;23:ZmuqKbGP+VWIh/qvO+XEqzTToWqobApljuVAVuy?= =?us-ascii?Q?/WR7hg4fQ5MjvtuKNFg7jaOJ5ovjJ4vq0Y4GTFqbRiRPjOuHFB+epk6XoN5A?= =?us-ascii?Q?sxCNuMHWw2FhqTFvRgOIU891RQT5iFV9ulxSKTUmrpHWsPyi/90QIB4ZL8Zo?= =?us-ascii?Q?6wknbaTVdLOU89TUY/LKNPRIXl+vgSuf0QpZM5NMaOCxjdhLthCh3u+Xh08+?= =?us-ascii?Q?VZWcfFVTv9/2SFmY4SylxUtybISHRMLHFtjZrS2ZCMmcNwnKbzh7zWEzzG/f?= =?us-ascii?Q?42IQ2Z0+mDjpbnGIvI9rPrSH8encfsL/hvQN6wcHkQFcm88x0RqNsENhNQqg?= =?us-ascii?Q?3W8ZGjW3oDip4PphHKUgaC31jshJbiaYjl1ZFb7B/Ivwy0rdUmAme+3y1NAc?= =?us-ascii?Q?dZhmfgPrXR0NE4PADbLje6PUzIUlgx23k9zD/e8F1r38JO+k7jYS6mu9EikT?= =?us-ascii?Q?Ro6HG0Zz1w9vh13gc0lvTrtsNf/s6WeC5YZvMwleaX/FfHIBowzkllycJU3n?= =?us-ascii?Q?rAsrWPjOg8noxxCBLx1Ik9ZVLKObJPAsAD6aX+9SkLBF4SmBTK1kbdJZH/n/?= =?us-ascii?Q?U7OwFBxh0zmbqdrxbIaU8/y5uLiybaN64BWvj6lIiVcmm+GJDQ7gXYjuojGE?= =?us-ascii?Q?yBH/00/Hd4+S6R+oQ4T6a9nqj4yPTuKr+FRB0ni6/phggJ9aRhVglOTtiTZ7?= =?us-ascii?Q?R8XHvHc6lPoMbkoIxx9+g3F4sGQS7hugLK6bn4t2LRm7ekmPaIu2w/fqojy1?= =?us-ascii?Q?HD/peQkaKam8tg4h8T8bNFqWk0ujzjiAZbFMa1g356wxUBQGK3b4gedbpCAM?= =?us-ascii?Q?72S1MlOIlw8qyihAORc8xfmvpHUbGztfetWGTY8ch2jJTYUjoYXo4BdyTFEd?= =?us-ascii?Q?ecY2ZbJafT9ZCl2sSn4mxohcsTSPSEklcwEAjSH0oGgs56LP3r7hP40+wcs2?= =?us-ascii?Q?aYhe1XWyGkedSCKfrJTnUSfBkCwif7ulO8BE5QAKUP/xqDWMFNeZilhiHWlF?= =?us-ascii?Q?J1GSSg0O1aas9JrbyPh9MmqFJnqjoZvglXNPkml2sK6kLjgs/cVqOqKtjbnD?= =?us-ascii?Q?gpoYPMQS/CZpzBl5nGiPwEtKChsUB4qKehQUpL6HPBd32yynVwfyCpGQGuS7?= =?us-ascii?Q?3XSA7t6nOdlnv4fSJNjlykN95+yo8IjT91oOrtVwlQ5A3XuBN/Ha7wUCiA+N?= =?us-ascii?Q?PRSUgjTGCX3tI77k+SWm9LXKk8J5ReK9A2AYjHGqqgI2ACoDS0sLUVmQNxw?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;6:d2eS9c1KNHPJidxAf+pt2rg+UBgghfIP8N5QC+0f/RdZ5O1qt6uR1ONMO7/phtC9hRBCDMJ4Msh6Vu7sh20lqk7+zBxYBMxzYbO0mTNGMmdRxYPeHoObgjco02oQwGyhssz88KwcxBxKKY7tj1FGgfHHHHL9LW+jBBEIf+ARuc67smCwWwsPrDBSuIo2i5NaJPaCxF0IhkYONpPWyUmoLvC6aUImGRmh8f6AZaTOyIinMhO3QmkKki0g6pBikDC5E1Qthz7HzVYrLdAm3bJureI/AxLumozpKpe8wr4FrkcxnIRrzRuLAwI2m8cc3Znni9aN0A0E9N/HaFMzXMTg3YTOZN7FE36W3gsWZ2qVa4H1JPj4z43Mq5y3679fov+GTalSoAsjoV4rdwTapUUILw==;5:wi3LikSspTxL7szVYd/zRF10lkn7xWRxxcAhYxtPinqL6SMuRjR8qckqYCa5xcz/BblnmVZeHJOJaVdyoq8mJKfyrLxIFEoVJRyEDFYYsSaqaXJEZjJfwEUWecvjEag9re6Msv5D7ZPEJSTtJeBKUA==;24:A/Em0aY+aJr17l0LOYlwghvluG/RQDys7CTJKxeYykmbBQuvbGegCx/yG3n3Qyh+BVs4UqsKsGHyH0p6R5NkHVBmXd0E4RQJURAFyMg2C8o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1736;7:D9yKegMTY2MBRh4/2SN02Tw5NzCczBWSvZjfYuzjxlS8kH6tfOlFOU1LGlrJf1Siq+SwS6RtnCQ99L1dSIdIkaZiBlniTmknx8s4MeESUpJBiaTzQeNM4mMIl3WlZjIK6fbc7ZO3Vzdxgr8nOSlRdcY/LHsxRu0coL1MITsgN6rJ1eYCWdNQ0xo/ew0kCXLyCYXRVx/BhGM9pm1vI1bnKL65hShEy7C/Wu0Bo96wUymSd5OvsbufoQUnzFbrxlGyIxdIE95aY3rAAwLRbuDiuOwcvfJCLaaAsToEwxeFnRE2iAABoTW4iW1ZznVzECbxPrMgXMFKmOnn8PkBioT9zS0kwCZGBrdP+7DpjoA4NuqVmOpVQy9pbno12EwBfoK308nfueBV3+Ru2fcAG9ZH4SoFGa6P8UpoX2tpu1CndnH4pWKg+h9loscq6qzHCKWEX/FI7D8L9QMe4wj6FjGHbtuii1N8BJOJTSjt1dcwnAtbexv5yj9WmI7bQlpuks8PrZH3P7RfUdyZywD9tw3Agg==;20:9pFfO7KxgN4jD3tDFvJMN5kMuRiBIEumIOtz71H9KGIF1JTBb1P5R1r6Gi60n23X5VuyrD9i435Ga9HlQFSIQ7ZbIq2L6/Qff1uhF+qvNDNmFj8J7CpFBLnsxfEkLhsIpWs/Ig5y+tE92Pu09uzZTd63cTaF4/szX4w+ZYy6bg1k5k0jXHsXw0s92cKkiUsiPRfFHkJzIh8Ja0AQqPgN8U2R3+9U+NB/kQM4LI/6k4ML4YUnvhHbO/PtEqrwfR1T X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2017 12:01:59.2838 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1736 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Kernel erases R8..R11 registers prior returning to userspace from int80: https://lkml.org/lkml/2009/10/1/164 GCC can reuse this registers and doesn't expect them to change during syscall invocation. I met this kind of bug in CRIU once gcc 6.1 and clang stored local variables in those registers and the kernel zerofied them during syscall: https://github.com/xemul/criu/commit/990d33f1a1cdd17bca6c2eb059ab3be2564f7fa2 By that reason I suggest to add those registers to clobbers in selftests. Cc: Shuah Khan Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: Andy Lutomirski Cc: Borislav Petkov Cc: x86@kernel.org Cc: linux-kselftest@vger.kernel.org Signed-off-by: Dmitry Safonov --- v2: Don't touch iopl test: it doesn't do int 0x80 tools/testing/selftests/x86/fsgsbase.c | 2 +- tools/testing/selftests/x86/ldt_gdt.c | 16 +++++++++++----- tools/testing/selftests/x86/ptrace_syscall.c | 3 ++- tools/testing/selftests/x86/single_step_syscall.c | 5 ++++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/x86/fsgsbase.c b/tools/testing/selftests/x86/fsgsbase.c index 5b2b4b3c634c..059b06b2d81d 100644 --- a/tools/testing/selftests/x86/fsgsbase.c +++ b/tools/testing/selftests/x86/fsgsbase.c @@ -245,7 +245,7 @@ void do_unexpected_base(void) long ret; asm volatile ("int $0x80" : "=a" (ret) : "a" (243), "b" (low_desc) - : "flags"); + : "flags", "r8", "r9", "r10", "r11"); memcpy(&desc, low_desc, sizeof(desc)); munmap(low_desc, sizeof(desc)); diff --git a/tools/testing/selftests/x86/ldt_gdt.c b/tools/testing/selftests/x86/ldt_gdt.c index 4af47079cf04..dfdabd1f3083 100644 --- a/tools/testing/selftests/x86/ldt_gdt.c +++ b/tools/testing/selftests/x86/ldt_gdt.c @@ -45,6 +45,12 @@ #define AR_DB (1 << 22) #define AR_G (1 << 23) +#ifdef __x86_64__ +# define INT80_CLOBBERS "flags", "r8", "r9", "r10", "r11" +#else +# define INT80_CLOBBERS "flags" +#endif + static int nerrs; /* Points to an array of 1024 ints, each holding its own index. */ @@ -588,7 +594,7 @@ static int invoke_set_thread_area(void) asm volatile ("int $0x80" : "=a" (ret), "+m" (low_user_desc) : "a" (243), "b" (low_user_desc) - : "flags"); + : INT80_CLOBBERS); return ret; } @@ -657,7 +663,7 @@ static void test_gdt_invalidation(void) "+a" (eax) : "m" (low_user_desc_clear), [arg1] "r" ((unsigned int)(unsigned long)low_user_desc_clear) - : "flags"); + : INT80_CLOBBERS); if (sel != 0) { result = "FAIL"; @@ -688,7 +694,7 @@ static void test_gdt_invalidation(void) "+a" (eax) : "m" (low_user_desc_clear), [arg1] "r" ((unsigned int)(unsigned long)low_user_desc_clear) - : "flags"); + : INT80_CLOBBERS); if (sel != 0) { result = "FAIL"; @@ -721,7 +727,7 @@ static void test_gdt_invalidation(void) "+a" (eax) : "m" (low_user_desc_clear), [arg1] "r" ((unsigned int)(unsigned long)low_user_desc_clear) - : "flags"); + : INT80_CLOBBERS); #ifdef __x86_64__ syscall(SYS_arch_prctl, ARCH_GET_FS, &new_base); @@ -774,7 +780,7 @@ static void test_gdt_invalidation(void) "+a" (eax) : "m" (low_user_desc_clear), [arg1] "r" ((unsigned int)(unsigned long)low_user_desc_clear) - : "flags"); + : INT80_CLOBBERS); #ifdef __x86_64__ syscall(SYS_arch_prctl, ARCH_GET_GS, &new_base); diff --git a/tools/testing/selftests/x86/ptrace_syscall.c b/tools/testing/selftests/x86/ptrace_syscall.c index b037ce9cf116..eaea92439708 100644 --- a/tools/testing/selftests/x86/ptrace_syscall.c +++ b/tools/testing/selftests/x86/ptrace_syscall.c @@ -58,7 +58,8 @@ static void do_full_int80(struct syscall_args32 *args) asm volatile ("int $0x80" : "+a" (args->nr), "+b" (args->arg0), "+c" (args->arg1), "+d" (args->arg2), - "+S" (args->arg3), "+D" (args->arg4), "+r" (bp)); + "+S" (args->arg3), "+D" (args->arg4), "+r" (bp) + : : "r8", "r9", "r10", "r11"); args->arg5 = bp; #else sys32_helper(args, int80_and_ret); diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c index 50c26358e8b7..a48da95c18fd 100644 --- a/tools/testing/selftests/x86/single_step_syscall.c +++ b/tools/testing/selftests/x86/single_step_syscall.c @@ -56,9 +56,11 @@ static volatile sig_atomic_t sig_traps; #ifdef __x86_64__ # define REG_IP REG_RIP # define WIDTH "q" +# define INT80_CLOBBERS "r8", "r9", "r10", "r11" #else # define REG_IP REG_EIP # define WIDTH "l" +# define INT80_CLOBBERS #endif static unsigned long get_eflags(void) @@ -140,7 +142,8 @@ int main() printf("[RUN]\tSet TF and check int80\n"); set_eflags(get_eflags() | X86_EFLAGS_TF); - asm volatile ("int $0x80" : "=a" (tmp) : "a" (SYS_getpid)); + asm volatile ("int $0x80" : "=a" (tmp) : "a" (SYS_getpid) + : INT80_CLOBBERS); check_result(); /* -- 2.11.1