From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753189AbcADVDF (ORCPT ); Mon, 4 Jan 2016 16:03:05 -0500 Received: from mail-db3on0099.outbound.protection.outlook.com ([157.55.234.99]:51952 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752715AbcADVC5 (ORCPT ); Mon, 4 Jan 2016 16:02:57 -0500 Authentication-Results: spf=fail (sender IP is 12.216.194.146) smtp.mailfrom=ezchip.com; ezchip.com; dkim=none (message not signed) header.d=none;ezchip.com; dmarc=none action=none header.from=ezchip.com; From: Chris Metcalf To: Gilad Ben Yossef , Steven Rostedt , Ingo Molnar , Peter Zijlstra , Andrew Morton , "Rik van Riel" , Tejun Heo , Frederic Weisbecker , Thomas Gleixner , "Paul E. McKenney" , Christoph Lameter , Viresh Kumar , Catalin Marinas , Will Deacon , Andy Lutomirski , "H. Peter Anvin" , , CC: Chris Metcalf Subject: [PATCH v9bis 07/13] arch/x86: enable task isolation functionality Date: Mon, 4 Jan 2016 16:02:41 -0500 Message-ID: <1451941361-32347-1-git-send-email-cmetcalf@ezchip.com> X-Mailer: git-send-email 2.1.2 In-Reply-To: <1451936091-29247-8-git-send-email-cmetcalf@ezchip.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;DB3FFO11FD027;1:kYgI9TOtP3PS07QwHaShzzUYu5XfHi6huFNzg7vnloAjlXSY9zZ+QGPEqE9/VvVNj1/8tN54vRZzQOjNJW2SNnucw0XkUhoPRB5vbRoZykMZwnTSKTsiK4CtQUfuyyhHsG03gw2zVE6h2DcgoP5mfXndQhIRATjmUcQxIDdK/PRkztj9yu7uj5fmsiKxjNFB1kX/8QBRYTqObgK9BoT/G+pzqwGjgu520UBW9HbIFur2pOpL48vJbCS50axOzTmK7DIe21y4ybd4DCYRtOMQfDgX6zNd78qk8jburKN1N38/GqmncDWzZgeFFWf2I5LEn+JAy/9TPXR1Pd49OFl90sZNp6WJJFbkrHs7OamF7uMXGvCPGN8zVcZJTi3ILAtm X-Forefront-Antispam-Report: CIP:12.216.194.146;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(5003940100001)(5001770100001)(575784001)(87936001)(19580405001)(47776003)(92566002)(50466002)(6806005)(5008740100001)(1096002)(104016004)(2950100001)(50226001)(229853001)(4001430100002)(2201001)(586003)(48376002)(11100500001)(4326007)(85426001)(1220700001)(189998001)(106466001)(33646002)(86362001)(50986999)(107886002)(42186005)(36756003)(19580395003)(5001970100001)(105606002)(42413003)(921003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:AM3PR02MB0424;H:ld-1.internal.tilera.com;FPR:;SPF:Fail;PTR:wb-fw1.tilera.com;MX:1;A:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;AM3PR02MB0424;2:dUkNRjMyCLDrfLkDFmSI5IDQb6Em3YHNJybrJZnVL10XzJofs7CF09rc3+x0aFnWzcO4z61V3L8F1TtzKwP72+/EAopg2FrxZnQ5cFYehgaH1K5Bx2tdJnCzYG2gNj9EY5lgWujxMoOhRmUZs3faKA==;3:Q1hfURzIqgVFYCRg0rGn1ekObfam7bfkXzI2dij1sid5mGLLowVKMtwODCWlY9YN12luVz86+EFWC5546ETq6j5Zg/rI/JtENqfavl+lH4Ws5Jo7DJ5wd1fasoAl2TR7dpsbkJZaNOMOj3zcN+GKXbEE4CYh3yWb9nXxrLMTzxIHe5I0LgptTTSL8uWnGdcS9yXnFA2VNXD527UhPzNWCjnpOdE6lamdSBY6rd+Bwus=;25:QjBa07KKoMvHDgsd7ypxQ4kY6scJCnxcIxhh3qOENqkpShTRfduNDz7WTsnlVoCLvsUueYhUSRUSTAtHuAwiU6hXD4wNkqP0dBxLqoNVVKy2+AZa0P2l3ySr6CHyjelOcJJeWm4LSVEf1t6GjCRu9YBt0TXGiJb+GZn5Sl973FfqmBN7jwlFuanig4nb8WwlkLtLRW5jr/1/C8IfZi/JriD0Vwp6HH5pFjaZNPMbhhEFXomsH3po/LffKjD+cgSsqAfITCyb28gmkv95JYzA5A==;20:s1BYa1Q4T2oGZdUA8BPtui143RyCgy7Jr5aAmyhGxX7kL9C6Pi+mZu41LaL+u2yQmp6X4Pfg3/3LlAf3r7Hy2vT9urmsUKDz98J8LwLulYZDAY3d27/vH9wzN+80bRj1DJsdt5V9orJuDn+GDlBDX7doJ+EobTZhFivOfM8vOCg= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR02MB0424; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(121898900299872); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:AM3PR02MB0424;BCL:0;PCL:0;RULEID:;SRVR:AM3PR02MB0424; X-Microsoft-Exchange-Diagnostics: 1;AM3PR02MB0424;4:5BvFFxZaw6KqX2kJdQacY1f4pnzwaETknQomRHdCO27W3SCPuOUyOMW1fzy5V4fFeTc9roWoT7EVuFhESOab/Qwe+OdKS9WtO4CMlcy3Ok8KyNp3pxd6ShzEOXCdE6l1zhAdHGYWZKlK54rvJV0kd5DoTgfTouwJsqRayQGolnhncEN+270DyC5INmxNH0dSVLazLCviFpZuUt2P+zeoZb6OUvv+zu47QNf5N7nFT5A7sXCduXMT+ZzqvEjk2gOUfXhQJJhcJgPy3qztGnnhzyixAq3QUGsXAHivQCgh+nfpVBKXBcFwN0+EyfPwiR1qQg6V8Jpy5Bspg5tCWEd5WsKsgOVKQv+PpND5St54C2EGRWgxWR2pMqmwFbNc3mvZr7LX7TLUjMXW55Ehb/91YcLYm6qYHBsL+IU5Z0YgaPwIaXbFoCaoW3HMwhlJI8ye X-Forefront-PRVS: 08118EFC2B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM3PR02MB0424;23:WFkbboG2zYGMvWALbzMyVJs0JWthap+bmW5rophdW?= =?us-ascii?Q?7K/c9GRdIFl94r9GiZYQmSRiENtQ3nfbihNmok/huhLLo+/vO18wD38N6pdZ?= =?us-ascii?Q?xXn+c1yBlFJ4+kUi5nVnl6zCBO3V455fMJc4c0nK5bcluUU3F4yRDgOzKPVl?= =?us-ascii?Q?ygHwF4j7pKNliRgaySpcls735h7AZnL71lKUvDCR7sikL76uoP3x0Vev8ee6?= =?us-ascii?Q?ghXVbRgy7/X08uPEA06o3mH79pyLUlcCdxMW6bMaW/9gTG0qkCGykCqFDDd4?= =?us-ascii?Q?NO4Y83TuNJ+MrS5fEvBGLwlRBp1uZhBy3kWXOEZxBswitmwckTLVo25nIrac?= =?us-ascii?Q?WGRwGX47hSh5yLTjH+4ZrwCx/3RuLMV9jGT5L2hw4KXSRW4RsuptxhUliox9?= =?us-ascii?Q?J+kKUuQ8a7T8g1I0xU4C3DBv0rpvkp0VxznC5fPgtmsHnYPvJlewDfyY4rl1?= =?us-ascii?Q?6mDxFUNYfxpvJX0st0ikVVUOJDFOTLILrB4LMFvGJqVWK0gkNI7uIh6eLJ4+?= =?us-ascii?Q?iTDW7IaQBFMI8lt8hun3iMwweLY3s9k/nf/xkqg7TFTk0mVmUNBKeSUVxwM9?= =?us-ascii?Q?uqHtP7eGFZS5e6WUZYdA2vrk7oTmqVZ91LiarYjC5PzVjWpFkqrle1nU7OQS?= =?us-ascii?Q?3s3WwidpOpd7Q/FIw+LkhdPTl5WWudpN1Q09ekC7zp1aXKv5Fh+IssEN9hT8?= =?us-ascii?Q?TKAEQj+0oOTjFKLnBISyLRs79bj7+esaNhkMdzjVL6KK0yiIJlw3NCgffZhE?= =?us-ascii?Q?kNAF/YUXSQXiwAX+Od2mXYabUn3rw3wfto4pzs83MdW2g6JQ/tUGmXXkHEfk?= =?us-ascii?Q?aPwIe6Hg5Meg3fzKPHxhsfXD54LS7DMzYb8kJesUIGpHoc1PYjZdnkbULVKd?= =?us-ascii?Q?aB+BFUIB/Bmfrn36QeHCNlKPMElc96LQENTRG31odHuji9unYScRaJjRBzJP?= =?us-ascii?Q?HZcPLZ2UoIhvPLcdh2bAh7bb55Wzp3cjo/7J/lzNuANRbMSf1cYgwb2MYS7n?= =?us-ascii?Q?EpXNw09XkhAcEHM5n5A1ENWyxyLUL3iEls/XjBA909QKc4EMOjSqALuH8XBZ?= =?us-ascii?Q?gQSciO4dTAhcKeMmqPz3xHw2gg1iWj8Km7c8BujtY3TNvnT0i2ex1Zcwuc6q?= =?us-ascii?Q?P7VC9FOi1AoLk8QRBwguxnoRmUMlZN5mI7fElrYvOgMH/XAOIRDxg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM3PR02MB0424;5:C7AoNsKpZUzofuFXkoBW4bsQcbkoK0zvtgzTvV4V1ycOdCiut+McL0OApAI49+nSVtYeYALZ5go8nWaRBr7FUpFz6qjiY2ZaYVt8doxwNhkx8jTfAMEz+6vP97tK4aAgxQf+8SrcqVDc/LvYZTqBvg==;24:xdUN1GzV2y/hPbIbpEw8M+F1/zZnGj5COL3xlazeotT1zWav1diPyChnIJVqZ9hYvmeuG+QwHUjrPImGKuVZxhFXVFLHE5SQiII08kzhFHw= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jan 2016 21:02:52.2361 (UTC) X-MS-Exchange-CrossTenant-Id: 0fc16e0a-3cd3-4092-8b2f-0a42cff122c3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0fc16e0a-3cd3-4092-8b2f-0a42cff122c3;Ip=[12.216.194.146];Helo=[ld-1.internal.tilera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR02MB0424 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In prepare_exit_to_usermode(), call task_isolation_ready() when we are checking the thread-info flags, and after we've handled the other work, call task_isolation_enter() unconditionally. In syscall_trace_enter_phase1(), we add the necessary support for strict-mode detection of syscalls. We add strict reporting for the kernel exception types that do not result in signals, namely non-signalling page faults and non-signalling MPX fixups. Signed-off-by: Chris Metcalf --- Oops! In v9 I sent a version of this patch that didn't have the semantic merge to 4.4 from Andy's commit 39b48e575e92 ("x86/entry: Split and inline prepare_exit_to_usermode()"). This "v9bis" version adds the necessary extra check to get into exit_to_usermode_loop() in the first place when running in task-isolation mode. arch/x86/entry/common.c | 18 ++++++++++++++++-- arch/x86/kernel/traps.c | 2 ++ arch/x86/mm/fault.c | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c index a89fdbc1f0be..477d8cafaaf2 100644 --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -91,6 +92,10 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch) */ if (work & _TIF_NOHZ) { enter_from_user_mode(); + if (task_isolation_check_syscall(regs->orig_ax)) { + regs->orig_ax = -1; + return 0; + } work &= ~_TIF_NOHZ; } #endif @@ -254,17 +259,26 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags) if (cached_flags & _TIF_USER_RETURN_NOTIFY) fire_user_return_notifiers(); + task_isolation_enter(); + /* Disable IRQs and retry */ local_irq_disable(); cached_flags = READ_ONCE(pt_regs_to_thread_info(regs)->flags); - if (!(cached_flags & EXIT_TO_USERMODE_LOOP_FLAGS)) + if (!(cached_flags & EXIT_TO_USERMODE_LOOP_FLAGS) && + task_isolation_ready()) break; } } +#ifdef CONFIG_TASK_ISOLATION +# define EXIT_TO_USERMODE_FLAGS (EXIT_TO_USERMODE_LOOP_FLAGS | _TIF_NOHZ) +#else +# define EXIT_TO_USERMODE_FLAGS EXIT_TO_USERMODE_LOOP_FLAGS +#endif + /* Called with IRQs disabled. */ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs) { @@ -278,7 +292,7 @@ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs) cached_flags = READ_ONCE(pt_regs_to_thread_info(regs)->flags); - if (unlikely(cached_flags & EXIT_TO_USERMODE_LOOP_FLAGS)) + if (unlikely(cached_flags & EXIT_TO_USERMODE_FLAGS)) exit_to_usermode_loop(regs, cached_flags); user_enter(); diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index ade185a46b1d..82bf53ec1e98 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef CONFIG_EISA #include @@ -398,6 +399,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) case 2: /* Bound directory has invalid entry. */ if (mpx_handle_bd_fault()) goto exit_trap; + task_isolation_check_exception("bounds check"); break; /* Success, it was handled */ case 1: /* Bound violation. */ info = mpx_generate_siginfo(regs); diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index eef44d9a3f77..7b23487a3bd7 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@ -14,6 +14,7 @@ #include /* prefetchw */ #include /* exception_enter(), ... */ #include /* faulthandler_disabled() */ +#include /* task_isolation_check_exception */ #include /* dotraplinkage, ... */ #include /* pgd_*(), ... */ @@ -1148,6 +1149,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code, local_irq_enable(); error_code |= PF_USER; flags |= FAULT_FLAG_USER; + task_isolation_check_exception("page fault at %#lx", address); } else { if (regs->flags & X86_EFLAGS_IF) local_irq_enable(); -- 2.1.2