# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Date 1174514580 18000
# Node ID 2c087916aaba101c3fbdc1c67c95f28065cf4709
# Parent 265e257388b52929e9e2bc62f9cf0818aac94e67
[LIBXC][POWERPC] Use new domain builder.
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
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 <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 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 <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 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 <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 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 <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;
+}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|