mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-16 22:38:04 +00:00
189ce92b4c
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
54 lines
1.9 KiB
Diff
54 lines
1.9 KiB
Diff
From 7938ffb57366a0e5f4b878955148f515d9940453 Mon Sep 17 00:00:00 2001
|
|
From: Tony Luck <tony.luck@intel.com>
|
|
Date: Wed, 23 May 2012 14:14:22 -0700
|
|
Subject: [PATCH 099/117] x86/mce: Fix check for processor context when
|
|
machine check was taken.
|
|
|
|
commit 875e26648cf9b6db9d8dc07b7959d7c61fb3f49c upstream.
|
|
|
|
Linus pointed out that there was no value is checking whether m->ip
|
|
was zero - because zero is a legimate value. If we have a reliable
|
|
(or faked in the VM86 case) "m->cs" we can use it to tell whether we
|
|
were in user mode or kernelwhen the machine check hit.
|
|
|
|
Reported-by: Linus Torvalds <torvalds@linuxfoundation.org>
|
|
Signed-off-by: Tony Luck <tony.luck@intel.com>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
arch/x86/kernel/cpu/mcheck/mce-severity.c | 16 ++++++++++------
|
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c
|
|
index 7395d5f..c9c9cfe 100644
|
|
--- a/arch/x86/kernel/cpu/mcheck/mce-severity.c
|
|
+++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c
|
|
@@ -145,15 +145,19 @@ static struct severity {
|
|
};
|
|
|
|
/*
|
|
- * If the EIPV bit is set, it means the saved IP is the
|
|
- * instruction which caused the MCE.
|
|
+ * If mcgstatus indicated that ip/cs on the stack were
|
|
+ * no good, then "m->cs" will be zero and we will have
|
|
+ * to assume the worst case (IN_KERNEL) as we actually
|
|
+ * have no idea what we were executing when the machine
|
|
+ * check hit.
|
|
+ * If we do have a good "m->cs" (or a faked one in the
|
|
+ * case we were executing in VM86 mode) we can use it to
|
|
+ * distinguish an exception taken in user from from one
|
|
+ * taken in the kernel.
|
|
*/
|
|
static int error_context(struct mce *m)
|
|
{
|
|
- if (m->mcgstatus & MCG_STATUS_EIPV)
|
|
- return (m->ip && (m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
|
|
- /* Unknown, assume kernel */
|
|
- return IN_KERNEL;
|
|
+ return ((m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
|
|
}
|
|
|
|
int mce_severity(struct mce *m, int tolerant, char **msg)
|
|
--
|
|
1.7.9.5
|
|
|