[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] merge with xen-unstable.hg
# HG changeset patch # User awilliam@xxxxxxxxxxxx # Date 1174577454 21600 # Node ID be1017157768e8d6d5d5552cf0008d81d611b1bb # Parent 93e11f6d6791de15cfdcc5f0ddbf9a0660f325ed # Parent 6519867be0fe862ce97eeb66d43edfb7bab35aaa merge with xen-unstable.hg --- tools/libxc/powerpc64/utils.c | 188 ---------- tools/libxc/powerpc64/utils.h | 37 -- tools/libxc/powerpc64/xc_linux_build.c | 336 ------------------- tools/libxc/powerpc64/xc_prose_build.c | 215 ------------ linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c | 8 tools/libxc/Makefile | 9 tools/libxc/powerpc64/Makefile | 3 tools/libxc/powerpc64/mk_flatdevtree.c | 58 +-- tools/libxc/powerpc64/mk_flatdevtree.h | 14 tools/libxc/xc_core.h | 2 tools/libxc/xc_core_powerpc.c | 79 ++++ tools/libxc/xc_core_powerpc.h | 57 +++ tools/libxc/xc_dom.h | 6 tools/libxc/xc_dom_boot.c | 295 ---------------- tools/libxc/xc_dom_compat_linux.c | 11 tools/libxc/xc_dom_core.c | 6 tools/libxc/xc_dom_ia64.c | 57 +++ tools/libxc/xc_dom_powerpc.c | 236 +++++++++++++ tools/libxc/xc_dom_x86.c | 183 ++++++++++ tools/python/xen/lowlevel/xc/xc.c | 51 -- tools/python/xen/xend/XendAPI.py | 11 tools/python/xen/xend/XendDmesg.py | 3 tools/python/xen/xend/image.py | 30 - tools/python/xen/xm/main.py | 19 - xen/arch/powerpc/backtrace.c | 3 xen/arch/powerpc/mm.c | 10 xen/arch/powerpc/setup.c | 9 xen/arch/powerpc/smp-tbsync.c | 17 xen/arch/x86/mm/shadow/types.h | 2 29 files changed, 712 insertions(+), 1243 deletions(-) diff -r 93e11f6d6791 -r be1017157768 linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c Thu Mar 22 09:28:05 2007 -0600 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/head64-xen.c Thu Mar 22 09:30:54 2007 -0600 @@ -105,13 +105,11 @@ void __init x86_64_start_kernel(char * r int i; xen_start_info = (struct start_info *)real_mode_data; - if (!xen_feature(XENFEAT_auto_translated_physmap)) { + if (!xen_feature(XENFEAT_auto_translated_physmap)) phys_to_machine_mapping = (unsigned long *)xen_start_info->mfn_list; - start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + - xen_start_info->nr_pt_frames; - } - + start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + + xen_start_info->nr_pt_frames; machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START; machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES; diff -r 93e11f6d6791 -r be1017157768 tools/libxc/Makefile --- a/tools/libxc/Makefile Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/Makefile Thu Mar 22 09:30:54 2007 -0600 @@ -8,6 +8,7 @@ CTRL_SRCS-y += xc_core.c CTRL_SRCS-y += xc_core.c CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c CTRL_SRCS-$(CONFIG_IA64) += xc_core_ia64.c +CTRL_SRCS-$(CONFIG_POWERPC) += xc_core_powerpc.c CTRL_SRCS-y += xc_domain.c CTRL_SRCS-y += xc_evtchn.c CTRL_SRCS-y += xc_misc.c @@ -47,11 +48,11 @@ GUEST_SRCS-y += xc_dom_core.c xc_dom_boo GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c GUEST_SRCS-y += xc_dom_elfloader.c GUEST_SRCS-y += xc_dom_binloader.c -GUEST_SRCS-y += xc_dom_x86.c -GUEST_SRCS-y += xc_dom_ia64.c +GUEST_SRCS-y += xc_dom_compat_linux.c -GUEST_SRCS-$(CONFIG_X86) += xc_dom_compat_linux.c -GUEST_SRCS-$(CONFIG_IA64) += xc_dom_compat_linux.c +GUEST_SRCS-$(CONFIG_X86) += xc_dom_x86.c +GUEST_SRCS-$(CONFIG_IA64) += xc_dom_ia64.c +GUEST_SRCS-$(CONFIG_POWERPC) += xc_dom_powerpc.c -include $(XEN_TARGET_ARCH)/Makefile diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/Makefile --- a/tools/libxc/powerpc64/Makefile Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/powerpc64/Makefile Thu Mar 22 09:30:54 2007 -0600 @@ -1,7 +1,4 @@ GUEST_SRCS-y += powerpc64/flatdevtree.c GUEST_SRCS-y += powerpc64/flatdevtree.c GUEST_SRCS-y += powerpc64/mk_flatdevtree.c -GUEST_SRCS-y += powerpc64/xc_linux_build.c -GUEST_SRCS-y += powerpc64/xc_prose_build.c -GUEST_SRCS-y += powerpc64/utils.c CTRL_SRCS-y += powerpc64/xc_memory.c diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/mk_flatdevtree.c --- a/tools/libxc/powerpc64/mk_flatdevtree.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/powerpc64/mk_flatdevtree.c Thu Mar 22 09:30:54 2007 -0600 @@ -34,6 +34,7 @@ #include <sys/param.h> #include <xc_private.h> /* for PERROR() */ +#include <xc_dom.h> #include "mk_flatdevtree.h" @@ -310,24 +311,19 @@ void free_devtree(struct ft_cxt *root) } int make_devtree(struct ft_cxt *root, - uint32_t domid, - uint32_t mem_mb, - unsigned long rma_bytes, - unsigned long shadow_mb, - unsigned long initrd_base, - unsigned long initrd_len, - const char *bootargs, - uint64_t shared_info_paddr, - unsigned long console_evtchn, - uint64_t console_paddr, - unsigned long store_evtchn, - uint64_t store_paddr) + struct xc_dom_image *dom, + unsigned long shadow_mb) { struct boot_param_header *bph = NULL; uint64_t val[2]; uint32_t val32[2]; - unsigned long remaining; - unsigned long initrd_end = initrd_base + initrd_len; + uint64_t shared_info_paddr = dom->shared_info_pfn << PAGE_SHIFT; + uint64_t xenstore_paddr = dom->xenstore_pfn << PAGE_SHIFT; + uint64_t console_paddr = dom->console_pfn << PAGE_SHIFT; + long remaining; + unsigned long ramdisk_start; + unsigned long ramdisk_size; + unsigned long rma_bytes = 1 << dom->realmodearea_log; int64_t shadow_mb_log; uint64_t pft_size; char cpupath[MAX_PATH]; @@ -370,16 +366,18 @@ int make_devtree(struct ft_cxt *root, } /* reserve xen store page for domU */ - if (store_paddr) { - val[0] = cpu_to_be64((u64) store_paddr); + if (xenstore_paddr) { + val[0] = cpu_to_be64((u64) xenstore_paddr); val[1] = cpu_to_be64((u64) PAGE_SIZE); ft_add_rsvmap(root, val[0], val[1]); } /* reserve space for initrd if needed */ - if ( initrd_len > 0 ) { - val[0] = cpu_to_be64((u64) initrd_base); - val[1] = cpu_to_be64((u64) initrd_len); + ramdisk_start = dom->ramdisk_seg.pfn << PAGE_SHIFT; + ramdisk_size = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart; + if (ramdisk_size > 0) { + val[0] = cpu_to_be64((u64) ramdisk_start); + val[1] = cpu_to_be64((u64) ramdisk_size); ft_add_rsvmap(root, val[0], val[1]); } @@ -422,13 +420,13 @@ int make_devtree(struct ft_cxt *root, ft_prop_int(root, "interrupt-controller", xen_phandle); /* chosen.addprop('bootargs', imghandler.cmdline + '\0') */ - if ( bootargs != NULL ) - ft_prop_str(root, "bootargs", bootargs); + if (dom->cmdline != NULL) + ft_prop_str(root, "bootargs", dom->cmdline); /* mark where the initrd is, if present */ - if ( initrd_len > 0 ) { - val[0] = cpu_to_be64((u64) initrd_base); - val[1] = cpu_to_be64((u64) initrd_end); + if (ramdisk_size > 0) { + val[0] = cpu_to_be64((u64) ramdisk_start); + val[1] = cpu_to_be64((u64) ramdisk_start + ramdisk_size); ft_prop(root, "linux,initrd-start", &(val[0]), sizeof(val[0])); ft_prop(root, "linux,initrd-end", &(val[1]), sizeof(val[1])); } @@ -443,7 +441,7 @@ int make_devtree(struct ft_cxt *root, ft_prop_str(root, "compatible", "Xen-3.0-unstable"); /* xen.addprop('reg', long(imghandler.vm.domid), long(0)) */ - val[0] = cpu_to_be64((u64) domid); + val[0] = cpu_to_be64((u64) dom->guest_domid); val[1] = cpu_to_be64((u64) 0); ft_prop(root, "reg", val, sizeof(val)); @@ -469,7 +467,7 @@ int make_devtree(struct ft_cxt *root, ft_prop(root, "reg", val, sizeof(val)); /* xencons.addprop('interrupts', console_evtchn, 0) */ - val32[0] = cpu_to_be32((u32) console_evtchn); + val32[0] = cpu_to_be32((u32) dom->console_evtchn); val32[1] = cpu_to_be32((u32) 0); ft_prop(root, "interrupts", val32, sizeof(val32)); @@ -477,17 +475,17 @@ int make_devtree(struct ft_cxt *root, ft_end_node(root); } - if (store_paddr != 0) { + if (xenstore_paddr != 0) { /* start store node */ ft_begin_node(root, "store"); /* store paddr */ - val[0] = cpu_to_be64((u64) store_paddr); + val[0] = cpu_to_be64((u64) xenstore_paddr); val[1] = cpu_to_be64((u64) PAGE_SIZE); ft_prop(root, "reg", val, sizeof(val)); /* store event channel */ - val32[0] = cpu_to_be32((u32) store_evtchn); + val32[0] = cpu_to_be32((u32) dom->xenstore_evtchn); val32[1] = cpu_to_be32((u32) 0); ft_prop(root, "interrupts", val32, sizeof(val32)); @@ -516,7 +514,7 @@ int make_devtree(struct ft_cxt *root, ft_end_node(root); /* calculate remaining bytes from total - rma size */ - remaining = (mem_mb * 1024 * 1024) - rma_bytes; + remaining = (dom->total_pages << PAGE_SHIFT) - rma_bytes; /* memory@<rma_bytes> is all remaining memory after RMA */ if (remaining > 0) diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/mk_flatdevtree.h --- a/tools/libxc/powerpc64/mk_flatdevtree.h Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/powerpc64/mk_flatdevtree.h Thu Mar 22 09:30:54 2007 -0600 @@ -26,18 +26,8 @@ extern void free_devtree(struct ft_cxt *root); extern int make_devtree(struct ft_cxt *root, - uint32_t domid, - uint32_t mem_mb, - unsigned long rma_bytes, - unsigned long shadow_mb, - unsigned long initrd_base, - unsigned long initrd_len, - const char *bootargs, - uint64_t shared_info_paddr, - unsigned long console_evtchn, - uint64_t console_paddr, - unsigned long store_evtchn, - uint64_t store_paddr); + struct xc_dom_image *dom, + unsigned long shadow_mb); #define MAX_PATH 200 #define BUFSIZE 1024 diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/utils.c --- a/tools/libxc/powerpc64/utils.c Thu Mar 22 09:28:05 2007 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright IBM Corporation 2006, 2007 - * - * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> - * Jimi Xenidis <jimix@xxxxxxxxxxxxxx> - */ -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <inttypes.h> - -#include <xen/xen.h> -#include <xen/memory.h> -#include <xc_private.h> -#include <xg_private.h> -#include <xenctrl.h> - -#include "flatdevtree_env.h" -#include "flatdevtree.h" -#include "utils.h" - -int get_rma_page_array(int xc_handle, int domid, xen_pfn_t **page_array, - unsigned long nr_pages) -{ - int rc; - int i; - xen_pfn_t *p; - - *page_array = malloc(nr_pages * sizeof(xen_pfn_t)); - if (*page_array == NULL) { - perror("malloc"); - return -1; - } - - DPRINTF("xc_get_pfn_list\n"); - /* We know that the RMA is machine contiguous so lets just get the - * first MFN and fill the rest in ourselves */ - rc = xc_get_pfn_list(xc_handle, domid, (uint64_t *)*page_array, 1); - if (rc == -1) { - perror("Could not get the page frame list"); - return -1; - } - p = *page_array; - for (i = 1; i < nr_pages; i++) - p[i] = p[i - 1] + 1; - return 0; -} - -int install_image( - int xc_handle, - int domid, - xen_pfn_t *page_array, - void *image, - unsigned long paddr, - unsigned long size) -{ - uint8_t *img = image; - int i; - int rc = 0; - - if (paddr & ~PAGE_MASK) { - printf("*** unaligned address\n"); - return -1; - } - - for (i = 0; i < size; i += PAGE_SIZE) { - void *page = img + i; - xen_pfn_t pfn = (paddr + i) >> PAGE_SHIFT; - xen_pfn_t mfn = page_array[pfn]; - - rc = xc_copy_to_domain_page(xc_handle, domid, mfn, page); - if (rc < 0) { - perror("xc_copy_to_domain_page"); - break; - } - } - return rc; -} - -void *load_file(const char *path, unsigned long *filesize) -{ - void *img; - ssize_t size; - int fd; - - DPRINTF("load_file(%s)\n", path); - - fd = open(path, O_RDONLY); - if (fd < 0) { - perror(path); - return NULL; - } - - size = lseek(fd, 0, SEEK_END); - if (size < 0) { - perror(path); - close(fd); - return NULL; - } - lseek(fd, 0, SEEK_SET); - - img = malloc(size); - if (img == NULL) { - perror(path); - close(fd); - return NULL; - } - - size = read(fd, img, size); - if (size <= 0) { - perror(path); - close(fd); - free(img); - return NULL; - } - - if (filesize) - *filesize = size; - close(fd); - return img; -} - -int load_elf_kernel( - int xc_handle, - int domid, - const char *kernel_path, - struct domain_setup_info *dsi, - xen_pfn_t *page_array) -{ - struct load_funcs load_funcs; - char *kernel_img; - unsigned long kernel_size; - int rc; - - /* load the kernel ELF file */ - kernel_img = load_file(kernel_path, &kernel_size); - if (kernel_img == NULL) { - rc = -1; - goto out; - } - - DPRINTF("probe_elf\n"); - rc = probe_elf(kernel_img, kernel_size, &load_funcs); - if (rc < 0) { - rc = -1; - printf("%s is not an ELF file\n", kernel_path); - goto out; - } - - DPRINTF("parseimage\n"); - rc = (load_funcs.parseimage)(kernel_img, kernel_size, dsi); - if (rc < 0) { - rc = -1; - goto out; - } - - DPRINTF("loadimage\n"); - (load_funcs.loadimage)(kernel_img, kernel_size, xc_handle, domid, - page_array, dsi); - - DPRINTF(" v_start %016"PRIx64"\n", dsi->v_start); - DPRINTF(" v_end %016"PRIx64"\n", dsi->v_end); - DPRINTF(" v_kernstart %016"PRIx64"\n", dsi->v_kernstart); - DPRINTF(" v_kernend %016"PRIx64"\n", dsi->v_kernend); - DPRINTF(" v_kernentry %016"PRIx64"\n", dsi->v_kernentry); - -out: - free(kernel_img); - return rc; -} diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/utils.h --- a/tools/libxc/powerpc64/utils.h Thu Mar 22 09:28:05 2007 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright IBM Corporation 2006, 2007 - * - * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> - * Jimi Xenidis <jimix@xxxxxxxxxxxxxx> - */ - -extern int get_rma_page_array(int xc_handle, int domid, xen_pfn_t **page_array, - unsigned long nr_pages); -extern int install_image(int xc_handle, int domid, xen_pfn_t *page_array, - void *image, unsigned long paddr, unsigned long size); -extern void *load_file(const char *path, unsigned long *filesize); -extern int load_elf_kernel(int xc_handle, int domid, const char *kernel_path, - struct domain_setup_info *dsi, - xen_pfn_t *page_array); - -#define ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1))) - -#define max(x,y) ({ \ - const typeof(x) _x = (x); \ - const typeof(y) _y = (y); \ - (void) (&_x == &_y); \ - _x > _y ? _x : _y; }) diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/xc_linux_build.c --- a/tools/libxc/powerpc64/xc_linux_build.c Thu Mar 22 09:28:05 2007 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,336 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright IBM Corporation 2006, 2007 - * - * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> - * Ryan Harper <ryanh@xxxxxxxxxx> - */ - -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <inttypes.h> - -#include <xen/xen.h> -#include <xen/memory.h> -#include <xc_private.h> -#include <xg_private.h> -#include <xenctrl.h> - -#include "flatdevtree_env.h" -#include "flatdevtree.h" -#include "utils.h" -#include "mk_flatdevtree.h" - -/* Use 16MB extents to match PowerPC's large page size. */ -#define EXTENT_SHIFT 24 -#define EXTENT_ORDER (EXTENT_SHIFT - PAGE_SHIFT) - -#define INITRD_ADDR (24UL << 20) -#define DEVTREE_ADDR (16UL << 20) - -static int init_boot_vcpu( - int xc_handle, - int domid, - struct domain_setup_info *dsi, - unsigned long devtree_addr, - unsigned long kern_addr) -{ - vcpu_guest_context_t ctxt; - int rc; - - memset(&ctxt.user_regs, 0x55, sizeof(ctxt.user_regs)); - ctxt.user_regs.pc = dsi->v_kernentry; - ctxt.user_regs.msr = 0; - ctxt.user_regs.gprs[1] = 0; /* Linux uses its own stack */ - ctxt.user_regs.gprs[3] = devtree_addr; - ctxt.user_regs.gprs[4] = kern_addr; - ctxt.user_regs.gprs[5] = 0; - /* There is a buggy kernel that does not zero the "local_paca", so - * we must make sure this register is 0 */ - ctxt.user_regs.gprs[13] = 0; - - DPRINTF("xc_vcpu_setvcpucontext:\n" - " pc 0x%016"PRIx64", msr 0x%016"PRIx64"\n" - " r1-5 %016"PRIx64" %016"PRIx64" %016"PRIx64" %016"PRIx64 - " %016"PRIx64"\n", - ctxt.user_regs.pc, ctxt.user_regs.msr, - ctxt.user_regs.gprs[1], - ctxt.user_regs.gprs[2], - ctxt.user_regs.gprs[3], - ctxt.user_regs.gprs[4], - ctxt.user_regs.gprs[5]); - rc = xc_vcpu_setcontext(xc_handle, domid, 0, &ctxt); - if (rc < 0) - perror("setdomaininfo"); - - return rc; -} - -static int load_initrd( - int xc_handle, - int domid, - xen_pfn_t *page_array, - const char *initrd_path, - unsigned long *base, - unsigned long *len) -{ - uint8_t *initrd_img; - int rc = -1; - - /* load the initrd file */ - initrd_img = load_file(initrd_path, len); - if (initrd_img == NULL) - return -1; - - DPRINTF("copying initrd to 0x%lx[0x%lx]\n", INITRD_ADDR, *len); - if (install_image(xc_handle, domid, page_array, initrd_img, INITRD_ADDR, - *len)) - goto out; - - *base = INITRD_ADDR; - rc = 0; - -out: - free(initrd_img); - return rc; -} - -static void free_page_array(xen_pfn_t *page_array) -{ - free(page_array); -} - -static int check_memory_config(int rma_log, unsigned int mem_mb) -{ - u64 mem_kb = (mem_mb << 10); - u64 rma_kb = (1 << rma_log) >> 10; - - switch(rma_log) - { - case 26: - case 27: - case 28: - case 30: - case 34: - case 38: - if (mem_kb < rma_kb) { - DPRINTF("Domain memory must be at least %dMB\n", - (1 << rma_log)>>20); - break; - } - - if (mem_kb % (16 << 10)) { - DPRINTF("Domain memory %dMB must be a multiple of 16MB\n", - mem_mb); - - break; - } - - /* rma_log and mem_mb OK */ - return 0; - - default: - DPRINTF("Invalid rma_log (%d)\n", rma_log); - } - - return 1; -} - -static int alloc_memory(int xc_handle, domid_t domid, ulong nr_pages, - ulong rma_pages) -{ - xen_pfn_t *extent_pfn_arry; - ulong nr_extents; - ulong start_pfn = rma_pages; - int i; - int j; - int rc = 0; - - nr_extents = (nr_pages - rma_pages) >> EXTENT_ORDER; - DPRINTF("allocating memory in %lu chunks of %luMB\n", nr_extents, - 1UL >> (20 - EXTENT_ORDER)); - - /* populate_physmap requires an array of PFNs that determine where the - * guest mapping of the new MFNs. */ - extent_pfn_arry = malloc((1<<EXTENT_ORDER) * sizeof(xen_pfn_t)); - if (extent_pfn_arry == NULL) { - PERROR("Couldn't allocate extent PFN array.\n"); - return -ENOMEM; - } - - /* Now allocate the remaining memory as large-order extents. */ - for (i = 0; i < nr_extents; i++) { - /* Initialize the extent PFN array. */ - for (j = 0; j < (1 << EXTENT_ORDER); j++) - extent_pfn_arry[j] = start_pfn++; - - DPRINTF("populate_physmap(Dom%u, order %u, starting_pfn %llx)\n", - domid, EXTENT_ORDER, extent_pfn_arry[0]); - - if (xc_domain_memory_populate_physmap(xc_handle, domid, 1, EXTENT_ORDER, - 0, extent_pfn_arry)) - { - PERROR("Could not allocate extents\n"); - rc = -1; - break; - } - } - - free(extent_pfn_arry); - return rc; -} - -int xc_linux_build(int xc_handle, - uint32_t domid, - unsigned int mem_mb, - const char *image_name, - const char *initrd_name, - const char *cmdline, - const char *features, - unsigned long flags, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - struct domain_setup_info dsi; - xen_pfn_t *page_array = NULL; - unsigned long nr_pages; - unsigned long devtree_addr = 0; - unsigned long kern_addr; - unsigned long initrd_base = 0; - unsigned long initrd_len = 0; - unsigned long rma_pages; - unsigned long shadow_mb; - u64 shared_info_paddr; - u64 store_paddr; - u64 console_paddr; - int rma_log = 26; /* 64MB RMA */ - int rc = 0; - int op; - struct ft_cxt devtree; - - DPRINTF("%s\n", __func__); - - nr_pages = mem_mb << (20 - PAGE_SHIFT); - DPRINTF("nr_pages 0x%lx\n", nr_pages); - - rma_pages = (1 << rma_log) >> PAGE_SHIFT; - if (rma_pages == 0) { - rc = -1; - goto out; - } - - /* validate rma_log and domain memory config */ - if (check_memory_config(rma_log, mem_mb)) { - rc = -1; - goto out; - } - - /* Allocate the RMA. */ - DPRINTF("RMA: 0x%lx pages\n", rma_pages); - if (xc_alloc_real_mode_area(xc_handle, domid, rma_log)) { - rc = -1; - goto out; - } - - /* Get the MFN mapping (for RMA only -- we only load data into the RMA). */ - if (get_rma_page_array(xc_handle, domid, &page_array, rma_pages)) { - rc = -1; - goto out; - } - - /* Allocate the non-RMA memory. */ - rc = alloc_memory(xc_handle, domid, nr_pages, rma_pages); - if (rc) { - goto out; - } - - /* Load kernel. */ - DPRINTF("loading image '%s'\n", image_name); - if (load_elf_kernel(xc_handle, domid, image_name, &dsi, page_array)) { - rc = -1; - goto out; - } - kern_addr = 0; - - /* Load initrd. */ - if (initrd_name && initrd_name[0] != '\0') { - DPRINTF("loading initrd '%s'\n", initrd_name); - if (load_initrd(xc_handle, domid, page_array, initrd_name, - &initrd_base, &initrd_len)) { - rc = -1; - goto out; - } - } - - /* fetch the current shadow_memory value for this domain */ - op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION; - if (xc_shadow_control(xc_handle, domid, op, NULL, 0, - &shadow_mb, 0, NULL) < 0) { - rc = -1; - goto out; - } - - /* determine shared_info, console, and store paddr */ - shared_info_paddr = (rma_pages << PAGE_SHIFT) - PAGE_SIZE; - console_paddr = shared_info_paddr - PAGE_SIZE; - store_paddr = console_paddr - PAGE_SIZE; - - /* map paddrs to mfns */ - *store_mfn = page_array[(xen_pfn_t)(store_paddr >> PAGE_SHIFT)]; - *console_mfn = page_array[(xen_pfn_t)(console_paddr >> PAGE_SHIFT)]; - DPRINTF("console_mfn->%08lx store_mfn->%08lx\n", *console_mfn, - *store_mfn); - - /* build the devtree here */ - DPRINTF("constructing devtree\n"); - if (make_devtree(&devtree, domid, mem_mb, (rma_pages << PAGE_SHIFT), - shadow_mb, initrd_base, initrd_len, cmdline, - shared_info_paddr, console_evtchn, console_paddr, - store_evtchn, store_paddr) < 0) { - DPRINTF("failed to create flattened device tree\n"); - rc = -1; - goto out; - } - - devtree_addr = DEVTREE_ADDR; - DPRINTF("loading flattened device tree to 0x%lx[0x%x]\n", - devtree_addr, devtree.bph->totalsize); - - if (install_image(xc_handle, domid, page_array, (void *)devtree.bph, - devtree_addr, devtree.bph->totalsize)) { - DPRINTF("couldn't load flattened device tree.\n"); - rc = -1; - goto out2; - } - - if (init_boot_vcpu(xc_handle, domid, &dsi, devtree_addr, kern_addr)) { - rc = -1; - goto out2; - } - -out2: - free_devtree(&devtree); -out: - free_page_array(page_array); - return rc; -} diff -r 93e11f6d6791 -r be1017157768 tools/libxc/powerpc64/xc_prose_build.c --- a/tools/libxc/powerpc64/xc_prose_build.c Thu Mar 22 09:28:05 2007 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Copyright IBM Corporation 2006, 2007 - * - * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx> - * Jonathan Appavoo <jappavoo@xxxxxxxxxx> - */ - -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <inttypes.h> - -#include <xen/xen.h> -#include <xen/memory.h> -#include <xc_private.h> -#include <xg_private.h> -#include <xenctrl.h> - -#include "utils.h" - -#define INITRD_ADDR (24UL << 20) - -static int init_boot_vcpu( - int xc_handle, - int domid, - struct domain_setup_info *dsi, - unsigned long kern_addr) -{ - vcpu_guest_context_t ctxt; - int rc; - - memset(&ctxt.user_regs, 0x55, sizeof(ctxt.user_regs)); - ctxt.user_regs.pc = dsi->v_kernentry; - ctxt.user_regs.msr = 0; - ctxt.user_regs.gprs[1] = 0; /* Linux uses its own stack */ - ctxt.user_regs.gprs[3] = 0; - ctxt.user_regs.gprs[4] = kern_addr; - ctxt.user_regs.gprs[5] = 0; /* reserved for specifying OF handler */ - /* There is a buggy kernel that does not zero the "local_paca", so - * we must make sure this register is 0 */ - ctxt.user_regs.gprs[13] = 0; - - DPRINTF("xc_vcpu_setvcpucontext:\n" - " pc 0x%016"PRIx64", msr 0x%016"PRIx64"\n" - " r1-5 %016"PRIx64" %016"PRIx64" %016"PRIx64" %016"PRIx64 - " %016"PRIx64"\n", - ctxt.user_regs.pc, ctxt.user_regs.msr, - ctxt.user_regs.gprs[1], - ctxt.user_regs.gprs[2], - ctxt.user_regs.gprs[3], - ctxt.user_regs.gprs[4], - ctxt.user_regs.gprs[5]); - rc = xc_vcpu_setcontext(xc_handle, domid, 0, &ctxt); - if (rc < 0) - perror("setdomaininfo"); - - return rc; -} - -static int load_initrd( - int xc_handle, - int domid, - xen_pfn_t *page_array, - const char *initrd_path, - unsigned long *base, - unsigned long *len) -{ - uint8_t *initrd_img; - int rc = -1; - - /* load the initrd file */ - initrd_img = load_file(initrd_path, len); - if (initrd_img == NULL) - return -1; - - DPRINTF("copying initrd to 0x%lx[0x%lx]\n", INITRD_ADDR, *len); - if (install_image(xc_handle, domid, page_array, initrd_img, INITRD_ADDR, - *len)) - goto out; - - *base = INITRD_ADDR; - rc = 0; - -out: - free(initrd_img); - return rc; -} - -static unsigned long create_start_info( - start_info_t *start_info, - unsigned int console_evtchn, unsigned int store_evtchn, - unsigned long nr_pages, unsigned long rma_pages, const char *cmdline) -{ - unsigned long start_info_addr; - uint64_t rma_top; - - memset(start_info, 0, sizeof(*start_info)); - snprintf(start_info->magic, sizeof(start_info->magic), - "xen-%d.%d-powerpc64HV", 3, 0); - - rma_top = rma_pages << PAGE_SHIFT; - DPRINTF("RMA top = 0x%"PRIX64"\n", rma_top); - - start_info->nr_pages = nr_pages; - start_info->shared_info = rma_top - PAGE_SIZE; - start_info->store_mfn = (rma_top >> PAGE_SHIFT) - 2; - start_info->store_evtchn = store_evtchn; - start_info->console.domU.mfn = (rma_top >> PAGE_SHIFT) - 3; - start_info->console.domU.evtchn = console_evtchn; - strncpy((char *)start_info->cmd_line, cmdline, MAX_GUEST_CMDLINE); - /* just in case we truncated cmdline with strncpy add 0 at the end */ - start_info->cmd_line[MAX_GUEST_CMDLINE-1]=0; - start_info_addr = rma_top - 4*PAGE_SIZE; - - return start_info_addr; -} - -static void free_page_array(xen_pfn_t *page_array) -{ - free(page_array); -} - -int xc_prose_build(int xc_handle, - uint32_t domid, - unsigned int mem_mb, - const char *image_name, - const char *initrd_name, - const char *cmdline, - const char *features, - unsigned long flags, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - start_info_t start_info; - struct domain_setup_info dsi; - xen_pfn_t *page_array = NULL; - unsigned long nr_pages; - unsigned long kern_addr; - unsigned long initrd_base = 0; - unsigned long initrd_len = 0; - unsigned long start_info_addr; - unsigned long rma_pages; - int rc = 0; - - DPRINTF("%s\n", __func__); - - DPRINTF("cmdline=%s\n", cmdline); - - nr_pages = mem_mb << (20 - PAGE_SHIFT); - DPRINTF("nr_pages 0x%lx\n", nr_pages); - - rma_pages = (1 << 26) >> PAGE_SHIFT; /* 64 MB */ - - if (get_rma_page_array(xc_handle, domid, &page_array, rma_pages)) { - rc = -1; - goto out; - } - - DPRINTF("loading image '%s'\n", image_name); - if (load_elf_kernel(xc_handle, domid, image_name, &dsi, page_array)) { - rc = -1; - goto out; - } - kern_addr = 0; - - if (initrd_name && initrd_name[0] != '\0') { - DPRINTF("loading initrd '%s'\n", initrd_name); - if (load_initrd(xc_handle, domid, page_array, initrd_name, - &initrd_base, &initrd_len)) { - rc = -1; - goto out; - } - } - - /* start_info stuff: about to be removed */ - start_info_addr = create_start_info(&start_info, console_evtchn, - store_evtchn, nr_pages, - rma_pages, cmdline); - *console_mfn = page_array[start_info.console.domU.mfn]; - *store_mfn = page_array[start_info.store_mfn]; - if (install_image(xc_handle, domid, page_array, &start_info, - start_info_addr, sizeof(start_info_t))) { - rc = -1; - goto out; - } - - if (init_boot_vcpu(xc_handle, domid, &dsi, kern_addr)) { - rc = -1; - goto out; - } - -out: - free_page_array(page_array); - return rc; -} diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_core.h --- a/tools/libxc/xc_core.h Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_core.h Thu Mar 22 09:30:54 2007 -0600 @@ -144,6 +144,8 @@ int xc_core_arch_map_p2m(int xc_handle, # include "xc_core_x86.h" #elif defined (__ia64__) # include "xc_core_ia64.h" +#elif defined (__powerpc__) +# include "xc_core_powerpc.h" #else # error "unsupported architecture" #endif diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_core_powerpc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xc_core_powerpc.c Thu Mar 22 09:30:54 2007 -0600 @@ -0,0 +1,79 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * Copyright IBM Corp. 2007 + * + * Authors: Isaku Yamahata <yamahata at valinux co jp> + * Hollis Blanchard <hollisb@xxxxxxxxxx> + * + */ + +#include "xg_private.h" +#include "xc_core.h" + +int +xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info) +{ + /* All PowerPC domU are autotranslated. */ + return 1; +} + +int +xc_core_arch_map_p2m(int xc_handle, xc_dominfo_t *info, + shared_info_t *live_shinfo, xen_pfn_t **live_p2m, + unsigned long *pfnp) +{ + /* All PowerPC domU are autotranslated. */ + errno = ENOSYS; + return -1; +} + +int +xc_core_arch_memory_map_get(int xc_handle, xc_dominfo_t *info, + shared_info_t *live_shinfo, + xc_core_memory_map_t **mapp, + unsigned int *nr_entries) +{ + xc_core_memory_map_t *map = NULL; + + map = malloc(sizeof(*map)); + if (!map) { + PERROR("Could not allocate memory"); + goto out; + } + + map->addr = 0; + map->size = info->max_memkb * 1024; + + *mapp = map; + *nr_entries = 1; + return 0; + +out: + free(map); + return -1; +} + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_core_powerpc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xc_core_powerpc.h Thu Mar 22 09:30:54 2007 -0600 @@ -0,0 +1,57 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp> + * VA Linux Systems Japan K.K. + * + */ + +#ifndef XC_CORE_POWERPC_H +#define XC_CORE_POWERPC_H + +#define ELF_ARCH_DATA ELFDATA2MSB +#define ELF_ARCH_MACHINE EM_PPC64 + +struct xc_core_arch_context { + /* nothing */ +}; + +#define xc_core_arch_context_init(arch_ctxt) do {} while (0) +#define xc_core_arch_context_free(arch_ctxt) do {} while (0) +#define xc_core_arch_context_get(arch_ctxt, ctxt, xc_handle, domid) \ + (0) +#define xc_core_arch_context_dump(arch_ctxt, args, dump_rtn) (0) + +static inline int +xc_core_arch_context_get_shdr(struct xc_core_arch_context *arch_ctxt, + struct xc_core_section_headers *sheaders, + struct xc_core_strtab *strtab, + uint64_t *filesz, uint64_t offset) +{ + *filesz = 0; + return 0; +} + +#endif /* XC_CORE_POWERPC_H */ + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom.h --- a/tools/libxc/xc_dom.h Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom.h Thu Mar 22 09:30:54 2007 -0600 @@ -49,6 +49,7 @@ struct xc_dom_image { struct xc_dom_seg ramdisk_seg; struct xc_dom_seg p2m_seg; struct xc_dom_seg pgtables_seg; + struct xc_dom_seg devicetree_seg; xen_pfn_t start_info_pfn; xen_pfn_t console_pfn; xen_pfn_t xenstore_pfn; @@ -75,6 +76,7 @@ struct xc_dom_image { /* physical memory */ xen_pfn_t total_pages; struct xc_dom_phys *phys_pages; + int realmodearea_log; /* malloc memory pool */ struct xc_dom_mem *memblocks; @@ -253,6 +255,10 @@ static inline xen_pfn_t xc_dom_p2m_guest /* --- arch bits --------------------------------------------------- */ +int arch_setup_meminit(struct xc_dom_image *dom); +int arch_setup_bootearly(struct xc_dom_image *dom); +int arch_setup_bootlate(struct xc_dom_image *dom); + /* * Local variables: * mode: C diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_boot.c --- a/tools/libxc/xc_dom_boot.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom_boot.c Thu Mar 22 09:30:54 2007 -0600 @@ -83,293 +83,6 @@ static int clear_page(struct xc_dom_imag return rc; } -/* ------------------------------------------------------------------------ */ -/* arch stuff: x86 bits */ - -#if defined(__i386__) || defined(__x86_64__) - - -static int x86_compat(int xc, domid_t domid, char *guest_type) -{ - static const struct { - char *guest; - uint32_t size; - } types[] = { - { "xen-3.0-x86_32p", 32 }, - { "xen-3.0-x86_64", 64 }, - }; - DECLARE_DOMCTL; - int i,rc; - - memset(&domctl, 0, sizeof(domctl)); - domctl.domain = domid; - domctl.cmd = XEN_DOMCTL_set_address_size; - for ( i = 0; i < sizeof(types)/sizeof(types[0]); i++ ) - if ( !strcmp(types[i].guest, guest_type) ) - domctl.u.address_size.size = types[i].size; - if ( domctl.u.address_size.size == 0 ) - /* nothing to do */ - return 0; - - xc_dom_printf("%s: guest %s, address size %" PRId32 "\n", __FUNCTION__, - guest_type, domctl.u.address_size.size); - rc = do_domctl(xc, &domctl); - if ( rc != 0 ) - xc_dom_printf("%s: warning: failed (rc=%d)\n", - __FUNCTION__, rc); - return rc; -} - - -static int x86_shadow(int xc, domid_t domid) -{ - int rc, mode; - - xc_dom_printf("%s: called\n", __FUNCTION__); - - mode = XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT | - XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE; - - rc = xc_shadow_control(xc, domid, - XEN_DOMCTL_SHADOW_OP_ENABLE, - NULL, 0, NULL, mode, NULL); - if ( rc != 0 ) - { - xc_dom_panic(XC_INTERNAL_ERROR, - "%s: SHADOW_OP_ENABLE (mode=0x%x) failed (rc=%d)\n", - __FUNCTION__, mode, rc); - return rc; - } - xc_dom_printf("%s: shadow enabled (mode=0x%x)\n", __FUNCTION__, mode); - return rc; -} - -static int arch_setup_meminit(struct xc_dom_image *dom) -{ - int rc = 0; - - x86_compat(dom->guest_xc, dom->guest_domid, dom->guest_type); - if ( xc_dom_feature_translated(dom) ) - { - dom->shadow_enabled = 1; - rc = x86_shadow(dom->guest_xc, dom->guest_domid); - } - return rc; -} - -static int arch_setup_bootearly(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootlate(struct xc_dom_image *dom) -{ - static const struct { - char *guest; - unsigned long pgd_type; - } types[] = { - { "xen-3.0-x86_32", MMUEXT_PIN_L2_TABLE}, - { "xen-3.0-x86_32p", MMUEXT_PIN_L3_TABLE}, - { "xen-3.0-x86_64", MMUEXT_PIN_L4_TABLE}, - }; - unsigned long pgd_type = 0; - shared_info_t *shared_info; - xen_pfn_t shinfo; - int i, rc; - - for ( i = 0; i < sizeof(types) / sizeof(types[0]); i++ ) - if ( !strcmp(types[i].guest, dom->guest_type) ) - pgd_type = types[i].pgd_type; - - if ( !xc_dom_feature_translated(dom) ) - { - /* paravirtualized guest */ - xc_dom_unmap_one(dom, dom->pgtables_seg.pfn); - rc = pin_table(dom->guest_xc, pgd_type, - xc_dom_p2m_host(dom, dom->pgtables_seg.pfn), - dom->guest_domid); - if ( rc != 0 ) - { - xc_dom_panic(XC_INTERNAL_ERROR, - "%s: pin_table failed (pfn 0x%" PRIpfn ", rc=%d)\n", - __FUNCTION__, dom->pgtables_seg.pfn, rc); - return rc; - } - shinfo = dom->shared_info_mfn; - } - else - { - /* paravirtualized guest with auto-translation */ - struct xen_add_to_physmap xatp; - int i; - - /* Map shared info frame into guest physmap. */ - xatp.domid = dom->guest_domid; - xatp.space = XENMAPSPACE_shared_info; - xatp.idx = 0; - xatp.gpfn = dom->shared_info_pfn; - rc = xc_memory_op(dom->guest_xc, XENMEM_add_to_physmap, &xatp); - if ( rc != 0 ) - { - xc_dom_panic(XC_INTERNAL_ERROR, "%s: mapping shared_info failed " - "(pfn=0x%" PRIpfn ", rc=%d)\n", - __FUNCTION__, xatp.gpfn, rc); - return rc; - } - - /* Map grant table frames into guest physmap. */ - for ( i = 0; ; i++ ) - { - xatp.domid = dom->guest_domid; - xatp.space = XENMAPSPACE_grant_table; - xatp.idx = i; - xatp.gpfn = dom->total_pages + i; - rc = xc_memory_op(dom->guest_xc, XENMEM_add_to_physmap, &xatp); - if ( rc != 0 ) - { - if ( (i > 0) && (errno == EINVAL) ) - { - xc_dom_printf("%s: %d grant tables mapped\n", __FUNCTION__, - i); - break; - } - xc_dom_panic(XC_INTERNAL_ERROR, - "%s: mapping grant tables failed " "(pfn=0x%" - PRIpfn ", rc=%d)\n", __FUNCTION__, xatp.gpfn, rc); - return rc; - } - } - shinfo = dom->shared_info_pfn; - } - - /* setup shared_info page */ - xc_dom_printf("%s: shared_info: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "\n", - __FUNCTION__, dom->shared_info_pfn, dom->shared_info_mfn); - shared_info = xc_map_foreign_range(dom->guest_xc, dom->guest_domid, - PAGE_SIZE_X86, - 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); - - return 0; -} - -/* ------------------------------------------------------------------------ */ -/* arch stuff: ia64 */ - -#elif defined(__ia64__) - -static int arch_setup_meminit(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootearly(struct xc_dom_image *dom) -{ - DECLARE_DOMCTL; - int rc; - - xc_dom_printf("%s: setup firmware\n", __FUNCTION__); - - memset(&domctl, 0, sizeof(domctl)); - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = dom->guest_domid; - domctl.u.arch_setup.flags = 0; - - domctl.u.arch_setup.bp = (dom->start_info_pfn << PAGE_SHIFT) - + sizeof(start_info_t); - /* 3 = start info page, xenstore page and console page */ - domctl.u.arch_setup.maxmem = (dom->total_pages - 3) << PAGE_SHIFT; - rc = do_domctl(dom->guest_xc, &domctl); - return rc; -} - -static int arch_setup_bootlate(struct xc_dom_image *dom) -{ - unsigned int page_size = XC_DOM_PAGE_SIZE(dom); - shared_info_t *shared_info; - - /* setup shared_info page */ - xc_dom_printf("%s: shared_info: mfn 0x%" PRIpfn "\n", - __FUNCTION__, dom->shared_info_mfn); - shared_info = xc_map_foreign_range(dom->guest_xc, dom->guest_domid, - page_size, - PROT_READ | PROT_WRITE, - dom->shared_info_mfn); - if ( shared_info == NULL ) - return -1; - dom->arch_hooks->shared_info(dom, shared_info); - munmap(shared_info, page_size); - return 0; -} - -/* ------------------------------------------------------------------------ */ -/* arch stuff: powerpc */ - -#elif defined(__powerpc64__) - -static int arch_setup_meminit(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootearly(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootlate(struct xc_dom_image *dom) -{ - start_info_t *si = - xc_dom_pfn_to_ptr(dom, dom->start_info_pfn, 1); - - xc_dom_printf("%s: TODO: setup devtree\n", __FUNCTION__); - -#if 0 - load_devtree(dom->guest_xc, - dom->guest_domid, - dom->p2m_host, - devtree, // FIXME - devtree_addr, // FIXME - dom->ramdisk_seg.vstart, - dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart, - si, - dom->start_info_pfn << PAGE_SHIFT); -#endif - return rc; -} - -/* ------------------------------------------------------------------------ */ -/* arch stuff: other */ - -#else - -static int arch_setup_meminit(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootearly(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -static int arch_setup_bootlate(struct xc_dom_image *dom) -{ - xc_dom_printf("%s: doing nothing\n", __FUNCTION__); - return 0; -} - -#endif /* arch stuff */ /* ------------------------------------------------------------------------ */ @@ -420,13 +133,7 @@ int xc_dom_boot_mem_init(struct xc_dom_i xc_dom_printf("%s: called\n", __FUNCTION__); - if ( (rc = arch_setup_meminit(dom)) != 0 ) - return rc; - - /* allocate guest memory */ - rc = xc_domain_memory_populate_physmap(dom->guest_xc, dom->guest_domid, - dom->total_pages, 0, 0, - dom->p2m_host); + rc = arch_setup_meminit(dom); if ( rc != 0 ) { xc_dom_panic(XC_OUT_OF_MEMORY, diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_compat_linux.c --- a/tools/libxc/xc_dom_compat_linux.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom_compat_linux.c Thu Mar 22 09:30:54 2007 -0600 @@ -32,6 +32,10 @@ static int xc_linux_build_internal(struc { int rc; + dom->flags = flags; + dom->console_evtchn = console_evtchn; + dom->xenstore_evtchn = store_evtchn; + if ( (rc = xc_dom_boot_xen_init(dom, xc_handle, domid)) != 0 ) goto out; if ( (rc = xc_dom_parse_image(dom)) != 0 ) @@ -42,12 +46,7 @@ static int xc_linux_build_internal(struc goto out; if ( (rc = xc_dom_build_image(dom)) != 0 ) goto out; - - dom->flags = flags; - dom->console_evtchn = console_evtchn; - dom->xenstore_evtchn = store_evtchn; - rc = xc_dom_boot_image(dom); - if ( rc != 0 ) + if ( (rc = xc_dom_boot_image(dom)) != 0 ) goto out; *console_mfn = xc_dom_p2m_host(dom, dom->console_pfn); diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_core.c --- a/tools/libxc/xc_dom_core.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom_core.c Thu Mar 22 09:30:54 2007 -0600 @@ -639,7 +639,7 @@ int xc_dom_mem_init(struct xc_dom_image int xc_dom_mem_init(struct xc_dom_image *dom, unsigned int mem_mb) { unsigned int page_shift; - xen_pfn_t nr_pages, pfn; + xen_pfn_t nr_pages; dom->arch_hooks = xc_dom_find_arch_hooks(dom->guest_type); if ( dom->arch_hooks == NULL ) @@ -659,10 +659,6 @@ int xc_dom_mem_init(struct xc_dom_image xc_dom_printf("%s: 0x%" PRIpfn " pages\n", __FUNCTION__, dom->total_pages); - /* setup initial p2m */ - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); - for ( pfn = 0; pfn < dom->total_pages; pfn++ ) - dom->p2m_host[pfn] = pfn; return 0; } diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_ia64.c --- a/tools/libxc/xc_dom_ia64.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom_ia64.c Thu Mar 22 09:30:54 2007 -0600 @@ -18,6 +18,7 @@ #include "xg_private.h" #include "xc_dom.h" +#include "xenctrl.h" /* ------------------------------------------------------------------------ */ @@ -128,6 +129,62 @@ static void __init register_arch_hooks(v xc_dom_register_arch_hooks(&xc_dom_arch_ia64be); } +int arch_setup_meminit(struct xc_dom_image *dom) +{ + xen_pfn_t pfn; + int rc; + + /* setup initial p2m */ + dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); + for ( pfn = 0; pfn < dom->total_pages; pfn++ ) + dom->p2m_host[pfn] = pfn; + + /* allocate guest memory */ + rc = xc_domain_memory_populate_physmap(dom->guest_xc, dom->guest_domid, + dom->total_pages, 0, 0, + dom->p2m_host); + return rc; +} + +int arch_setup_bootearly(struct xc_dom_image *dom) +{ + DECLARE_DOMCTL; + int rc; + + xc_dom_printf("%s: setup firmware\n", __FUNCTION__); + + memset(&domctl, 0, sizeof(domctl)); + domctl.cmd = XEN_DOMCTL_arch_setup; + domctl.domain = dom->guest_domid; + domctl.u.arch_setup.flags = 0; + + domctl.u.arch_setup.bp = (dom->start_info_pfn << PAGE_SHIFT) + + sizeof(start_info_t); + /* 3 = start info page, xenstore page and console page */ + domctl.u.arch_setup.maxmem = (dom->total_pages - 3) << PAGE_SHIFT; + rc = do_domctl(dom->guest_xc, &domctl); + return rc; +} + +int arch_setup_bootlate(struct xc_dom_image *dom) +{ + unsigned int page_size = XC_DOM_PAGE_SIZE(dom); + shared_info_t *shared_info; + + /* setup shared_info page */ + xc_dom_printf("%s: shared_info: mfn 0x%" PRIpfn "\n", + __FUNCTION__, dom->shared_info_mfn); + shared_info = xc_map_foreign_range(dom->guest_xc, dom->guest_domid, + page_size, + PROT_READ | PROT_WRITE, + dom->shared_info_mfn); + if ( shared_info == NULL ) + return -1; + dom->arch_hooks->shared_info(dom, shared_info); + munmap(shared_info, page_size); + return 0; +} + /* * Local variables: * mode: C diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_powerpc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/libxc/xc_dom_powerpc.c Thu Mar 22 09:30:54 2007 -0600 @@ -0,0 +1,236 @@ +/* + * Xen domain builder -- powerpc bits. + * + * Most architecture-specific code for powerpc goes here. + * + * This code is licenced under the GPL. + * written 2006 by Gerd Hoffmann <kraxel@xxxxxxx>. + * + * Copyright IBM Corp. 2007 + * + * Authors: Gerd Hoffmann <kraxel@xxxxxxx> + * Hollis Blanchard <hollisb@xxxxxxxxxx> + * + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <inttypes.h> + +#include <xen/xen.h> + +#include "xg_private.h" +#include "xc_dom.h" +#include "powerpc64/flatdevtree.h" +#include "powerpc64/mk_flatdevtree.h" + +#define RMA_LOG 26 /* 64 MB */ +#define EXTENT_LOG 24 /* 16 MB */ +#define EXTENT_ORDER (EXTENT_LOG - PAGE_SHIFT) + +/* ------------------------------------------------------------------------ */ + +static int alloc_magic_pages(struct xc_dom_image *dom) +{ + struct ft_cxt devtree; + void *guest_devtree; + unsigned long shadow_mb; + int rma_pages; + int rc; + + /* Allocate special pages from the end of the RMA. */ + rma_pages = 1 << (dom->realmodearea_log - PAGE_SHIFT); + dom->shared_info_pfn = --rma_pages; + dom->console_pfn = --rma_pages; + dom->xenstore_pfn = --rma_pages; + + /* Gather shadow allocation info for the device tree. */ + rc = xc_shadow_control(dom->guest_xc, dom->guest_domid, + XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION, NULL, 0, + &shadow_mb, 0, NULL); + if (rc < 0 || shadow_mb == 0) { + xc_dom_printf("Couldn't get shadow allocation size or it was 0.\n"); + return rc; + } + + /* Build device tree. */ + rc = make_devtree(&devtree, dom, shadow_mb); + if (rc < 0) { + xc_dom_printf("Failed to create flattened device tree.\n"); + return rc; + } + + /* Find a spot for it. */ + rc = xc_dom_alloc_segment(dom, &dom->devicetree_seg, "devtree", 0, + devtree.bph->totalsize); + if (rc) + goto out; + + /* Copy the device tree into place. */ + guest_devtree = xc_dom_seg_to_ptr(dom, &dom->devicetree_seg); + if (!guest_devtree) { + xc_dom_printf("Couldn't map guest memory for device tree.\n"); + rc = -1; + goto out; + } + memcpy(guest_devtree, devtree.bph, devtree.bph->totalsize); + +out: + free_devtree(&devtree); + return rc; +} + +static int shared_info(struct xc_dom_image *dom, void *ptr) +{ + shared_info_t *shared_info = ptr; + + xc_dom_printf("%s: called\n", __FUNCTION__); + + memset(shared_info, 0, sizeof(*shared_info)); + return 0; +} + +static int vcpu(struct xc_dom_image *dom, void *ptr) +{ + vcpu_guest_context_t *ctxt = ptr; + + memset(ctxt, 0x55, sizeof(*ctxt)); + ctxt->user_regs.pc = dom->parms.virt_entry; + ctxt->user_regs.msr = 0; + ctxt->user_regs.gprs[1] = 0; /* Linux uses its own stack */ + ctxt->user_regs.gprs[3] = dom->devicetree_seg.pfn << PAGE_SHIFT; + ctxt->user_regs.gprs[4] = dom->kernel_seg.pfn << PAGE_SHIFT; + ctxt->user_regs.gprs[5] = 0; + + /* There is a buggy kernel that does not zero the "local_paca", so + * we must make sure this register is 0 */ + ctxt->user_regs.gprs[13] = 0; + + xc_dom_printf("%s: initial vcpu:\n", __FUNCTION__); + xc_dom_printf(" pc 0x%016"PRIx64", msr 0x%016"PRIx64"\n" + " r1-5 %016"PRIx64" %016"PRIx64" %016"PRIx64" %016"PRIx64 + " %016"PRIx64"\n", + ctxt->user_regs.pc, ctxt->user_regs.msr, + ctxt->user_regs.gprs[1], + ctxt->user_regs.gprs[2], + ctxt->user_regs.gprs[3], + ctxt->user_regs.gprs[4], + ctxt->user_regs.gprs[5]); + + return 0; +} + +/* ------------------------------------------------------------------------ */ + +static struct xc_dom_arch xc_dom_arch = { + .guest_type = "xen-3.0-powerpc64", + .page_shift = PAGE_SHIFT, + .alloc_magic_pages = alloc_magic_pages, + .shared_info = shared_info, + .vcpu = vcpu, +}; + +static void __init register_arch_hooks(void) +{ + xc_dom_register_arch_hooks(&xc_dom_arch); +} + +int arch_setup_meminit(struct xc_dom_image *dom) +{ + xen_pfn_t *extent_list; + unsigned long total_mem = dom->total_pages << PAGE_SHIFT; + unsigned long rma_bytes; + unsigned long rma_nr_pages; + unsigned long nr_extents; + int rc = 0; + int i; + + /* XXX RMA size is processor-dependent. */ + dom->realmodearea_log = RMA_LOG; + rma_bytes = 1 << dom->realmodearea_log; + rma_nr_pages = rma_bytes >> PAGE_SHIFT; + + xc_dom_printf("dom%u memory: %lu MB RMA, %lu MB additional.\n", + dom->guest_domid, rma_bytes >> 20, (total_mem - rma_bytes) >> 20); + + if (total_mem < rma_bytes) { + xc_dom_printf("Domain must have at least %lu MB\n", rma_bytes >> 20); + return -EINVAL; + } + + /* Allocate the first chunk of memory. */ + rc = xc_alloc_real_mode_area(dom->guest_xc, dom->guest_domid, + dom->realmodearea_log); + if (rc) { + xc_dom_printf("Failed to allocate real mode area.\n"); + return rc; + } + + /* Allocate p2m map. */ + dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); + if (dom->p2m_host == NULL) { + xc_dom_printf("Couldn't allocate p2m map.\n"); + return -ENOMEM; + } + + nr_extents = (dom->total_pages - rma_nr_pages) >> EXTENT_ORDER; + if (nr_extents) { + /* Allocate extent list for populate_physmap() call. */ + extent_list = xc_dom_malloc(dom, sizeof(xen_pfn_t) * nr_extents); + if (extent_list == NULL) { + xc_dom_printf("Couldn't allocate extent list.\n"); + return -ENOMEM; + } + + /* Allocate the remaining (non-RMA) memory. */ + for (i = 0; i < nr_extents; i++) { + /* Use PFNs above the RMA memory we already allocated. */ + extent_list[i] = rma_nr_pages + i * (1<<EXTENT_ORDER); + } + rc = xc_domain_memory_populate_physmap(dom->guest_xc, dom->guest_domid, + nr_extents, EXTENT_ORDER, 0, + extent_list); + if (rc < 0) { + xc_dom_printf("populate_physmap(0x%lx extents order %u) -> 0x%x\n", + nr_extents, EXTENT_ORDER, rc); + return rc; + } + } + + /* Populate the p2m map. */ + rc = xc_get_pfn_list(dom->guest_xc, dom->guest_domid, dom->p2m_host, + dom->total_pages); + if (rc < 0) { + xc_dom_printf("Couldn't get p2m translation.\n"); + return rc; + } + + xc_dom_printf("%s: success\n", __func__); + + return 0; +} + +int arch_setup_bootearly(struct xc_dom_image *dom) +{ + xc_dom_printf("%s: doing nothing\n", __FUNCTION__); + return 0; +} + +int arch_setup_bootlate(struct xc_dom_image *dom) +{ + unsigned int page_size = XC_DOM_PAGE_SIZE(dom); + shared_info_t *shared_info; + + /* setup shared_info page */ + xc_dom_printf("%s: shared_info: mfn 0x%" PRIpfn "\n", + __FUNCTION__, dom->shared_info_mfn); + shared_info = xc_map_foreign_range(dom->guest_xc, dom->guest_domid, + page_size, + PROT_READ | PROT_WRITE, + dom->shared_info_mfn); + if ( shared_info == NULL ) + return -1; + dom->arch_hooks->shared_info(dom, shared_info); + munmap(shared_info, page_size); + return 0; +} diff -r 93e11f6d6791 -r be1017157768 tools/libxc/xc_dom_x86.c --- a/tools/libxc/xc_dom_x86.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/libxc/xc_dom_x86.c Thu Mar 22 09:30:54 2007 -0600 @@ -22,6 +22,7 @@ #include "xg_private.h" #include "xc_dom.h" +#include "xenctrl.h" /* ------------------------------------------------------------------------ */ @@ -547,6 +548,188 @@ static void __init register_arch_hooks(v xc_dom_register_arch_hooks(&xc_dom_64); } +static int x86_compat(int xc, domid_t domid, char *guest_type) +{ + static const struct { + char *guest; + uint32_t size; + } types[] = { + { "xen-3.0-x86_32p", 32 }, + { "xen-3.0-x86_64", 64 }, + }; + DECLARE_DOMCTL; + int i,rc; + + memset(&domctl, 0, sizeof(domctl)); + domctl.domain = domid; + domctl.cmd = XEN_DOMCTL_set_address_size; + for ( i = 0; i < sizeof(types)/sizeof(types[0]); i++ ) + if ( !strcmp(types[i].guest, guest_type) ) + domctl.u.address_size.size = types[i].size; + if ( domctl.u.address_size.size == 0 ) + /* nothing to do */ + return 0; + + xc_dom_printf("%s: guest %s, address size %" PRId32 "\n", __FUNCTION__, + guest_type, domctl.u.address_size.size); + rc = do_domctl(xc, &domctl); + if ( rc != 0 ) + xc_dom_printf("%s: warning: failed (rc=%d)\n", + __FUNCTION__, rc); + return rc; +} + + +static int x86_shadow(int xc, domid_t domid) +{ + int rc, mode; + + xc_dom_printf("%s: called\n", __FUNCTION__); + + mode = XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT | + XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE; + + rc = xc_shadow_control(xc, domid, + XEN_DOMCTL_SHADOW_OP_ENABLE, + NULL, 0, NULL, mode, NULL); + if ( rc != 0 ) + { + xc_dom_panic(XC_INTERNAL_ERROR, + "%s: SHADOW_OP_ENABLE (mode=0x%x) failed (rc=%d)\n", + __FUNCTION__, mode, rc); + return rc; + } + xc_dom_printf("%s: shadow enabled (mode=0x%x)\n", __FUNCTION__, mode); + return rc; +} + +int arch_setup_meminit(struct xc_dom_image *dom) +{ + int rc; + xen_pfn_t pfn; + + x86_compat(dom->guest_xc, dom->guest_domid, dom->guest_type); + if ( xc_dom_feature_translated(dom) ) + { + dom->shadow_enabled = 1; + rc = x86_shadow(dom->guest_xc, dom->guest_domid); + if ( rc ) + return rc; + } + + /* setup initial p2m */ + dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); + for ( pfn = 0; pfn < dom->total_pages; pfn++ ) + dom->p2m_host[pfn] = pfn; + + /* allocate guest memory */ + rc = xc_domain_memory_populate_physmap(dom->guest_xc, dom->guest_domid, + dom->total_pages, 0, 0, + dom->p2m_host); + return rc; +} + +int arch_setup_bootearly(struct xc_dom_image *dom) +{ + xc_dom_printf("%s: doing nothing\n", __FUNCTION__); + return 0; +} + +int arch_setup_bootlate(struct xc_dom_image *dom) +{ + static const struct { + char *guest; + unsigned long pgd_type; + } types[] = { + { "xen-3.0-x86_32", MMUEXT_PIN_L2_TABLE}, + { "xen-3.0-x86_32p", MMUEXT_PIN_L3_TABLE}, + { "xen-3.0-x86_64", MMUEXT_PIN_L4_TABLE}, + }; + unsigned long pgd_type = 0; + shared_info_t *shared_info; + xen_pfn_t shinfo; + int i, rc; + + for ( i = 0; i < sizeof(types) / sizeof(types[0]); i++ ) + if ( !strcmp(types[i].guest, dom->guest_type) ) + pgd_type = types[i].pgd_type; + + if ( !xc_dom_feature_translated(dom) ) + { + /* paravirtualized guest */ + xc_dom_unmap_one(dom, dom->pgtables_seg.pfn); + rc = pin_table(dom->guest_xc, pgd_type, + xc_dom_p2m_host(dom, dom->pgtables_seg.pfn), + dom->guest_domid); + if ( rc != 0 ) + { + xc_dom_panic(XC_INTERNAL_ERROR, + "%s: pin_table failed (pfn 0x%" PRIpfn ", rc=%d)\n", + __FUNCTION__, dom->pgtables_seg.pfn, rc); + return rc; + } + shinfo = dom->shared_info_mfn; + } + else + { + /* paravirtualized guest with auto-translation */ + struct xen_add_to_physmap xatp; + int i; + + /* Map shared info frame into guest physmap. */ + xatp.domid = dom->guest_domid; + xatp.space = XENMAPSPACE_shared_info; + xatp.idx = 0; + xatp.gpfn = dom->shared_info_pfn; + rc = xc_memory_op(dom->guest_xc, XENMEM_add_to_physmap, &xatp); + if ( rc != 0 ) + { + xc_dom_panic(XC_INTERNAL_ERROR, "%s: mapping shared_info failed " + "(pfn=0x%" PRIpfn ", rc=%d)\n", + __FUNCTION__, xatp.gpfn, rc); + return rc; + } + + /* Map grant table frames into guest physmap. */ + for ( i = 0; ; i++ ) + { + xatp.domid = dom->guest_domid; + xatp.space = XENMAPSPACE_grant_table; + xatp.idx = i; + xatp.gpfn = dom->total_pages + i; + rc = xc_memory_op(dom->guest_xc, XENMEM_add_to_physmap, &xatp); + if ( rc != 0 ) + { + if ( (i > 0) && (errno == EINVAL) ) + { + xc_dom_printf("%s: %d grant tables mapped\n", __FUNCTION__, + i); + break; + } + xc_dom_panic(XC_INTERNAL_ERROR, + "%s: mapping grant tables failed " "(pfn=0x%" + PRIpfn ", rc=%d)\n", __FUNCTION__, xatp.gpfn, rc); + return rc; + } + } + shinfo = dom->shared_info_pfn; + } + + /* setup shared_info page */ + xc_dom_printf("%s: shared_info: pfn 0x%" PRIpfn ", mfn 0x%" PRIpfn "\n", + __FUNCTION__, dom->shared_info_pfn, dom->shared_info_mfn); + shared_info = xc_map_foreign_range(dom->guest_xc, dom->guest_domid, + PAGE_SIZE_X86, + 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); + + return 0; +} + /* * Local variables: * mode: C diff -r 93e11f6d6791 -r be1017157768 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/python/xen/lowlevel/xc/xc.c Thu Mar 22 09:30:54 2007 -0600 @@ -1072,46 +1072,6 @@ static PyObject *pyxc_alloc_real_mode_ar Py_INCREF(zero); return zero; } - -static PyObject *pyxc_prose_build(XcObject *self, - PyObject *args, - PyObject *kwds) -{ - uint32_t dom; - char *image, *ramdisk = NULL, *cmdline = "", *features = NULL; - int flags = 0; - int store_evtchn, console_evtchn; - unsigned int mem_mb; - unsigned long store_mfn = 0; - unsigned long console_mfn = 0; - int unused; - - static char *kwd_list[] = { "dom", "store_evtchn", - "console_evtchn", "image", "memsize", - /* optional */ - "ramdisk", "cmdline", "flags", - "features", NULL }; - - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssis#", kwd_list, - &dom, &store_evtchn, &mem_mb, - &console_evtchn, &image, - /* optional */ - &ramdisk, &cmdline, &flags, - &features, &unused) ) - return NULL; - - if ( xc_prose_build(self->xc_handle, dom, mem_mb, image, - ramdisk, cmdline, features, flags, - store_evtchn, &store_mfn, - console_evtchn, &console_mfn) != 0 ) { - if (!errno) - errno = EINVAL; - return pyxc_error_to_exception(); - } - return Py_BuildValue("{s:i,s:i}", - "store_mfn", store_mfn, - "console_mfn", console_mfn); -} #endif /* powerpc */ static PyMethodDef pyxc_methods[] = { @@ -1463,17 +1423,6 @@ static PyMethodDef pyxc_methods[] = { "Allocate a domain's real mode area.\n" " dom [int]: Identifier of domain.\n" " log [int]: Specifies the area's size.\n" - "Returns: [int] 0 on success; -1 on error.\n" }, - - { "arch_prose_build", - (PyCFunction)pyxc_prose_build, - METH_VARARGS | METH_KEYWORDS, "\n" - "Build a new Linux guest OS.\n" - " dom [int]: Identifier of domain to build into.\n" - " image [str]: Name of kernel image file. May be gzipped.\n" - " ramdisk [str, n/a]: Name of ramdisk file, if any.\n" - " cmdline [str, n/a]: Kernel parameters, if any.\n\n" - " vcpus [int, 1]: Number of Virtual CPUS in domain.\n\n" "Returns: [int] 0 on success; -1 on error.\n" }, #endif /* __powerpc */ diff -r 93e11f6d6791 -r be1017157768 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/python/xen/xend/XendAPI.py Thu Mar 22 09:30:54 2007 -0600 @@ -665,6 +665,7 @@ class XendAPI(object): ('add_to_other_config', None), ('remove_from_other_config', None), ('dmesg', 'String'), + ('dmesg_clear', 'String'), ('get_log', 'String'), ('send_debug_keys', None)] @@ -742,11 +743,11 @@ class XendAPI(object): return xen_api_error(XEND_ERROR_HOST_RUNNING) return xen_api_error(XEND_ERROR_UNSUPPORTED) - def host_dmesg(self, session, host_ref, clear): - if clear: - return xen_api_success(XendDmesg.instance().clear()) - else: - return xen_api_success(XendDmesg.instance().info()) + def host_dmesg(self, session, host_ref): + return xen_api_success(XendDmesg.instance().info()) + + def host_dmesg_clear(self, session, host_ref): + return xen_api_success(XendDmesg.instance().clear()) def host_get_log(self, session, host_ref): log_file = open(XendLogging.getLogFilename()) diff -r 93e11f6d6791 -r be1017157768 tools/python/xen/xend/XendDmesg.py --- a/tools/python/xen/xend/XendDmesg.py Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/python/xen/xend/XendDmesg.py Thu Mar 22 09:30:54 2007 -0600 @@ -13,6 +13,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #============================================================================ # Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx> +# Copyright (C) 2007 XenSource Inc. #============================================================================ """Get dmesg output for this node. @@ -28,7 +29,7 @@ class XendDmesg: return self.xc.readconsolering() def clear(self): - self.xc.readconsolering(True) + return self.xc.readconsolering(True) def instance(): global inst diff -r 93e11f6d6791 -r be1017157768 tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/python/xen/xend/image.py Thu Mar 22 09:30:54 2007 -0600 @@ -227,35 +227,6 @@ class PPC_LinuxImageHandler(LinuxImageHa return max(maxmem_kb / 64, shadow_mem_kb) - -class PPC_ProseImageHandler(PPC_LinuxImageHandler): - - ostype = "prose" - - def buildDomain(self): - store_evtchn = self.vm.getStorePort() - console_evtchn = self.vm.getConsolePort() - - mem_mb = self.getRequiredInitialReservation() / 1024 - - log.debug("dom = %d", self.vm.getDomid()) - log.debug("memsize = %d", mem_mb) - log.debug("image = %s", self.kernel) - log.debug("store_evtchn = %d", store_evtchn) - log.debug("console_evtchn = %d", console_evtchn) - log.debug("cmdline = %s", self.cmdline) - log.debug("ramdisk = %s", self.ramdisk) - log.debug("vcpus = %d", self.vm.getVCpuCount()) - log.debug("features = %s", self.vm.getFeatures()) - - return xc.arch_prose_build(dom = self.vm.getDomid(), - memsize = mem_mb, - image = self.kernel, - store_evtchn = store_evtchn, - console_evtchn = console_evtchn, - cmdline = self.cmdline, - ramdisk = self.ramdisk, - features = self.vm.getFeatures()) class HVMImageHandler(ImageHandler): @@ -613,7 +584,6 @@ _handlers = { _handlers = { "powerpc": { "linux": PPC_LinuxImageHandler, - "prose": PPC_ProseImageHandler, }, "ia64": { "linux": LinuxImageHandler, diff -r 93e11f6d6791 -r be1017157768 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Thu Mar 22 09:28:05 2007 -0600 +++ b/tools/python/xen/xm/main.py Thu Mar 22 09:30:54 2007 -0600 @@ -217,7 +217,7 @@ SUBCOMMAND_OPTIONS = { ('-q', '--quiet', 'Do not print an error message if the domain does not exist'), ), 'dmesg': ( - ('-c', '--clear', 'Clear dmesg buffer'), + ('-c', '--clear', 'Clear dmesg buffer as well as printing it'), ), 'vnet-list': ( ('-l', '--long', 'List Vnets as SXP'), @@ -1587,17 +1587,16 @@ def xm_dmesg(args): usage('dmesg') if serverType == SERVER_XEN_API: + host = server.xenapi.session.get_this_host() + if use_clear: + print server.xenapi.host.dmesg_clear(host), + else: + print server.xenapi.host.dmesg(host), + else: if not use_clear: - print server.xenapi.host.dmesg( - server.xenapi.session.get_this_host(),0) + print server.xend.node.dmesg.info(), else: - server.xenapi.host.dmesg( - server.xenapi.session.get_this_host(),1) - else: - if not use_clear: - print server.xend.node.dmesg.info() - else: - server.xend.node.dmesg.clear() + print server.xend.node.dmesg.clear(), def xm_log(args): arg_check(args, "log", 0) diff -r 93e11f6d6791 -r be1017157768 xen/arch/powerpc/backtrace.c --- a/xen/arch/powerpc/backtrace.c Thu Mar 22 09:28:05 2007 -0600 +++ b/xen/arch/powerpc/backtrace.c Thu Mar 22 09:30:54 2007 -0600 @@ -222,8 +222,7 @@ void __warn(char *file, int line) void dump_execution_state(void) { - struct vcpu *v = current; - struct cpu_user_regs *regs = &v->arch.ctxt; + struct cpu_user_regs *regs = guest_cpu_user_regs(); show_registers(regs); if (regs->msr & MSR_HV) { diff -r 93e11f6d6791 -r be1017157768 xen/arch/powerpc/mm.c --- a/xen/arch/powerpc/mm.c Thu Mar 22 09:28:05 2007 -0600 +++ b/xen/arch/powerpc/mm.c Thu Mar 22 09:30:54 2007 -0600 @@ -401,9 +401,13 @@ int allocate_rma(struct domain *d, unsig void free_rma_check(struct page_info *page) { - if (test_bit(_PGC_page_RMA, &page->count_info) && - !test_bit(_DOMF_dying, &page_get_owner(page)->domain_flags)) - panic("Attempt to free an RMA page: 0x%lx\n", page_to_mfn(page)); + if (test_bit(_PGC_page_RMA, &page->count_info)) { + if (!test_bit(_DOMF_dying, &page_get_owner(page)->domain_flags)) { + panic("Attempt to free an RMA page: 0x%lx\n", page_to_mfn(page)); + } else { + clear_bit(_PGC_page_RMA, &page->count_info); + } + } } ulong pfn2mfn(struct domain *d, ulong pfn, int *type) diff -r 93e11f6d6791 -r be1017157768 xen/arch/powerpc/setup.c --- a/xen/arch/powerpc/setup.c Thu Mar 22 09:28:05 2007 -0600 +++ b/xen/arch/powerpc/setup.c Thu Mar 22 09:30:54 2007 -0600 @@ -37,6 +37,7 @@ #include <xen/keyhandler.h> #include <xen/numa.h> #include <xen/rcupdate.h> +#include <xen/version.h> #include <acm/acm_hooks.h> #include <public/version.h> #include <asm/mpic.h> @@ -450,6 +451,14 @@ extern void arch_get_xen_caps(xen_capabi extern void arch_get_xen_caps(xen_capabilities_info_t *info); void arch_get_xen_caps(xen_capabilities_info_t *info) { + int major = xen_major_version(); + int minor = xen_minor_version(); + char s[32]; + + (*info)[0] = '\0'; + + snprintf(s, sizeof(s), "xen-%d.%d-powerpc64 ", major, minor); + safe_strcat(*info, s); } diff -r 93e11f6d6791 -r be1017157768 xen/arch/powerpc/smp-tbsync.c --- a/xen/arch/powerpc/smp-tbsync.c Thu Mar 22 09:28:05 2007 -0600 +++ b/xen/arch/powerpc/smp-tbsync.c Thu Mar 22 09:30:54 2007 -0600 @@ -31,6 +31,13 @@ #define local_irq_disable() #define NUM_ITER 300 + +#undef DEBUG +#ifdef DEBUG +#define DBG(fmt...) printk(fmt) +#else +#define DBG(fmt...) +#endif enum { kExit=0, kSetAndTest, kTest @@ -128,7 +135,7 @@ void __devinit smp_generic_give_timebase { int i, score, score2, old, min=0, max=5000, offset=1000; - printk("Synchronizing timebase\n"); + printk("Synchronizing timebase...\n"); /* if this fails then this kernel won't work anyway... */ tbsync = kmalloc( sizeof(*tbsync), GFP_KERNEL ); @@ -139,13 +146,13 @@ void __devinit smp_generic_give_timebase while (!tbsync->ack) barrier(); - printk("Got ack\n"); + DBG("Got ack\n"); /* binary search */ for (old = -1; old != offset ; offset = (min+max) / 2) { score = start_contest(kSetAndTest, offset, NUM_ITER); - printk("score %d, offset %d\n", score, offset ); + DBG("score %d, offset %d\n", score, offset ); if( score > 0 ) max = offset; @@ -156,7 +163,7 @@ void __devinit smp_generic_give_timebase score = start_contest(kSetAndTest, min, NUM_ITER); score2 = start_contest(kSetAndTest, max, NUM_ITER); - printk("Min %d (score %d), Max %d (score %d)\n", + DBG("Min %d (score %d), Max %d (score %d)\n", min, score, max, score2); score = abs(score); score2 = abs(score2); @@ -171,7 +178,7 @@ void __devinit smp_generic_give_timebase if (score2 <= score || score2 < 20) break; } - printk("Final offset: %d (%d/%d)\n", offset, score2, NUM_ITER ); + DBG("Final offset: %d (%d/%d)\n", offset, score2, NUM_ITER ); /* exiting */ tbsync->cmd = kExit; diff -r 93e11f6d6791 -r be1017157768 xen/arch/x86/mm/shadow/types.h --- a/xen/arch/x86/mm/shadow/types.h Thu Mar 22 09:28:05 2007 -0600 +++ b/xen/arch/x86/mm/shadow/types.h Thu Mar 22 09:30:54 2007 -0600 @@ -597,7 +597,7 @@ accumulate_guest_flags(struct vcpu *v, w * have reserved bits that we can use for this. */ -#define SH_L1E_MAGIC 0xffffffff00000000ULL +#define SH_L1E_MAGIC 0xffffffff00000001ULL static inline int sh_l1e_is_magic(shadow_l1e_t sl1e) { return ((sl1e.l1 & SH_L1E_MAGIC) == SH_L1E_MAGIC); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |