From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751834AbdBMKRf (ORCPT ); Mon, 13 Feb 2017 05:17:35 -0500 Received: from mail-he1eur01on0131.outbound.protection.outlook.com ([104.47.0.131]:47981 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751066AbdBMKRc (ORCPT ); Mon, 13 Feb 2017 05:17:32 -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: [PATCHv3] x86/selftests: add clobbers for int80 on x86_64 Date: Mon, 13 Feb 2017 13:13:36 +0300 Message-ID: <20170213101336.20486-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: VI1PR07CA0068.eurprd07.prod.outlook.com (10.164.94.164) To HE1PR0801MB1737.eurprd08.prod.outlook.com (10.168.149.149) X-MS-Office365-Filtering-Correlation-Id: adcde1dc-1158-4c37-5192-08d453f98366 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:HE1PR0801MB1737; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;3:WChRbTA9w6TXA/nclA+001a7N4YZJRbsMT/LDnvPACcjg8bLIw6hirekPV+NPEY+k3pgUCmsFl6llnUAn/NYMtUy1cv71Ox4y4hEfri+ciVUNZzV7bVybeVlXwcTBMvTMSDM7wGeSMxpZf38DJtlENnBttU9Dna80rBAhXOTQzbSH5cgo09ivSk9Uq5bfxbelK2gi58MPsIRflBzdaOp9hiuvWpF2MBph+8w/tbUU0j8t2DutoxaGD520aTz6khdny89N7fzYCpU+mDoTScQcA==;25:jVzqyvUQWq4QbAQtXpEExrczCMUZrIzLKvipO7DY8dDx9hSkk+tt2TiLpz55Hdvd6R/ccwCwMhAaoxBG+YroU+cM9a/hKP5K3Gvs7Z3o3dpRteigicaVDBkBn8GF+4D+sWQsTuWUaM3cS2lfJVTJ4C7FcxkKPdHx0LzKIiDzAC/MpPG2GHr1l81nVJpFIlPFueGtT7KBCJmWna+o6wd/DfQGfTYProJXi1HlvrnGvJ5m94xKOtEHrZRHBi2S7oKQS1Sc10eTXdChdvM6PzHZM8A/EI02zmJGVmBUtXE3NmDLKUAcu3i6bQVXUEILp752GmYEyZeQEBtF8vUW5txE1fKqA7AVPZR1OgRCnupO0o0hvHS6MAMS5hrShv/i+gsGjjSSqR28hnpjoP9G0YZ9Wz5xkvnOcmVjdgifleG55rtMv0PF1+XeVFPIf6MCL8iNKtPpxYun/QGEk7y1xMzcVg== X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;31:8HzrPfAEQ/a9+3gotzHennS+1fLFK8eA0IdcbmLGfJn8odsISCxmCEM2D2xQKAOCjmqH7v9WFsAOj+3SB4wAh+gfCr0fZBbw3bqOSCSbfAUE/JGxGPVW5qG03WnP5+YoAmO3BEsklzkKBC64BsR1+VEW6xD6yYZ4/kOBAsrpcRTZ5lH+5D/Ko0UEQ0XhUk6VDaDLYz8oSa7/OPH2i9XXBH+ZU3H/zY4UQJY9HOR/WnytW2qzHoQAv1pQlSG1lLTT;20:+06vC6nkDJ8yMfGiV1lP3hc9CF+gGOoUizkiEIhIfeHXXYSBrcyHThNJT5DV9qMdoAH/gnMmMpuQoCqLphyDNCcoPX8R0+BiHEXVnRzNL4cq1RqsOASXu/3Y/oF/3GfRJpEKL6op0aBVVaN3cB0t2o4JHSRvTemZaA9fSrqDmEL6T+zu4r5NeZ2vHWglkAk8+EDlaTCL3eNL1penPqoWNuRqr5LcY+cRrHSwWQZUmOy3zmS7sx1lJGorc/hb0obraFafnXo4RFlFJ/zfkvI96id3gtr9ELLLgU3IoQNZBrAp+atDO2G0o1IFab/jP3gMWEviw9pnfU0xdyS9IFZWf2xYZua7hGpyoPVn/JYbD59njRLIdk3snImmEpTKuuBBgx/ELs5Tn8Fqbe/YvjVbYCb4xIgbYRJanrRkaYPKR2E= 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)(10201501046)(3002001)(6041248)(20161123564025)(20161123555025)(20161123558025)(20161123560025)(20161123562025)(6072148);SRVR:HE1PR0801MB1737;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1737; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;4:FWjD1PIoVBZYtA9s7UhMhw3liB/jjlCJTFglXYqow8ZJFyuaEMe166H51wPO0mdnmAzZgcV1PEmQ5MgoIxOjG0yb36P3EWNBQ0qYbNWFbBaX5+Gq5VnpcwV/3oF5ZOtJLOGm6ZvQGeKcQtvNQUNYxs8c71cBjAhldi16NWZ04+YVa60+nut1qYhsTtSu9k3tek0qPUxL9R+d3wuyvTGuncy54aO6JPcbIkdndBS2Wp2WngTzXLYx3IlT+HRUefiweIdZKYLERf25LRlXKCd5buNaZKdDu/N6BvFLl/sNHchl2+XBhLpvDm3SJFedqhacTFzQnnH5DegQgWoWYuhTTbpXYmQq1qtaou/zEDie56KuM07uTbi3cD7vlKe2v6iFOpkox4p8JNEUEpS6Eo3J5UjqEgYEgnHdEUtkmG36CazELx7dws37ekjIH8UodIPJduSZtIoTALpUBsdGVKkoz2yvHP2rT9YlnVLMe2MHoaWp7TTaTOQgMX3cB10olqSxtNFIY9MaeaG2FQkAaZDT5HDx16V1kefAnhuMogHtOcYdqDZS47qtENNRY60RHVsjdXGiLungLC4Rs0Nbg3HkN2G4NALwpc3wh80x0zgKtRNaV+8spWn7qW6cxRbcJvBlPEhqn1FlaryU7Fg1Segt+nId/2Bog4WBgctpDVGWAcAFx+bsYzC6iT+Ud3/WNf/r X-Forefront-PRVS: 02176E2458 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(189002)(199003)(36756003)(2906002)(33646002)(4326007)(38730400002)(53936002)(6306002)(6916009)(189998001)(7416002)(39060400001)(6486002)(6666003)(50226002)(69596002)(8676002)(305945005)(7736002)(66066001)(1076002)(3846002)(6116002)(25786008)(48376002)(97736004)(50466002)(68736007)(105586002)(54906002)(6506006)(6512007)(110136004)(92566002)(86362001)(5660300001)(47776003)(50986999)(81156014)(5003940100001)(81166006)(2351001)(101416001)(53416004)(106356001)(42186005);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1737;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR0801MB1737;23:8qDkbL3AEka3Slh6zTZ1FiRtDsk+qUIFK5Jsgcp?= =?us-ascii?Q?gM/GBTAcHjsrkAi+Vf4RJnQgEB0j7TLKLBG3isfIAnO5BZ8Y6XcjlXNWP17z?= =?us-ascii?Q?rGsea3fS27bEEZiSx0ucSo5vatxFu5rc1MrK8wfQIkdjUTNZTmHR/8a0EdBK?= =?us-ascii?Q?Y+EzQA6n3a6UQC9myVfLVknieUggjnyUQgwxJVFJtN3Tll+m5yoPz2z2+QAF?= =?us-ascii?Q?0qQg/4m5BN6aYtET6tUDweY45Buxltfe/eeZ7Q0buSttNiOfyqB8kPPpktb8?= =?us-ascii?Q?qQSiQYTPEpxo8OcjvXpK1+Qz0n8nbtW6+AsFlvQ61PGKSLCs72hfU2H1tBnt?= =?us-ascii?Q?dCtyLeQIoeWfpfbdUomqGwTa59D5sa3CXxIray09xKdorMx7XBDU9p+H5VoE?= =?us-ascii?Q?jtQ09LB+EYj8ekF66gYIeTUFwrm9CwSJ9du8AIkyFJqLjW6CSJQpUk3SAIJJ?= =?us-ascii?Q?19zmC2NHAzeaT/+VDvslVoCR+RN5siIT1OzvqXc41mEPxrejt1UkT9MvRh4r?= =?us-ascii?Q?H+jIvaUiScE6Ntx1D9/kWYGZX8RV7Gb2bdRtTxDXunzIZJ14JE3Q3uWqUcNU?= =?us-ascii?Q?vR+Qw6VNBZZJ3gwOjS7KoxYw07yeUsFTs4w/6chUHeSAzjlGgoqSekvHfknI?= =?us-ascii?Q?/owHWCrlU0cX+Yy0zw7HICIl5a3Ail3OXJPfI5GrPa8+3Hsu5O9WqOnL6eqS?= =?us-ascii?Q?6p5+h6phG9m66OQPFQ1GksEqxp8uWLi3WAitoEdtVmFrJERk+qPHkyIw8eko?= =?us-ascii?Q?Grxg+YookwYG70jI3r6yON/2/WJjhiZ0gmiu6BgymqrJCItmUnYLL8F8EUGn?= =?us-ascii?Q?lP1DmeY6oJDMH3hYhcdhTzLuwoABZiKT8BefGaKep2kN1OOoWSR4DLO6yWS9?= =?us-ascii?Q?FCploV2DvzejXYHvDKJTl5z0jTNlPpmO/gafRyI+1hCW97KsBVRNvJKGx7mF?= =?us-ascii?Q?5AvBYdD21/fu5ELfid2qonuaoq46p/IAzAFeyb+T9PbWmnfWx+DcwnHMad1r?= =?us-ascii?Q?RPoKNuYJYYiRHFndYgOAmnfBFjSjKVfWhLw7aNfAFESBULfwtEKO30mkQixe?= =?us-ascii?Q?dqlgqeG1Mf+3u/V8daQDPNrO58i53LDJ/BiyQ33L4Sgj9w37EWby3NK+dHl2?= =?us-ascii?Q?eAJ9A/gMD3ywy7nYnehTJMvvYdr29CR5e58tEHbyU8NDZ9w5Uo8LNtw/cssP?= =?us-ascii?Q?/1sHfjBlGu67V8LMbpIUgWZCE0ztprGX809YLYflDvjiy93oc/icDLBY3GA?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;6:qFKrG13v6ADFW1pw1212S+lLVI5iQMNpqYrvr8V/tV1+Dz4V8RqbHs+5ZeHPENsON7T6bE8BAJOU/NVxL+coAT+ajAK9I/CnMbviUBFcShDZYNOR1wo49hf04LRYFWfedrRbWOnj+8ZADUHO7yuIJPrr5pSJ7f0Dspe8yRIAhkSqxRnwYIZXnwTtf8JXnk57mmgmtDkNC/opw9bD0aHDRQynL3NxUR9ThUnEUEPdy69f1GiYeRJQTDYnb0ilYpfEDltXGN6snj+Sj09awd76DRKrO+WKyjrGtelLk2EeKisrddfvhqMxodEY6i1GfOeIWFtMFHu/53NzPWuLNwIIqbWiFqzT5wkd4mlsG75rNeGnhXdV5cLCKilHve1YqCPVpfxq1SxfXB3Di03Zvyfgnw==;5:DjjfZG6h0og1F5FhWrOMyTh8Bd1ucUDMyCA0G6JL2Z3K0fWCmbvyseaNlvoy/+VmM1c+a9tlkirLGgd06WCpeJ8r+PqK/MuePQuIPr/S/9SPvammxGa78hVa4JNHZW9O1/6IIcz/RJYL5t5KSTARNXjmm/hWhwqpzAw5I9nlLwo=;24:NxAZplUNY0tD5yezoUyeAnlzjdx5IG9BHwpbp1NxaeH0bqJ2g9FPlAqP5Dixc+/YbrhyGtgockyXG0nYGpN4ErNI5UeV/IPno+79JXK6zl8= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1737;7:JiLQvUxJLLh2FfShg8HKJoq7cPqrpXLEi9CECi3/yJrs+HFmcZYcb6wzp3342DgXaY1d5OxOsH9N6YzcXPCOKajXxi0iG14a7X0Q3i+t1ti8iMdbdR3qct5MupwGmciSYNvAufjWmmfcS2rUVOO7nY81bwMRS30KArCwVf510fSMziqwn2yJ3XDc+aXoX7WKzB6sTIB1u1W33hTHWqWUERlHMksi1jDOdwPgZtrGwpw23kxiyQJJFzotUjfsgFUYbS9xMt1gFTPtLVYPMlMjeVdHBCSxx2ZoUXJ/rD8MWhpbYxPZbGH2Lky6ij+rlaF1QK4YHG3qlAx+RiL3Mosmo8AXfV7beWV3VKY8PVvpYEoCLti2fKfxq8i1vH4YD/IUx6Jn+YVsUr6l2Nn/tnfDs+osm7nJWF2TELdJJvHFSnr67x040RTAzrWKctXrlLG/3UxWB6npF8OiBSy/r7Q0/DtndL5EXwLl82olZhAQDzbzS0GHJl21rEDs+gIA1mjpJpaonpisORaQCIg27LAB3A==;20:dg81CzqMqItsnPRVgLEXJecWLNnIbgBXXHAFAdhCaQg6ell87nBkaTPvfKh2NP9IjZwwCVOCbdhZtT5roDxhqUyWtyz7wW47121iguWmnaXhiXDy9kJ8q1yzvuDpKCBoLg/aDBqqOrWS21gQqGtYL8geLWjZMU2+hS4U+C/+5fw8AWm6MhfYNOvM9pQkWyk7hSV/EKn7sRq6Pn8xvPy0a78Orm9JYHvoJYIe1sGUkldKZP6ycm2lQ6STJ5C53gSt X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Feb 2017 10:17:26.9694 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1737 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. Also, as notted by Andy - removed unneeded clobber for flags in int 0x80 inline asm. 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 --- v3: Remove not needed clobber for "flags" (Andy) 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..b4967d875236 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"); + : "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..f6121612e769 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 "r8", "r9", "r10", "r11" +#else +# define INT80_CLOBBERS +#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