[BUGFIX] MCE: Fix bug of IA32_MCG_STATUS after system reset

Submitted by Huang Ying on Jan. 5, 2010, 8:32 a.m.

Details

Message ID 1262680344.31401.226.camel@yhuang-dev.sh.intel.com
State New
Headers show

Commit Message

Huang Ying Jan. 5, 2010, 8:32 a.m.
Now, if we inject a fatal MCE into guest OS, for example Linux, Linux
will go panic and then reboot. But if we inject another MCE now,
system will reset directly instead of go panic firstly, because
MCG_STATUS.MCIP is set to 1 and not cleared after reboot. This is does
not follow the behavior in real hardware.

This patch fixes this via set env->mcg_status to 0 during system reset.

Signed-off-by: Huang Ying <ying.huang@intel.com>

---
 target-i386/helper.c |    2 ++
 1 file changed, 2 insertions(+)

Comments

Anthony Liguori Jan. 11, 2010, 4 p.m.
On 01/05/2010 02:32 AM, Huang Ying wrote:
> Now, if we inject a fatal MCE into guest OS, for example Linux, Linux
> will go panic and then reboot. But if we inject another MCE now,
> system will reset directly instead of go panic firstly, because
> MCG_STATUS.MCIP is set to 1 and not cleared after reboot. This is does
> not follow the behavior in real hardware.
>
> This patch fixes this via set env->mcg_status to 0 during system reset.
>
> Signed-off-by: Huang Ying<ying.huang@intel.com>
>    

Applied.  Thanks.

Regards,

Anthony Liguori
> ---
>   target-i386/helper.c |    2 ++
>   1 file changed, 2 insertions(+)
>
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -617,6 +617,8 @@ void cpu_reset(CPUX86State *env)
>       env->dr[7] = DR7_FIXED_1;
>       cpu_breakpoint_remove_all(env, BP_CPU);
>       cpu_watchpoint_remove_all(env, BP_CPU);
> +
> +    env->mcg_status = 0;
>   }
>
>   void cpu_x86_close(CPUX86State *env)
>
>
>
>
>
>

Patch hide | download patch | download mbox

--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -617,6 +617,8 @@  void cpu_reset(CPUX86State *env)
     env->dr[7] = DR7_FIXED_1;
     cpu_breakpoint_remove_all(env, BP_CPU);
     cpu_watchpoint_remove_all(env, BP_CPU);
+
+    env->mcg_status = 0;
 }
 
 void cpu_x86_close(CPUX86State *env)