From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757105AbbFPURR (ORCPT ); Tue, 16 Jun 2015 16:17:17 -0400 Received: from mail.kernel.org ([198.145.29.136]:42466 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752938AbbFPURH (ORCPT ); Tue, 16 Jun 2015 16:17:07 -0400 From: Andy Lutomirski To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Weisbecker?= , Rik van Riel , Oleg Nesterov , Denys Vlasenko , Borislav Petkov , Kees Cook , Brian Gerst , Andy Lutomirski Subject: [RFC/INCOMPLETE 00/13] x86: Rewrite exit-to-userspace code Date: Tue, 16 Jun 2015 13:16:46 -0700 Message-Id: X-Mailer: git-send-email 2.4.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is incomplete, but it's finally good enough that I think it's time to get other opinions on it. It is a complete rewrite of the slow path code that handles exits to user mode. The exit-to-usermode code is copied in several places and is written in a nasty combination of asm and C. It's not at all clear what it's supposed to do, and the way it's structured makes it very hard to work with. For example, it's not even clear why syscall exit hooks are called only once per syscall right now. (It seems to be a side effect of the way that rdi and rdx are handled in the asm loop, and it seems reliable, but it's still pointlessly complicated.) The existing code also makes context tracking overly complicated and hard to understand. Finally, it's nearly impossible for anyone to change what happens on exit to usermode, since the existing code is so fragile. I tried to clean it up incrementally, but I decided it was too hard. Instead, this series just replaces the code. It seems to work. Context tracking in particular works very differently now. The low-level entry code checks that we're in CONTEXT_USER and switches to CONTEXT_KERNEL. The exit code does the reverse. There is no need to track what CONTEXT_XYZ state we came from, because we already know. Similarly, SCHEDULE_USER is gone, since we can reschedule if needed by simply calling schedule() from C code. The main things that are missing are that I haven't done the 32-bit parts (anyone want to help?) and therefore I haven't deleted the old C code. I also think this may break UML for trivial reasons. Because I haven't converted the 32-bit code yet, all of the now-unnecessary unnecessary calls to exception_enter are still present in traps.c. IRQ context tracking is still duplicated. We should probably clean it up by changing the core code to supply something like irq_enter_we_are_already_in_context_kernel. Thoughts? Andy Lutomirski (13): context_tracking: Add context_tracking_assert_state notifiers: Assert that RCU is watching in notify_die x86: Move C entry and exit code to arch/x86/entry/common.c x86/traps: Assert that we're in CONTEXT_KERNEL in exception entries x86/entry: Add enter_from_user_mode and use it in syscalls x86/entry: Add new, comprehensible entry and exit hooks x86/entry/64: Really create an error-entry-from-usermode code path x86/entry/64: Migrate 64-bit syscalls to new exit hooks x86/entry/compat: Migrate compat syscalls to new exit hooks x86/asm/entry/64: Save all regs on interrupt entry x86/asm/entry/64: Simplify irq stack pt_regs handling x86/asm/entry/64: Migrate error and interrupt exit work to C x86/entry: Remove SCHEDULE_USER and asm/context-tracking.h arch/x86/entry/Makefile | 1 + arch/x86/entry/common.c | 372 ++++++++++++++++++++++++++++++++ arch/x86/entry/entry_64.S | 176 ++++----------- arch/x86/entry/entry_64_compat.S | 7 +- arch/x86/include/asm/context_tracking.h | 10 - arch/x86/include/asm/signal.h | 1 + arch/x86/kernel/ptrace.c | 202 +---------------- arch/x86/kernel/signal.c | 28 +-- arch/x86/kernel/traps.c | 9 + include/linux/context_tracking.h | 8 + kernel/notifier.c | 2 + 11 files changed, 439 insertions(+), 377 deletions(-) create mode 100644 arch/x86/entry/common.c delete mode 100644 arch/x86/include/asm/context_tracking.h -- 2.4.3