From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753040AbdBJL6j (ORCPT ); Fri, 10 Feb 2017 06:58:39 -0500 Received: from mail-he1eur01on0108.outbound.protection.outlook.com ([104.47.0.108]:7107 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751305AbdBJL6g (ORCPT ); Fri, 10 Feb 2017 06:58:36 -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: [PATCH] x86/selftests: add clobbers for int80 on x86_64 Date: Fri, 10 Feb 2017 14:52:39 +0300 Message-ID: <20170210115239.29256-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: HE1PR02CA0061.eurprd02.prod.outlook.com (10.163.170.29) To DB6PR0801MB1733.eurprd08.prod.outlook.com (10.169.226.148) X-MS-Office365-Filtering-Correlation-Id: 03208ce6-1b18-419a-8f57-08d451abd97a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB6PR0801MB1733; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;3:nsriPvvr2ZcoNssztFY7xxmHU0xg/HQSTGASIp/lx9CHkMpuKRhlnaFnPM+vTi2y/me7B32WlXMCqZLs84X8QdgXvLSs/AceDJ3h+3QDlR1KsZI6IKsz5ZI3s6yj6rdq2nQFol8c5XAofSFVuy0G0TtKZZPVSePWV/XYLHws+XyIkJMoDkJT2eok8RkEHDeQdFeHEkJgwjRh9g85P4TpMAxpCFB2MZIDbAImmeRqmsIsGwVAVEZrpzvt3PVjGc4Le370yk6q4EDyjG+tW2PFBA==;25:yJpF3yKY+c6rZVXXRudOEnOU6jaVJxe2b2ws6EU+mof+ure9hWWWnVXOUOKUBMU7ueiOjhLFSH3KW/ZYqMADA6usyrJ414tdwW23XNm+D2qMvH7WxIPQ4kFXuklJKQgEvb+hEn/7CfvjJNSiWHlmjonpWBy+i++GuEZEG0MHbIae4B8IGySa7pJZw0mMfsCbbqqK2TvZozCwP05v+4VzZ+oH2+d5xs2JVMg1HJDo+YCRoOSqkeHpEEHAd7w7BHO4w8jvq58qkAQ8lKi7eTNR5bFiSU6nCeh9/TDXM/oZRBe+CHFTai3S0xwtIYpU2Rd4ZwbSRwa5L5SkhQbGcYVJtLcXDGXpjsQSyw86h62re0XMQR3ajUSQCTGyv8nt96t8iVNCSdTk2dbR7CkTblBRqUgdV4byEbdpAg8tLDnPLcBZ2rzBV5i6V4cikXaNjihEkGV83mE7W6yE+K0lJQ8Ecg== X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;31:x6bTq2ixmT/I4zJYW4ASTOAZuXqDgwyRpZu8ENEfZFjSX3gBsrKhMFd4dkJZNB9s47Y27G0ux4JtOs0W5YRUVJQO3eb0NgpuyXS9i6ladb9KgsaltIRLGjM+MsGZLsIypbzc2tLqDZFPoLuefAYOZZMnRkck0/XrSag4KlgyKqEEH6AKPs3TukF3PKym1Jcog0PO1Lw/3yEojSdU9VtYJOTYbZGDiUvpREMrtJ87OCQJoTI8H5JRLRyA8+LiUit1;20:GouYuewNIAs2uFZ6G85PnnAGqccav46Kh5iR/a4I8Qnjpq4OIkJ0JkQ/CYc4DzgN4RhZnJkdWnkzom67AukKo8h/T5JJkx4R4Onhyj5IL3E+agMy1GIg6k9mMUpHGYcABNYAVE3aNuYO5JwzKcJQiYA+I6qBjiMFVy5hPAeOWuW6cJDMe0+a1bZS+rztJ40w8EuZtuVS+vzE/jW2zD0+BvhGzmc84jTvBX6lU0jmp+ue9so79EDiAWJHswB+sMtP2mb46qSZQLZhJpbvaP97674j6qpIuPPPrnbcpNOV0VrxwZqk9R+qGLaAR0RGHX4IlzD9YmQEzL2L1uY/bEcot+NoG192apghgbpuOP/FfL+WoFXnB+e0LqPDywKGdfdrFtFW7IgLQ0H4LDIpVuSpnjL7F1PafZjHHGuNCY/0Lxo= 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)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123564025)(20161123555025)(20161123560025)(20161123562025)(20161123558025)(6072148);SRVR:DB6PR0801MB1733;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1733; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;4:7T6jquJ7BB72BmIP1DNX2fBoaaiNuTQ+cbvbTUWYrZ2RYiQ1DhZDuyx+b1LNpy/TQ3dlPX8HvL6wIyKu8lDP6LdaEY0dfIoNuMVkocAztswija8hO6Dqa4xf/YQeiCxCstWlsZsxNfJC7H0DKzDh3TCMHFOi/zsAFZkziA3unfijnFeSLg0GMDyG9zHM5AjymYZbE9tJMs087MxF8QIIQscdW/P16zDf+jGLhBhoSdbUfr6wJBCNV8DECR6ZbH/87VAjCnpbQ4hWWkoIz34vf8ByK/eHoxIXnvmLGS+Fktd9Yt6zSquPg4jogIfKrdgzh2a0rzaR2PKI/bmBM0XjZLp2zNHi4cmOu8uKpZtMZAhWbScnWzjvruKCGuMQpTl157saE1CRnN6lgEJeMyFYl7lsXrUBJVLNddlyCEVvuIYtayEy6OYkhj5pWpG9jySMkb2Tcy9yLVFSIPj66Q6fXJOSMkHj1SlLN0lCcBV5wqGOPyvk68BpsS2mtgk3bmusWK1tQ9q3VHNTZglVbEzU2EyZMl9vW/OIKnqKJGrwGWZurcqaHZ+YpW7+7iE77cZEvGPhlU8LDG3dIqVK7x2lGSLp5MnyCt6+OKLICUphnl25XQ5nGB25WhV3LrqH35L0QvnlS9436ad0vAJJnqwo7YHCbFATZ1+P2AJiFViufFymX5PbUKDN0SaSX7IrBYd+ X-Forefront-PRVS: 0214EB3F68 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(199003)(189002)(3846002)(189998001)(97736004)(66066001)(86362001)(36756003)(5003940100001)(92566002)(48376002)(101416001)(53416004)(33646002)(4326007)(69596002)(2906002)(42186005)(106356001)(50986999)(2351001)(50466002)(305945005)(47776003)(105586002)(6116002)(81156014)(7416002)(6486002)(81166006)(8676002)(39060400001)(1076002)(68736007)(54906002)(6916009)(6512007)(38730400002)(110136004)(50226002)(6506006)(6666003)(6306002)(25786008)(53936002)(7736002)(5660300001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1733;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1733;23:xJ7bCE5D4EHI1P04i3pMosSwLCrfL0WOyENy5XN?= =?us-ascii?Q?gnLxE87lgNpIWYKvBBcuIE0GGrc1bsTpk4a3xkpN05pZDnnfU3KgbraFgZ1e?= =?us-ascii?Q?38Yv/GB0o50GI/2ZD/1Aw+vdISNH/P7WJcuTlCzDQn11fsw3wmVx3dkvVkhY?= =?us-ascii?Q?LQN5fGJL3iAAzGuwTJP8USExG8tuOPvjvwf859vLWzWlDXaPzOnpB324di54?= =?us-ascii?Q?TkFVjBivua3ylrBtFeIVTJ10fwXjaQCVmCoxS3ys14f/9601ZlcvFP41id5L?= =?us-ascii?Q?l+EfqJ1oG+BkyS75WO999GtBP2EyfGtbSJqbgdyHbs956I942KbUgYAbbn4k?= =?us-ascii?Q?NFPL/onYhl3YSCywVkjfQRmECETRYT32eMqOTDvNaj9PIIFnhY8vI1fc/NUP?= =?us-ascii?Q?jThq3xNtjCYMu7gab/8T9EN4dXSuQS56glnsSoQJRfEd1YllyOJFg2P8qslM?= =?us-ascii?Q?XahBGFyD/ItNUGQCOOyU3r7IRD84B5oSvy3XcAbRrGda5fVihFMj1H3nwNGr?= =?us-ascii?Q?VogdOxhLesqPzsJVACY5bkLkneVva2pY304bWlsSVaJeS9esQzW0elpv74d0?= =?us-ascii?Q?lNb1TdGPSAzOernpiVu6Nvg+4GLjK3fTpHPGvToWCG/zAzmTsd6fR5HD9Ds2?= =?us-ascii?Q?u7RgfLUh+P/kvwsaDCIsuSAFjgAJe8LEd2O6gcM0qA8Nld/luYly1UB0wbdc?= =?us-ascii?Q?wrZKiHbzPp9VLqHvnhgbOh7B63siIPR4VLyuo9ICkX8plpo55YO60ffe3ZA0?= =?us-ascii?Q?HLUDJKy1h++pZWKNHar9rY+Hd82lqWTRYTWD0GLI4ZUCX1IYQUbUBUzDnWN2?= =?us-ascii?Q?T6bp24vj4Bdh8kuzOK+9squHp9Wuc8KWttrzuAeU6UGODR+8sgU/Qn2T3PS4?= =?us-ascii?Q?f4670hVB4eSBrNqlDku3F9+itErVIB1tvd6Z0s5gJlJtk1eQLEsCC7Io2Rgd?= =?us-ascii?Q?+orJC9zocewU6I4d4oTfvNKnOs1Za+vbXX/j5l2wIK0GSOpqj+F4CvigGmvT?= =?us-ascii?Q?WR75LgcC5B8qA7qhKAuOrdaCmI3wVJwN84/iBl594KQptMqX9VldEZjE6AUQ?= =?us-ascii?Q?3CrGPEv4QZTWqbKiYABXt8DGSlozT67FdkH4zVPOJhJQNELWmTDbPgohCutU?= =?us-ascii?Q?3EngwHR0DYl9kc4/vo2IHJrEsLPqUmDJE7ZWwizmmlZeaETgdK4aQi3xBuwv?= =?us-ascii?Q?jCZu2Cuzq0dyZzzw/vbdCicBfVI4gdDFpwtKII9rYxfjCNTgps90Mck/fxg?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;6:Zrk2v46rq0h+Qw0CvZxe635CbDxQxs8o7SZNIVYOyjmdxO120jRZEOT/x9zh2N/28skJmdFdEvBscvyf9AyWUmg1l5cstSwV33Ilxc3+lHEcON/z4emlETFYJYkpQAnQAUUIGhO9z8YFa53iuz6bpwZoCjlo9B8kmzHhW8vj5kDSgtP1v5xkx6B6JDk/YYnErCDAYKcQQLZaOhBwo+p8NwKl+mJRVofyOx/PMvk2GpIONk8o7hEGjnnz352U3rFbEKNHQ0njGdwGuRxXm5i9UzgknrbPjxpF9KB7kkc8rUYyrusFQJcPLIN/WA37fuXfQCB1NdveAIro+Ie1zCKCylm8Y6Aic3/H9G7KjnyIy6nic+pMbbPk8sFtDQeBo0ePfzGaXUgpqa2gY88dJYul6g==;5:feWznDPQYa5gOM0dGaLq5p2QaAV/1TZKX/bxDWRKNysQuIS7CcF4rRMZNR0+zXnUSSc4BzuaRGjsDZdn3fXjNAV8zMQnklNBjlAGWJpH/nFR1hntpIbekSUgKpNgMg7oom9H9iENMgEoEjIvJExRXQ==;24:4ARCON0+K/ueQcL8l4svkHE/NcO4an6RPtGdSKJWd4O3sVGuPQwOMElZjCmyWdQoI2Vfz4zBE/gHm/4i+VBluxFJvYR5UkPodP3/rr9Nfas= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;7:MlyVyqbgjr72yyHWFoyZwWkrJeIqHReqWBWJ+7IGknoX9LHNrk8milzhD+QbPgRDaLbOx0f+MdPubHfEALXKjnECskV63+kFgG72Cd6bqq1zEUEwFqWgI3q1y1W9S1ilDdmCa3UUPAbv5ELJgaXL3t01NqkN7kWHRw06EC7BAmkb7Liuxf20Bf1yCz2DIlfs7vqpD2bmWYfw1wjEJxwf9gEc6GHnclUXh4hgkxsJI1aoskgtnyOYrFySeJ3grk1IKID3himSVwtxsU8Qs0Fr+LU/8Dmce1neyZkgezsq5BIxqiTuycydCPztfSNov0SKqrr/1nLHF2jrS7lR8iVKgyjd2KkjU53f6LZcQ8b+/gj2ZgpLYaBv83vBYF/92NkKT7Nymg1GD15jA9rnkZHYwjLgqgoTXlCBArT1uDJC5ARAEiSYxBWP20o3invm9aizT9dhUy06DOcPK+VQmM6rL/bE0sL4G9P982j6VcyMBbWT+Fci89IZuVPQo52Y6VLfp62kxgtOHZaaUavWWy3g2A==;20:X3qIGK9MaP55IDISd+2TCCnFZtO4nPpaZ+2+3LsN7ORqXdHQVB5kWdJQEgH1vYqz1Vzf1NTjjQM9O/A6AiU57KmfRnVODvWT524V4hQDpc7xhkavP1oQBc8Dlru0MNeql156plsXm0ZWTVH6dyOy1zyON/kxses6QwaBqHKELbQkW89mPXSc0OgEaNrEvG6c5LvayIFHoNkoyEl7QjhSqlR/4G8DEi4vScmYVdNgAyFzsVamKyQmb0epoACQFoS2 X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2017 11:56:28.3277 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1733 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 --- tools/testing/selftests/x86/fsgsbase.c | 2 +- tools/testing/selftests/x86/iopl.c | 10 ++++++++-- 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 ++++- 5 files changed, 26 insertions(+), 10 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/iopl.c b/tools/testing/selftests/x86/iopl.c index c496ca97bc18..98236a233db8 100644 --- a/tools/testing/selftests/x86/iopl.c +++ b/tools/testing/selftests/x86/iopl.c @@ -19,6 +19,12 @@ #include #include +#ifdef __x86_64__ +# define INT80_CLOBBERS "r8", "r9", "r10", "r11" +#else +# define INT80_CLOBBERS +#endif + static int nerrs = 0; static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), @@ -70,7 +76,7 @@ int main(void) err(1, "iopl"); printf("[RUN]\tchild: write to 0x80\n"); - asm volatile ("outb %%al, $0x80" : : "a" (0)); + asm volatile ("outb %%al, $0x80" : : "a" (0) : INT80_CLOBBERS); return 0; } else { @@ -93,7 +99,7 @@ int main(void) if (sigsetjmp(jmpbuf, 1) != 0) { printf("[OK]\twrite was denied\n"); } else { - asm volatile ("outb %%al, $0x80" : : "a" (0)); + asm volatile ("outb %%al, $0x80" : : "a" (0) : INT80_CLOBBERS); printf("[FAIL]\twrite was allowed\n"); nerrs++; } 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