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 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_core_arm.h | 2 + tools/libxc/xc_core_x86.h | 5 ++ tools/libxc/xc_dom.h | 6 +-- tools/libxc/xc_dom_arm.c | 19 ++++-- tools/libxc/xc_dom_boot.c | 23 +++---- 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/mm.h | 3 + xen/include/xen/sched.h | 2 + 18 files changed, 234 insertions(+), 194 deletions(-) Cheers, Stefano
Stefano Stabellini
2013-Jan-16 18:58 UTC
[PATCH v2 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 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/mm.h | 3 + xen/include/xen/sched.h | 2 + 8 files changed, 132 insertions(+), 120 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index acb6771..4d3073b 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -58,6 +58,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 1e730a7..24dbe69 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -119,7 +119,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; /* * Calculate the sizes for the heaps 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/mm.h b/xen/include/asm-arm/mm.h index 4ed5df6..96b36c2 100644 --- a/xen/include/asm-arm/mm.h +++ b/xen/include/asm-arm/mm.h @@ -136,6 +136,9 @@ extern unsigned long frametable_base_mfn; extern unsigned long max_page; extern unsigned long total_pages; +/* XXX: implement NUMA support */ +#define node_spanned_pages(nid) (total_pages) +#define __node_distance(a, b) (20) /* Boot-time pagetable setup */ extern void setup_pagetables(unsigned long boot_phys_offset, paddr_t xen_paddr); 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-Jan-16 18:58 UTC
[PATCH v2 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> --- 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 59d8d73..644b066 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/regs.h> @@ -328,11 +329,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 4d3073b..137332e 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -579,6 +579,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 on v2: - add xc_dom_gnttab_init changes. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- tools/libxc/xc_core_arm.h | 2 ++ tools/libxc/xc_core_x86.h | 5 +++++ tools/libxc/xc_dom.h | 6 +----- tools/libxc/xc_dom_arm.c | 19 ++++++++++++------- tools/libxc/xc_dom_boot.c | 23 ++++++++++------------- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/tools/libxc/xc_core_arm.h b/tools/libxc/xc_core_arm.h index 3a6be2a..c046250 100644 --- a/tools/libxc/xc_core_arm.h +++ b/tools/libxc/xc_core_arm.h @@ -33,6 +33,8 @@ struct xc_core_arch_context { (0) #define xc_core_arch_context_dump(xch, arch_ctxt, args, dump_rtn) (0) +#define xc_dom_feature_translated(dom) (1) + int xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, unsigned long pfn); diff --git a/tools/libxc/xc_core_x86.h b/tools/libxc/xc_core_x86.h index 7b209f6..ee7d8b1 100644 --- a/tools/libxc/xc_core_x86.h +++ b/tools/libxc/xc_core_x86.h @@ -34,6 +34,11 @@ struct xc_core_arch_context { (0) #define xc_core_arch_context_dump(xch, arch_ctxt, args, dump_rtn) (0) +static inline int xc_dom_feature_translated(struct xc_dom_image *dom) +{ + return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active); +} + int xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, unsigned long pfn); diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h index eccc516..b5e17be 100644 --- a/tools/libxc/xc_dom.h +++ b/tools/libxc/xc_dom.h @@ -15,6 +15,7 @@ */ #include <xen/libelf/libelf.h> +#include <xc_core.h> #define INVALID_P2M_ENTRY ((xen_pfn_t)-1) @@ -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..0cec774 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; } 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); + } } /* -- 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> --- 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 7586a6c..c0d6349 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
Ian Campbell
2013-Jan-24 17:37 UTC
Re: [PATCH v2 1/4] xen: move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo to common code
On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote:> @ -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;Does the loss of precision here matter in practice? Would we be better off sticking with cntfrq and doing the divide in arch_do_physinfo?> diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h > index 4ed5df6..96b36c2 100644 > --- a/xen/include/asm-arm/mm.h > +++ b/xen/include/asm-arm/mm.h > @@ -136,6 +136,9 @@ extern unsigned long frametable_base_mfn; > > extern unsigned long max_page; > extern unsigned long total_pages; > +/* XXX: implement NUMA support */ > +#define node_spanned_pages(nid) (total_pages) > +#define __node_distance(a, b) (20)Please put these in asm-arm/numa.h
Ian Campbell
2013-Jan-24 17:39 UTC
Re: [PATCH v2 2/4] xen/arm: implement gnttab_create_shared_page and gnttab_shared_gmfn
On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote:> 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 59d8d73..644b066 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/regs.h> > @@ -328,11 +329,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 4d3073b..137332e 100644 > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -579,6 +579,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:
On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote:> 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 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>
On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote:> + 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(); > + }This is a very verbose way to write tsc_mode = d_config->b_info.tsc_mode since the enum has the same values, but since this is code motion and since I probably wrote the original: Acked-by: Ian Campbell <ian.campbell@citrix.com>
Stefano Stabellini
2013-Feb-14 11:28 UTC
Re: [PATCH v2 1/4] xen: move XEN_SYSCTL_physinfo, XEN_SYSCTL_numainfo and XEN_SYSCTL_topologyinfo to common code
On Thu, 24 Jan 2013, Ian Campbell wrote:> On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote: > > @ -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; > > Does the loss of precision here matter in practice? Would we be better > off sticking with cntfrq and doing the divide in arch_do_physinfo?We need to export cpu_khz anyway because it is exported in xen/include/xen/time.h. We can only decide to keep an additional internal cntfrq variable. However I don''t think that we need to worry about it practice. After all khz have been enough on x86 for all these years..> > diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h > > index 4ed5df6..96b36c2 100644 > > --- a/xen/include/asm-arm/mm.h > > +++ b/xen/include/asm-arm/mm.h > > @@ -136,6 +136,9 @@ extern unsigned long frametable_base_mfn; > > > > extern unsigned long max_page; > > extern unsigned long total_pages; > > +/* XXX: implement NUMA support */ > > +#define node_spanned_pages(nid) (total_pages) > > +#define __node_distance(a, b) (20) > > Please put these in asm-arm/numa.hOK
On Thu, 2013-01-24 at 17:40 +0000, Ian Campbell wrote:> On Wed, 2013-01-16 at 18:58 +0000, Stefano Stabellini wrote: > > 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 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>This change broke the x86_64 build (at least, presumalby 32 too) gcc -O1 -fno-omit-frame-pointer -m64 -g -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wdeclaration-after-statement -D__XEN_TOOLS__ -MMD -MF .xc_core.o.d -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -fno-optimize-sibling-calls -D_GNU_SOURCE -I../../xen/common/libelf -Werror -Wmissing-prototypes -I. -I/local/scratch/ianc/devel/arm/xen-unstable/tools/libxc/../../tools/include -pthread -c -o xc_core.o xc_core.c cc1: warnings being treated as errors In file included from xc_core.h:154, from xc_core.c:66: xc_core_x86.h: In function ‘xc_dom_feature_translated’: xc_core_x86.h:39: error: implicit declaration of function ‘elf_xen_feature_get’ xc_core_x86.h:39: error: dereferencing pointer to incomplete type In file included from xc_dom.h:18, from xc_core.c:67: /local/scratch/ianc/devel/arm/xen-unstable/tools/libxc/../../tools/include/xen/libelf/libelf.h: At top level: /local/scratch/ianc/devel/arm/xen-unstable/tools/libxc/../../tools/include/xen/libelf/libelf.h:266: error: static declaration of ‘elf_xen_feature_get’ follows non-static declaration xc_core_x86.h:39: note: previous implicit declaration of ‘elf_xen_feature_get’ was here Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel