# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 43ff88825b1a1ac82e43a80600ec84afe4826acf
# Parent d7242c3a29064bae094d50ffca8cc99efd6dbc84
[XEN] Allow add_to_physmap to be applied to DOMID_SELF.
Also sanitise handling of existing mappings of Xen heap
frames.
Signed-off-by: Steven Smith <ssmith@xxxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/mm.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff -r d7242c3a2906 -r 43ff88825b1a xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Thu Aug 03 14:02:29 2006 +0100
+++ b/xen/arch/x86/mm.c Thu Aug 03 14:20:45 2006 +0100
@@ -2976,13 +2976,20 @@ long arch_memory_op(int op, XEN_GUEST_HA
case XENMEM_add_to_physmap:
{
struct xen_add_to_physmap xatp;
- unsigned long mfn = 0, gpfn;
+ unsigned long prev_mfn, mfn = 0, gpfn;
struct domain *d;
if ( copy_from_guest(&xatp, arg, 1) )
return -EFAULT;
- if ( (d = find_domain_by_id(xatp.domid)) == NULL )
+ if ( xatp.domid == DOMID_SELF )
+ {
+ d = current->domain;
+ get_knownalive_domain(d);
+ }
+ else if ( !IS_PRIV(current->domain) )
+ return -EPERM;
+ else if ( (d = find_domain_by_id(xatp.domid)) == NULL )
return -ESRCH;
switch ( xatp.space )
@@ -3008,8 +3015,16 @@ long arch_memory_op(int op, XEN_GUEST_HA
LOCK_BIGLOCK(d);
/* Remove previously mapped page if it was present. */
- if ( mfn_valid(gmfn_to_mfn(d, xatp.gpfn)) )
- guest_remove_page(d, xatp.gpfn);
+ prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
+ if ( mfn_valid(prev_mfn) )
+ {
+ if ( IS_XEN_HEAP_FRAME(mfn_to_page(prev_mfn)) )
+ /* Xen heap frames are simply unhooked from this phys slot. */
+ guest_physmap_remove_page(d, xatp.gpfn, prev_mfn);
+ else
+ /* Normal domain memory is freed, to avoid leaking memory. */
+ guest_remove_page(d, xatp.gpfn);
+ }
/* Unmap from old location, if any. */
gpfn = get_gpfn_from_mfn(mfn);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|