goto out1;
}
break;
- case XENMEM_remove_from_physmap:
- if ( lock_pages(arg, sizeof(struct xen_remove_from_physmap)) )
- {
- PERROR("Could not lock");
- goto out1;
- }
- break;
case XENMEM_current_reservation:
case XENMEM_maximum_reservation:
case XENMEM_maximum_gpfn:
case XENMEM_add_to_physmap:
unlock_pages(arg, sizeof(struct xen_add_to_physmap));
break;
- case XENMEM_remove_from_physmap:
- unlock_pages(arg, sizeof(struct xen_remove_from_physmap));
- break;
case XENMEM_current_reservation:
case XENMEM_maximum_reservation:
case XENMEM_maximum_gpfn:
break;
}
- case XENMEM_remove_from_physmap:
- {
- struct xen_remove_from_physmap xrfp;
- unsigned long mfn;
- struct domain *d;
-
- if ( copy_from_guest(&xrfp, arg, 1) )
- return -EFAULT;
-
- rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
- if ( rc != 0 )
- return rc;
-
- domain_lock(d);
-
- mfn = gmfn_to_mfn(d, xrfp.gpfn);
-
- if ( mfn_valid(mfn) )
- guest_physmap_remove_page(d, xrfp.gpfn, mfn, 0);
-
- domain_unlock(d);
-
- rcu_unlock_domain(d);
-
- break;
- }
-
-
case XENMEM_machine_memory_map:
{
struct xen_memory_map memmap;
break;
}
- case XENMEM_remove_from_physmap:
- {
- struct xen_remove_from_physmap xrfp;
- unsigned long mfn;
- struct domain *d;
-
- if ( copy_from_guest(&xrfp, arg, 1) )
- return -EFAULT;
-
- rc = rcu_lock_target_domain_by_id(xrfp.domid, &d);
- if ( rc != 0 )
- return rc;
-
- if ( xsm_remove_from_physmap(current->domain, d) )
- {
- rcu_unlock_domain(d);
- return -EPERM;
- }
-
- domain_lock(d);
-
- mfn = gmfn_to_mfn(d, xrfp.gpfn);
-
- if ( mfn_valid(mfn) )
- guest_physmap_remove_page(d, xrfp.gpfn, mfn, 0);
-
- domain_unlock(d);
-
- rcu_unlock_domain(d);
-
- break;
- }
-
case XENMEM_set_memory_map:
{
struct xen_foreign_memory_map fmap;
break;
}
- case XENMEM_remove_from_physmap:
- {
- struct compat_remove_from_physmap cmp;
- struct xen_remove_from_physmap *nat = (void *)COMPAT_ARG_XLAT_VIRT_BASE;
-
- if ( copy_from_guest(&cmp, arg, 1) )
- return -EFAULT;
-
- XLAT_remove_from_physmap(nat, &cmp);
- rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
-
- break;
- }
-
case XENMEM_set_memory_map:
{
struct compat_foreign_memory_map cmp;
typedef struct xen_add_to_physmap xen_add_to_physmap_t;
DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
-/*
- * Unmaps the page appearing at a particular GPFN from the specified guest's
- * pseudophysical address space.
- * arg == addr of xen_remove_from_physmap_t.
- */
-#define XENMEM_remove_from_physmap 15
-struct xen_remove_from_physmap {
- /* Which domain to change the mapping for. */
- domid_t domid;
-
- /* GPFN of the current mapping of the page. */
- xen_pfn_t gpfn;
-};
-typedef struct xen_remove_from_physmap xen_remove_from_physmap_t;
-DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t);
-
/*** REMOVED ***/
/*#define XENMEM_translate_gpfn_list 8*/
! kexec_image kexec.h
! kexec_range kexec.h
! add_to_physmap memory.h
-! remove_from_physmap memory.h
! foreign_memory_map memory.h
! memory_exchange memory.h
! memory_map memory.h
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);
int (*test_assign_device) (uint32_t machine_bdf);
int (*assign_device) (struct domain *d, uint32_t machine_bdf);
return xsm_call(add_to_physmap(d1, d2));
}
-static inline int xsm_remove_from_physmap(struct domain *d1, struct domain *d2)
-{
- return xsm_call(remove_from_physmap(d1, d2));
-}
-
static inline int xsm_sendtrigger(struct domain *d)
{
return xsm_call(sendtrigger(d));
return 0;
}
-static int dummy_remove_from_physmap (struct domain *d1, struct domain *d2)
-{
- return 0;
-}
#endif
struct xsm_operations dummy_xsm_ops;
set_to_dummy_if_null(ops, mmu_machphys_update);
set_to_dummy_if_null(ops, update_va_mapping);
set_to_dummy_if_null(ops, add_to_physmap);
- set_to_dummy_if_null(ops, remove_from_physmap);
set_to_dummy_if_null(ops, sendtrigger);
set_to_dummy_if_null(ops, test_assign_device);
set_to_dummy_if_null(ops, assign_device);
return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
}
-static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
-{
- return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
-}
-
static int flask_sendtrigger(struct domain *d)
{
return domain_has_perm(current->domain, d, SECCLASS_DOMAIN, DOMAIN__TRIGGER);
.mmu_machphys_update = flask_mmu_machphys_update,
.update_va_mapping = flask_update_va_mapping,
.add_to_physmap = flask_add_to_physmap,
- .remove_from_physmap = flask_remove_from_physmap,
.sendtrigger = flask_sendtrigger,
.test_assign_device = flask_test_assign_device,
.assign_device = flask_assign_device,