*/
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;
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;
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);
return xsm_call(domain_memory_map(d));
}
-static inline int xsm_mmu_normal_update (struct domain *d, intpte_t fpte)
+static inline int xsm_mmu_normal_update (struct domain *d, struct domain *f,
+ intpte_t fpte)
{
- return xsm_call(mmu_normal_update(d, fpte));
+ return xsm_call(mmu_normal_update(d, f, fpte));
}
static inline int xsm_mmu_machphys_update (struct domain *d, unsigned long mfn)
return xsm_call(mmu_machphys_update(d, mfn));
}
-static inline int xsm_update_va_mapping(struct domain *d, l1_pgentry_t 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, pte));
+ return xsm_call(update_va_mapping(d, f, pte));
}
static inline int xsm_add_to_physmap(struct domain *d1, struct domain *d2)
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;
}
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;
}
#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>
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
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)
{
u32 perm;
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;
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 )
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;
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;