Hi all, this small patch series contains the changes necessary to compile and run xl on ARM. Xl can be used to create VMs. The first two patches are hypervisor changes, while the last two are libxc and libxli multiarch fixes. Changes in v3: - rebased on b61ed421d2c85b5b106c63f2c14f8aa162b282f0; - move node_spanned_pages and __node_distance definitions to numa.h; - implement xc_dom_feature_translated in xc_dom_{arm/x86}.c. Changes in v2: - rebased on 77d3a1db3196b1b5864469f8d3f41d496800c795; - cpu_khz is khz while cntfrq is hz: take care of the conversion; - move the xc_dom_gnttab_hvm_seed changes into the libxc patch. Stefano Stabellini (4): xen: move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo to common code xen/arm: implement gnttab_create_shared_page and gnttab_shared_gmfn libxc: fixes for the ARM platform xen/arm: compile and run libxl/xl tools/libxc/xc_dom.h | 6 +-- tools/libxc/xc_dom_arm.c | 24 +++++-- tools/libxc/xc_dom_boot.c | 23 +++---- tools/libxc/xc_dom_x86.c | 5 ++ tools/libxl/libxl_dom.c | 54 ++-------------- tools/libxl/libxl_x86.c | 48 ++++++++++++++ xen/arch/arm/domain.c | 3 + xen/arch/arm/mm.c | 3 + xen/arch/arm/setup.c | 2 +- xen/arch/arm/sysctl.c | 2 + xen/arch/arm/time.c | 10 ++-- xen/arch/x86/sysctl.c | 123 +++---------------------------------- xen/common/sysctl.c | 109 ++++++++++++++++++++++++++++++++ xen/include/asm-arm/domain.h | 1 + xen/include/asm-arm/grant_table.h | 13 +++- xen/include/asm-arm/numa.h | 4 + xen/include/xen/sched.h | 2 + 17 files changed, 238 insertions(+), 194 deletions(-) Cheers, Stefano
Stefano Stabellini
2013-Feb-14 18:06 UTC
[PATCH v3 1/4] xen: move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo to common code
Move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo from x86/sysctl.c to common/sysctl.c. The implementation of XEN_SYSCTL_physinfo is mostly generic but needs to fill in few arch specific details: introduce arch_do_physinfo to do that. The implementation of XEN_SYSCTL_physinfo relies on two global variables: total_pages and cpu_khz. Make them available on ARM. Implement node_spanned_pages and __node_distance on ARM, assuming 1 numa node for now. Changes in v3: - move node_spanned_pages and __node_distance definitions to numa.h. Changes in v2: - cpu_khz is khz while cntfrq is hz: take care of the conversion; - rebased on 77d3a1db3196b1b5864469f8d3f41d496800c795. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- xen/arch/arm/mm.c | 1 + xen/arch/arm/setup.c | 2 +- xen/arch/arm/sysctl.c | 2 + xen/arch/arm/time.c | 10 ++-- xen/arch/x86/sysctl.c | 123 +++---------------------------------------- xen/common/sysctl.c | 109 +++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/numa.h | 4 ++ xen/include/xen/sched.h | 2 + 8 files changed, 133 insertions(+), 120 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 7621d1b..f1011b9 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -59,6 +59,7 @@ unsigned long frametable_base_mfn __read_mostly; unsigned long frametable_virt_end __read_mostly; unsigned long max_page; +unsigned long total_pages; extern char __init_begin[], __init_end[]; diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 52d2e7a..389bdac 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -219,7 +219,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size) ram_start = early_info.mem.bank[0].start; ram_size = early_info.mem.bank[0].size; ram_end = ram_start + ram_size; - ram_pages = ram_size >> PAGE_SHIFT; + total_pages = ram_pages = ram_size >> PAGE_SHIFT; /* * Locate the xenheap using these constraints: diff --git a/xen/arch/arm/sysctl.c b/xen/arch/arm/sysctl.c index a286abe..a5d9cf0 100644 --- a/xen/arch/arm/sysctl.c +++ b/xen/arch/arm/sysctl.c @@ -12,6 +12,8 @@ #include <xen/errno.h> #include <public/sysctl.h> +void arch_do_physinfo(xen_sysctl_physinfo_t *pi) { } + long arch_do_sysctl(struct xen_sysctl *sysctl, XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c index 07628e1..3dad9b3 100644 --- a/xen/arch/arm/time.c +++ b/xen/arch/arm/time.c @@ -43,16 +43,16 @@ uint64_t __read_mostly boot_count; /* For fine-grained timekeeping, we use the ARM "Generic Timer", a * register-mapped time source in the SoC. */ -static uint32_t __read_mostly cntfrq; /* Ticks per second */ +unsigned long __read_mostly cpu_khz; /* CPU clock frequency in kHz. */ /*static inline*/ s_time_t ticks_to_ns(uint64_t ticks) { - return muldiv64(ticks, SECONDS(1), cntfrq); + return muldiv64(ticks, SECONDS(1), 1000 * cpu_khz); } /*static inline*/ uint64_t ns_to_ticks(s_time_t ns) { - return muldiv64(ns, cntfrq, SECONDS(1)); + return muldiv64(ns, 1000 * cpu_khz, SECONDS(1)); } /* TODO: On a real system the firmware would have set the frequency in @@ -93,9 +93,9 @@ int __init init_xen_time(void) if ( (READ_CP32(ID_PFR1) & ID_PFR1_GT_MASK) != ID_PFR1_GT_v1 ) panic("CPU does not support the Generic Timer v1 interface.\n"); - cntfrq = READ_CP32(CNTFRQ); + cpu_khz = READ_CP32(CNTFRQ) / 1000; boot_count = READ_CP64(CNTPCT); - printk("Using generic timer at %"PRIu32" Hz\n", cntfrq); + printk("Using generic timer at %lu KHz\n", cpu_khz); return 0; } diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index d0be4be..b4d3e32 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -57,6 +57,15 @@ long cpu_down_helper(void *data) return ret; } +void arch_do_physinfo(xen_sysctl_physinfo_t *pi) +{ + memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4); + if ( hvm_enabled ) + pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm; + if ( iommu_enabled ) + pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm_directio; +} + long arch_do_sysctl( struct xen_sysctl *sysctl, XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) { @@ -65,120 +74,6 @@ long arch_do_sysctl( switch ( sysctl->cmd ) { - case XEN_SYSCTL_physinfo: - { - xen_sysctl_physinfo_t *pi = &sysctl->u.physinfo; - - memset(pi, 0, sizeof(*pi)); - pi->threads_per_core - cpumask_weight(per_cpu(cpu_sibling_mask, 0)); - pi->cores_per_socket - cpumask_weight(per_cpu(cpu_core_mask, 0)) / pi->threads_per_core; - pi->nr_cpus = num_online_cpus(); - pi->nr_nodes = num_online_nodes(); - pi->max_node_id = MAX_NUMNODES-1; - pi->max_cpu_id = nr_cpu_ids - 1; - pi->total_pages = total_pages; - pi->free_pages = avail_domheap_pages(); - pi->scrub_pages = 0; - pi->cpu_khz = cpu_khz; - memcpy(pi->hw_cap, boot_cpu_data.x86_capability, NCAPINTS*4); - if ( hvm_enabled ) - pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm; - if ( iommu_enabled ) - pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm_directio; - - if ( __copy_field_to_guest(u_sysctl, sysctl, u.physinfo) ) - ret = -EFAULT; - } - break; - - case XEN_SYSCTL_topologyinfo: - { - uint32_t i, max_cpu_index, last_online_cpu; - xen_sysctl_topologyinfo_t *ti = &sysctl->u.topologyinfo; - - last_online_cpu = cpumask_last(&cpu_online_map); - max_cpu_index = min_t(uint32_t, ti->max_cpu_index, last_online_cpu); - ti->max_cpu_index = last_online_cpu; - - for ( i = 0; i <= max_cpu_index; i++ ) - { - if ( !guest_handle_is_null(ti->cpu_to_core) ) - { - uint32_t core = cpu_online(i) ? cpu_to_core(i) : ~0u; - if ( copy_to_guest_offset(ti->cpu_to_core, i, &core, 1) ) - break; - } - if ( !guest_handle_is_null(ti->cpu_to_socket) ) - { - uint32_t socket = cpu_online(i) ? cpu_to_socket(i) : ~0u; - if ( copy_to_guest_offset(ti->cpu_to_socket, i, &socket, 1) ) - break; - } - if ( !guest_handle_is_null(ti->cpu_to_node) ) - { - uint32_t node = cpu_online(i) ? cpu_to_node(i) : ~0u; - if ( copy_to_guest_offset(ti->cpu_to_node, i, &node, 1) ) - break; - } - } - - ret = ((i <= max_cpu_index) || - __copy_field_to_guest(u_sysctl, sysctl, u.topologyinfo)) - ? -EFAULT : 0; - } - break; - - case XEN_SYSCTL_numainfo: - { - uint32_t i, j, max_node_index, last_online_node; - xen_sysctl_numainfo_t *ni = &sysctl->u.numainfo; - - last_online_node = last_node(node_online_map); - max_node_index = min_t(uint32_t, ni->max_node_index, last_online_node); - ni->max_node_index = last_online_node; - - for ( i = 0; i <= max_node_index; i++ ) - { - if ( !guest_handle_is_null(ni->node_to_memsize) ) - { - uint64_t memsize = node_online(i) ? - node_spanned_pages(i) << PAGE_SHIFT : 0ul; - if ( copy_to_guest_offset(ni->node_to_memsize, i, &memsize, 1) ) - break; - } - if ( !guest_handle_is_null(ni->node_to_memfree) ) - { - uint64_t memfree = node_online(i) ? - avail_node_heap_pages(i) << PAGE_SHIFT : 0ul; - if ( copy_to_guest_offset(ni->node_to_memfree, i, &memfree, 1) ) - break; - } - - if ( !guest_handle_is_null(ni->node_to_node_distance) ) - { - for ( j = 0; j <= max_node_index; j++) - { - uint32_t distance = ~0u; - if ( node_online(i) && node_online(j) ) - distance = __node_distance(i, j); - if ( copy_to_guest_offset( - ni->node_to_node_distance, - i*(max_node_index+1) + j, &distance, 1) ) - break; - } - if ( j <= max_node_index ) - break; - } - } - - ret = ((i <= max_node_index) || - __copy_field_to_guest(u_sysctl, sysctl, u.numainfo)) - ? -EFAULT : 0; - } - break; - case XEN_SYSCTL_cpu_hotplug: { unsigned int cpu = sysctl->u.cpu_hotplug.cpu; diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index d663ed7..20bb864 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -249,6 +249,115 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) ret = sched_adjust_global(&op->u.scheduler_op); break; + case XEN_SYSCTL_physinfo: + { + xen_sysctl_physinfo_t *pi = &op->u.physinfo; + + memset(pi, 0, sizeof(*pi)); + pi->threads_per_core + cpumask_weight(per_cpu(cpu_sibling_mask, 0)); + pi->cores_per_socket + cpumask_weight(per_cpu(cpu_core_mask, 0)) / pi->threads_per_core; + pi->nr_cpus = num_online_cpus(); + pi->nr_nodes = num_online_nodes(); + pi->max_node_id = MAX_NUMNODES-1; + pi->max_cpu_id = nr_cpu_ids - 1; + pi->total_pages = total_pages; + pi->free_pages = avail_domheap_pages(); + pi->scrub_pages = 0; + pi->cpu_khz = cpu_khz; + arch_do_physinfo(pi); + + if ( copy_to_guest(u_sysctl, op, 1) ) + ret = -EFAULT; + } + break; + + case XEN_SYSCTL_numainfo: + { + uint32_t i, j, max_node_index, last_online_node; + xen_sysctl_numainfo_t *ni = &op->u.numainfo; + + last_online_node = last_node(node_online_map); + max_node_index = min_t(uint32_t, ni->max_node_index, last_online_node); + ni->max_node_index = last_online_node; + + for ( i = 0; i <= max_node_index; i++ ) + { + if ( !guest_handle_is_null(ni->node_to_memsize) ) + { + uint64_t memsize = node_online(i) ? + node_spanned_pages(i) << PAGE_SHIFT : 0ul; + if ( copy_to_guest_offset(ni->node_to_memsize, i, &memsize, 1) ) + break; + } + if ( !guest_handle_is_null(ni->node_to_memfree) ) + { + uint64_t memfree = node_online(i) ? + avail_node_heap_pages(i) << PAGE_SHIFT : 0ul; + if ( copy_to_guest_offset(ni->node_to_memfree, i, &memfree, 1) ) + break; + } + + if ( !guest_handle_is_null(ni->node_to_node_distance) ) + { + for ( j = 0; j <= max_node_index; j++) + { + uint32_t distance = ~0u; + if ( node_online(i) && node_online(j) ) + distance = __node_distance(i, j); + if ( copy_to_guest_offset( + ni->node_to_node_distance, + i*(max_node_index+1) + j, &distance, 1) ) + break; + } + if ( j <= max_node_index ) + break; + } + } + + ret = ((i <= max_node_index) || copy_to_guest(u_sysctl, op, 1)) + ? -EFAULT : 0; + } + break; + + case XEN_SYSCTL_topologyinfo: + { + uint32_t i, max_cpu_index, last_online_cpu; + xen_sysctl_topologyinfo_t *ti = &op->u.topologyinfo; + + last_online_cpu = cpumask_last(&cpu_online_map); + max_cpu_index = min_t(uint32_t, ti->max_cpu_index, last_online_cpu); + ti->max_cpu_index = last_online_cpu; + + for ( i = 0; i <= max_cpu_index; i++ ) + { + if ( !guest_handle_is_null(ti->cpu_to_core) ) + { + uint32_t core = cpu_online(i) ? cpu_to_core(i) : ~0u; + if ( copy_to_guest_offset(ti->cpu_to_core, i, &core, 1) ) + break; + } + if ( !guest_handle_is_null(ti->cpu_to_socket) ) + { + uint32_t socket = cpu_online(i) ? cpu_to_socket(i) : ~0u; + if ( copy_to_guest_offset(ti->cpu_to_socket, i, &socket, 1) ) + break; + } + if ( !guest_handle_is_null(ti->cpu_to_node) ) + { + uint32_t node = cpu_online(i) ? cpu_to_node(i) : ~0u; + if ( copy_to_guest_offset(ti->cpu_to_node, i, &node, 1) ) + break; + } + } + + ret = ((i <= max_cpu_index) || copy_to_guest(u_sysctl, op, 1)) + ? -EFAULT : 0; + } + break; + + default: ret = arch_do_sysctl(op, u_sysctl); copyback = 0; diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h index a1b1f58..86f0183 100644 --- a/xen/include/asm-arm/numa.h +++ b/xen/include/asm-arm/numa.h @@ -10,6 +10,10 @@ static inline __attribute__((pure)) int phys_to_nid(paddr_t addr) return 0; } +/* XXX: implement NUMA support */ +#define node_spanned_pages(nid) (total_pages) +#define __node_distance(a, b) (20) + #endif /* __ARCH_ARM_NUMA_H */ /* * Local variables: diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 90a6537..ba0f2f8 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -748,6 +748,8 @@ extern void dump_runq(unsigned char key); #define num_cpupool_cpus(c) cpumask_weight((c)->cpu_valid) +void arch_do_physinfo(xen_sysctl_physinfo_t *pi); + #endif /* __SCHED_H__ */ /* -- 1.7.2.5
Stefano Stabellini
2013-Feb-14 18:06 UTC
[PATCH v3 2/4] xen/arm: implement gnttab_create_shared_page and gnttab_shared_gmfn
Introduce a simple pfn array, grant_table_gpfn, to keep track of the grant table pages mapped in guest gpfn space. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> --- xen/arch/arm/domain.c | 3 +++ xen/arch/arm/mm.c | 2 ++ xen/include/asm-arm/domain.h | 1 + xen/include/asm-arm/grant_table.h | 13 +++++++++++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 0aa261a..e37ec54 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -6,6 +6,7 @@ #include <xen/wait.h> #include <xen/errno.h> #include <xen/bitops.h> +#include <xen/grant_table.h> #include <asm/current.h> #include <asm/event.h> @@ -329,11 +330,13 @@ struct domain *alloc_domain_struct(void) d = alloc_xenheap_pages(0, 0); if ( d != NULL ) clear_page(d); + d->arch.grant_table_gpfn = xmalloc_array(xen_pfn_t, max_nr_grant_frames); return d; } void free_domain_struct(struct domain *d) { + xfree(d->arch.grant_table_gpfn); free_xenheap_page(d); } diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index f1011b9..b341a5b 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -592,6 +592,8 @@ static int xenmem_add_to_physmap_one( if ( idx < nr_grant_frames(d->grant_table) ) mfn = virt_to_mfn(d->grant_table->shared_raw[idx]); } + + d->arch.grant_table_gpfn[idx] = gpfn; spin_unlock(&d->grant_table->lock); break; diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 577ad19..29fe808 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -39,6 +39,7 @@ struct arch_domain { struct p2m_domain p2m; struct hvm_domain hvm_domain; + xen_pfn_t *grant_table_gpfn; struct { /* diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h index e49aa8d..3fa270d 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -15,8 +15,6 @@ int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn, unsigned long new_gpaddr, unsigned int flags); void gnttab_mark_dirty(struct domain *d, unsigned long l); #define gnttab_create_status_page(d, t, i) do {} while (0) -#define gnttab_create_shared_page(d, t, i) do {} while (0) -#define gnttab_shared_gmfn(d, t, i) (0) #define gnttab_status_gmfn(d, t, i) (0) #define gnttab_release_host_mappings(domain) 1 static inline int replace_grant_supported(void) @@ -24,6 +22,17 @@ static inline int replace_grant_supported(void) return 1; } +#define gnttab_create_shared_page(d, t, i) \ + do { \ + share_xen_page_with_guest( \ + virt_to_page((char *)(t)->shared_raw[i]), \ + (d), XENSHARE_writable); \ + } while ( 0 ) + +#define gnttab_shared_gmfn(d, t, i) \ + ( ((i >= nr_grant_frames(d->grant_table)) && \ + (i < max_nr_grant_frames)) ? 0 : (d->arch.grant_table_gpfn[i])) + #endif /* __ASM_GRANT_TABLE_H__ */ /* * Local variables: -- 1.7.2.5
Make xc_dom_feature_translated an arch-dependent function. alloc_magic_pages: save console and xenstore pfn''s in xc_dom_image. alloc_magic_pages: set HVM_PARAM_CONSOLE_EVTCHN and HVM_PARAM_STORE_EVTCHN hvm_params using the event channels allocated by the toolstack. Call xc_dom_gnttab_hvm_seed instead of xc_dom_gnttab_seed in xc_dom_gnttab_init for autotranslated guests. Changes in v3: - rebased on b61ed421d2c85b5b106c63f2c14f8aa162b282f0; - implement xc_dom_feature_translated in xc_dom_{arm/x86}.c. Changes on v2: - add xc_dom_gnttab_init changes. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> --- tools/libxc/xc_dom.h | 6 +----- tools/libxc/xc_dom_arm.c | 24 +++++++++++++++++------- tools/libxc/xc_dom_boot.c | 23 ++++++++++------------- tools/libxc/xc_dom_x86.c | 5 +++++ 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h index eccc516..7583d8c 100644 --- a/tools/libxc/xc_dom.h +++ b/tools/libxc/xc_dom.h @@ -250,6 +250,7 @@ int xc_dom_gnttab_seed(xc_interface *xch, domid_t domid, xen_pfn_t xenstore_gmfn, domid_t console_domid, domid_t xenstore_domid); +int xc_dom_feature_translated(struct xc_dom_image *dom); /* --- debugging bits ---------------------------------------------- */ @@ -312,11 +313,6 @@ static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, return (ptr ? (ptr + offset) : NULL); } -static inline int xc_dom_feature_translated(struct xc_dom_image *dom) -{ - return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active); -} - static inline xen_pfn_t xc_dom_p2m_host(struct xc_dom_image *dom, xen_pfn_t pfn) { if (dom->shadow_enabled) diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c index b743a6c..62bd3cf 100644 --- a/tools/libxc/xc_dom_arm.c +++ b/tools/libxc/xc_dom_arm.c @@ -51,7 +51,7 @@ static int setup_pgtables_arm(struct xc_dom_image *dom) static int alloc_magic_pages(struct xc_dom_image *dom) { int rc, i; - xen_pfn_t store_pfn, console_pfn, p2m[NR_MAGIC_PAGES]; + xen_pfn_t p2m[NR_MAGIC_PAGES]; DOMPRINTF_CALLED(dom->xch); @@ -64,15 +64,20 @@ static int alloc_magic_pages(struct xc_dom_image *dom) if ( rc < 0 ) return rc; - console_pfn = dom->rambase_pfn + dom->total_pages + CONSOLE_PFN_OFFSET; - store_pfn = dom->rambase_pfn + dom->total_pages + XENSTORE_PFN_OFFSET; + dom->console_pfn = dom->rambase_pfn + dom->total_pages + CONSOLE_PFN_OFFSET; + dom->xenstore_pfn = dom->rambase_pfn + dom->total_pages + XENSTORE_PFN_OFFSET; - xc_clear_domain_page(dom->xch, dom->guest_domid, console_pfn); - xc_clear_domain_page(dom->xch, dom->guest_domid, store_pfn); + xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn); + xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn); xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_PFN, - console_pfn); + dom->console_pfn); xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_PFN, - store_pfn); + dom->xenstore_pfn); + /* allocated by toolstack */ + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN, + dom->console_evtchn); + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN, + dom->xenstore_evtchn); return 0; } @@ -196,6 +201,11 @@ int arch_setup_bootlate(struct xc_dom_image *dom) return 0; } +int xc_dom_feature_translated(struct xc_dom_image *dom) +{ + return 1; +} + /* * Local variables: * mode: C diff --git a/tools/libxc/xc_dom_boot.c b/tools/libxc/xc_dom_boot.c index f83aa12..c7f04a8 100644 --- a/tools/libxc/xc_dom_boot.c +++ b/tools/libxc/xc_dom_boot.c @@ -416,19 +416,16 @@ int xc_dom_gnttab_hvm_seed(xc_interface *xch, domid_t domid, int xc_dom_gnttab_init(struct xc_dom_image *dom) { - xen_pfn_t console_gmfn; - xen_pfn_t xenstore_gmfn; - int autotranslated; - - autotranslated = xc_dom_feature_translated(dom); - console_gmfn = autotranslated ? - dom->console_pfn : xc_dom_p2m_host(dom, dom->console_pfn); - xenstore_gmfn = autotranslated ? - dom->xenstore_pfn : xc_dom_p2m_host(dom, dom->xenstore_pfn); - - return xc_dom_gnttab_seed(dom->xch, dom->guest_domid, - console_gmfn, xenstore_gmfn, - dom->console_domid, dom->xenstore_domid); + if ( xc_dom_feature_translated(dom) ) { + return xc_dom_gnttab_hvm_seed(dom->xch, dom->guest_domid, + dom->console_pfn, dom->xenstore_pfn, + dom->console_domid, dom->xenstore_domid); + } else { + return xc_dom_gnttab_seed(dom->xch, dom->guest_domid, + xc_dom_p2m_host(dom, dom->console_pfn), + xc_dom_p2m_host(dom, dom->xenstore_pfn), + dom->console_domid, dom->xenstore_domid); + } } /* diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c index be2ad66..9cbdd62 100644 --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -822,6 +822,11 @@ int arch_setup_bootlate(struct xc_dom_image *dom) return 0; } +int xc_dom_feature_translated(struct xc_dom_image *dom) +{ + return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active); +} + /* * Local variables: * mode: C -- 1.7.2.5
Move tsc, rtc, memmap_limit, localtime and shadow settings from libxl__build_pre to libxl__arch_domain_create. Get the console and xenstore pfn''s from struct xc_dom_image for autotranslated guests. Changes in v2: - move the xc_dom_gnttab_hvm_seed changes into the libxc patch. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> --- tools/libxl/libxl_dom.c | 54 ++++++---------------------------------------- tools/libxl/libxl_x86.c | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 47 deletions(-) diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 6b3b3c3..65d9fa0 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -202,9 +202,7 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *info, libxl__domain_build_state *state) { libxl_ctx *ctx = libxl__gc_owner(gc); - int tsc_mode; char *xs_domid, *con_domid; - uint32_t rtc_timeoffset; xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); @@ -233,49 +231,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, libxl_set_vcpuaffinity_all(ctx, domid, info->max_vcpus, &info->cpumap); xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT); - if (info->type == LIBXL_DOMAIN_TYPE_PV) - xc_domain_set_memmap_limit(ctx->xch, domid, - (info->max_memkb + info->u.pv.slack_memkb)); - switch (info->tsc_mode) { - case LIBXL_TSC_MODE_DEFAULT: - tsc_mode = 0; - break; - case LIBXL_TSC_MODE_ALWAYS_EMULATE: - tsc_mode = 1; - break; - case LIBXL_TSC_MODE_NATIVE: - tsc_mode = 2; - break; - case LIBXL_TSC_MODE_NATIVE_PARAVIRT: - tsc_mode = 3; - break; - default: - abort(); - } - xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0); - if (libxl_defbool_val(info->disable_migrate)) - xc_domain_disable_migrate(ctx->xch, domid); - - rtc_timeoffset = info->rtc_timeoffset; - if (libxl_defbool_val(info->localtime)) { - time_t t; - struct tm *tm; - - t = time(NULL); - tm = localtime(&t); - - rtc_timeoffset += tm->tm_gmtoff; - } - - if (rtc_timeoffset) - xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset); - - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { - unsigned long shadow; - shadow = (info->shadow_memkb + 1023) / 1024; - xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL); - } - xs_domid = xs_read(ctx->xsh, XBT_NULL, "/tool/xenstored/domid", NULL); state->store_domid = xs_domid ? atoi(xs_domid) : 0; free(xs_domid); @@ -443,8 +398,13 @@ int libxl__build_pv(libxl__gc *gc, uint32_t domid, goto out; } - state->console_mfn = xc_dom_p2m_host(dom, dom->console_pfn); - state->store_mfn = xc_dom_p2m_host(dom, dom->xenstore_pfn); + if (xc_dom_feature_translated(dom)) { + state->console_mfn = dom->console_pfn; + state->store_mfn = dom->xenstore_pfn; + } else { + state->console_mfn = xc_dom_p2m_host(dom, dom->console_pfn); + state->store_mfn = xc_dom_p2m_host(dom, dom->xenstore_pfn); + } libxl__file_reference_unmap(&state->pv_kernel); libxl__file_reference_unmap(&state->pv_ramdisk); diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 590e39d..a17f6ae 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -248,6 +248,54 @@ int libxl__arch_domain_create(libxl__gc *gc, libxl_domain_config *d_config, uint32_t domid) { int ret = 0; + int tsc_mode; + uint32_t rtc_timeoffset; + libxl_ctx *ctx = libxl__gc_owner(gc); + + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_PV) + xc_domain_set_memmap_limit(ctx->xch, domid, + (d_config->b_info.max_memkb + + d_config->b_info.u.pv.slack_memkb)); + + switch (d_config->b_info.tsc_mode) { + case LIBXL_TSC_MODE_DEFAULT: + tsc_mode = 0; + break; + case LIBXL_TSC_MODE_ALWAYS_EMULATE: + tsc_mode = 1; + break; + case LIBXL_TSC_MODE_NATIVE: + tsc_mode = 2; + break; + case LIBXL_TSC_MODE_NATIVE_PARAVIRT: + tsc_mode = 3; + break; + default: + abort(); + } + xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0); + if (libxl_defbool_val(d_config->b_info.disable_migrate)) + xc_domain_disable_migrate(ctx->xch, domid); + rtc_timeoffset = d_config->b_info.rtc_timeoffset; + if (libxl_defbool_val(d_config->b_info.localtime)) { + time_t t; + struct tm *tm; + + t = time(NULL); + tm = localtime(&t); + + rtc_timeoffset += tm->tm_gmtoff; + } + + if (rtc_timeoffset) + xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset); + + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM) { + unsigned long shadow; + shadow = (d_config->b_info.shadow_memkb + 1023) / 1024; + xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL); + } + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV && libxl_defbool_val(d_config->b_info.u.pv.e820_host)) { ret = libxl__e820_alloc(gc, domid, d_config); -- 1.7.2.5
On Thu, 2013-02-14 at 18:05 +0000, Stefano Stabellini wrote:> Stefano Stabellini (4): > xen: move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo to common code > xen/arm: implement gnttab_create_shared_page and gnttab_shared_gmfn > libxc: fixes for the ARM platform > xen/arm: compile and run libxl/xlAll acked + applied, thanks. Ian.