From: Joerg Roedel <joro@8bytes.org>
To: Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@kernel.org>, "H . Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Linus Torvalds <torvalds@linux-foundation.org>,
Andy Lutomirski <luto@kernel.org>,
Dave Hansen <dave.hansen@intel.com>,
Josh Poimboeuf <jpoimboe@redhat.com>,
Juergen Gross <jgross@suse.com>,
Peter Zijlstra <peterz@infradead.org>,
Borislav Petkov <bp@alien8.de>, Jiri Kosina <jkosina@suse.cz>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Brian Gerst <brgerst@gmail.com>,
David Laight <David.Laight@aculab.com>,
Denys Vlasenko <dvlasenk@redhat.com>,
Eduardo Valentin <eduval@amazon.com>,
Greg KH <gregkh@linuxfoundation.org>,
Will Deacon <will.deacon@arm.com>,
aliguori@amazon.com, daniel.gruss@iaik.tugraz.at,
hughd@google.com, keescook@google.com,
Andrea Arcangeli <aarcange@redhat.com>,
Waiman Long <llong@redhat.com>, Pavel Machek <pavel@ucw.cz>,
"David H . Gutteridge" <dhgutteridge@sympatico.ca>,
jroedel@suse.de, joro@8bytes.org
Subject: [PATCH 35/35] x86/entry/32: Add debug code to check entry/exit cr3
Date: Mon, 16 Apr 2018 17:25:23 +0200 [thread overview]
Message-ID: <1523892323-14741-36-git-send-email-joro@8bytes.org> (raw)
In-Reply-To: <1523892323-14741-1-git-send-email-joro@8bytes.org>
From: Joerg Roedel <jroedel@suse.de>
Add a config option that enabled code to check that we enter
and leave the kernel with the correct cr3. This is needed
because we have no NX protection of user-addresses in the
kernel-cr3 on x86-32 and wouldn't notice that type of bug
otherwise.
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
arch/x86/Kconfig.debug | 12 ++++++++++++
arch/x86/entry/entry_32.S | 43 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
index 192e4d2..a57f556 100644
--- a/arch/x86/Kconfig.debug
+++ b/arch/x86/Kconfig.debug
@@ -337,6 +337,18 @@ config X86_DEBUG_FPU
If unsure, say N.
+config X86_DEBUG_ENTRY_CR3
+ bool "Debug CR3 for Kernel entry/exit"
+ depends on X86_32 && PAGE_TABLE_ISOLATION
+ ---help---
+ Add instructions to the x86-32 entry code to check whether the kernel
+ is entered and left with the correct CR3. When PTI is enabled, this
+ checks whether we enter the kernel with the user-space cr3 when
+ coming from user-mode and if we leave with user-cr3 back to
+ user-space.
+
+ If unsure, say N.
+
config PUNIT_ATOM_DEBUG
tristate "ATOM Punit debug driver"
depends on PCI
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index f47e535..6b371a9 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -166,6 +166,24 @@
.Lend_\@:
.endm
+.macro BUG_IF_WRONG_CR3 no_user_check=0
+#ifdef CONFIG_X86_DEBUG_ENTRY_CR3
+ ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_PTI
+ .if \no_user_check == 0
+ /* coming from usermode? */
+ testl $SEGMENT_RPL_MASK, PT_CS(%esp)
+ jz .Lend_\@
+ .endif
+ /* On user-cr3? */
+ movl %cr3, %eax
+ testl $PTI_SWITCH_MASK, %eax
+ jnz .Lend_\@
+ /* From userspace with kernel cr3 - BUG */
+ ud2
+.Lend_\@:
+#endif
+.endm
+
/*
* Switch to kernel cr3 if not already loaded and return current cr3 in
* \scratch_reg
@@ -218,6 +236,8 @@
.macro SAVE_ALL_NMI cr3_reg:req
SAVE_ALL
+ BUG_IF_WRONG_CR3
+
/*
* Now switch the CR3 when PTI is enabled.
*
@@ -229,6 +249,7 @@
.Lend_\@:
.endm
+
/*
* This is a sneaky trick to help the unwinder find pt_regs on the stack. The
* frame pointer is replaced with an encoded pointer to pt_regs. The encoding
@@ -292,6 +313,8 @@
.Lswitched_\@:
+ BUG_IF_WRONG_CR3
+
RESTORE_REGS pop=\pop
.endm
@@ -362,6 +385,8 @@
ALTERNATIVE "", "jmp .Lend_\@", X86_FEATURE_XENPV
+ BUG_IF_WRONG_CR3
+
SWITCH_TO_KERNEL_CR3 scratch_reg=%eax
/*
@@ -803,6 +828,7 @@ ENTRY(entry_SYSENTER_32)
*/
pushfl
pushl %eax
+ BUG_IF_WRONG_CR3 no_user_check=1
SWITCH_TO_KERNEL_CR3 scratch_reg=%eax
popl %eax
popfl
@@ -897,6 +923,7 @@ ENTRY(entry_SYSENTER_32)
* whereas POPF does not.)
*/
btr $X86_EFLAGS_IF_BIT, (%esp)
+ BUG_IF_WRONG_CR3 no_user_check=1
popfl
popl %eax
@@ -974,6 +1001,8 @@ restore_all:
/* Switch back to user CR3 */
SWITCH_TO_USER_CR3 scratch_reg=%eax
+ BUG_IF_WRONG_CR3
+
/* Restore user state */
RESTORE_REGS pop=4 # skip orig_eax/error_code
.Lirq_return:
@@ -987,6 +1016,7 @@ restore_all:
restore_all_kernel:
TRACE_IRQS_IRET
PARANOID_EXIT_TO_KERNEL_MODE
+ BUG_IF_WRONG_CR3
RESTORE_REGS 4
jmp .Lirq_return
@@ -994,6 +1024,19 @@ restore_all_kernel:
ENTRY(iret_exc )
pushl $0 # no error code
pushl $do_iret_error
+
+#ifdef CONFIG_X86_DEBUG_ENTRY_CR3
+ /*
+ * The stack-frame here is the one that iret faulted on, so its a
+ * return-to-user frame. We are on kernel-cr3 because we come here from
+ * the fixup code. This confuses the CR3 checker, so switch to user-cr3
+ * as the checker expects it.
+ */
+ pushl %eax
+ SWITCH_TO_USER_CR3 scratch_reg=%eax
+ popl %eax
+#endif
+
jmp common_exception
.previous
_ASM_EXTABLE(.Lirq_return, iret_exc)
--
2.7.4
next prev parent reply other threads:[~2018-04-16 15:25 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-16 15:24 [PATCH 00/35 v5] PTI support for x32 Joerg Roedel
2018-04-16 15:24 ` [PATCH 01/35] x86/asm-offsets: Move TSS_sp0 and TSS_sp1 to asm-offsets.c Joerg Roedel
2018-04-16 15:24 ` [PATCH 02/35] x86/entry/32: Rename TSS_sysenter_sp0 to TSS_entry_stack Joerg Roedel
2018-04-16 15:24 ` [PATCH 03/35] x86/entry/32: Load task stack from x86_tss.sp1 in SYSENTER handler Joerg Roedel
2018-04-18 23:26 ` Andi Kleen
2018-04-19 0:02 ` Linus Torvalds
2018-04-19 0:38 ` Andi Kleen
2018-04-19 0:44 ` Andy Lutomirski
2018-04-19 9:01 ` David Laight
2018-04-16 15:24 ` [PATCH 04/35] x86/entry/32: Put ESPFIX code into a macro Joerg Roedel
2018-04-16 15:24 ` [PATCH 05/35] x86/entry/32: Unshare NMI return path Joerg Roedel
2018-04-16 15:24 ` [PATCH 06/35] x86/entry/32: Split off return-to-kernel path Joerg Roedel
2018-04-16 15:24 ` [PATCH 07/35] x86/entry/32: Enter the kernel via trampoline stack Joerg Roedel
2018-04-16 15:24 ` [PATCH 08/35] x86/entry/32: Leave " Joerg Roedel
2018-04-16 15:24 ` [PATCH 09/35] x86/entry/32: Introduce SAVE_ALL_NMI and RESTORE_ALL_NMI Joerg Roedel
2018-04-16 15:24 ` [PATCH 10/35] x86/entry/32: Handle Entry from Kernel-Mode on Entry-Stack Joerg Roedel
2018-04-16 15:24 ` [PATCH 11/35] x86/entry/32: Simplify debug entry point Joerg Roedel
2018-04-16 15:25 ` [PATCH 12/35] x86/32: Use tss.sp1 as cpu_current_top_of_stack Joerg Roedel
2018-04-16 15:25 ` [PATCH 13/35] x86/entry/32: Add PTI cr3 switch to non-NMI entry/exit points Joerg Roedel
2018-04-16 15:25 ` [PATCH 14/35] x86/entry/32: Add PTI cr3 switches to NMI handler code Joerg Roedel
2018-04-16 15:25 ` [PATCH 15/35] x86/pgtable: Rename pti_set_user_pgd to pti_set_user_pgtbl Joerg Roedel
2018-04-16 15:25 ` [PATCH 16/35] x86/pgtable/pae: Unshare kernel PMDs when PTI is enabled Joerg Roedel
2018-04-16 15:25 ` [PATCH 17/35] x86/pgtable/32: Allocate 8k page-tables " Joerg Roedel
2018-04-16 15:25 ` [PATCH 18/35] x86/pgtable: Move pgdp kernel/user conversion functions to pgtable.h Joerg Roedel
2018-04-16 15:25 ` [PATCH 19/35] x86/pgtable: Move pti_set_user_pgtbl() " Joerg Roedel
2018-04-16 15:25 ` [PATCH 20/35] x86/pgtable: Move two more functions from pgtable_64.h " Joerg Roedel
2018-04-16 15:25 ` [PATCH 21/35] x86/mm/pae: Populate valid user PGD entries Joerg Roedel
2018-04-16 15:25 ` [PATCH 22/35] x86/mm/pae: Populate the user page-table with user pgd's Joerg Roedel
2018-04-16 15:25 ` [PATCH 23/35] x86/mm/legacy: " Joerg Roedel
2018-04-16 15:25 ` [PATCH 24/35] x86/mm/pti: Add an overflow check to pti_clone_pmds() Joerg Roedel
2018-04-16 15:25 ` [PATCH 25/35] x86/mm/pti: Define X86_CR3_PTI_PCID_USER_BIT on x86_32 Joerg Roedel
2018-04-16 15:25 ` [PATCH 26/35] x86/mm/pti: Clone CPU_ENTRY_AREA on PMD level " Joerg Roedel
2018-04-16 15:25 ` [PATCH 27/35] x86/mm/dump_pagetables: Define INIT_PGD Joerg Roedel
2018-04-16 15:25 ` [PATCH 28/35] x86/pgtable/pae: Use separate kernel PMDs for user page-table Joerg Roedel
2018-04-16 15:25 ` [PATCH 29/35] x86/ldt: Reserve address-space range on 32 bit for the LDT Joerg Roedel
2018-04-16 15:25 ` [PATCH 30/35] x86/ldt: Define LDT_END_ADDR Joerg Roedel
2018-04-16 15:25 ` [PATCH 31/35] x86/ldt: Split out sanity check in map_ldt_struct() Joerg Roedel
2018-04-16 15:25 ` [PATCH 32/35] x86/ldt: Enable LDT user-mapping for PAE Joerg Roedel
2018-04-16 15:25 ` [PATCH 33/35] x86/pti: Allow CONFIG_PAGE_TABLE_ISOLATION for x86_32 Joerg Roedel
2018-04-16 15:25 ` [PATCH 34/35] x86/mm/pti: Add Warning when booting on a PCID capable CPU Joerg Roedel
2018-04-16 15:25 ` Joerg Roedel [this message]
2018-04-16 15:32 ` [PATCH 00/35 v5] PTI support for x32 Linus Torvalds
2018-04-16 16:01 ` Joerg Roedel
2018-04-16 16:13 ` Linus Torvalds
2018-04-18 7:35 ` Joerg Roedel
2018-04-16 17:57 ` H. Peter Anvin
-- strict thread matches above, loose matches on Subject: below --
2018-03-16 19:29 [PATCH 00/35 v4] " Joerg Roedel
2018-03-16 19:29 ` [PATCH 35/35] x86/entry/32: Add debug code to check entry/exit cr3 Joerg Roedel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1523892323-14741-36-git-send-email-joro@8bytes.org \
--to=joro@8bytes.org \
--cc=David.Laight@aculab.com \
--cc=aarcange@redhat.com \
--cc=aliguori@amazon.com \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=brgerst@gmail.com \
--cc=daniel.gruss@iaik.tugraz.at \
--cc=dave.hansen@intel.com \
--cc=dhgutteridge@sympatico.ca \
--cc=dvlasenk@redhat.com \
--cc=eduval@amazon.com \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=hughd@google.com \
--cc=jgross@suse.com \
--cc=jkosina@suse.cz \
--cc=jpoimboe@redhat.com \
--cc=jroedel@suse.de \
--cc=keescook@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=llong@redhat.com \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=pavel@ucw.cz \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=will.deacon@arm.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).