All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Lutomirski <luto@kernel.org>
To: X86 ML <x86@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	KVM list <kvm@vger.kernel.org>,
	Arjan van de Ven <arjan@linux.intel.com>,
	xen-devel <Xen-devel@lists.xen.org>,
	linux-kernel@vger.kernel.org,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>
Subject: [PATCH v5 6/9] x86/msr: Carry on after a non-"safe" MSR access fails
Date: Sat,  2 Apr 2016 07:01:37 -0700	[thread overview]
Message-ID: <26567b216aae70e795938f4b567eace5a0eb90ba.1459605520.git.luto@kernel.org> (raw)
In-Reply-To: <cover.1459605520.git.luto@kernel.org>
In-Reply-To: <cover.1459605520.git.luto@kernel.org>

This demotes an OOPS and likely panic due to a failed non-"safe" MSR
access to a WARN_ONCE and, for RDMSR, a return value of zero.

To be clear, this type of failure should *not* happen.  This patch
exists to minimize the chance of nasty undebuggable failures
happening when a CONFIG_PARAVIRT=y bug in the non-"safe" MSR helpers
gets fixed.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
 arch/x86/include/asm/msr.h | 10 ++++++++--
 arch/x86/mm/extable.c      | 27 +++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
index 93fb7c1cffda..1487054a1a70 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -92,7 +92,10 @@ static inline unsigned long long native_read_msr(unsigned int msr)
 {
 	DECLARE_ARGS(val, low, high);
 
-	asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr));
+	asm volatile("1: rdmsr\n"
+		     "2:\n"
+		     _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_rdmsr_unsafe)
+		     : EAX_EDX_RET(val, low, high) : "c" (msr));
 	if (msr_tracepoint_active(__tracepoint_read_msr))
 		do_trace_read_msr(msr, EAX_EDX_VAL(val, low, high), 0);
 	return EAX_EDX_VAL(val, low, high);
@@ -119,7 +122,10 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
 static inline void native_write_msr(unsigned int msr,
 				    unsigned low, unsigned high)
 {
-	asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high) : "memory");
+	asm volatile("1: wrmsr\n"
+		     "2:\n"
+		     _ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_wrmsr_unsafe)
+		     : : "c" (msr), "a"(low), "d" (high) : "memory");
 	if (msr_tracepoint_active(__tracepoint_read_msr))
 		do_trace_write_msr(msr, ((u64)high << 32 | low), 0);
 }
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 50dfe438bd91..98b5f45d9d79 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -50,6 +50,33 @@ bool ex_handler_ext(const struct exception_table_entry *fixup,
 }
 EXPORT_SYMBOL(ex_handler_ext);
 
