The commit re-introducing it (
14eb3b41d0 ["xen: reinstate previously
unused XENMEM_remove_from_physmap hypercall"]) as well as the one having
originally introduced it (
d818f3cb7c ["hvm: Use main memory for video
memory"]) and the one then purging it again (
78c3097e4f ["Remove unused
XENMEM_remove_from_physmap"]) make clear that this operation is intended
for use on HVM (i.e. translated) guests only. Restrict it at least as
much, because for PV guests documentation (in the public header) does
not even match the implementation: It talks about GPFN as input, but
get_page_from_gfn() assumes a GMFN in the non-translated case (and hands
back the value passed in).
Also lift the check in XENMEM_add_to_physmap{,_batch} handling up
directly into top level hypercall handling, and clarify things in the
public header accordingly.
Take the liberty and also replace a pointless use of "current" with a
more efficient use of an existing local variable (or function parameter
to be precise).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
mfn_t mfn = INVALID_MFN;
p2m_type_t p2mt;
- if ( !paging_mode_translate(d) )
- return -EACCES;
-
switch ( space )
{
case XENMAPSPACE_shared_info:
long rc = 0;
union xen_add_to_physmap_batch_extra extra;
+ ASSERT(paging_mode_translate(d));
+
if ( xatp->space != XENMAPSPACE_gmfn_foreign )
extra.res0 = 0;
else
static long xatp_permission_check(struct domain *d, unsigned int space)
{
+ if ( !paging_mode_translate(d) )
+ return -EACCES;
+
/*
* XENMAPSPACE_dev_mmio mapping is only supported for hardware Domain
* to map this kind of space to itself.
*/
if ( (space == XENMAPSPACE_dev_mmio) &&
- (!is_hardware_domain(current->domain) || (d != current->domain)) )
+ (!is_hardware_domain(d) || (d != current->domain)) )
return -EACCES;
return xsm_add_to_physmap(XSM_TARGET, current->domain, d);
if ( d == NULL )
return -ESRCH;
- rc = xsm_remove_from_physmap(XSM_TARGET, curr_d, d);
+ rc = paging_mode_translate(d)
+ ? xsm_remove_from_physmap(XSM_TARGET, curr_d, d)
+ : -EACCES;
if ( rc )
{
rcu_unlock_domain(d);
/*
* Sets the GPFN at which a particular page appears in the specified guest's
- * pseudophysical address space.
+ * physical address space (translated guests only).
* arg == addr of xen_add_to_physmap_t.
*/
#define XENMEM_add_to_physmap 7
/*
* Unmaps the page appearing at a particular GPFN from the specified guest's
- * pseudophysical address space.
+ * physical address space (translated guests only).
* arg == addr of xen_remove_from_physmap_t.
*/
#define XENMEM_remove_from_physmap 15