[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |