WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] xsm: XSM foreigndom usage bug
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 16 Sep 2008 06:00:52 -0700
Delivery-date: Tue, 16 Sep 2008 06:01:56 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] xsm: XSM foreigndom usage bug, Xen patchbot-unstable <=