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

[Xen-changelog] [xen-unstable] xsm: XSM foreigndom usage bug



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1221130609 -3600
# Node ID e5766aea29073402cbc9373d4d76bd60986e956d
# Parent  f5e72cbfbb176afd1526a5a4fe11049461eac151
xsm: XSM foreigndom usage bug

- This patch corrects an unsafe/incorrect usage of FOREIGNDOM.  The
value of FOREIGNDOM is now passed through the XSM interface.
Corresponding updates to the Flask module are included in this patch.

- This patch also includes a minor header update to allow the Flask
  module to compile after recent updates to Xen.

Signed-off-by: George Coker <gscoker@xxxxxxxxxxxxxx>
---
 xen/arch/x86/mm.c     |    4 ++--
 xen/include/xsm/xsm.h |   20 ++++++++++++--------
 xen/xsm/dummy.c       |    6 ++++--
 xen/xsm/flask/hooks.c |   30 ++++++++----------------------
 4 files changed, 26 insertions(+), 34 deletions(-)

diff -r f5e72cbfbb17 -r e5766aea2907 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Sep 10 11:26:16 2008 +0100
+++ b/xen/arch/x86/mm.c Thu Sep 11 11:56:49 2008 +0100
@@ -2804,7 +2804,7 @@ int do_mmu_update(
              */
         case MMU_NORMAL_PT_UPDATE:
         case MMU_PT_UPDATE_PRESERVE_AD:
-            rc = xsm_mmu_normal_update(d, req.val);
+            rc = xsm_mmu_normal_update(d, FOREIGNDOM, req.val);
             if ( rc )
                 break;
 
@@ -3321,7 +3321,7 @@ int do_update_va_mapping(unsigned long v
     if ( unlikely(!access_ok(va, 1) && !paging_mode_external(d)) )
         return -EINVAL;
 
-    rc = xsm_update_va_mapping(d, val);
+    rc = xsm_update_va_mapping(d, FOREIGNDOM, val);
     if ( rc )
         return rc;
 
diff -r f5e72cbfbb17 -r e5766aea2907 xen/include/xsm/xsm.h
--- a/xen/include/xsm/xsm.h     Wed Sep 10 11:26:16 2008 +0100
+++ b/xen/include/xsm/xsm.h     Thu Sep 11 11:56:49 2008 +0100
@@ -137,9 +137,11 @@ struct xsm_operations {
     int (*getidletime) (void);
     int (*machine_memory_map) (void);
     int (*domain_memory_map) (struct domain *d);
-    int (*mmu_normal_update) (struct domain *d, intpte_t fpte);
+    int (*mmu_normal_update) (struct domain *d, struct domain *f, 
+                                                                intpte_t fpte);
     int (*mmu_machphys_update) (struct domain *d, unsigned long mfn);
-    int (*update_va_mapping) (struct domain *d, l1_pgentry_t pte);
+    int (*update_va_mapping) (struct domain *d, struct domain *f, 
+                                                            l1_pgentry_t pte);
     int (*add_to_physmap) (struct domain *d1, struct domain *d2);
     int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
     int (*sendtrigger) (struct domain *d);
@@ -560,9 +562,10 @@ static inline int xsm_domain_memory_map(
     return xsm_call(domain_memory_map(d));
 }
 
-static inline int xsm_mmu_normal_update (struct domain *d, intpte_t fpte)
-{
-    return xsm_call(mmu_normal_update(d, fpte));
+static inline int xsm_mmu_normal_update (struct domain *d, struct domain *f, 
+                                                                intpte_t fpte)
+{
+    return xsm_call(mmu_normal_update(d, f, fpte));
 }
 
 static inline int xsm_mmu_machphys_update (struct domain *d, unsigned long mfn)
@@ -570,9 +573,10 @@ static inline int xsm_mmu_machphys_updat
     return xsm_call(mmu_machphys_update(d, mfn));
 }
 
-static inline int xsm_update_va_mapping(struct domain *d, l1_pgentry_t pte)
-{
-    return xsm_call(update_va_mapping(d, pte));
+static inline int xsm_update_va_mapping(struct domain *d, struct domain *f, 
+                                                            l1_pgentry_t pte)
+{
+    return xsm_call(update_va_mapping(d, f, pte));
 }
 
 static inline int xsm_add_to_physmap(struct domain *d1, struct domain *d2)
diff -r f5e72cbfbb17 -r e5766aea2907 xen/xsm/dummy.c
--- a/xen/xsm/dummy.c   Wed Sep 10 11:26:16 2008 +0100
+++ b/xen/xsm/dummy.c   Thu Sep 11 11:56:49 2008 +0100
@@ -400,7 +400,8 @@ static int dummy_domain_memory_map (stru
     return 0;
 }
 
-static int dummy_mmu_normal_update (struct domain *d, intpte_t fpte)
+static int dummy_mmu_normal_update (struct domain *d, struct domain *f, 
+                                                                intpte_t fpte)
 {
     return 0;
 }
@@ -410,7 +411,8 @@ static int dummy_mmu_machphys_update (st
     return 0;
 }
 
-static int dummy_update_va_mapping (struct domain *d, l1_pgentry_t pte)
+static int dummy_update_va_mapping (struct domain *d, struct domain *f, 
+                                                            l1_pgentry_t pte)
 {
     return 0;
 }
diff -r f5e72cbfbb17 -r e5766aea2907 xen/xsm/flask/hooks.c
--- a/xen/xsm/flask/hooks.c     Wed Sep 10 11:26:16 2008 +0100
+++ b/xen/xsm/flask/hooks.c     Thu Sep 11 11:56:49 2008 +0100
@@ -11,6 +11,7 @@
 #include <xen/init.h>
 #include <xen/lib.h>
 #include <xen/sched.h>
+#include <xen/paging.h>
 #include <xen/xmalloc.h>
 #include <xsm/xsm.h>
 #include <xen/spinlock.h>
@@ -354,7 +355,7 @@ static int get_mfn_sid(unsigned long mfn
     if ( mfn_valid(mfn) )
     {
         /*mfn is valid if this is a page that Xen is tracking!*/
-        page = mfn_to_page(mfn);        
+        page = mfn_to_page(mfn);
         rc = get_page_sid(page, sid);
     }
     else
@@ -403,23 +404,6 @@ static int flask_memory_pin_page(struct 
 
     return avc_has_perm(dsec->sid, sid, SECCLASS_MMU, MMU__PINPAGE, NULL);
 }
-
-/* Used to defer flushing of memory structures. */
-struct percpu_mm_info {
-#define DOP_FLUSH_TLB      (1<<0) /* Flush the local TLB.                    */
-#define DOP_FLUSH_ALL_TLBS (1<<1) /* Flush TLBs of all VCPUs of current dom. */
-#define DOP_RELOAD_LDT     (1<<2) /* Reload the LDT shadow mapping.          */
-    unsigned int   deferred_ops;
-    /* If non-NULL, specifies a foreign subject domain for some operations. */
-    struct domain *foreign;
-};
-static DEFINE_PER_CPU(struct percpu_mm_info, percpu_mm_info);
-
-/*
- * Returns the current foreign domain; defaults to the currently-executing
- * domain if a foreign override hasn't been specified.
- */
-#define FOREIGNDOM (this_cpu(percpu_mm_info).foreign ?: current->domain)
 
 static int flask_console_io(struct domain *d, int cmd)
 {
@@ -1023,7 +1007,8 @@ static int flask_domain_memory_map(struc
     return domain_has_perm(current->domain, d, SECCLASS_MMU, MMU__MEMORYMAP);
 }
 
-static int flask_mmu_normal_update(struct domain *d, intpte_t fpte)
+static int flask_mmu_normal_update(struct domain *d, struct domain *f, 
+                                                                intpte_t fpte)
 {
     int rc = 0;
     u32 map_perms = MMU__MAP_READ;
@@ -1036,7 +1021,7 @@ static int flask_mmu_normal_update(struc
     if ( l1e_get_flags(l1e_from_intpte(fpte)) & _PAGE_RW )
         map_perms |= MMU__MAP_WRITE;
 
-    fmfn = gmfn_to_mfn(FOREIGNDOM, l1e_get_pfn(l1e_from_intpte(fpte)));
+    fmfn = gmfn_to_mfn(f, l1e_get_pfn(l1e_from_intpte(fpte)));
 
     rc = get_mfn_sid(fmfn, &fsid);
     if ( rc )
@@ -1059,7 +1044,8 @@ static int flask_mmu_machphys_update(str
     return avc_has_perm(dsec->sid, psid, SECCLASS_MMU, MMU__UPDATEMP, NULL);
 }
 
-static int flask_update_va_mapping(struct domain *d, l1_pgentry_t pte)
+static int flask_update_va_mapping(struct domain *d, struct domain *f, 
+                                                            l1_pgentry_t pte)
 {
     int rc = 0;
     u32 psid;
@@ -1069,7 +1055,7 @@ static int flask_update_va_mapping(struc
 
     dsec = d->ssid;
 
-    mfn = gmfn_to_mfn(FOREIGNDOM, l1e_get_pfn(pte));        
+    mfn = gmfn_to_mfn(f, l1e_get_pfn(pte));        
     rc = get_mfn_sid(mfn, &psid);
     if ( rc )
         return rc;

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


 


Rackspace

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