aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/domain.c
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2013-05-08 12:41:09 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-05-08 12:59:18 +0100
commit6ff9e4f743bf2ca4e46bee862dad734777b11b55 (patch)
tree50ddb6a1b89207afb91eed9667eadd85b5ea6640 /xen/arch/x86/domain.c
parent80185fd5ba2aa1d5979b900468937da59d051df7 (diff)
downloadxen-6ff9e4f743bf2ca4e46bee862dad734777b11b55.tar.gz
xen-6ff9e4f743bf2ca4e46bee862dad734777b11b55.tar.bz2
xen-6ff9e4f743bf2ca4e46bee862dad734777b11b55.zip
xen: move VCPUOP_register_vcpu_info to common code
Move the implementation of VCPUOP_register_vcpu_info from x86 specific to commmon code. Move vcpu_info_mfn from an arch specific vcpu sub-field to the common vcpu struct. Move the initialization of vcpu_info_mfn to common code. Move unmap_vcpu_info and the call to unmap_vcpu_info at domain destruction time to common code. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/domain.c')
-rw-r--r--xen/arch/x86/domain.c113
1 files changed, 0 insertions, 113 deletions
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index db1e65dd26..0228db2ad9 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -385,8 +385,6 @@ int vcpu_initialise(struct vcpu *v)
vmce_init_vcpu(v);
- v->arch.vcpu_info_mfn = INVALID_MFN;
-
if ( is_hvm_domain(d) )
{
rc = hvm_vcpu_initialise(v);
@@ -960,99 +958,6 @@ int arch_vcpu_reset(struct vcpu *v)
return 0;
}
-/*
- * Unmap the vcpu info page if the guest decided to place it somewhere
- * else. This is only used from arch_domain_destroy, so there's no
- * need to do anything clever.
- */
-static void
-unmap_vcpu_info(struct vcpu *v)
-{
- unsigned long mfn;
-
- if ( v->arch.vcpu_info_mfn == INVALID_MFN )
- return;
-
- mfn = v->arch.vcpu_info_mfn;
- unmap_domain_page_global(v->vcpu_info);
-
- v->vcpu_info = &dummy_vcpu_info;
- v->arch.vcpu_info_mfn = INVALID_MFN;
-
- put_page_and_type(mfn_to_page(mfn));
-}
-
-/*
- * Map a guest page in and point the vcpu_info pointer at it. This
- * makes sure that the vcpu_info is always pointing at a valid piece
- * of memory, and it sets a pending event to make sure that a pending
- * event doesn't get missed.
- */
-static int
-map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset)
-{
- struct domain *d = v->domain;
- void *mapping;
- vcpu_info_t *new_info;
- struct page_info *page;
- int i;
-
- if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
- return -EINVAL;
-
- if ( v->arch.vcpu_info_mfn != INVALID_MFN )
- return -EINVAL;
-
- /* Run this command on yourself or on other offline VCPUS. */
- if ( (v != current) && !test_bit(_VPF_down, &v->pause_flags) )
- return -EINVAL;
-
- page = get_page_from_gfn(d, gfn, NULL, P2M_ALLOC);
- if ( !page )
- return -EINVAL;
-
- if ( !get_page_type(page, PGT_writable_page) )
- {
- put_page(page);
- return -EINVAL;
- }
-
- mapping = __map_domain_page_global(page);
- if ( mapping == NULL )
- {
- put_page_and_type(page);
- return -ENOMEM;
- }
-
- new_info = (vcpu_info_t *)(mapping + offset);
-
- if ( v->vcpu_info == &dummy_vcpu_info )
- {
- memset(new_info, 0, sizeof(*new_info));
- __vcpu_info(v, new_info, evtchn_upcall_mask) = 1;
- }
- else
- {
- memcpy(new_info, v->vcpu_info, sizeof(*new_info));
- }
-
- v->vcpu_info = new_info;
- v->arch.vcpu_info_mfn = page_to_mfn(page);
-
- /* Set new vcpu_info pointer /before/ setting pending flags. */
- wmb();
-
- /*
- * Mark everything as being pending just to make sure nothing gets
- * lost. The domain will get a spurious event, but it can cope.
- */
- vcpu_info(v, evtchn_upcall_pending) = 1;
- for ( i = 0; i < BITS_PER_EVTCHN_WORD(d); i++ )
- set_bit(i, &vcpu_info(v, evtchn_pending_sel));
-
- return 0;
-}
-
long
arch_do_vcpu_op(
int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
@@ -1089,22 +994,6 @@ arch_do_vcpu_op(
break;
}
- case VCPUOP_register_vcpu_info:
- {
- struct domain *d = v->domain;
- struct vcpu_register_vcpu_info info;
-
- rc = -EFAULT;
- if ( copy_from_guest(&info, arg, 1) )
- break;
-
- domain_lock(d);
- rc = map_vcpu_info(v, info.mfn, info.offset);
- domain_unlock(d);
-
- break;
- }
-
/*
* XXX Disable for 4.0.0: __update_vcpu_system_time() writes to the given
* virtual address even when running in another domain's address space.
@@ -1971,8 +1860,6 @@ int domain_relinquish_resources(struct domain *d)
ret = vcpu_destroy_pagetables(v);
if ( ret )
return ret;
-
- unmap_vcpu_info(v);
}
if ( !is_hvm_domain(d) )