From: tip-bot for Andy Lutomirski <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: pbonzini@redhat.com, luto@kernel.org, hpa@zytor.com,
bp@alien8.de, tglx@linutronix.de, kvm@vger.kernel.org,
Xen-devel@lists.xen.org, torvalds@linux-foundation.org,
peterz@infradead.org, akpm@linux-foundation.org,
arjan@linux.intel.com, linux-kernel@vger.kernel.org,
mingo@kernel.org, boris.ostrovsky@oracle.com
Subject: [tip:x86/asm] x86/msr: Carry on after a non-"safe" MSR access fails
Date: Wed, 13 Apr 2016 04:45:19 -0700 [thread overview]
Message-ID: <tip-fbd704374d111bed16a19261176fa30e2379c87c@git.kernel.org> (raw)
In-Reply-To: <26567b216aae70e795938f4b567eace5a0eb90ba.1459605520.git.luto@kernel.org>
Commit-ID: fbd704374d111bed16a19261176fa30e2379c87c
Gitweb: http://git.kernel.org/tip/fbd704374d111bed16a19261176fa30e2379c87c
Author: Andy Lutomirski <luto@kernel.org>
AuthorDate: Sat, 2 Apr 2016 07:01:37 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 13 Apr 2016 11:37:45 +0200
x86/msr: Carry on after a non-"safe" MSR access fails
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.
Tested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: KVM list <kvm@vger.kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: xen-devel <Xen-devel@lists.xen.org>
Link: http://lkml.kernel.org/r/26567b216aae70e795938f4b567eace5a0eb90ba.1459605520.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@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 7a79ee2..25f169c 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -84,7 +84,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);
@@ -111,7 +114,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 061a237..fd9eb98 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -43,6 +43,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;
next prev parent reply other threads:[~2016-04-13 11:46 UTC|newest]
Thread overview: 51+ 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-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-02 14:01 ` [PATCH v5 2/9] x86/head: Move the early NMI fixup into C Andy Lutomirski
2016-04-13 11:43 ` [tip:x86/asm] " 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 18:39 ` Borislav Petkov
2016-04-02 20:13 ` Andy Lutomirski
2016-04-02 20:47 ` Borislav Petkov
2016-04-02 20:58 ` Andy Lutomirski
2016-04-04 11:52 ` Jan Kara
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 16:00 ` Peter Zijlstra
2016-04-04 19:38 ` Borislav Petkov
2016-04-04 21:31 ` Andy Lutomirski
2016-04-04 21:40 ` Borislav Petkov
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-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-03 8:07 ` Borislav Petkov
2016-04-03 13:22 ` Andy Lutomirski
2016-04-03 13:51 ` Linus Torvalds
2016-04-03 13:55 ` Andy Lutomirski
2016-04-03 14:10 ` Borislav Petkov
2016-04-04 15:47 ` Andy Lutomirski
2016-04-03 14:17 ` Linus Torvalds
2016-04-13 11:44 ` [tip:x86/asm] " tip-bot for 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-03 8:41 ` Borislav Petkov
2016-04-03 13:23 ` Andy Lutomirski
2016-04-03 14:07 ` 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-02 14:01 ` [PATCH v5 6/9] x86/msr: Carry on after a non-"safe" MSR access fails Andy Lutomirski
2016-04-13 11:45 ` tip-bot for Andy Lutomirski [this message]
2016-04-02 14:01 ` [PATCH v5 7/9] x86/paravirt: Add paravirt_{read,write}_msr Andy Lutomirski
2016-04-04 16:33 ` [Xen-devel] [PATCH v5 7/9] x86/paravirt: Add paravirt_{read, write}_msr David Vrabel
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-02 14:01 ` [PATCH v5 8/9] x86/paravirt: Make "unsafe" MSR accesses unsafe even if PARAVIRT=y Andy Lutomirski
2016-04-13 11:46 ` [tip:x86/asm] " 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-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-04 16:23 ` Borislav Petkov
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=tip-fbd704374d111bed16a19261176fa30e2379c87c@git.kernel.org \
--to=tipbot@zytor.com \
--cc=Xen-devel@lists.xen.org \
--cc=akpm@linux-foundation.org \
--cc=arjan@linux.intel.com \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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
Powered by JetHome