forked from Minki/linux
x86, mce: improve mce_get_rip
Assume IP on the stack is valid when either EIPV or RIPV are set. This influences whether the machine check exception handler decides to return or panic. This fixes a test case in the mce-test suite and is more compliant to the specification. This currently only makes a difference in a artificial testing scenario with the mce-test test suite. Also in addition do not force the EIPV to be valid with the exact register MSRs, and keep in trust the CS value on stack even if MSR is available. [AK: combination of patches from Huang Ying and Hidetoshi Seto, with new description by me] [add some description, no code changed - HS] Signed-off-by: Huang Ying <ying.huang@intel.com> Signed-off-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
ac9603754d
commit
1b2797dcc9
@ -306,21 +306,22 @@ int mce_available(struct cpuinfo_x86 *c)
|
|||||||
return cpu_has(c, X86_FEATURE_MCE) && cpu_has(c, X86_FEATURE_MCA);
|
return cpu_has(c, X86_FEATURE_MCE) && cpu_has(c, X86_FEATURE_MCA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the address of the instruction at the time of the machine check
|
||||||
|
* error.
|
||||||
|
*/
|
||||||
static inline void mce_get_rip(struct mce *m, struct pt_regs *regs)
|
static inline void mce_get_rip(struct mce *m, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (regs && (m->mcgstatus & MCG_STATUS_RIPV)) {
|
|
||||||
|
if (regs && (m->mcgstatus & (MCG_STATUS_RIPV|MCG_STATUS_EIPV))) {
|
||||||
m->ip = regs->ip;
|
m->ip = regs->ip;
|
||||||
m->cs = regs->cs;
|
m->cs = regs->cs;
|
||||||
} else {
|
} else {
|
||||||
m->ip = 0;
|
m->ip = 0;
|
||||||
m->cs = 0;
|
m->cs = 0;
|
||||||
}
|
}
|
||||||
if (rip_msr) {
|
if (rip_msr)
|
||||||
/* Assume the RIP in the MSR is exact. Is this true? */
|
|
||||||
m->mcgstatus |= MCG_STATUS_EIPV;
|
|
||||||
m->ip = mce_rdmsrl(rip_msr);
|
m->ip = mce_rdmsrl(rip_msr);
|
||||||
m->cs = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
|
Loading…
Reference in New Issue
Block a user