diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-02-28 11:09:39 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-02-28 11:09:39 +0100 |
commit | 8db1e759556d3a3832f92e91d6c848c5ce2d3fa1 (patch) | |
tree | 4dfe7fd0f989b23a377df70973f569491f618551 /xen/arch/x86/x86_64 | |
parent | 703ac3abcfc5f649c038070867ee12c67f730548 (diff) | |
download | xen-8db1e759556d3a3832f92e91d6c848c5ce2d3fa1.tar.gz xen-8db1e759556d3a3832f92e91d6c848c5ce2d3fa1.tar.bz2 xen-8db1e759556d3a3832f92e91d6c848c5ce2d3fa1.zip |
x86: rework hypercall argument translation area setup
... using the new per-domain mapping management functions, adding
destroy_perdomain_mapping() to the previously introduced pair.
Rather than using an order-1 Xen heap allocation, use (currently 2)
individual domain heap pages to populate space in the per-domain
mapping area.
Also fix a benign off-by-one mistake in is_compat_arg_xlat_range().
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/x86_64')
-rw-r--r-- | xen/arch/x86/x86_64/mm.c | 20 |
1 files changed, 5 insertions, 15 deletions
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 8a5e1cc0fa..8cd0d30e84 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -832,27 +832,17 @@ void __init zap_low_mappings(void) __PAGE_HYPERVISOR); } -void *compat_arg_xlat_virt_base(void) -{ - return current->arch.compat_arg_xlat; -} - int setup_compat_arg_xlat(struct vcpu *v) { - unsigned int order = get_order_from_bytes(COMPAT_ARG_XLAT_SIZE); - - v->arch.compat_arg_xlat = alloc_xenheap_pages(order, - MEMF_node(vcpu_to_node(v))); - - return v->arch.compat_arg_xlat ? 0 : -ENOMEM; + return create_perdomain_mapping(v->domain, ARG_XLAT_START(v), + PFN_UP(COMPAT_ARG_XLAT_SIZE), + NULL, NIL(struct page_info *)); } void free_compat_arg_xlat(struct vcpu *v) { - unsigned int order = get_order_from_bytes(COMPAT_ARG_XLAT_SIZE); - - free_xenheap_pages(v->arch.compat_arg_xlat, order); - v->arch.compat_arg_xlat = NULL; + destroy_perdomain_mapping(v->domain, ARG_XLAT_START(v), + PFN_UP(COMPAT_ARG_XLAT_SIZE)); } void cleanup_frame_table(struct mem_hotadd_info *info) |