aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/x86_64/mm.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2010-11-16 14:16:36 +0000
committerKeir Fraser <keir@xen.org>2010-11-16 14:16:36 +0000
commit106f2288c2a71e4f6438d5e2571a78720e659d34 (patch)
tree085fb5fd0943b5fd21d2bbdfbebf622eb0ee8362 /xen/arch/x86/x86_64/mm.c
parent561e9179370c6927160eb797e1dccc5351d13eb3 (diff)
downloadxen-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.c31
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)