[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] x86: add CMCI software injection interface



Hi, all

 

Currently we already have MCE software injection interface.

This small patch now add CMCI software injection interface. So that CMCI error could be triggered by software on CPUs which support CMCI.

Broadcast option is used for simulating bank sharing scenario.

 

This patch was tested together by running mcelog in DOM0 and got expected CMCI information.

 

Thanks& Regards,

Criping

 

 

diff -r 37ab34d32ecf xen/arch/x86/cpu/mcheck/mce.c

--- a/xen/arch/x86/cpu/mcheck/mce.c   Fri Apr 23 14:39:44 2010 +0800

+++ b/xen/arch/x86/cpu/mcheck/mce.c          Fri Apr 23 14:40:00 2010 +0800

@@ -1274,6 +1274,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u

        unsigned int target;

        struct xen_mc_msrinject *mc_msrinject;

        struct xen_mc_mceinject *mc_mceinject;

+       cpumask_t target_map;

 

        if (!IS_PRIV(v->domain) )

                 return x86_mcerr(NULL, -EPERM);

@@ -1411,6 +1412,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u

 

                 mc_mceinject = &op->u.mc_mceinject;

                 target = mc_mceinject->mceinj_cpunr;

+                flags = mc_mceinject->mceinj_flag;

 

                 if (target >= NR_CPUS)

                           return x86_mcerr("do_mca #MC: bad target", -EINVAL);

@@ -1419,12 +1421,22 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u

                           return x86_mcerr("do_mca #MC: target offline", -EINVAL);

 

                 add_taint(TAINT_ERROR_INJECT);

-

-        if ( mce_broadcast )

-            on_each_cpu(x86_mc_mceinject, mc_mceinject, 0);

-        else

-            on_selected_cpus(cpumask_of(target), x86_mc_mceinject,

-                  mc_mceinject, 1);

+                if (flags == XEN_MC_UC) {

+                          if ( mce_broadcast )

+                                   on_each_cpu(x86_mc_mceinject, mc_mceinject, 0);

+                          else

+                                   on_selected_cpus(cpumask_of(target), x86_mc_mceinject,

+                                            mc_mceinject, 1);

+                }

+                else if (flags == XEN_MC_CE) {

+                          if (mce_broadcast)

+                                   send_IPI_mask(&cpu_online_map, CMCI_APIC_VECTOR);

+                          else {

+                                   cpus_clear(target_map);

+                                   cpu_set(target, target_map);

+                                   send_IPI_mask(&target_map, CMCI_APIC_VECTOR);

+                          }

+                }

                 break;

 

        default:

diff -r 37ab34d32ecf xen/include/public/arch-x86/xen-mca.h

--- a/xen/include/public/arch-x86/xen-mca.h Fri Apr 23 14:39:44 2010 +0800

+++ b/xen/include/public/arch-x86/xen-mca.h        Fri Apr 23 14:40:00 2010 +0800

@@ -400,8 +400,11 @@ struct xen_mc_msrinject {

 #define MC_MSRINJ_F_INTERPOSE   0x1

 

 #define XEN_MC_mceinject    5

+#define XEN_MC_UC           0

+#define XEN_MC_CE           1

 struct xen_mc_mceinject {

-        unsigned int mceinj_cpunr;      /* target processor id */

+       uint32_t mceinj_cpunr;      /* target processor id */

+       uint32_t mceinj_flag;       /* UC error or CE error flag */

 };

 

 struct xen_mc {

Attachment: cmci_inject.patch
Description: cmci_inject.patch

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.