diff options
author | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-08-25 00:51:20 +0000 |
---|---|---|
committer | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-08-25 00:51:20 +0000 |
commit | acc63faffa3cdefd9bd5f6e099971b4fcdae436b (patch) | |
tree | 826e7457f143456e94b597a2cdd175d1df4d726c /tools | |
parent | 60eb66351321ad80bf3356e2e35aeced44522a7a (diff) | |
download | xen-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/Makefile | 80 | ||||
-rw-r--r-- | tools/libxc/xc_core.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_domain.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_linux_build.c | 19 | ||||
-rw-r--r-- | tools/libxc/xc_linux_restore.c | 30 | ||||
-rw-r--r-- | tools/libxc/xc_linux_save.c | 10 | ||||
-rw-r--r-- | tools/libxc/xc_load_aout9.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_load_bin.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_load_elf.c | 2 | ||||
-rw-r--r-- | tools/libxc/xc_private.c | 152 | ||||
-rw-r--r-- | tools/libxc/xc_private.h | 229 | ||||
-rw-r--r-- | tools/libxc/xc_vmx_build.c | 18 | ||||
-rw-r--r-- | tools/libxc/xenctrl.h | 88 | ||||
-rw-r--r-- | tools/libxc/xenguest.h | 66 | ||||
-rw-r--r-- | tools/libxc/xg_private.c | 86 | ||||
-rw-r--r-- | tools/libxc/xg_private.h | 170 | ||||
-rw-r--r-- | tools/python/setup.py | 2 | ||||
-rw-r--r-- | tools/python/xen/lowlevel/xc/xc.c | 1 | ||||
-rw-r--r-- | tools/xcutils/Makefile | 2 | ||||
-rw-r--r-- | tools/xcutils/xc_restore.c | 5 | ||||
-rw-r--r-- | tools/xcutils/xc_save.c | 5 |
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) |