+bool ex_handler_rdmsr_unsafe(const struct exception_table_entry *fixup,
+			     struct pt_regs *regs, int trapnr)
+{
+	WARN_ONCE(1, "unchecked MSR access error: RDMSR from 0x%x\n",
+		  (unsigned int)regs->cx);
+
+	/* Pretend that the read succeeded and returned 0. */
+	regs->ip = ex_fixup_addr(fixup);
+	regs->ax = 0;
+	regs->dx = 0;
+	return true;
+}
+EXPORT_SYMBOL(ex_handler_rdmsr_unsafe);
+
+bool ex_handler_wrmsr_unsafe(const struct exception_table_entry *fixup,
+			     struct pt_regs *regs, int trapnr)
+{
+	WARN_ONCE(1, "unchecked MSR access error: WRMSR to 0x%x (tried to write 0x%08x%08x)\n",
+		  (unsigned int)regs->cx,
+		  (unsigned int)regs->dx, (unsigned int)regs->ax);
+
+	/* Pretend that the write succeeded. */
+	regs->ip = ex_fixup_addr(fixup);
+	return true;
+}
+EXPORT_SYMBOL(ex_handler_wrmsr_unsafe);
+
 bool ex_has_fault_handler(unsigned long ip)
 {
 	const struct exception_table_entry *e;
-- 
2.5.5

  parent reply	other threads:[~2016-04-02 14:02 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-02 14:01 [PATCH v5 0/9] Improve non-"safe" MSR access failure handling Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 1/9] x86/head: Pass a real pt_regs and trapnr to early_fixup_exception Andy Lutomirski
2016-04-02 14:01   ` Andy Lutomirski
2016-04-13 11:43   ` [tip:x86/asm] x86/head: Pass a real pt_regs and trapnr to early_fixup_exception() tip-bot for Andy Lutomirski
2016-04-13 11:43   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 2/9] x86/head: Move the early NMI fixup into C Andy Lutomirski
2016-04-02 14:01 ` Andy Lutomirski
2016-04-13 11:43   ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2016-04-13 11:43   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 3/9] x86/head: Move early exception panic code into early_fixup_exception Andy Lutomirski
2016-04-02 14:01   ` Andy Lutomirski
2016-04-02 18:39   ` Borislav Petkov
2016-04-02 18:39   ` Borislav Petkov
2016-04-02 20:13     ` Andy Lutomirski
2016-04-02 20:47       ` Borislav Petkov
2016-04-02 20:47       ` Borislav Petkov
2016-04-02 20:58         ` Andy Lutomirski
2016-04-02 20:58         ` Andy Lutomirski
2016-04-04 11:52           ` Jan Kara
2016-04-04 11:52           ` Jan Kara
2016-04-04 12:46             ` Peter Zijlstra
2016-04-04 12:46             ` Peter Zijlstra
2016-04-04 15:32             ` Andy Lutomirski
2016-04-04 15:36               ` Arjan van de Ven
2016-04-04 15:36               ` Arjan van de Ven
2016-04-04 16:00               ` Peter Zijlstra
2016-04-04 16:00               ` Peter Zijlstra
2016-04-04 19:38                 ` Borislav Petkov
2016-04-04 19:38                 ` Borislav Petkov
2016-04-04 21:31                   ` Andy Lutomirski
2016-04-04 21:40                     ` Borislav Petkov
2016-04-04 21:40                     ` Borislav Petkov
2016-04-04 21:31                   ` Andy Lutomirski
2016-04-04 15:32             ` Andy Lutomirski
2016-04-02 20:13     ` Andy Lutomirski
2016-04-13 11:44   ` [tip:x86/asm] x86/head: Move early exception panic code into early_fixup_exception() tip-bot for Andy Lutomirski
2016-04-13 11:44   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 4/9] x86/traps: Enable all exception handler callbacks early Andy Lutomirski
2016-04-02 18:52   ` Borislav Petkov
2016-04-02 20:16     ` Andy Lutomirski
2016-04-02 20:52       ` Borislav Petkov
2016-04-02 20:52       ` Borislav Petkov
2016-04-03  8:07         ` Borislav Petkov
2016-04-03  8:07         ` Borislav Petkov
2016-04-03 13:22           ` Andy Lutomirski
2016-04-03 13:22           ` Andy Lutomirski
2016-04-03 13:51           ` Linus Torvalds
2016-04-03 13:51           ` Linus Torvalds
2016-04-03 13:55             ` Andy Lutomirski
2016-04-03 14:10               ` Borislav Petkov
2016-04-03 14:10               ` Borislav Petkov
2016-04-04 15:47                 ` Andy Lutomirski
2016-04-04 15:47                 ` Andy Lutomirski
2016-04-03 14:17               ` Linus Torvalds
2016-04-03 14:17               ` Linus Torvalds
2016-04-03 13:55             ` Andy Lutomirski
2016-04-02 20:16     ` Andy Lutomirski
2016-04-02 18:52   ` Borislav Petkov
2016-04-13 11:44   ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2016-04-13 11:44   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 4/9] " Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 5/9] x86/paravirt: Add _safe to the read_msr and write_msr PV hooks Andy Lutomirski
2016-04-02 14:01   ` Andy Lutomirski
2016-04-03  8:41   ` Borislav Petkov
2016-04-03 13:23     ` Andy Lutomirski
2016-04-03 14:07       ` Borislav Petkov
2016-04-03 14:07       ` Borislav Petkov
2016-04-03 13:23     ` Andy Lutomirski
2016-04-03  8:41   ` Borislav Petkov
2016-04-13 11:44   ` [tip:x86/asm] x86/paravirt: Add _safe to the read_ms()r and write_msr() PV callbacks tip-bot for Andy Lutomirski
2016-04-13 11:44   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 6/9] x86/msr: Carry on after a non-"safe" MSR access fails Andy Lutomirski
2016-04-02 14:01 ` Andy Lutomirski [this message]
2016-04-13 11:45   ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2016-04-13 11:45   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 7/9] x86/paravirt: Add paravirt_{read, write}_msr Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 7/9] x86/paravirt: Add paravirt_{read,write}_msr Andy Lutomirski
2016-04-04 16:33   ` [PATCH v5 7/9] x86/paravirt: Add paravirt_{read, write}_msr David Vrabel
2016-04-04 16:33   ` [Xen-devel] " David Vrabel
2016-04-04 16:40     ` Andy Lutomirski
2016-04-04 16:40     ` Andy Lutomirski
2016-04-13 11:45   ` [tip:x86/asm] x86/paravirt: Add paravirt_{read, write}_msr() tip-bot for Andy Lutomirski
2016-04-13 11:45   ` [tip:x86/asm] x86/paravirt: Add paravirt_{read,write}_msr() tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 8/9] x86/paravirt: Make "unsafe" MSR accesses unsafe even if PARAVIRT=y Andy Lutomirski
2016-04-02 14:01   ` Andy Lutomirski
2016-04-13 11:46   ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2016-04-13 11:46   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 9/9] x86/msr: Set the return value to zero when native_rdmsr_safe fails Andy Lutomirski
2016-04-13 11:46   ` [tip:x86/asm] x86/msr: Set the return value to zero when native_rdmsr_safe() fails tip-bot for Andy Lutomirski
2016-04-13 11:46   ` tip-bot for Andy Lutomirski
2016-04-02 14:01 ` [PATCH v5 9/9] x86/msr: Set the return value to zero when native_rdmsr_safe fails Andy Lutomirski
2016-04-02 14:24 ` [PATCH v5 0/9] Improve non-"safe" MSR access failure handling Linus Torvalds
2016-04-02 15:13   ` Andy Lutomirski
2016-04-02 15:21     ` Linus Torvalds
2016-04-02 15:21     ` Linus Torvalds
2016-04-02 15:13   ` Andy Lutomirski
2016-04-02 14:24 ` Linus Torvalds
2016-04-04 16:23 ` Borislav Petkov
2016-04-04 16:23 ` Borislav Petkov
2016-04-05 15:38 ` Boris Ostrovsky
2016-04-05 15:38 ` [Xen-devel] " Boris Ostrovsky

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=26567b216aae70e795938f4b567eace5a0eb90ba.1459605520.git.luto@kernel.org \
    --to=luto@kernel.org \
    --cc=Xen-devel@lists.xen.org \
    --cc=akpm@linux-foundation.org \
    --cc=arjan@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=torvalds@linux-foundation.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.