diff options
author | Keir Fraser <keir@xen.org> | 2010-11-16 14:16:36 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-11-16 14:16:36 +0000 |
commit | 106f2288c2a71e4f6438d5e2571a78720e659d34 (patch) | |
tree | 085fb5fd0943b5fd21d2bbdfbebf622eb0ee8362 /xen/arch/x86/x86_64/mm.c | |
parent | 561e9179370c6927160eb797e1dccc5351d13eb3 (diff) | |
download | xen-106f2288c2a71e4f6438d5e2571a78720e659d34.tar.gz xen-106f2288c2a71e4f6438d5e2571a78720e659d34.tar.bz2 xen-106f2288c2a71e4f6438d5e2571a78720e659d34.zip |
x86_64: Make 32-bit-hypercall translate area per-vcpu.
This is a prerequisite for allowing guest descheduling within a
hypercall.
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/x86_64/mm.c')
-rw-r--r-- | xen/arch/x86/x86_64/mm.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 883d23fa84..1de4e8b03d 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -47,8 +47,6 @@ unsigned int __read_mostly pfn_pdx_hole_shift = 0; unsigned int __read_mostly m2p_compat_vstart = __HYPERVISOR_COMPAT_VIRT_START; -DEFINE_PER_CPU_READ_MOSTLY(void *, compat_arg_xlat); - /* Top-level master (and idle-domain) page directory. */ l4_pgentry_t __attribute__ ((__section__ (".bss.page_aligned"))) idle_pg_table[L4_PAGETABLE_ENTRIES]; @@ -819,25 +817,30 @@ void __init zap_low_mappings(void) 0x10, __PAGE_HYPERVISOR); } -int __cpuinit setup_compat_arg_xlat(unsigned int cpu, int node) +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); - unsigned int memflags = node != NUMA_NO_NODE ? MEMF_node(node) : 0; struct page_info *pg; - BUG_ON((PAGE_SIZE << order) != COMPAT_ARG_XLAT_SIZE); + pg = alloc_domheap_pages(NULL, order, 0); + if ( pg == NULL ) + return -ENOMEM; - pg = alloc_domheap_pages(NULL, order, memflags); - per_cpu(compat_arg_xlat, cpu) = pg ? page_to_virt(pg) : NULL; - return pg ? 0 : -ENOMEM; + v->arch.compat_arg_xlat = page_to_virt(pg); + return 0; } -void __cpuinit free_compat_arg_xlat(unsigned int cpu) +void free_compat_arg_xlat(struct vcpu *v) { unsigned int order = get_order_from_bytes(COMPAT_ARG_XLAT_SIZE); - if ( per_cpu(compat_arg_xlat, cpu) != NULL ) - free_domheap_pages(virt_to_page(per_cpu(compat_arg_xlat, cpu)), order); - per_cpu(compat_arg_xlat, cpu) = NULL; + if ( v->arch.compat_arg_xlat != NULL ) + free_domheap_pages(virt_to_page(v->arch.compat_arg_xlat), order); + v->arch.compat_arg_xlat = NULL; } void cleanup_frame_table(struct mem_hotadd_info *info) @@ -1009,10 +1012,6 @@ void __init subarch_init_memory(void) share_xen_page_with_privileged_guests(page, XENSHARE_readonly); } } - - if ( setup_compat_arg_xlat(smp_processor_id(), - cpu_to_node[0]) ) - panic("Could not setup argument translation area"); } long subarch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) |