xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 4] MCA physical address check when calculate domain
@ 2011-05-07 20:29 Liu, Jinsong
  2011-05-09  9:16 ` Jan Beulich
  0 siblings, 1 reply; 8+ messages in thread
From: Liu, Jinsong @ 2011-05-07 20:29 UTC (permalink / raw)
  To: Keir Fraser, xen-devel@lists.xensource.com; +Cc: Jiang, Yunhong, Li, Xin

[-- Attachment #1: Type: text/plain, Size: 1982 bytes --]

MCA physical address check when calculate domain

Bank addr maybe invalid, or 
Bank addr maybe physical/memory/linear address or segment offset.
This patch add mca MCi_STATUS_MISCV/MCi_STATUS_ADDRV check, and add physical address verify,
so that it work safe when calculate domain.

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>

diff -r e4e1efda200f xen/arch/x86/cpu/mcheck/mce.c
--- a/xen/arch/x86/cpu/mcheck/mce.c	Thu May 05 13:54:29 2011 +0800
+++ b/xen/arch/x86/cpu/mcheck/mce.c	Fri May 06 13:56:21 2011 +0800
@@ -151,7 +151,6 @@ static struct mcinfo_bank *mca_init_bank
                                          struct mc_info *mi, int bank)
 {
     struct mcinfo_bank *mib;
-    uint64_t addr=0, misc = 0;
 
     if (!mi)
         return NULL;
@@ -170,22 +169,23 @@ static struct mcinfo_bank *mca_init_bank
     mib->common.size = sizeof (struct mcinfo_bank);
     mib->mc_bank = bank;
 
-    addr = misc = 0;
     if (mib->mc_status & MCi_STATUS_MISCV)
         mib->mc_misc = mca_rdmsr(MSR_IA32_MCx_MISC(bank));
 
     if (mib->mc_status & MCi_STATUS_ADDRV)
-    {
         mib->mc_addr = mca_rdmsr(MSR_IA32_MCx_ADDR(bank));
 
-        if (mfn_valid(paddr_to_pfn(mib->mc_addr))) {
-            struct domain *d;
+    if ((mib->mc_status & MCi_STATUS_MISCV) &&
+        (mib->mc_status & MCi_STATUS_ADDRV) &&
+        ((mib->mc_misc & MCi_MISC_ADDRMOD_MASK) == MCi_MISC_PHYSMOD) && 
+          mfn_valid(paddr_to_pfn(mib->mc_addr)))
+    {
+        struct domain *d;
 
-            d = maddr_get_owner(mib->mc_addr);
-            if (d != NULL && (who == MCA_POLLER ||
-                              who == MCA_CMCI_HANDLER))
-                mib->mc_domid = d->domain_id;
-        }
+        d = maddr_get_owner(mib->mc_addr);
+        if (d != NULL && (who == MCA_POLLER ||
+                          who == MCA_CMCI_HANDLER))
+            mib->mc_domid = d->domain_id;
     }
 
     if (who == MCA_CMCI_HANDLER) {

[-- Attachment #2: mca-cleanup-4.patch --]
[-- Type: application/octet-stream, Size: 1931 bytes --]

MCA physical address check when calculate domain

Bank addr maybe invalid, or 
Bank addr maybe physical/memory/linear address or segment offset.
This patch add mca MCi_STATUS_MISCV/MCi_STATUS_ADDRV check, and add physical address verify,
so that it work safe when calculate domain.

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>

diff -r e4e1efda200f xen/arch/x86/cpu/mcheck/mce.c
--- a/xen/arch/x86/cpu/mcheck/mce.c	Thu May 05 13:54:29 2011 +0800
+++ b/xen/arch/x86/cpu/mcheck/mce.c	Fri May 06 13:56:21 2011 +0800
@@ -151,7 +151,6 @@ static struct mcinfo_bank *mca_init_bank
                                          struct mc_info *mi, int bank)
 {
     struct mcinfo_bank *mib;
-    uint64_t addr=0, misc = 0;
 
     if (!mi)
         return NULL;
@@ -170,22 +169,23 @@ static struct mcinfo_bank *mca_init_bank
     mib->common.size = sizeof (struct mcinfo_bank);
     mib->mc_bank = bank;
 
-    addr = misc = 0;
     if (mib->mc_status & MCi_STATUS_MISCV)
         mib->mc_misc = mca_rdmsr(MSR_IA32_MCx_MISC(bank));
 
     if (mib->mc_status & MCi_STATUS_ADDRV)
-    {
         mib->mc_addr = mca_rdmsr(MSR_IA32_MCx_ADDR(bank));
 
-        if (mfn_valid(paddr_to_pfn(mib->mc_addr))) {
-            struct domain *d;
+    if ((mib->mc_status & MCi_STATUS_MISCV) &&
+        (mib->mc_status & MCi_STATUS_ADDRV) &&
+        ((mib->mc_misc & MCi_MISC_ADDRMOD_MASK) == MCi_MISC_PHYSMOD) && 
+          mfn_valid(paddr_to_pfn(mib->mc_addr)))
+    {
+        struct domain *d;
 
-            d = maddr_get_owner(mib->mc_addr);
-            if (d != NULL && (who == MCA_POLLER ||
-                              who == MCA_CMCI_HANDLER))
-                mib->mc_domid = d->domain_id;
-        }
+        d = maddr_get_owner(mib->mc_addr);
+        if (d != NULL && (who == MCA_POLLER ||
+                          who == MCA_CMCI_HANDLER))
+            mib->mc_domid = d->domain_id;
     }
 
     if (who == MCA_CMCI_HANDLER) {

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-05-11 18:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-07 20:29 [PATCH 4] MCA physical address check when calculate domain Liu, Jinsong
2011-05-09  9:16 ` Jan Beulich
2011-05-10  6:38   ` Liu, Jinsong
2011-05-10  8:32     ` Jan Beulich
2011-05-10 10:46       ` Liu, Jinsong
2011-05-10 13:09         ` Jan Beulich
2011-05-11  7:21           ` Liu, Jinsong
2011-05-11 18:11             ` Luck, Tony

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).