diff -r c2a8bde9ad6e tools/libxc/Makefile --- a/tools/libxc/Makefile Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/Makefile Wed Nov 09 14:01:30 2011 +0100 @@ -13,6 +13,7 @@ CTRL_SRCS-y += xc_domain.c CTRL_SRCS-y += xc_evtchn.c CTRL_SRCS-y += xc_gnttab.c CTRL_SRCS-y += xc_misc.c +CTRL_SRCS-$(CONFIG_X86) += xc_misc_x86.c CTRL_SRCS-y += xc_flask.c CTRL_SRCS-y += xc_physdev.c CTRL_SRCS-y += xc_private.c diff -r c2a8bde9ad6e tools/libxc/xc_dom_ia64.c --- a/tools/libxc/xc_dom_ia64.c Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xc_dom_ia64.c Wed Nov 09 14:01:30 2011 +0100 @@ -83,7 +83,7 @@ int start_info_ia64(struct xc_dom_image bp->initrd_start = start_info->mod_start; bp->initrd_size = start_info->mod_len; } - bp->command_line = (dom->start_info_pfn << PAGE_SHIFT_IA64) + bp->command_line = (dom->start_info_pfn << XC_PAGE_SHIFT) + offsetof(start_info_t, cmd_line); if ( dom->cmdline ) { @@ -128,7 +128,7 @@ static int vcpu_ia64(struct xc_dom_image #ifdef __ia64__ /* FIXME */ ctxt->regs.ar.fpsr = xc_ia64_fpsr_default(); #endif - ctxt->regs.r[28] = (dom->start_info_pfn << PAGE_SHIFT_IA64) + ctxt->regs.r[28] = (dom->start_info_pfn << XC_PAGE_SHIFT) + sizeof(start_info_ia64_t); return 0; } @@ -138,7 +138,7 @@ static int vcpu_ia64(struct xc_dom_image static struct xc_dom_arch xc_dom_arch = { .guest_type = "xen-3.0-ia64", .native_protocol = XEN_IO_PROTO_ABI_IA64, - .page_shift = PAGE_SHIFT_IA64, + .page_shift = XC_PAGE_SHIFT, .alloc_magic_pages = alloc_magic_pages, .start_info = start_info_ia64, .shared_info = shared_info_ia64, @@ -148,7 +148,7 @@ static struct xc_dom_arch xc_dom_arch = static struct xc_dom_arch xc_dom_arch_ia64be = { .guest_type = "xen-3.0-ia64be", .native_protocol = XEN_IO_PROTO_ABI_IA64, - .page_shift = PAGE_SHIFT_IA64, + .page_shift = XC_PAGE_SHIFT, .alloc_magic_pages = alloc_magic_pages, .start_info = start_info_ia64, .shared_info = shared_info_ia64, @@ -173,8 +173,8 @@ int arch_setup_meminit(struct xc_dom_ima /* setup initial p2m */ if (dom->guest_type && strcmp(dom->guest_type, "hvm-3.0-ia64-sioemu") == 0) { - start = FW_MEM_BASE >> PAGE_SHIFT_IA64; - nbr = FW_MEM_SIZE >> PAGE_SHIFT_IA64; + start = FW_MEM_BASE >> XC_PAGE_SHIFT; + nbr = FW_MEM_SIZE >> XC_PAGE_SHIFT; } else { start = 0; nbr = dom->total_pages; diff -r c2a8bde9ad6e tools/libxc/xc_dom_x86.c --- a/tools/libxc/xc_dom_x86.c Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xc_dom_x86.c Wed Nov 09 14:01:30 2011 +0100 @@ -89,7 +89,7 @@ static int count_pgtables(struct xc_dom_ pages = extra_pages; for ( ; ; ) { - try_virt_end = round_up(dom->virt_alloc_end + pages * PAGE_SIZE_X86, + try_virt_end = round_up(dom->virt_alloc_end + pages * XC_PAGE_SIZE, bits_to_mask(22)); /* 4MB alignment */ dom->pg_l4 = nr_page_tables(dom, dom->parms.virt_base, try_virt_end, l4_bits); @@ -107,7 +107,7 @@ static int count_pgtables(struct xc_dom_ } dom->pgtables = dom->pg_l4 + dom->pg_l3 + dom->pg_l2 + dom->pg_l1; pages = dom->pgtables + extra_pages; - if ( dom->virt_alloc_end + pages * PAGE_SIZE_X86 <= try_virt_end + 1 ) + if ( dom->virt_alloc_end + pages * XC_PAGE_SIZE <= try_virt_end + 1 ) break; } dom->virt_pgtab_end = try_virt_end + 1; @@ -132,7 +132,7 @@ static int count_pgtables_x86_32_pae(str L3_PAGETABLE_SHIFT_PAE, L2_PAGETABLE_SHIFT_PAE); } -#define pfn_to_paddr(pfn) ((xen_paddr_t)(pfn) << PAGE_SHIFT_X86) +#define pfn_to_paddr(pfn) ((xen_paddr_t)(pfn) << XC_PAGE_SHIFT) static int setup_pgtables_x86_32(struct xc_dom_image *dom) { @@ -145,7 +145,7 @@ static int setup_pgtables_x86_32(struct xen_pfn_t pgpfn; for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) + addr += XC_PAGE_SIZE ) { if ( l1tab == NULL ) { @@ -159,7 +159,7 @@ static int setup_pgtables_x86_32(struct /* make L1 entry */ l1off = l1_table_offset_i386(addr); - pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86; + pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT; l1tab[l1off] = pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT; if ( (addr >= dom->pgtables_seg.vstart) && @@ -264,7 +264,7 @@ static int setup_pgtables_x86_32_pae(str l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) + addr += XC_PAGE_SIZE ) { if ( l2tab == NULL ) { @@ -290,7 +290,7 @@ static int setup_pgtables_x86_32_pae(str /* make L1 entry */ l1off = l1_table_offset_pae(addr); - pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86; + pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT; l1tab[l1off] = pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT; if ( (addr >= dom->pgtables_seg.vstart) && @@ -345,7 +345,7 @@ static int setup_pgtables_x86_64(struct xen_pfn_t pgpfn; for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) + addr += XC_PAGE_SIZE ) { if ( l3tab == NULL ) { @@ -383,7 +383,7 @@ static int setup_pgtables_x86_64(struct /* make L1 entry */ l1off = l1_table_offset_x86_64(addr); - pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86; + pgpfn = (addr - dom->parms.virt_base) >> XC_PAGE_SHIFT; l1tab[l1off] = pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT; if ( (addr >= dom->pgtables_seg.vstart) && @@ -438,7 +438,7 @@ static int start_info_x86_32(struct xc_d strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); start_info->magic[sizeof(start_info->magic) - 1] = '\0'; start_info->nr_pages = dom->total_pages; - start_info->shared_info = shinfo << PAGE_SHIFT_X86; + start_info->shared_info = shinfo << XC_PAGE_SHIFT; start_info->pt_base = dom->pgtables_seg.vstart; start_info->nr_pt_frames = dom->pgtables; start_info->mfn_list = dom->p2m_seg.vstart; @@ -478,7 +478,7 @@ static int start_info_x86_64(struct xc_d strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); start_info->magic[sizeof(start_info->magic) - 1] = '\0'; start_info->nr_pages = dom->total_pages; - start_info->shared_info = shinfo << PAGE_SHIFT_X86; + start_info->shared_info = shinfo << XC_PAGE_SHIFT; start_info->pt_base = dom->pgtables_seg.vstart; start_info->nr_pt_frames = dom->pgtables; start_info->mfn_list = dom->p2m_seg.vstart; @@ -550,9 +550,9 @@ static int vcpu_x86_32(struct xc_dom_ima ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_32; ctxt->user_regs.eip = dom->parms.virt_entry; ctxt->user_regs.esp = - dom->parms.virt_base + (dom->bootstack_pfn + 1) * PAGE_SIZE_X86; + dom->parms.virt_base + (dom->bootstack_pfn + 1) * XC_PAGE_SIZE; ctxt->user_regs.esi = - dom->parms.virt_base + (dom->start_info_pfn) * PAGE_SIZE_X86; + dom->parms.virt_base + (dom->start_info_pfn) * XC_PAGE_SIZE; ctxt->user_regs.eflags = 1 << 9; /* Interrupt Enable */ ctxt->kernel_ss = ctxt->user_regs.ss; @@ -589,9 +589,9 @@ static int vcpu_x86_64(struct xc_dom_ima ctxt->user_regs.cs = FLAT_KERNEL_CS_X86_64; ctxt->user_regs.rip = dom->parms.virt_entry; ctxt->user_regs.rsp = - dom->parms.virt_base + (dom->bootstack_pfn + 1) * PAGE_SIZE_X86; + dom->parms.virt_base + (dom->bootstack_pfn + 1) * XC_PAGE_SIZE; ctxt->user_regs.rsi = - dom->parms.virt_base + (dom->start_info_pfn) * PAGE_SIZE_X86; + dom->parms.virt_base + (dom->start_info_pfn) * XC_PAGE_SIZE; ctxt->user_regs.rflags = 1 << 9; /* Interrupt Enable */ ctxt->kernel_ss = ctxt->user_regs.ss; @@ -611,7 +611,7 @@ static int vcpu_x86_64(struct xc_dom_ima static struct xc_dom_arch xc_dom_32 = { .guest_type = "xen-3.0-x86_32", .native_protocol = XEN_IO_PROTO_ABI_X86_32, - .page_shift = PAGE_SHIFT_X86, + .page_shift = XC_PAGE_SHIFT, .sizeof_pfn = 4, .alloc_magic_pages = alloc_magic_pages, .count_pgtables = count_pgtables_x86_32, @@ -623,7 +623,7 @@ static struct xc_dom_arch xc_dom_32 = { static struct xc_dom_arch xc_dom_32_pae = { .guest_type = "xen-3.0-x86_32p", .native_protocol = XEN_IO_PROTO_ABI_X86_32, - .page_shift = PAGE_SHIFT_X86, + .page_shift = XC_PAGE_SHIFT, .sizeof_pfn = 4, .alloc_magic_pages = alloc_magic_pages, .count_pgtables = count_pgtables_x86_32_pae, @@ -636,7 +636,7 @@ static struct xc_dom_arch xc_dom_32_pae static struct xc_dom_arch xc_dom_64 = { .guest_type = "xen-3.0-x86_64", .native_protocol = XEN_IO_PROTO_ABI_X86_64, - .page_shift = PAGE_SHIFT_X86, + .page_shift = XC_PAGE_SHIFT, .sizeof_pfn = 8, .alloc_magic_pages = alloc_magic_pages, .count_pgtables = count_pgtables_x86_64, @@ -855,13 +855,13 @@ int arch_setup_bootlate(struct xc_dom_im DOMPRINTF("%s: shared_info: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "", __FUNCTION__, dom->shared_info_pfn, dom->shared_info_mfn); shared_info = xc_map_foreign_range(dom->xch, dom->guest_domid, - PAGE_SIZE_X86, + XC_PAGE_SIZE, PROT_READ | PROT_WRITE, shinfo); if ( shared_info == NULL ) return -1; dom->arch_hooks->shared_info(dom, shared_info); - munmap(shared_info, PAGE_SIZE_X86); + munmap(shared_info, XC_PAGE_SIZE); return 0; } diff -r c2a8bde9ad6e tools/libxc/xc_misc.c --- a/tools/libxc/xc_misc.c Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xc_misc.c Wed Nov 09 14:01:30 2011 +0100 @@ -177,28 +177,6 @@ int xc_sched_id(xc_interface *xch, return 0; } -#if defined(__i386__) || defined(__x86_64__) -int xc_mca_op(xc_interface *xch, struct xen_mc *mc) -{ - int ret = 0; - DECLARE_HYPERCALL; - DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); - - if ( xc_hypercall_bounce_pre(xch, mc) ) - { - PERROR("Could not bounce xen_mc memory buffer"); - return -1; - } - mc->interface_version = XEN_MCA_INTERFACE_VERSION; - - hypercall.op = __HYPERVISOR_mca; - hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(mc); - ret = do_xen_hypercall(xch, &hypercall); - xc_hypercall_bounce_post(xch, mc); - return ret; -} -#endif - int xc_perfc_reset(xc_interface *xch) { DECLARE_SYSCTL; diff -r c2a8bde9ad6e tools/libxc/xc_misc_x86.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xc_misc_x86.c Wed Nov 09 14:01:30 2011 +0100 @@ -0,0 +1,51 @@ +/****************************************************************************** + * xc_misc_x86.c + * + * Miscellaneous x86 specific control interface functions. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "xc_private.h" + +int xc_mca_op(xc_interface *xch, struct xen_mc *mc) +{ + int ret = 0; + DECLARE_HYPERCALL; + DECLARE_HYPERCALL_BOUNCE(mc, sizeof(*mc), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + + if ( xc_hypercall_bounce_pre(xch, mc) ) + { + PERROR("Could not bounce xen_mc memory buffer"); + return -1; + } + mc->interface_version = XEN_MCA_INTERFACE_VERSION; + + hypercall.op = __HYPERVISOR_mca; + hypercall.arg[0] = HYPERCALL_BUFFER_AS_ARG(mc); + ret = do_xen_hypercall(xch, &hypercall); + xc_hypercall_bounce_post(xch, mc); + return ret; +} + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff -r c2a8bde9ad6e tools/libxc/xc_offline_page.c --- a/tools/libxc/xc_offline_page.c Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xc_offline_page.c Wed Nov 09 14:01:30 2011 +0100 @@ -369,7 +369,7 @@ static int __clear_pte(xc_interface *xch /* XXX Check for PSE bit here */ /* Hit one entry */ - if ( ((pte >> PAGE_SHIFT_X86) & MFN_MASK_X86) == mfn) + if ( ((pte >> XC_PAGE_SHIFT) & MFN_MASK_X86) == mfn) { *new_pte = pte & ~_PAGE_PRESENT; if (!backup_ptes(table_mfn, table_offset, backup)) @@ -400,7 +400,7 @@ static int __update_pte(xc_interface *xc if (pte & _PAGE_PRESENT) ERROR("Page present while in backup ptes\n"); pte &= ~MFN_MASK_X86; - pte |= (new_mfn << PAGE_SHIFT_X86) | _PAGE_PRESENT; + pte |= (new_mfn << XC_PAGE_SHIFT) | _PAGE_PRESENT; *new_pte = pte; return 1; } diff -r c2a8bde9ad6e tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xenctrl.h Wed Nov 09 14:01:30 2011 +0100 @@ -49,52 +49,6 @@ #include "xentoollog.h" -#if defined(__i386__) || defined(__x86_64__) -#include -#include -#include -#endif - -#ifdef __ia64__ -#define XC_PAGE_SHIFT 14 -#else -#define XC_PAGE_SHIFT 12 -#endif -#define XC_PAGE_SIZE (1UL << XC_PAGE_SHIFT) -#define XC_PAGE_MASK (~(XC_PAGE_SIZE-1)) - -#define INVALID_MFN (~0UL) - -/* - * DEFINITIONS FOR CPU BARRIERS - */ - -#if defined(__i386__) -#define xen_mb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" ) -#define xen_rmb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" ) -#define xen_wmb() asm volatile ( "" : : : "memory") -#elif defined(__x86_64__) -#define xen_mb() asm volatile ( "mfence" : : : "memory") -#define xen_rmb() asm volatile ( "lfence" : : : "memory") -#define xen_wmb() asm volatile ( "" : : : "memory") -#elif defined(__ia64__) -#define xen_mb() asm volatile ("mf" ::: "memory") -#define xen_rmb() asm volatile ("mf" ::: "memory") -#define xen_wmb() asm volatile ("mf" ::: "memory") -#else -#error "Define barriers" -#endif - - -#define XENCTRL_HAS_XC_INTERFACE 1 -/* In Xen 4.0 and earlier, xc_interface_open and xc_evtchn_open would - * both return ints being the file descriptor. In 4.1 and later, they - * return an xc_interface* and xc_evtchn*, respectively - ie, a - * pointer to an opaque struct. This #define is provided in 4.1 and - * later, allowing out-of-tree callers to more easily distinguish - * between, and be compatible with, both versions. - */ - /* * GENERAL @@ -119,6 +73,43 @@ typedef struct xc_interface_core xc_gnts typedef enum xc_error_code xc_error_code; +#if defined(__i386__) || defined(__x86_64__) +#include "xenctrl_x86.h" +#endif + +#ifdef __ia64__ +#define XC_PAGE_SHIFT 14 +#endif +#define XC_PAGE_SIZE (1UL << XC_PAGE_SHIFT) +#define XC_PAGE_MASK (~(XC_PAGE_SIZE-1)) + +#define INVALID_MFN (~0UL) + +#define XENCTRL_HAS_XC_INTERFACE 1 +/* In Xen 4.0 and earlier, xc_interface_open and xc_evtchn_open would + * both return ints being the file descriptor. In 4.1 and later, they + * return an xc_interface* and xc_evtchn*, respectively - ie, a + * pointer to an opaque struct. This #define is provided in 4.1 and + * later, allowing out-of-tree callers to more easily distinguish + * between, and be compatible with, both versions. + */ + + +/* + * DEFINITIONS FOR CPU BARRIERS + */ + +#ifdef __ia64__ +#define xen_mb() asm volatile ("mf" ::: "memory") +#define xen_rmb() asm volatile ("mf" ::: "memory") +#define xen_wmb() asm volatile ("mf" ::: "memory") +#else +#ifndef xen_mb +#error "Define barriers" +#endif +#endif + + /* * INITIALIZATION FUNCTIONS */ @@ -364,33 +355,22 @@ typedef struct xc_dominfo { typedef xen_domctl_getdomaininfo_t xc_domaininfo_t; +#ifdef __ia64__ typedef union { -#if defined(__i386__) || defined(__x86_64__) - vcpu_guest_context_x86_64_t x64; - vcpu_guest_context_x86_32_t x32; -#endif vcpu_guest_context_t c; } vcpu_guest_context_any_t; typedef union { -#if defined(__i386__) || defined(__x86_64__) - shared_info_x86_64_t x64; - shared_info_x86_32_t x32; -#endif shared_info_t s; } shared_info_any_t; typedef union { -#if defined(__i386__) || defined(__x86_64__) - start_info_x86_64_t x64; - start_info_x86_32_t x32; -#endif start_info_t s; } start_info_any_t; - +#endif int xc_domain_create(xc_interface *xch, uint32_t ssidref, @@ -968,32 +948,6 @@ int xc_domain_set_memmap_limit(xc_interf uint32_t domid, unsigned long map_limitkb); -#if defined(__i386__) || defined(__x86_64__) -/* - * PC BIOS standard E820 types and structure. - */ -#define E820_RAM 1 -#define E820_RESERVED 2 -#define E820_ACPI 3 -#define E820_NVS 4 -#define E820_UNUSABLE 5 - -#define E820MAX (128) - -struct e820entry { - uint64_t addr; - uint64_t size; - uint32_t type; -} __attribute__((packed)); -int xc_domain_set_memory_map(xc_interface *xch, - uint32_t domid, - struct e820entry entries[], - uint32_t nr_entries); - -int xc_get_machine_memory_map(xc_interface *xch, - struct e820entry entries[], - uint32_t max_entries); -#endif int xc_domain_set_time_offset(xc_interface *xch, uint32_t domid, int32_t time_offset_seconds); @@ -1691,23 +1645,6 @@ int xc_domain_debug_control(xc_interface uint32_t sop, uint32_t vcpu); -#if defined(__i386__) || defined(__x86_64__) -int xc_cpuid_check(xc_interface *xch, - const unsigned int *input, - const char **config, - char **config_transformed); -int xc_cpuid_set(xc_interface *xch, - domid_t domid, - const unsigned int *input, - const char **config, - char **config_transformed); -int xc_cpuid_apply_policy(xc_interface *xch, - domid_t domid); -void xc_cpuid_to_str(const unsigned int *regs, - char **strs); -int xc_mca_op(xc_interface *xch, struct xen_mc *mc); -#endif - struct xc_px_val { uint64_t freq; /* Px core frequency */ uint64_t residency; /* Px residency time */ diff -r c2a8bde9ad6e tools/libxc/xenctrl_x86.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xenctrl_x86.h Wed Nov 09 14:01:30 2011 +0100 @@ -0,0 +1,111 @@ +/****************************************************************************** + * xenctrl.h + * + * A library for low-level access to the Xen x86 control interfaces. + * + * Copyright (c) 2003-2004, K A Fraser. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef XENCTRL_X86_H +#define XENCTRL_X86_H + +#include +#include +#include + +#define XC_PAGE_SHIFT 12 + +/* + * DEFINITIONS FOR CPU BARRIERS + */ + +#if defined(__i386__) +#define xen_mb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" ) +#define xen_rmb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" ) +#define xen_wmb() asm volatile ( "" : : : "memory") +#elif defined(__x86_64__) +#define xen_mb() asm volatile ( "mfence" : : : "memory") +#define xen_rmb() asm volatile ( "lfence" : : : "memory") +#define xen_wmb() asm volatile ( "" : : : "memory") +#endif + + +typedef union +{ + vcpu_guest_context_x86_64_t x64; + vcpu_guest_context_x86_32_t x32; + vcpu_guest_context_t c; +} vcpu_guest_context_any_t; + +typedef union +{ + shared_info_x86_64_t x64; + shared_info_x86_32_t x32; + shared_info_t s; +} shared_info_any_t; + +typedef union +{ + start_info_x86_64_t x64; + start_info_x86_32_t x32; + start_info_t s; +} start_info_any_t; + + +/* + * PC BIOS standard E820 types and structure. + */ +#define E820_RAM 1 +#define E820_RESERVED 2 +#define E820_ACPI 3 +#define E820_NVS 4 +#define E820_UNUSABLE 5 + +#define E820MAX (128) + +struct e820entry { + uint64_t addr; + uint64_t size; + uint32_t type; +} __attribute__((packed)); + +int xc_domain_set_memory_map(xc_interface *xch, + uint32_t domid, + struct e820entry entries[], + uint32_t nr_entries); + +int xc_get_machine_memory_map(xc_interface *xch, + struct e820entry entries[], + uint32_t max_entries); + + +int xc_cpuid_check(xc_interface *xch, + const unsigned int *input, + const char **config, + char **config_transformed); +int xc_cpuid_set(xc_interface *xch, + domid_t domid, + const unsigned int *input, + const char **config, + char **config_transformed); +int xc_cpuid_apply_policy(xc_interface *xch, + domid_t domid); +void xc_cpuid_to_str(const unsigned int *regs, + char **strs); +int xc_mca_op(xc_interface *xch, struct xen_mc *mc); + +#endif /* XENCTRL_X86_H */ diff -r c2a8bde9ad6e tools/libxc/xg_private.h --- a/tools/libxc/xg_private.h Wed Nov 02 14:54:36 2011 +0100 +++ b/tools/libxc/xg_private.h Wed Nov 09 14:01:30 2011 +0100 @@ -34,6 +34,10 @@ #include #include +#if defined(__i386__) || defined(__x86_64__) +#include "xg_x86_private.h" +#endif + #ifndef ELFSIZE #include #if UINT_MAX == ULONG_MAX @@ -52,112 +56,8 @@ char *xc_inflate_buffer(xc_interface *xc unsigned long csum_page (void * page); -#define _PAGE_PRESENT 0x001 -#define _PAGE_RW 0x002 -#define _PAGE_USER 0x004 -#define _PAGE_PWT 0x008 -#define _PAGE_PCD 0x010 -#define _PAGE_ACCESSED 0x020 -#define _PAGE_DIRTY 0x040 -#define _PAGE_PAT 0x080 -#define _PAGE_PSE 0x080 -#define _PAGE_GLOBAL 0x100 - -#define L1_PAGETABLE_SHIFT_I386 12 -#define L2_PAGETABLE_SHIFT_I386 22 -#define L1_PAGETABLE_ENTRIES_I386 1024 -#define L2_PAGETABLE_ENTRIES_I386 1024 - -#define L1_PAGETABLE_SHIFT_PAE 12 -#define L2_PAGETABLE_SHIFT_PAE 21 -#define L3_PAGETABLE_SHIFT_PAE 30 -#define L1_PAGETABLE_ENTRIES_PAE 512 -#define L2_PAGETABLE_ENTRIES_PAE 512 -#define L3_PAGETABLE_ENTRIES_PAE 4 - -#define L1_PAGETABLE_SHIFT_X86_64 12 -#define L2_PAGETABLE_SHIFT_X86_64 21 -#define L3_PAGETABLE_SHIFT_X86_64 30 -#define L4_PAGETABLE_SHIFT_X86_64 39 -#define L1_PAGETABLE_ENTRIES_X86_64 512 -#define L2_PAGETABLE_ENTRIES_X86_64 512 -#define L3_PAGETABLE_ENTRIES_X86_64 512 -#define L4_PAGETABLE_ENTRIES_X86_64 512 - -#if defined(__i386__) -#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_I386 -#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_I386 -#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_I386 -#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_I386 -#elif defined(__x86_64__) -#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_X86_64 -#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_X86_64 -#define L3_PAGETABLE_SHIFT L3_PAGETABLE_SHIFT_X86_64 -#define L4_PAGETABLE_SHIFT L4_PAGETABLE_SHIFT_X86_64 -#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_X86_64 -#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_X86_64 -#define L3_PAGETABLE_ENTRIES L3_PAGETABLE_ENTRIES_X86_64 -#define L4_PAGETABLE_ENTRIES L4_PAGETABLE_ENTRIES_X86_64 -#endif - -typedef uint32_t l1_pgentry_32_t; -typedef uint32_t l2_pgentry_32_t; -typedef uint64_t l1_pgentry_64_t; -typedef uint64_t l2_pgentry_64_t; -typedef uint64_t l3_pgentry_64_t; -typedef uint64_t l4_pgentry_64_t; - -#if defined(__i386__) -typedef l1_pgentry_32_t l1_pgentry_t; -typedef l2_pgentry_32_t l2_pgentry_t; -#elif defined(__x86_64__) -typedef l1_pgentry_64_t l1_pgentry_t; -typedef l2_pgentry_64_t l2_pgentry_t; -typedef l3_pgentry_64_t l3_pgentry_t; -typedef l4_pgentry_64_t l4_pgentry_t; -#endif - -#define l1_table_offset_i386(_a) \ - (((_a) >> L1_PAGETABLE_SHIFT_I386) & (L1_PAGETABLE_ENTRIES_I386 - 1)) -#define l2_table_offset_i386(_a) \ - (((_a) >> L2_PAGETABLE_SHIFT_I386) & (L2_PAGETABLE_ENTRIES_I386 - 1)) - -#define l1_table_offset_pae(_a) \ - (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1)) -#define l2_table_offset_pae(_a) \ - (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1)) -#define l3_table_offset_pae(_a) \ - (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1)) - -#define l1_table_offset_x86_64(_a) \ - (((_a) >> L1_PAGETABLE_SHIFT_X86_64) & (L1_PAGETABLE_ENTRIES_X86_64 - 1)) -#define l2_table_offset_x86_64(_a) \ - (((_a) >> L2_PAGETABLE_SHIFT_X86_64) & (L2_PAGETABLE_ENTRIES_X86_64 - 1)) -#define l3_table_offset_x86_64(_a) \ - (((_a) >> L3_PAGETABLE_SHIFT_X86_64) & (L3_PAGETABLE_ENTRIES_X86_64 - 1)) -#define l4_table_offset_x86_64(_a) \ - (((_a) >> L4_PAGETABLE_SHIFT_X86_64) & (L4_PAGETABLE_ENTRIES_X86_64 - 1)) - -#if defined(__i386__) -#define l1_table_offset(_a) l1_table_offset_i386(_a) -#define l2_table_offset(_a) l2_table_offset_i386(_a) -#elif defined(__x86_64__) -#define l1_table_offset(_a) l1_table_offset_x86_64(_a) -#define l2_table_offset(_a) l2_table_offset_x86_64(_a) -#define l3_table_offset(_a) l3_table_offset_x86_64(_a) -#define l4_table_offset(_a) l4_table_offset_x86_64(_a) -#endif - -#define PAGE_SHIFT_X86 12 -#define PAGE_SIZE_X86 (1UL << PAGE_SHIFT_X86) -#define PAGE_MASK_X86 (~(PAGE_SIZE_X86-1)) - -#define PAGE_SHIFT_IA64 14 -#define PAGE_SIZE_IA64 (1UL << PAGE_SHIFT_IA64) -#define PAGE_MASK_IA64 (~(PAGE_SIZE_IA64-1)) - #define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1)) -#define NRPAGES(x) (ROUNDUP(x, PAGE_SHIFT) >> PAGE_SHIFT) +#define NRPAGES(x) (ROUNDUP(x, XC_PAGE_SHIFT) >> XC_PAGE_SHIFT) /* XXX SMH: following skanky macros rely on variable p2m_size being set */ @@ -169,7 +69,7 @@ struct domain_info_context { }; /* Number of xen_pfn_t in a page */ -#define FPP (PAGE_SIZE/(dinfo->guest_width)) +#define FPP (XC_PAGE_SIZE/(dinfo->guest_width)) /* Number of entries in the pfn_to_mfn_frame_list_list */ #define P2M_FLL_ENTRIES (((dinfo->p2m_size)+(FPP*FPP)-1)/(FPP*FPP)) @@ -182,11 +82,6 @@ struct domain_info_context { #define P2M_TOOLS_FL_SIZE ((P2M_FL_ENTRIES) * \ MAX((sizeof (xen_pfn_t)), dinfo->guest_width)) -/* Masks for PTE<->PFN conversions */ -#define MADDR_BITS_X86 ((dinfo->guest_width == 8) ? 52 : 44) -#define MFN_MASK_X86 ((1ULL << (MADDR_BITS_X86 - PAGE_SHIFT_X86)) - 1) -#define MADDR_MASK_X86 (MFN_MASK_X86 << PAGE_SHIFT_X86) - #define PAEKERN_no 0 #define PAEKERN_yes 1 diff -r c2a8bde9ad6e tools/libxc/xg_x86_private.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xg_x86_private.h Wed Nov 09 14:01:30 2011 +0100 @@ -0,0 +1,121 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef XG_X86_PRIVATE_H +#define XG_X86_PRIVATE_H + +#define _PAGE_PRESENT 0x001 +#define _PAGE_RW 0x002 +#define _PAGE_USER 0x004 +#define _PAGE_PWT 0x008 +#define _PAGE_PCD 0x010 +#define _PAGE_ACCESSED 0x020 +#define _PAGE_DIRTY 0x040 +#define _PAGE_PAT 0x080 +#define _PAGE_PSE 0x080 +#define _PAGE_GLOBAL 0x100 + +#define L1_PAGETABLE_SHIFT_I386 12 +#define L2_PAGETABLE_SHIFT_I386 22 +#define L1_PAGETABLE_ENTRIES_I386 1024 +#define L2_PAGETABLE_ENTRIES_I386 1024 + +#define L1_PAGETABLE_SHIFT_PAE 12 +#define L2_PAGETABLE_SHIFT_PAE 21 +#define L3_PAGETABLE_SHIFT_PAE 30 +#define L1_PAGETABLE_ENTRIES_PAE 512 +#define L2_PAGETABLE_ENTRIES_PAE 512 +#define L3_PAGETABLE_ENTRIES_PAE 4 + +#define L1_PAGETABLE_SHIFT_X86_64 12 +#define L2_PAGETABLE_SHIFT_X86_64 21 +#define L3_PAGETABLE_SHIFT_X86_64 30 +#define L4_PAGETABLE_SHIFT_X86_64 39 +#define L1_PAGETABLE_ENTRIES_X86_64 512 +#define L2_PAGETABLE_ENTRIES_X86_64 512 +#define L3_PAGETABLE_ENTRIES_X86_64 512 +#define L4_PAGETABLE_ENTRIES_X86_64 512 + +#if defined(__i386__) +#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_I386 +#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_I386 +#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_I386 +#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_I386 +#elif defined(__x86_64__) +#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_X86_64 +#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_X86_64 +#define L3_PAGETABLE_SHIFT L3_PAGETABLE_SHIFT_X86_64 +#define L4_PAGETABLE_SHIFT L4_PAGETABLE_SHIFT_X86_64 +#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_X86_64 +#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_X86_64 +#define L3_PAGETABLE_ENTRIES L3_PAGETABLE_ENTRIES_X86_64 +#define L4_PAGETABLE_ENTRIES L4_PAGETABLE_ENTRIES_X86_64 +#endif + +typedef uint32_t l1_pgentry_32_t; +typedef uint32_t l2_pgentry_32_t; +typedef uint64_t l1_pgentry_64_t; +typedef uint64_t l2_pgentry_64_t; +typedef uint64_t l3_pgentry_64_t; +typedef uint64_t l4_pgentry_64_t; + +#if defined(__i386__) +typedef l1_pgentry_32_t l1_pgentry_t; +typedef l2_pgentry_32_t l2_pgentry_t; +#elif defined(__x86_64__) +typedef l1_pgentry_64_t l1_pgentry_t; +typedef l2_pgentry_64_t l2_pgentry_t; +typedef l3_pgentry_64_t l3_pgentry_t; +typedef l4_pgentry_64_t l4_pgentry_t; +#endif + +#define l1_table_offset_i386(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT_I386) & (L1_PAGETABLE_ENTRIES_I386 - 1)) +#define l2_table_offset_i386(_a) \ + (((_a) >> L2_PAGETABLE_SHIFT_I386) & (L2_PAGETABLE_ENTRIES_I386 - 1)) + +#define l1_table_offset_pae(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1)) +#define l2_table_offset_pae(_a) \ + (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1)) +#define l3_table_offset_pae(_a) \ + (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1)) + +#define l1_table_offset_x86_64(_a) \ + (((_a) >> L1_PAGETABLE_SHIFT_X86_64) & (L1_PAGETABLE_ENTRIES_X86_64 - 1)) +#define l2_table_offset_x86_64(_a) \ + (((_a) >> L2_PAGETABLE_SHIFT_X86_64) & (L2_PAGETABLE_ENTRIES_X86_64 - 1)) +#define l3_table_offset_x86_64(_a) \ + (((_a) >> L3_PAGETABLE_SHIFT_X86_64) & (L3_PAGETABLE_ENTRIES_X86_64 - 1)) +#define l4_table_offset_x86_64(_a) \ + (((_a) >> L4_PAGETABLE_SHIFT_X86_64) & (L4_PAGETABLE_ENTRIES_X86_64 - 1)) + +#if defined(__i386__) +#define l1_table_offset(_a) l1_table_offset_i386(_a) +#define l2_table_offset(_a) l2_table_offset_i386(_a) +#elif defined(__x86_64__) +#define l1_table_offset(_a) l1_table_offset_x86_64(_a) +#define l2_table_offset(_a) l2_table_offset_x86_64(_a) +#define l3_table_offset(_a) l3_table_offset_x86_64(_a) +#define l4_table_offset(_a) l4_table_offset_x86_64(_a) +#endif + +/* Masks for PTE<->PFN conversions */ +#define MADDR_BITS_X86 ((dinfo->guest_width == 8) ? 52 : 44) +#define MFN_MASK_X86 ((1ULL << (MADDR_BITS_X86 - XC_PAGE_SHIFT)) - 1) +#define MADDR_MASK_X86 (MFN_MASK_X86 << XC_PAGE_SHIFT) + +#endif /* XG_X86_PRIVATE_H */