aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-08-25 00:51:20 +0000
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>2005-08-25 00:51:20 +0000
commitacc63faffa3cdefd9bd5f6e099971b4fcdae436b (patch)
tree826e7457f143456e94b597a2cdd175d1df4d726c /tools
parent60eb66351321ad80bf3356e2e35aeced44522a7a (diff)
downloadxen-acc63faffa3cdefd9bd5f6e099971b4fcdae436b.tar.gz
xen-acc63faffa3cdefd9bd5f6e099971b4fcdae436b.tar.bz2
xen-acc63faffa3cdefd9bd5f6e099971b4fcdae436b.zip
Break the building/save/restore code out into a separate library libxenguest.
Also update the tools accordingly. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Diffstat (limited to 'tools')
-rw-r--r--tools/libxc/Makefile80
-rw-r--r--tools/libxc/xc_core.c2
-rw-r--r--tools/libxc/xc_domain.c2
-rw-r--r--tools/libxc/xc_linux_build.c19
-rw-r--r--tools/libxc/xc_linux_restore.c30
-rw-r--r--tools/libxc/xc_linux_save.c10
-rw-r--r--tools/libxc/xc_load_aout9.c2
-rw-r--r--tools/libxc/xc_load_bin.c2
-rw-r--r--tools/libxc/xc_load_elf.c2
-rw-r--r--tools/libxc/xc_private.c152
-rw-r--r--tools/libxc/xc_private.h229
-rw-r--r--tools/libxc/xc_vmx_build.c18
-rw-r--r--tools/libxc/xenctrl.h88
-rw-r--r--tools/libxc/xenguest.h66
-rw-r--r--tools/libxc/xg_private.c86
-rw-r--r--tools/libxc/xg_private.h170
-rw-r--r--tools/python/setup.py2
-rw-r--r--tools/python/xen/lowlevel/xc/xc.c1
-rw-r--r--tools/xcutils/Makefile2
-rw-r--r--tools/xcutils/xc_restore.c5
-rw-r--r--tools/xcutils/xc_save.c5
21 files changed, 537 insertions, 436 deletions
diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
index 661ae50838..9b46321ebb 100644
--- a/tools/libxc/Makefile
+++ b/tools/libxc/Makefile
@@ -12,28 +12,32 @@ CC = gcc
XEN_ROOT = ../..
include $(XEN_ROOT)/tools/Rules.mk
-SRCS :=
-SRCS += xc_sedf.c
-SRCS += xc_bvtsched.c
-SRCS += xc_core.c
-SRCS += xc_domain.c
-SRCS += xc_evtchn.c
-SRCS += xc_gnttab.c
-SRCS += xc_load_bin.c
-SRCS += xc_load_elf.c
-SRCS += xc_linux_build.c
-SRCS += xc_misc.c
-SRCS += xc_physdev.c
-SRCS += xc_private.c
+SRCS :=
+BUILD_SRCS :=
+SRCS += xc_bvtsched.c
+SRCS += xc_core.c
+SRCS += xc_domain.c
+SRCS += xc_evtchn.c
+SRCS += xc_gnttab.c
+SRCS += xc_misc.c
+SRCS += xc_physdev.c
+SRCS += xc_private.c
+SRCS += xc_sedf.c
+
ifeq ($(XEN_TARGET_ARCH),ia64)
-SRCS += xc_ia64_stubs.c
+BUILD_SRCS += xc_ia64_stubs.c
else
-SRCS += xc_load_aout9.c
-SRCS += xc_linux_restore.c
-SRCS += xc_linux_save.c
-SRCS += xc_vmx_build.c
-SRCS += xc_ptrace.c
-SRCS += xc_ptrace_core.c
+SRCS += xc_ptrace.c
+SRCS += xc_ptrace_core.c
+
+BUILD_SRCS := xc_load_aout9.c
+BUILD_SRCS += xc_load_bin.c
+BUILD_SRCS += xc_load_elf.c
+BUILD_SRCS += xc_linux_build.c
+BUILD_SRCS += xc_linux_restore.c
+BUILD_SRCS += xc_linux_save.c
+BUILD_SRCS += xc_vmx_build.c
+BUILD_SRCS += xg_private.c
endif
CFLAGS += -Wall
@@ -43,13 +47,20 @@ CFLAGS += -fno-strict-aliasing
CFLAGS += $(INCLUDES) -I.
# Get gcc to generate the dependencies for us.
CFLAGS += -Wp,-MD,.$(@F).d
+LDFLAGS += -L.
DEPS = .*.d
LIB_OBJS := $(patsubst %.c,%.o,$(SRCS))
PIC_OBJS := $(patsubst %.c,%.opic,$(SRCS))
-LIB := libxenctrl.a libxenctrl-pic.a
-LIB += libxenctrl.so libxenctrl.so.$(MAJOR) libxenctrl.so.$(MAJOR).$(MINOR)
+LIB_BUILD_OBJS := $(patsubst %.c,%.o,$(BUILD_SRCS))
+PIC_BUILD_OBJS := $(patsubst %.c,%.opic,$(BUILD_SRCS))
+
+LIB := libxenctrl.a
+LIB += libxenctrl.so libxenctrl.so.$(MAJOR) libxenctrl.so.$(MAJOR).$(MINOR)
+
+LIB += libxenguest.a
+LIB += libxenguest.so libxenguest.so.$(MAJOR) libxenguest.so.$(MAJOR).$(MINOR)
all: build
build: check-for-zlib mk-symlinks
@@ -83,6 +94,11 @@ install: build
ln -sf libxenctrl.so.$(MAJOR) $(DESTDIR)/usr/$(LIBDIR)/libxenctrl.so
$(INSTALL_DATA) xenctrl.h $(DESTDIR)/usr/include/xen
+ $(INSTALL_PROG) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)/usr/$(LIBDIR)
+ $(INSTALL_DATA) libxenguest.a $(DESTDIR)/usr/$(LIBDIR)
+ ln -sf libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)/usr/$(LIBDIR)/libxenguest.so.$(MAJOR)
+ ln -sf libxenguest.so.$(MAJOR) $(DESTDIR)/usr/$(LIBDIR)/libxenguest.so
+
.PHONY: TAGS clean rpm install all
TAGS:
@@ -100,10 +116,9 @@ rpm: build
mv staging/i386/*.rpm .
rm -rf staging
-libxenctrl.a: $(LIB_OBJS)
- $(AR) rc $@ $^
+# libxenctrl
-libxenctrl-pic.a: $(PIC_OBJS)
+libxenctrl.a: $(LIB_OBJS)
$(AR) rc $@ $^
libxenctrl.so: libxenctrl.so.$(MAJOR)
@@ -112,6 +127,19 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR)
ln -sf $< $@
libxenctrl.so.$(MAJOR).$(MINOR): $(PIC_OBJS)
- $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenctrl.so.$(MAJOR) -shared -o $@ $^ -lz
+ $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenctrl.so.$(MAJOR) -shared -o $@ $^
+
+# libxenguest
+
+libxenguest.a: $(LIB_BUILD_OBJS)
+ $(AR) rc $@ $^
+
+libxenguest.so: libxenguest.so.$(MAJOR)
+ ln -sf $< $@
+libxenguest.so.$(MAJOR): libxenguest.so.$(MAJOR).$(MINOR)
+ ln -sf $< $@
+
+libxenguest.so.$(MAJOR).$(MINOR): $(PIC_BUILD_OBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenguest.so.$(MAJOR) -shared -o $@ $^ -lz -lxenctrl
-include $(DEPS)
diff --git a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c
index df4352de1c..9b67ad536e 100644
--- a/tools/libxc/xc_core.c
+++ b/tools/libxc/xc_core.c
@@ -1,4 +1,4 @@
-#include "xc_private.h"
+#include "xg_private.h"
#define ELFSIZE 32
#include "xc_elf.h"
#include <stdlib.h>
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
index 2b16659e9e..b1b4af0363 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -266,7 +266,7 @@ int xc_domain_memory_increase_reservation(int xc_handle,
int err;
unsigned int npages = mem_kb / (PAGE_SIZE/1024);
- err = do_dom_mem_op(xc_handle, MEMOP_increase_reservation, NULL,
+ err = xc_dom_mem_op(xc_handle, MEMOP_increase_reservation, NULL,
npages, 0, domid);
if (err == npages)
return 0;
diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c
index 45044c0735..2a21622374 100644
--- a/tools/libxc/xc_linux_build.c
+++ b/tools/libxc/xc_linux_build.c
@@ -2,7 +2,8 @@
* xc_linux_build.c
*/
-#include "xc_private.h"
+#include "xg_private.h"
+#include <xenctrl.h>
#if defined(__i386__)
#define ELFSIZE 32
@@ -340,7 +341,7 @@ static int setup_guest(int xc_handle,
unsigned long count, i;
start_info_t *start_info;
shared_info_t *shared_info;
- mmu_t *mmu = NULL;
+ xc_mmu_t *mmu = NULL;
int rc;
unsigned long nr_pt_pages;
@@ -490,7 +491,7 @@ static int setup_guest(int xc_handle,
}
}
- if ( (mmu = init_mmu_updates(xc_handle, dom)) == NULL )
+ if ( (mmu = xc_init_mmu_updates(xc_handle, dom)) == NULL )
goto error_out;
/* setup page tables */
@@ -520,9 +521,9 @@ static int setup_guest(int xc_handle,
page_array[physmap_pfn++]);
for ( count = 0; count < nr_pages; count++ )
{
- if ( add_mmu_update(xc_handle, mmu,
- (page_array[count] << PAGE_SHIFT) |
- MMU_MACHPHYS_UPDATE, count) )
+ if ( xc_add_mmu_update(xc_handle, mmu,
+ (page_array[count] << PAGE_SHIFT) |
+ MMU_MACHPHYS_UPDATE, count) )
{
munmap(physmap, PAGE_SIZE);
goto error_out;
@@ -602,7 +603,7 @@ static int setup_guest(int xc_handle,
munmap(shared_info, PAGE_SIZE);
/* Send the page update requests down to the hypervisor. */
- if ( finish_mmu_updates(xc_handle, mmu) )
+ if ( xc_finish_mmu_updates(xc_handle, mmu) )
goto error_out;
free(mmu);
@@ -676,7 +677,7 @@ int xc_linux_build(int xc_handle,
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
- if ( (do_dom0_op(xc_handle, &op) < 0) ||
+ if ( (xc_dom0_op(xc_handle, &op) < 0) ||
((u16)op.u.getdomaininfo.domain != domid) )
{
PERROR("Could not get info on domain");
@@ -793,7 +794,7 @@ int xc_linux_build(int xc_handle,
launch_op.u.setdomaininfo.ctxt = ctxt;
launch_op.cmd = DOM0_SETDOMAININFO;
- rc = do_dom0_op(xc_handle, &launch_op);
+ rc = xc_dom0_op(xc_handle, &launch_op);
return rc;
diff --git a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c
index 67d5607e77..4a9342c347 100644
--- a/tools/libxc/xc_linux_restore.c
+++ b/tools/libxc/xc_linux_restore.c
@@ -6,7 +6,12 @@
* Copyright (c) 2003, K A Fraser.
*/
-#include "xc_private.h"
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "xg_private.h"
+#include <xenctrl.h>
+
#include <xen/linux/suspend.h>
#define MAX_BATCH_SIZE 1024
@@ -89,7 +94,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
char *region_base;
- mmu_t *mmu = NULL;
+ xc_mmu_t *mmu = NULL;
/* used by debug verify code */
unsigned long buf[PAGE_SIZE/sizeof(unsigned long)];
@@ -132,7 +137,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
/* Get the domain's shared-info frame. */
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)dom;
- if (do_dom0_op(xc_handle, &op) < 0) {
+ if (xc_dom0_op(xc_handle, &op) < 0) {
ERR("Could not get information on new domain");
goto out;
}
@@ -158,7 +163,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
goto out;
}
- mmu = init_mmu_updates(xc_handle, dom);
+ mmu = xc_init_mmu_updates(xc_handle, dom);
if (mmu == NULL) {
ERR("Could not initialise for MMU updates");
goto out;
@@ -355,8 +360,9 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
}
}
- if ( add_mmu_update(xc_handle, mmu,
- (mfn<<PAGE_SHIFT) | MMU_MACHPHYS_UPDATE, pfn) )
+ if ( xc_add_mmu_update(xc_handle, mmu,
+ (mfn<<PAGE_SHIFT) | MMU_MACHPHYS_UPDATE,
+ pfn) )
{
printf("machpys mfn=%ld pfn=%ld\n",mfn,pfn);
goto out;
@@ -370,7 +376,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
DPRINTF("Received all pages\n");
- if ( finish_mmu_updates(xc_handle, mmu) )
+ if ( xc_finish_mmu_updates(xc_handle, mmu) )
goto out;
/*
@@ -388,14 +394,14 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
pin[nr_pins].mfn = pfn_to_mfn_table[i];
if ( ++nr_pins == MAX_PIN_BATCH )
{
- if ( do_mmuext_op(xc_handle, pin, nr_pins, dom) < 0 )
+ if ( xc_mmuext_op(xc_handle, pin, nr_pins, dom) < 0 )
goto out;
nr_pins = 0;
}
}
if ( (nr_pins != 0) &&
- (do_mmuext_op(xc_handle, pin, nr_pins, dom) < 0) )
+ (xc_mmuext_op(xc_handle, pin, nr_pins, dom) < 0) )
goto out;
DPRINTF("\b\b\b\b100%%\n");
@@ -435,7 +441,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
if ( count > 0 )
{
- if ( (rc = do_dom_mem_op( xc_handle,
+ if ( (rc = xc_dom_mem_op( xc_handle,
MEMOP_decrease_reservation,
pfntab, count, 0, dom )) <0 )
{
@@ -586,7 +592,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
op.u.setdomaininfo.domain = (domid_t)dom;
op.u.setdomaininfo.vcpu = 0;
op.u.setdomaininfo.ctxt = &ctxt;
- rc = do_dom0_op(xc_handle, &op);
+ rc = xc_dom0_op(xc_handle, &op);
if ( rc != 0 )
{
@@ -597,7 +603,7 @@ int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
DPRINTF("Domain ready to be unpaused\n");
op.cmd = DOM0_UNPAUSEDOMAIN;
op.u.unpausedomain.domain = (domid_t)dom;
- rc = do_dom0_op(xc_handle, &op);
+ rc = xc_dom0_op(xc_handle, &op);
if (rc == 0) {
/* Success: print the domain id. */
DPRINTF("DOM=%u\n", dom);
diff --git a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c
index 77349c88a3..f83d9a5481 100644
--- a/tools/libxc/xc_linux_save.c
+++ b/tools/libxc/xc_linux_save.c
@@ -7,11 +7,15 @@
*/
#include <inttypes.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
#include <sys/time.h>
-#include "xc_private.h"
+
+#include "xg_private.h"
+
#include <xen/linux/suspend.h>
#include <xen/io/domain_controller.h>
-#include <time.h>
#define BATCH_SIZE 1024 /* 1024 pages (4MB) at a time */
@@ -772,7 +776,7 @@ int xc_linux_save(int xc_handle, int io_fd, u32 dom)
goto out;
}
- if ( get_pfn_type_batch(xc_handle, dom, batch, pfn_type) ){
+ if ( xc_get_pfn_type_batch(xc_handle, dom, batch, pfn_type) ){
ERR("get_pfn_type_batch failed");
goto out;
}
diff --git a/tools/libxc/xc_load_aout9.c b/tools/libxc/xc_load_aout9.c
index bb747b9d8c..ba87dfe59f 100644
--- a/tools/libxc/xc_load_aout9.c
+++ b/tools/libxc/xc_load_aout9.c
@@ -1,5 +1,5 @@
-#include "xc_private.h"
+#include "xg_private.h"
#include "xc_aout9.h"
#if defined(__i386__)
diff --git a/tools/libxc/xc_load_bin.c b/tools/libxc/xc_load_bin.c
index 965ccd08da..975b8c5af7 100644
--- a/tools/libxc/xc_load_bin.c
+++ b/tools/libxc/xc_load_bin.c
@@ -66,7 +66,7 @@
* Free Software Foundation, Inc.
*/
-#include "xc_private.h"
+#include "xg_private.h"
#include <stdlib.h>
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
diff --git a/tools/libxc/xc_load_elf.c b/tools/libxc/xc_load_elf.c
index 90417fb2ca..581dfd582d 100644
--- a/tools/libxc/xc_load_elf.c
+++ b/tools/libxc/xc_load_elf.c
@@ -2,7 +2,7 @@
* xc_elf_load.c
*/
-#include "xc_private.h"
+#include "xg_private.h"
#if defined(__i386__)
#define ELFSIZE 32
diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c
index d05dbe9267..9914d9ade2 100644
--- a/tools/libxc/xc_private.c
+++ b/tools/libxc/xc_private.c
@@ -64,8 +64,8 @@ void *xc_map_foreign_range(int xc_handle, u32 dom,
/*******************/
/* NB: arr must be mlock'ed */
-int get_pfn_type_batch(int xc_handle,
- u32 dom, int num, unsigned long *arr)
+int xc_get_pfn_type_batch(int xc_handle,
+ u32 dom, int num, unsigned long *arr)
{
dom0_op_t op;
op.cmd = DOM0_GETPAGEFRAMEINFO2;
@@ -92,25 +92,40 @@ unsigned int get_pfn_type(int xc_handle,
return op.u.getpageframeinfo.type;
}
+int xc_mmuext_op(
+ int xc_handle,
+ struct mmuext_op *op,
+ unsigned int nr_ops,
+ domid_t dom)
+{
+ privcmd_hypercall_t hypercall;
+ long ret = -EINVAL;
+ hypercall.op = __HYPERVISOR_mmuext_op;
+ hypercall.arg[0] = (unsigned long)op;
+ hypercall.arg[1] = (unsigned long)nr_ops;
+ hypercall.arg[2] = (unsigned long)0;
+ hypercall.arg[3] = (unsigned long)dom;
-/*******************/
-
-int pin_table(
- int xc_handle, unsigned int type, unsigned long mfn, domid_t dom)
-{
- struct mmuext_op op;
+ if ( mlock(op, nr_ops*sizeof(*op)) != 0 )
+ {
+ PERROR("Could not lock memory for Xen hypercall");
+ goto out1;
+ }
- op.cmd = type;
- op.mfn = mfn;
+ if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
+ {
+ fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ " rebuild the user-space tool set?\n",ret,errno);
+ }
- if ( do_mmuext_op(xc_handle, &op, 1, dom) < 0 )
- return 1;
+ safe_munlock(op, nr_ops*sizeof(*op));
- return 0;
-}
+ out1:
+ return ret;
+}
-static int flush_mmu_updates(int xc_handle, mmu_t *mmu)
+static int flush_mmu_updates(int xc_handle, xc_mmu_t *mmu)
{
int err = 0;
privcmd_hypercall_t hypercall;
@@ -145,9 +160,9 @@ static int flush_mmu_updates(int xc_handle, mmu_t *mmu)
return err;
}
-mmu_t *init_mmu_updates(int xc_handle, domid_t dom)
+xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom)
{
- mmu_t *mmu = malloc(sizeof(mmu_t));
+ xc_mmu_t *mmu = malloc(sizeof(xc_mmu_t));
if ( mmu == NULL )
return mmu;
mmu->idx = 0;
@@ -155,8 +170,8 @@ mmu_t *init_mmu_updates(int xc_handle, domid_t dom)
return mmu;
}
-int add_mmu_update(int xc_handle, mmu_t *mmu,
- unsigned long ptr, unsigned long val)
+int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
+ unsigned long ptr, unsigned long val)
{
mmu->updates[mmu->idx].ptr = ptr;
mmu->updates[mmu->idx].val = val;
@@ -167,11 +182,48 @@ int add_mmu_update(int xc_handle, mmu_t *mmu,
return 0;
}
-int finish_mmu_updates(int xc_handle, mmu_t *mmu)
+int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu)
{
return flush_mmu_updates(xc_handle, mmu);
}
+int xc_dom_mem_op(int xc_handle,
+ unsigned int memop,
+ unsigned int *extent_list,
+ unsigned int nr_extents,
+ unsigned int extent_order,
+ domid_t domid)
+{
+ privcmd_hypercall_t hypercall;
+ long ret = -EINVAL;
+
+ hypercall.op = __HYPERVISOR_dom_mem_op;
+ hypercall.arg[0] = (unsigned long)memop;
+ hypercall.arg[1] = (unsigned long)extent_list;
+ hypercall.arg[2] = (unsigned long)nr_extents;
+ hypercall.arg[3] = (unsigned long)extent_order;
+ hypercall.arg[4] = (unsigned long)domid;
+
+ if ( (extent_list != NULL) &&
+ (mlock(extent_list, nr_extents*sizeof(unsigned long)) != 0) )
+ {
+ PERROR("Could not lock memory for Xen hypercall");
+ goto out1;
+ }
+
+ if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
+ {
+ fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
+ " rebuild the user-space tool set?\n",ret,errno);
+ }
+
+ if ( extent_list != NULL )
+ safe_munlock(extent_list, nr_extents*sizeof(unsigned long));
+
+ out1:
+ return ret;
+}
+
long long xc_domain_get_cpu_usage( int xc_handle, domid_t domid, int vcpu )
{
@@ -190,19 +242,6 @@ long long xc_domain_get_cpu_usage( int xc_handle, domid_t domid, int vcpu )
}
-/* This is shared between save and restore, and may generally be useful. */
-unsigned long csum_page (void * page)
-{
- int i;
- unsigned long *p = page;
- unsigned long long sum=0;
-
- for ( i = 0; i < (PAGE_SIZE/sizeof(unsigned long)); i++ )
- sum += p[i];
-
- return sum ^ (sum>>32);
-}
-
unsigned long xc_get_m2p_start_mfn ( int xc_handle )
{
unsigned long mfn;
@@ -332,53 +371,6 @@ unsigned long xc_get_filesz(int fd)
return sz;
}
-char *xc_read_kernel_image(const char *filename, unsigned long *size)
-{
- int kernel_fd = -1;
- gzFile kernel_gfd = NULL;
- char *image = NULL;
- unsigned int bytes;
-
- if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
- {
- PERROR("Could not open kernel image");
- goto out;
- }
-
- if ( (*size = xc_get_filesz(kernel_fd)) == 0 )
- {
- PERROR("Could not read kernel image");
- goto out;
- }
-
- if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
- {
- PERROR("Could not allocate decompression state for state file");
- goto out;
- }
-
- if ( (image = malloc(*size)) == NULL )
- {
- PERROR("Could not allocate memory for kernel image");
- goto out;
- }
-
- if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
- {
- PERROR("Error reading kernel image, could not"
- " read the whole image (%d != %ld).", bytes, *size);
- free(image);
- image = NULL;
- }
-
- out:
- if ( kernel_gfd != NULL )
- gzclose(kernel_gfd);
- else if ( kernel_fd >= 0 )
- close(kernel_fd);
- return image;
-}
-
void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
int xch, u32 dom, unsigned long *parray,
unsigned long vstart)
diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h
index ef0187ba3d..802ea47201 100644
--- a/tools/libxc/xc_private.h
+++ b/tools/libxc/xc_private.h
@@ -1,124 +1,26 @@
-#ifndef __XC_PRIVATE_H__
-#define __XC_PRIVATE_H__
+#ifndef XC_PRIVATE_H
+#define XC_PRIVATE_H
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
+#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/ioctl.h>
-#include <errno.h>
-#include <string.h>
#include "xenctrl.h"
#include <xen/linux/privcmd.h>
-#define _PAGE_PRESENT 0x001
-#define _PAGE_RW 0x002
-#define _PAGE_USER 0x004
-#define _PAGE_PWT 0x008
-#define _PAGE_PCD 0x010
-#define _PAGE_ACCESSED 0x020
-#define _PAGE_DIRTY 0x040
-#define _PAGE_PAT 0x080
-#define _PAGE_PSE 0x080
-#define _PAGE_GLOBAL 0x100
-
-#if defined(__i386__)
-#define L1_PAGETABLE_SHIFT 12
-#define L2_PAGETABLE_SHIFT 22
-#define L1_PAGETABLE_SHIFT_PAE 12
-#define L2_PAGETABLE_SHIFT_PAE 21
-#define L3_PAGETABLE_SHIFT_PAE 30
-#elif defined(__x86_64__)
-#define L1_PAGETABLE_SHIFT 12
-#define L2_PAGETABLE_SHIFT 21
-#define L3_PAGETABLE_SHIFT 30
-#define L4_PAGETABLE_SHIFT 39
-#endif
-
-#if defined(__i386__)
-#define ENTRIES_PER_L1_PAGETABLE 1024
-#define ENTRIES_PER_L2_PAGETABLE 1024
-#define L1_PAGETABLE_ENTRIES_PAE 512
-#define L2_PAGETABLE_ENTRIES_PAE 512
-#define L3_PAGETABLE_ENTRIES_PAE 4
-#elif defined(__x86_64__)
-#define L1_PAGETABLE_ENTRIES 512
-#define L2_PAGETABLE_ENTRIES 512
-#define L3_PAGETABLE_ENTRIES 512
-#define L4_PAGETABLE_ENTRIES 512
-#endif
-
#define PAGE_SHIFT XC_PAGE_SHIFT
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
-typedef u32 l1_pgentry_32_t;
-typedef u32 l2_pgentry_32_t;
-typedef u64 l1_pgentry_64_t;
-typedef u64 l2_pgentry_64_t;
-typedef u64 l3_pgentry_64_t;
-typedef unsigned long l1_pgentry_t;
-typedef unsigned long l2_pgentry_t;
-#if defined(__x86_64__)
-typedef unsigned long l3_pgentry_t;
-typedef unsigned long l4_pgentry_t;
-#endif
-
-#if defined(__i386__)
-#define l1_table_offset(_a) \
- (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
-#define l2_table_offset(_a) \
- ((_a) >> L2_PAGETABLE_SHIFT)
-#define l1_table_offset_pae(_a) \
- (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1))
-#define l2_table_offset_pae(_a) \
- (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1))
-#define l3_table_offset_pae(_a) \
- (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1))
-#elif defined(__x86_64__)
-#define l1_table_offset(_a) \
- (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
-#define l2_table_offset(_a) \
- (((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1))
-#define l3_table_offset(_a) \
- (((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1))
-#define l4_table_offset(_a) \
- (((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1))
-#endif
-
-struct domain_setup_info
-{
- unsigned long v_start;
- unsigned long v_end;
- unsigned long v_kernstart;
- unsigned long v_kernend;
- unsigned long v_kernentry;
-
- unsigned int load_symtab;
- unsigned int pae_kernel;
- unsigned long symtab_addr;
- unsigned long symtab_len;
-};
-
-typedef int (*parseimagefunc)(char *image, unsigned long image_size,
- struct domain_setup_info *dsi);
-typedef int (*loadimagefunc)(char *image, unsigned long image_size, int xch,
- u32 dom, unsigned long *parray,
- struct domain_setup_info *dsi);
-
-struct load_funcs
-{
- parseimagefunc parseimage;
- loadimagefunc loadimage;
-};
-
#define ERROR(_m, _a...) \
do { \
int __saved_errno = errno; \
@@ -186,97 +88,6 @@ static inline int do_dom0_op(int xc_handle, dom0_op_t *op)
return ret;
}
-static inline int do_dom_mem_op(int xc_handle,
- unsigned int memop,
- unsigned int *extent_list,
- unsigned int nr_extents,
- unsigned int extent_order,
- domid_t domid)
-{
- privcmd_hypercall_t hypercall;
- long ret = -EINVAL;
-
- hypercall.op = __HYPERVISOR_dom_mem_op;
- hypercall.arg[0] = (unsigned long)memop;
- hypercall.arg[1] = (unsigned long)extent_list;
- hypercall.arg[2] = (unsigned long)nr_extents;
- hypercall.arg[3] = (unsigned long)extent_order;
- hypercall.arg[4] = (unsigned long)domid;
-
- if ( (extent_list != NULL) &&
- (mlock(extent_list, nr_extents*sizeof(unsigned long)) != 0) )
- {
- PERROR("Could not lock memory for Xen hypercall");
- goto out1;
- }
-
- if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
- {
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
- " rebuild the user-space tool set?\n",ret,errno);
- }
-
- if ( extent_list != NULL )
- safe_munlock(extent_list, nr_extents*sizeof(unsigned long));
-
- out1:
- return ret;
-}
-
-static inline int do_mmuext_op(
- int xc_handle,
- struct mmuext_op *op,
- unsigned int nr_ops,
- domid_t dom)
-{
- privcmd_hypercall_t hypercall;
- long ret = -EINVAL;
-
- hypercall.op = __HYPERVISOR_mmuext_op;
- hypercall.arg[0] = (unsigned long)op;
- hypercall.arg[1] = (unsigned long)nr_ops;
- hypercall.arg[2] = (unsigned long)0;
- hypercall.arg[3] = (unsigned long)dom;
-
- if ( mlock(op, nr_ops*sizeof(*op)) != 0 )
- {
- PERROR("Could not lock memory for Xen hypercall");
- goto out1;
- }
-
- if ( (ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 )
- {
- fprintf(stderr, "Dom_mem operation failed (rc=%ld errno=%d)-- need to"
- " rebuild the user-space tool set?\n",ret,errno);
- }
-
- safe_munlock(op, nr_ops*sizeof(*op));
-
- out1:
- return ret;
-}
-
-
-/*
- * PFN mapping.
- */
-int get_pfn_type_batch(int xc_handle, u32 dom, int num, unsigned long *arr);
-unsigned long csum_page (void * page);
-
-/*
- * MMU updates.
- */
-#define MAX_MMU_UPDATES 1024
-typedef struct {
- mmu_update_t updates[MAX_MMU_UPDATES];
- int idx;
- domid_t subject;
-} mmu_t;
-mmu_t *init_mmu_updates(int xc_handle, domid_t dom);
-int add_mmu_update(int xc_handle, mmu_t *mmu,
- unsigned long ptr, unsigned long val);
-int finish_mmu_updates(int xc_handle, mmu_t *mmu);
-
/*
* ioctl-based mfn mapping interface
@@ -296,38 +107,4 @@ typedef struct privcmd_mmap {
} privcmd_mmap_t;
*/
-#define mfn_mapper_queue_size 128
-
-typedef struct mfn_mapper {
- int xc_handle;
- int size;
- int prot;
- int error;
- int max_queue_size;
- void * addr;
- privcmd_mmap_t ioctl;
-
-} mfn_mapper_t;
-
-unsigned long xc_get_m2p_start_mfn (int xc_handle);
-
-int xc_copy_to_domain_page(int xc_handle, u32 domid,
- unsigned long dst_pfn, void *src_page);
-
-unsigned long xc_get_filesz(int fd);
-
-char *xc_read_kernel_image(const char *filename, unsigned long *size);
-
-void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
- int xch, u32 dom, unsigned long *parray,
- unsigned long vstart);
-
-int pin_table(int xc_handle, unsigned int type, unsigned long mfn,
- domid_t dom);
-
-/* image loading */
-int probe_elf(char *image, unsigned long image_size, struct load_funcs *funcs);
-int probe_bin(char *image, unsigned long image_size, struct load_funcs *funcs);
-int probe_aout9(char *image, unsigned long image_size, struct load_funcs *funcs);
-
#endif /* __XC_PRIVATE_H__ */
diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c
index f10cc8391c..4a0101e7a2 100644
--- a/tools/libxc/xc_vmx_build.c
+++ b/tools/libxc/xc_vmx_build.c
@@ -3,7 +3,7 @@
*/
#include <stddef.h>
-#include "xc_private.h"
+#include "xg_private.h"
#define ELFSIZE 32
#include "xc_elf.h"
#include <stdlib.h>
@@ -243,7 +243,7 @@ static int setup_guest(int xc_handle,
shared_info_t *shared_info;
struct linux_boot_params * boot_paramsp;
__u16 * boot_gdtp;
- mmu_t *mmu = NULL;
+ xc_mmu_t *mmu = NULL;
int rc;
unsigned long nr_pt_pages;
@@ -358,7 +358,7 @@ static int setup_guest(int xc_handle,
}
}
- if ( (mmu = init_mmu_updates(xc_handle, dom)) == NULL )
+ if ( (mmu = xc_init_mmu_updates(xc_handle, dom)) == NULL )
goto error_out;
#ifdef __i386__
@@ -459,9 +459,9 @@ static int setup_guest(int xc_handle,
/* Write the machine->phys table entries. */
for ( count = 0; count < nr_pages; count++ )
{
- if ( add_mmu_update(xc_handle, mmu,
- (page_array[count] << PAGE_SHIFT) |
- MMU_MACHPHYS_UPDATE, count) )
+ if ( xc_add_mmu_update(xc_handle, mmu,
+ (page_array[count] << PAGE_SHIFT) |
+ MMU_MACHPHYS_UPDATE, count) )
goto error_out;
}
@@ -587,7 +587,7 @@ static int setup_guest(int xc_handle,
#endif
/* Send the page update requests down to the hypervisor. */
- if ( finish_mmu_updates(xc_handle, mmu) )
+ if ( xc_finish_mmu_updates(xc_handle, mmu) )
goto error_out;
free(mmu);
@@ -708,7 +708,7 @@ int xc_vmx_build(int xc_handle,
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
- if ( (do_dom0_op(xc_handle, &op) < 0) ||
+ if ( (xc_dom0_op(xc_handle, &op) < 0) ||
((u16)op.u.getdomaininfo.domain != domid) )
{
PERROR("Could not get info on domain");
@@ -789,7 +789,7 @@ int xc_vmx_build(int xc_handle,
launch_op.u.setdomaininfo.ctxt = ctxt;
launch_op.cmd = DOM0_SETDOMAININFO;
- rc = do_dom0_op(xc_handle, &launch_op);
+ rc = xc_dom0_op(xc_handle, &launch_op);
return rc;
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 5206a51779..9f2c876fc8 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -6,8 +6,8 @@
* Copyright (c) 2003-2004, K A Fraser.
*/
-#ifndef __XC_H__
-#define __XC_H__
+#ifndef XENCTRL_H
+#define XENCTRL_H
#include <stdint.h>
@@ -254,63 +254,6 @@ int xc_shadow_control(int xc_handle,
unsigned long pages,
xc_shadow_control_stats_t *stats);
-
-#define XCFLAGS_VERBOSE 1
-#define XCFLAGS_LIVE 2
-#define XCFLAGS_DEBUG 4
-#define XCFLAGS_CONFIGURE 8
-
-struct XcIOContext;
-
-/**
- * This function will save a domain running Linux.
- *
- * @parm xc_handle a handle to an open hypervisor interface
- * @parm fd the file descriptor to save a domain to
- * @parm dom the id of the domain
- * @return 0 on success, -1 on failure
- */
-int xc_linux_save(int xc_handle, int fd, u32 dom);
-
-/**
- * This function will restore a saved domain running Linux.
- *
- * @parm xc_handle a handle to an open hypervisor interface
- * @parm fd the file descriptor to restore a domain from
- * @parm dom the id of the domain
- * @parm nr_pfns the number of pages
- * @parm store_evtchn the store event channel for this domain to use
- * @parm store_mfn returned with the mfn of the store page
- * @return 0 on success, -1 on failure
- */
-int xc_linux_restore(int xc_handle, int io_fd, u32 dom, unsigned long nr_pfns,
- unsigned int store_evtchn, unsigned long *store_mfn);
-
-int xc_linux_build(int xc_handle,
- u32 domid,
- const char *image_name,
- const char *ramdisk_name,
- const char *cmdline,
- unsigned int control_evtchn,
- unsigned long flags,
- unsigned int vcpus,
- unsigned int store_evtchn,
- unsigned long *store_mfn);
-
-struct mem_map;
-int xc_vmx_build(int xc_handle,
- u32 domid,
- int memsize,
- const char *image_name,
- struct mem_map *memmap,
- const char *ramdisk_name,
- const char *cmdline,
- unsigned int control_evtchn,
- unsigned long flags,
- unsigned int vcpus,
- unsigned int store_evtchn,
- unsigned long *store_mfn);
-
int xc_bvtsched_global_set(int xc_handle,
unsigned long ctx_allow);
@@ -484,6 +427,16 @@ int xc_get_pfn_list(int xc_handle, u32 domid, unsigned long *pfn_buf,
int xc_ia64_get_pfn_list(int xc_handle, u32 domid, unsigned long *pfn_buf,
unsigned int start_page, unsigned int nr_pages);
+int xc_mmuext_op(int xc_handle, struct mmuext_op *op, unsigned int nr_ops,
+ domid_t dom);
+
+int xc_dom_mem_op(int xc_handle, unsigned int memop, unsigned int *extent_list,
+ unsigned int nr_extents, unsigned int extent_order,
+ domid_t domid);
+
+int xc_get_pfn_type_batch(int xc_handle, u32 dom, int num, unsigned long *arr);
+
+
/*\
* GRANT TABLE FUNCTIONS
\*/
@@ -555,4 +508,19 @@ int xc_dom0_op(int xc_handle, dom0_op_t *op);
*/
long xc_init_store(int xc_handle, int remote_port);
-#endif /* __XC_H__ */
+/*
+ * MMU updates.
+ */
+#define MAX_MMU_UPDATES 1024
+struct xc_mmu {
+ mmu_update_t updates[MAX_MMU_UPDATES];
+ int idx;
+ domid_t subject;
+};
+typedef struct xc_mmu xc_mmu_t;
+xc_mmu_t *xc_init_mmu_updates(int xc_handle, domid_t dom);
+int xc_add_mmu_update(int xc_handle, xc_mmu_t *mmu,
+ unsigned long ptr, unsigned long val);
+int xc_finish_mmu_updates(int xc_handle, xc_mmu_t *mmu);
+
+#endif
diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h
new file mode 100644
index 0000000000..861a621d85
--- /dev/null
+++ b/tools/libxc/xenguest.h
@@ -0,0 +1,66 @@
+/******************************************************************************
+ * xenguest.h
+ *
+ * A library for guest domain management in Xen.
+ *
+ * Copyright (c) 2003-2004, K A Fraser.
+ */
+
+#ifndef XENBUILD_H
+#define XENBUILD_H
+
+#define XCFLAGS_VERBOSE 1
+#define XCFLAGS_LIVE 2
+#define XCFLAGS_DEBUG 4
+#define XCFLAGS_CONFIGURE 8
+
+/**
+ * This function will save a domain running Linux.
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm fd the file descriptor to save a domain to
+ * @parm dom the id of the domain
+ * @return 0 on success, -1 on failure
+ */
+int xc_linux_save(int xc_handle, int fd, uint32_t dom);
+
+/**
+ * This function will restore a saved domain running Linux.
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm fd the file descriptor to restore a domain from
+ * @parm dom the id of the domain
+ * @parm nr_pfns the number of pages
+ * @parm store_evtchn the store event channel for this domain to use
+ * @parm store_mfn returned with the mfn of the store page
+ * @return 0 on success, -1 on failure
+ */
+int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long nr_pfns,
+ unsigned int store_evtchn, unsigned long *store_mfn);
+
+int xc_linux_build(int xc_handle,
+ uint32_t domid,
+ const char *image_name,
+ const char *ramdisk_name,
+ const char *cmdline,
+ unsigned int control_evtchn,
+ unsigned long flags,
+ unsigned int vcpus,
+ unsigned int store_evtchn,
+ unsigned long *store_mfn);
+
+struct mem_map;
+int xc_vmx_build(int xc_handle,
+ uint32_t domid,
+ int memsize,
+ const char *image_name,
+ struct mem_map *memmap,
+ const char *ramdisk_name,
+ const char *cmdline,
+ unsigned int control_evtchn,
+ unsigned long flags,
+ unsigned int vcpus,
+ unsigned int store_evtchn,
+ unsigned long *store_mfn);
+
+#endif
diff --git a/tools/libxc/xg_private.c b/tools/libxc/xg_private.c
new file mode 100644
index 0000000000..a5b81fdd35
--- /dev/null
+++ b/tools/libxc/xg_private.c
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * xg_private.c
+ *
+ * Helper functions for the rest of the library.
+ */
+
+#include <stdlib.h>
+#include <zlib.h>
+
+#include "xg_private.h"
+
+char *xc_read_kernel_image(const char *filename, unsigned long *size)
+{
+ int kernel_fd = -1;
+ gzFile kernel_gfd = NULL;
+ char *image = NULL;
+ unsigned int bytes;
+
+ if ( (kernel_fd = open(filename, O_RDONLY)) < 0 )
+ {
+ PERROR("Could not open kernel image");
+ goto out;
+ }
+
+ if ( (*size = xc_get_filesz(kernel_fd)) == 0 )
+ {
+ PERROR("Could not read kernel image");
+ goto out;
+ }
+
+ if ( (kernel_gfd = gzdopen(kernel_fd, "rb")) == NULL )
+ {
+ PERROR("Could not allocate decompression state for state file");
+ goto out;
+ }
+
+ if ( (image = malloc(*size)) == NULL )
+ {
+ PERROR("Could not allocate memory for kernel image");
+ goto out;
+ }
+
+ if ( (bytes = gzread(kernel_gfd, image, *size)) != *size )
+ {
+ PERROR("Error reading kernel image, could not"
+ " read the whole image (%d != %ld).", bytes, *size);
+ free(image);
+ image = NULL;
+ }
+
+ out:
+ if ( kernel_gfd != NULL )
+ gzclose(kernel_gfd);
+ else if ( kernel_fd >= 0 )
+ close(kernel_fd);
+ return image;
+}
+
+/*******************/
+
+int pin_table(
+ int xc_handle, unsigned int type, unsigned long mfn, domid_t dom)
+{
+ struct mmuext_op op;
+
+ op.cmd = type;
+ op.mfn = mfn;
+
+ if ( xc_mmuext_op(xc_handle, &op, 1, dom) < 0 )
+ return 1;
+
+ return 0;
+}
+
+/* This is shared between save and restore, and may generally be useful. */
+unsigned long csum_page (void * page)
+{
+ int i;
+ unsigned long *p = page;
+ unsigned long long sum=0;
+
+ for ( i = 0; i < (PAGE_SIZE/sizeof(unsigned long)); i++ )
+ sum += p[i];
+
+ return sum ^ (sum>>32);
+}
diff --git a/tools/libxc/xg_private.h b/tools/libxc/xg_private.h
new file mode 100644
index 0000000000..f48ae0fba7
--- /dev/null
+++ b/tools/libxc/xg_private.h
@@ -0,0 +1,170 @@
+#ifndef XG_PRIVATE_H
+#define XG_PRIVATE_H
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "xenctrl.h"
+
+#include <xen/linux/privcmd.h>
+
+char *xc_read_kernel_image(const char *filename, unsigned long *size);
+unsigned long csum_page (void * page);
+
+#define _PAGE_PRESENT 0x001
+#define _PAGE_RW 0x002
+#define _PAGE_USER 0x004
+#define _PAGE_PWT 0x008
+#define _PAGE_PCD 0x010
+#define _PAGE_ACCESSED 0x020
+#define _PAGE_DIRTY 0x040
+#define _PAGE_PAT 0x080
+#define _PAGE_PSE 0x080
+#define _PAGE_GLOBAL 0x100
+
+#if defined(__i386__)
+#define L1_PAGETABLE_SHIFT 12
+#define L2_PAGETABLE_SHIFT 22
+#define L1_PAGETABLE_SHIFT_PAE 12
+#define L2_PAGETABLE_SHIFT_PAE 21
+#define L3_PAGETABLE_SHIFT_PAE 30
+#elif defined(__x86_64__)
+#define L1_PAGETABLE_SHIFT 12
+#define L2_PAGETABLE_SHIFT 21
+#define L3_PAGETABLE_SHIFT 30
+#define L4_PAGETABLE_SHIFT 39
+#endif
+
+#if defined(__i386__)
+#define ENTRIES_PER_L1_PAGETABLE 1024
+#define ENTRIES_PER_L2_PAGETABLE 1024
+#define L1_PAGETABLE_ENTRIES_PAE 512
+#define L2_PAGETABLE_ENTRIES_PAE 512
+#define L3_PAGETABLE_ENTRIES_PAE 4
+#elif defined(__x86_64__)
+#define L1_PAGETABLE_ENTRIES 512
+#define L2_PAGETABLE_ENTRIES 512
+#define L3_PAGETABLE_ENTRIES 512
+#define L4_PAGETABLE_ENTRIES 512
+#endif
+
+#define PAGE_SHIFT XC_PAGE_SHIFT
+#define PAGE_SIZE (1UL << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+
+typedef u32 l1_pgentry_32_t;
+typedef u32 l2_pgentry_32_t;
+typedef u64 l1_pgentry_64_t;
+typedef u64 l2_pgentry_64_t;
+typedef u64 l3_pgentry_64_t;
+typedef unsigned long l1_pgentry_t;
+typedef unsigned long l2_pgentry_t;
+#if defined(__x86_64__)
+typedef unsigned long l3_pgentry_t;
+typedef unsigned long l4_pgentry_t;
+#endif
+
+#if defined(__i386__)
+#define l1_table_offset(_a) \
+ (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
+#define l2_table_offset(_a) \
+ ((_a) >> L2_PAGETABLE_SHIFT)
+#define l1_table_offset_pae(_a) \
+ (((_a) >> L1_PAGETABLE_SHIFT_PAE) & (L1_PAGETABLE_ENTRIES_PAE - 1))
+#define l2_table_offset_pae(_a) \
+ (((_a) >> L2_PAGETABLE_SHIFT_PAE) & (L2_PAGETABLE_ENTRIES_PAE - 1))
+#define l3_table_offset_pae(_a) \
+ (((_a) >> L3_PAGETABLE_SHIFT_PAE) & (L3_PAGETABLE_ENTRIES_PAE - 1))
+#elif defined(__x86_64__)
+#define l1_table_offset(_a) \
+ (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
+#define l2_table_offset(_a) \
+ (((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1))
+#define l3_table_offset(_a) \
+ (((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1))
+#define l4_table_offset(_a) \
+ (((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1))
+#endif
+
+#define ERROR(_m, _a...) \
+do { \
+ int __saved_errno = errno; \
+ fprintf(stderr, "ERROR: " _m "\n" , ## _a ); \
+ errno = __saved_errno; \
+} while (0)
+
+
+#define PERROR(_m, _a...) \
+do { \
+ int __saved_errno = errno; \
+ fprintf(stderr, "ERROR: " _m " (%d = %s)\n" , ## _a , \
+ __saved_errno, strerror(__saved_errno)); \
+ errno = __saved_errno; \
+} while (0)
+
+
+struct domain_setup_info
+{
+ unsigned long v_start;
+ unsigned long v_end;
+ unsigned long v_kernstart;
+ unsigned long v_kernend;
+ unsigned long v_kernentry;
+
+ unsigned int load_symtab;
+ unsigned int pae_kernel;
+ unsigned long symtab_addr;
+ unsigned long symtab_len;
+};
+
+typedef int (*parseimagefunc)(char *image, unsigned long image_size,
+ struct domain_setup_info *dsi);
+typedef int (*loadimagefunc)(char *image, unsigned long image_size, int xch,
+ u32 dom, unsigned long *parray,
+ struct domain_setup_info *dsi);
+
+struct load_funcs
+{
+ parseimagefunc parseimage;
+ loadimagefunc loadimage;
+};
+
+#define mfn_mapper_queue_size 128
+
+typedef struct mfn_mapper {
+ int xc_handle;
+ int size;
+ int prot;
+ int error;
+ int max_queue_size;
+ void * addr;
+ privcmd_mmap_t ioctl;
+
+} mfn_mapper_t;
+
+unsigned long xc_get_m2p_start_mfn (int xc_handle);
+
+int xc_copy_to_domain_page(int xc_handle, u32 domid,
+ unsigned long dst_pfn, void *src_page);
+
+unsigned long xc_get_filesz(int fd);
+
+void xc_map_memcpy(unsigned long dst, char *src, unsigned long size,
+ int xch, u32 dom, unsigned long *parray,
+ unsigned long vstart);
+
+int pin_table(int xc_handle, unsigned int type, unsigned long mfn,
+ domid_t dom);
+
+/* image loading */
+int probe_elf(char *image, unsigned long image_size, struct load_funcs *funcs);
+int probe_bin(char *image, unsigned long image_size, struct load_funcs *funcs);
+int probe_aout9(char *image, unsigned long image_size, struct load_funcs *funcs);
+
+#endif
+
diff --git a/tools/python/setup.py b/tools/python/setup.py
index 3b716e197b..82ff6e1662 100644
--- a/tools/python/setup.py
+++ b/tools/python/setup.py
@@ -17,7 +17,7 @@ library_dirs = [ XEN_ROOT + "/tools/libxc",
XEN_ROOT + "/tools/xenstore",
]
-libraries = [ "xenctrl", "xenstore" ]
+libraries = [ "xenctrl", "xenguest", "xenstore" ]
xc = Extension("xc",
extra_compile_args = extra_compile_args,
diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c
index 027ac2a223..871051f4af 100644
--- a/tools/python/xen/lowlevel/xc/xc.c
+++ b/tools/python/xen/lowlevel/xc/xc.c
@@ -6,6 +6,7 @@
#include <Python.h>
#include <xenctrl.h>
+#include <xenguest.h>
#include <zlib.h>
#include <fcntl.h>
#include <netinet/in.h>
diff --git a/tools/xcutils/Makefile b/tools/xcutils/Makefile
index 4397dbbf8f..77343b71e8 100644
--- a/tools/xcutils/Makefile
+++ b/tools/xcutils/Makefile
@@ -30,7 +30,7 @@ PROG_DEP = .*.d
PROGRAMS = xc_restore xc_save
-LDLIBS = -L$(XEN_LIBXC) -lxenctrl
+LDLIBS = -L$(XEN_LIBXC) -lxenguest -lxenctrl
.PHONY: all
all: build
diff --git a/tools/xcutils/xc_restore.c b/tools/xcutils/xc_restore.c
index e3d00aa5c1..c5d3c84c4c 100644
--- a/tools/xcutils/xc_restore.c
+++ b/tools/xcutils/xc_restore.c
@@ -7,11 +7,12 @@
*
*/
+#include <err.h>
#include <stdlib.h>
+#include <stdint.h>
#include <stdio.h>
-#include <err.h>
-#include <xenctrl.h>
+#include <xenguest.h>
int
main(int argc, char **argv)
diff --git a/tools/xcutils/xc_save.c b/tools/xcutils/xc_save.c
index d2b2e96be9..37c0bf17d4 100644
--- a/tools/xcutils/xc_save.c
+++ b/tools/xcutils/xc_save.c
@@ -7,11 +7,12 @@
*
*/
+#include <err.h>
#include <stdlib.h>
+#include <stdint.h>
#include <stdio.h>
-#include <err.h>
-#include <xenctrl.h>
+#include <xenguest.h>
int
main(int argc, char **argv)