# HG changeset patch
# User Hollis Blanchard <[EMAIL PROTECTED]>
# Date 1174514580 18000
# Node ID 2c087916aaba101c3fbdc1c67c95f28065cf4709
# Parent  265e257388b52929e9e2bc62f9cf0818aac94e67
[LIBXC][POWERPC] Use new domain builder.
Signed-off-by: Hollis Blanchard <[EMAIL PROTECTED]>
---
 tools/libxc/powerpc64/utils.c          |  188 ------------------
 tools/libxc/powerpc64/utils.h          |   37 ---
 tools/libxc/powerpc64/xc_linux_build.c |  336 ---------------------------------
 tools/libxc/Makefile                   |    6 
 tools/libxc/powerpc64/Makefile         |    2 
 tools/libxc/powerpc64/mk_flatdevtree.c |   58 ++---
 tools/libxc/powerpc64/mk_flatdevtree.h |   14 -
 tools/libxc/xc_dom.h                   |    2 
 tools/libxc/xc_dom_compat_linux.c      |   11 -
 tools/libxc/xc_dom_powerpc.c           |  236 +++++++++++++++++++++++
 10 files changed, 277 insertions(+), 613 deletions(-)

diff -r 265e257388b5 -r 2c087916aaba tools/libxc/Makefile
--- a/tools/libxc/Makefile      Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/Makefile      Wed Mar 21 17:03:00 2007 -0500
@@ -48,9 +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_compat_linux.c
 
-GUEST_SRCS-$(CONFIG_X86)     += xc_dom_x86.c xc_dom_compat_linux.c
-GUEST_SRCS-$(CONFIG_IA64)    += xc_dom_ia64.c 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 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/Makefile
--- a/tools/libxc/powerpc64/Makefile    Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/powerpc64/Makefile    Wed Mar 21 17:03:00 2007 -0500
@@ -1,6 +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/utils.c
 
 CTRL_SRCS-y += powerpc64/xc_memory.c
diff -r 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/mk_flatdevtree.c
--- a/tools/libxc/powerpc64/mk_flatdevtree.c    Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/powerpc64/mk_flatdevtree.c    Wed Mar 21 17:03:00 2007 -0500
@@ -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 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/mk_flatdevtree.h
--- a/tools/libxc/powerpc64/mk_flatdevtree.h    Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/powerpc64/mk_flatdevtree.h    Wed Mar 21 17:03:00 2007 -0500
@@ -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 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/utils.c
--- a/tools/libxc/powerpc64/utils.c     Wed Mar 21 17:03:00 2007 -0500
+++ /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 <[EMAIL PROTECTED]>
- *          Jimi Xenidis <[EMAIL PROTECTED]>
- */
-#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 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/utils.h
--- a/tools/libxc/powerpc64/utils.h     Wed Mar 21 17:03:00 2007 -0500
+++ /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 <[EMAIL PROTECTED]>
- *          Jimi Xenidis <[EMAIL PROTECTED]>
- */
-
-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 265e257388b5 -r 2c087916aaba tools/libxc/powerpc64/xc_linux_build.c
--- a/tools/libxc/powerpc64/xc_linux_build.c    Wed Mar 21 17:03:00 2007 -0500
+++ /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 <[EMAIL PROTECTED]>
- *          Ryan Harper <[EMAIL PROTECTED]>
- */
-
-#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 265e257388b5 -r 2c087916aaba tools/libxc/xc_dom.h
--- a/tools/libxc/xc_dom.h      Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/xc_dom.h      Wed Mar 21 17:03:00 2007 -0500
@@ -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;
diff -r 265e257388b5 -r 2c087916aaba tools/libxc/xc_dom_compat_linux.c
--- a/tools/libxc/xc_dom_compat_linux.c Wed Mar 21 17:03:00 2007 -0500
+++ b/tools/libxc/xc_dom_compat_linux.c Wed Mar 21 17:03:00 2007 -0500
@@ -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 265e257388b5 -r 2c087916aaba tools/libxc/xc_dom_powerpc.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_dom_powerpc.c      Wed Mar 21 17:03:00 2007 -0500
@@ -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 <[EMAIL PROTECTED]>.
+ *
+ * Copyright IBM Corp. 2007
+ *
+ * Authors: Gerd Hoffmann <[EMAIL PROTECTED]>
+ *          Hollis Blanchard <[EMAIL PROTECTED]>
+ *
+ */
+#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;
+}

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to