aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--extras/mini-os/Config.mk5
-rw-r--r--extras/mini-os/Makefile2
-rw-r--r--extras/mini-os/arch/ia64/mm.c8
-rw-r--r--extras/mini-os/include/lib.h1
-rw-r--r--extras/mini-os/include/mm.h3
-rw-r--r--extras/mini-os/include/x86/arch_mm.h5
-rw-r--r--extras/mini-os/lib/sys.c67
-rw-r--r--tools/libxc/Makefile8
-rw-r--r--tools/libxc/xc_core.c18
-rw-r--r--tools/libxc/xc_minios.c17
-rw-r--r--xen/common/libelf/libelf-private.h2
11 files changed, 62 insertions, 74 deletions
diff --git a/extras/mini-os/Config.mk b/extras/mini-os/Config.mk
index 1eb68d2f4b..15f7ed832c 100644
--- a/extras/mini-os/Config.mk
+++ b/extras/mini-os/Config.mk
@@ -41,10 +41,7 @@ include $(MINI-OS_ROOT)/$(TARGET_ARCH_DIR)/arch.mk
extra_incl := $(foreach dir,$(EXTRA_INC),-I$(MINI-OS_ROOT)/include/$(dir))
DEF_CPPFLAGS += -I$(MINI-OS_ROOT)/include
-
-ifeq ($(stubdom),y)
-DEF_CPPFLAGS += -DCONFIG_STUBDOM
-endif
+DEF_CPPFLAGS += -D__MINIOS__
ifeq ($(libc),y)
DEF_CPPFLAGS += -DHAVE_LIBC
diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile
index 4bb78a6708..8cec019e42 100644
--- a/extras/mini-os/Makefile
+++ b/extras/mini-os/Makefile
@@ -96,7 +96,7 @@ APP_LDLIBS +=
endif
ifeq ($(libc),y)
-LDLIBS += -L$(XEN_ROOT)/stubdom/libxc -lxenctrl -lxenguest
+APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc -whole-archive -lxenguest -lxenctrl -no-whole-archive
APP_LDLIBS += -lpci
APP_LDLIBS += -lz
LDLIBS += -lc
diff --git a/extras/mini-os/arch/ia64/mm.c b/extras/mini-os/arch/ia64/mm.c
index f2291f918c..273430da8b 100644
--- a/extras/mini-os/arch/ia64/mm.c
+++ b/extras/mini-os/arch/ia64/mm.c
@@ -131,6 +131,14 @@ arch_init_demand_mapping_area(unsigned long max_pfn)
}
/* Helper function used in gnttab.c. */
+void do_map_frames(unsigned long addr,
+ unsigned long *f, unsigned long n, unsigned long stride,
+ unsigned long increment, domid_t id, int may_fail, unsigned long prot)
+{
+ /* TODO */
+ ASSERT(0);
+}
+
void*
map_frames_ex(unsigned long* frames, unsigned long n, unsigned long stride,
unsigned long increment, unsigned long alignment, domid_t id,
diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h
index b26a5eda39..ababf890fb 100644
--- a/extras/mini-os/include/lib.h
+++ b/extras/mini-os/include/lib.h
@@ -136,6 +136,7 @@ enum fd_type {
FTYPE_CONSOLE,
FTYPE_FILE,
FTYPE_XENBUS,
+ FTYPE_XC,
FTYPE_EVTCHN,
FTYPE_SOCKET,
FTYPE_TAP,
diff --git a/extras/mini-os/include/mm.h b/extras/mini-os/include/mm.h
index c2981c6fd8..28fb727f9f 100644
--- a/extras/mini-os/include/mm.h
+++ b/extras/mini-os/include/mm.h
@@ -67,6 +67,9 @@ void arch_init_p2m(unsigned long max_pfn_p);
void *map_frames_ex(unsigned long *f, unsigned long n, unsigned long stride,
unsigned long increment, unsigned long alignment, domid_t id,
int may_fail, unsigned long prot);
+void do_map_frames(unsigned long addr,
+ unsigned long *f, unsigned long n, unsigned long stride,
+ unsigned long increment, domid_t id, int may_fail, unsigned long prot);
#ifdef HAVE_LIBC
extern unsigned long heap, brk, heap_mapped, heap_end;
#endif
diff --git a/extras/mini-os/include/x86/arch_mm.h b/extras/mini-os/include/x86/arch_mm.h
index 98876b130b..580955d223 100644
--- a/extras/mini-os/include/x86/arch_mm.h
+++ b/extras/mini-os/include/x86/arch_mm.h
@@ -219,11 +219,6 @@ static __inline__ paddr_t machine_to_phys(maddr_t machine)
#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, 0, L1_PROT)
#define map_zero(n, a) map_frames_ex(&mfn_zero, n, 0, 0, a, DOMID_SELF, 0, L1_PROT_RO)
-#ifndef __ASSEMBLY__
-void do_map_frames(unsigned long addr,
- unsigned long *f, unsigned long n, unsigned long stride,
- unsigned long increment, domid_t id, int may_fail, unsigned long prot);
-#endif
#define do_map_zero(start, n) do_map_frames(start, &mfn_zero, n, 0, 0, DOMID_SELF, 0, L1_PROT_RO)
#endif /* _ARCH_MM_H_ */
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index 730caab552..004e300728 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -81,6 +81,7 @@
#define NOFILE 32
extern int xc_evtchn_close(int fd);
+extern int xc_interface_close(int fd);
pthread_mutex_t fd_lock = PTHREAD_MUTEX_INITIALIZER;
struct file files[NOFILE] = {
@@ -259,10 +260,7 @@ int read(int fd, void *buf, size_t nbytes)
}
return ret * sizeof(union xenfb_in_event);
}
- case FTYPE_NONE:
- case FTYPE_XENBUS:
- case FTYPE_EVTCHN:
- case FTYPE_BLK:
+ default:
break;
}
printk("read(%d): Bad descriptor\n", fd);
@@ -295,12 +293,7 @@ int write(int fd, const void *buf, size_t nbytes)
case FTYPE_TAP:
netfront_xmit(files[fd].tap.dev, (void*) buf, nbytes);
return nbytes;
- case FTYPE_NONE:
- case FTYPE_XENBUS:
- case FTYPE_EVTCHN:
- case FTYPE_BLK:
- case FTYPE_KBD:
- case FTYPE_FB:
+ default:
break;
}
printk("write(%d): Bad descriptor\n", fd);
@@ -351,15 +344,7 @@ int fsync(int fd) {
}
return 0;
}
- case FTYPE_NONE:
- case FTYPE_CONSOLE:
- case FTYPE_SOCKET:
- case FTYPE_XENBUS:
- case FTYPE_EVTCHN:
- case FTYPE_TAP:
- case FTYPE_BLK:
- case FTYPE_KBD:
- case FTYPE_FB:
+ default:
break;
}
printk("fsync(%d): Bad descriptor\n", fd);
@@ -391,6 +376,9 @@ int close(int fd)
files[fd].type = FTYPE_NONE;
return res;
}
+ case FTYPE_XC:
+ xc_interface_close(fd);
+ return 0;
case FTYPE_EVTCHN:
xc_evtchn_close(fd);
return 0;
@@ -495,13 +483,7 @@ int fstat(int fd, struct stat *buf)
stat_from_fs(buf, &stat);
return 0;
}
- case FTYPE_NONE:
- case FTYPE_XENBUS:
- case FTYPE_EVTCHN:
- case FTYPE_TAP:
- case FTYPE_BLK:
- case FTYPE_KBD:
- case FTYPE_FB:
+ default:
break;
}
@@ -522,15 +504,7 @@ int ftruncate(int fd, off_t length)
}
return 0;
}
- case FTYPE_NONE:
- case FTYPE_CONSOLE:
- case FTYPE_SOCKET:
- case FTYPE_XENBUS:
- case FTYPE_EVTCHN:
- case FTYPE_TAP:
- case FTYPE_BLK:
- case FTYPE_KBD:
- case FTYPE_FB:
+ default:
break;
}
@@ -636,9 +610,10 @@ static const char file_types[] = {
[FTYPE_NONE] = 'N',
[FTYPE_CONSOLE] = 'C',
[FTYPE_FILE] = 'F',
- [FTYPE_XENBUS] = 'X',
+ [FTYPE_XENBUS] = 'S',
+ [FTYPE_XC] = 'X',
[FTYPE_EVTCHN] = 'E',
- [FTYPE_SOCKET] = 'S',
+ [FTYPE_SOCKET] = 's',
[FTYPE_TAP] = 'T',
[FTYPE_BLK] = 'B',
[FTYPE_KBD] = 'K',
@@ -722,7 +697,7 @@ static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exce
/* Then see others as well. */
for (i = 0; i < nfds; i++) {
switch(files[i].type) {
- case FTYPE_NONE:
+ default:
if (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds))
printk("bogus fd %d in select\n", i);
/* Fallthrough. */
@@ -1083,14 +1058,20 @@ int clock_gettime(clockid_t clk_id, struct timespec *tp)
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
{
+ unsigned long n = (length + PAGE_SIZE - 1) / PAGE_SIZE;
+
ASSERT(!start);
- length = (length + PAGE_SIZE - 1) & PAGE_MASK;
ASSERT(prot == (PROT_READ|PROT_WRITE));
- ASSERT(flags == (MAP_SHARED|MAP_ANON) || flags == (MAP_PRIVATE|MAP_ANON));
- ASSERT(fd == -1);
+ ASSERT((fd == -1 && (flags == (MAP_SHARED|MAP_ANON) || flags == (MAP_PRIVATE|MAP_ANON)))
+ || (fd != -1 && flags == MAP_SHARED));
ASSERT(offset == 0);
- return map_zero(length / PAGE_SIZE, 1);
+ if (fd == -1)
+ return map_zero(n, 1);
+ else if (files[fd].type == FTYPE_XC) {
+ unsigned long zero = 0;
+ return map_frames_ex(&zero, n, 0, 0, 1, DOMID_SELF, 0, 0);
+ } else ASSERT(0);
}
#if defined(__x86_64__) || defined(__ia64__)
__typeof__(mmap) mmap64 __attribute__((__alias__("mmap")));
@@ -1110,7 +1091,7 @@ int munmap(void *start, size_t length)
call[i].args[0] = (unsigned long) &data[i];
call[i].args[1] = 0;
call[i].args[2] = 0;
- call[i].args[3] = UVMF_INVLPG | UVMF_ALL;
+ call[i].args[3] = UVMF_INVLPG;
}
ret = HYPERVISOR_multicall(call, n);
diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
index 47bfb2c004..d685419da6 100644
--- a/tools/libxc/Makefile
+++ b/tools/libxc/Makefile
@@ -5,11 +5,9 @@ MAJOR = 3.2
MINOR = 0
CTRL_SRCS-y :=
-ifneq ($(stubdom),y)
CTRL_SRCS-y += xc_core.c
CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c
CTRL_SRCS-$(CONFIG_IA64) += xc_core_ia64.c
-endif
CTRL_SRCS-y += xc_domain.c
CTRL_SRCS-y += xc_evtchn.c
CTRL_SRCS-y += xc_misc.c
@@ -21,9 +19,7 @@ CTRL_SRCS-y += xc_sedf.c
CTRL_SRCS-y += xc_csched.c
CTRL_SRCS-y += xc_tbuf.c
CTRL_SRCS-y += xc_pm.c
-ifneq ($(stubdom),y)
CTRL_SRCS-y += xc_resume.c
-endif
CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c
CTRL_SRCS-$(CONFIG_Linux) += xc_linux.c
CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c
@@ -33,15 +29,12 @@ CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c
GUEST_SRCS-y :=
GUEST_SRCS-y += xg_private.c
-ifneq ($(stubdom),y)
GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
-endif
VPATH = ../../xen/common/libelf
CFLAGS += -I../../xen/common/libelf
-ifneq ($(stubdom),y)
GUEST_SRCS-y += libelf-tools.c libelf-loader.c
GUEST_SRCS-y += libelf-dominfo.c libelf-relocate.c
@@ -55,7 +48,6 @@ GUEST_SRCS-y += xc_dom_compat_linux.c
GUEST_SRCS-$(CONFIG_X86) += xc_dom_x86.c
GUEST_SRCS-$(CONFIG_X86) += xc_cpuid_x86.c
GUEST_SRCS-$(CONFIG_IA64) += xc_dom_ia64.c
-endif
-include $(XEN_TARGET_ARCH)/Makefile
diff --git a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c
index a4327101b6..864380d03d 100644
--- a/tools/libxc/xc_core.c
+++ b/tools/libxc/xc_core.c
@@ -64,7 +64,7 @@
/* string table */
struct xc_core_strtab {
char *strings;
- uint16_t current;
+ uint16_t length;
uint16_t max;
};
@@ -89,7 +89,7 @@ xc_core_strtab_init(void)
/* index 0 represents none */
strtab->strings[0] = '\0';
- strtab->current = 1;
+ strtab->length = 1;
return strtab;
}
@@ -107,14 +107,14 @@ xc_core_strtab_get(struct xc_core_strtab *strtab, const char *name)
uint16_t ret = 0;
uint16_t len = strlen(name) + 1;
- if ( strtab->current > UINT16_MAX - len )
+ if ( strtab->length > UINT16_MAX - len )
{
PERROR("too long string table");
errno = E2BIG;
return ret;
}
- if ( strtab->current + len > strtab->max )
+ if ( strtab->length + len > strtab->max )
{
char *tmp;
if ( strtab->max > UINT16_MAX / 2 )
@@ -135,9 +135,9 @@ xc_core_strtab_get(struct xc_core_strtab *strtab, const char *name)
strtab->max *= 2;
}
- ret = strtab->current;
- strcpy(strtab->strings + strtab->current, name);
- strtab->current += len;
+ ret = strtab->length;
+ strcpy(strtab->strings + strtab->length, name);
+ strtab->length += len;
return ret;
}
@@ -669,7 +669,7 @@ xc_domain_dumpcore_via_callback(int xc_handle,
offset += filesz;
/* fixing up section header string table section header */
- filesz = strtab->current;
+ filesz = strtab->length;
sheaders->shdrs[strtab_idx].sh_offset = offset;
sheaders->shdrs[strtab_idx].sh_size = filesz;
@@ -829,7 +829,7 @@ copy_done:
goto out;
/* elf section header string table: .shstrtab */
- sts = dump_rtn(args, strtab->strings, strtab->current);
+ sts = dump_rtn(args, strtab->strings, strtab->length);
if ( sts != 0 )
goto out;
diff --git a/tools/libxc/xc_minios.c b/tools/libxc/xc_minios.c
index d5c1b5245c..aceb387afb 100644
--- a/tools/libxc/xc_minios.c
+++ b/tools/libxc/xc_minios.c
@@ -35,11 +35,12 @@ extern struct wait_queue_head event_queue;
int xc_interface_open(void)
{
- return 0;
+ return alloc_fd(FTYPE_XC);
}
int xc_interface_close(int xc_handle)
{
+ files[xc_handle].type = FTYPE_NONE;
return 0;
}
@@ -79,8 +80,12 @@ void *xc_map_foreign_range(int xc_handle, uint32_t dom,
int xc_map_foreign_ranges(int xc_handle, uint32_t dom,
privcmd_mmap_entry_t *entries, int nr)
{
- printf("xc_map_foreign_ranges, TODO\n");
- do_exit();
+ int i;
+ for (i = 0; i < nr; i++) {
+ unsigned long mfn = entries[i].mfn;
+ do_map_frames(entries[i].va, &mfn, entries[i].npages, 0, 1, dom, 0, L1_PROT);
+ }
+ return 0;
}
int do_xen_hypercall(int xc_handle, privcmd_hypercall_t *hypercall)
@@ -294,6 +299,12 @@ int xc_evtchn_unmask(int xce_handle, evtchn_port_t port)
return 0;
}
+/* Optionally flush file to disk and discard page cache */
+void discard_file_cache(int fd, int flush)
+{
+ if (flush)
+ fsync(fd);
+}
/*
* Local variables:
* mode: C
diff --git a/xen/common/libelf/libelf-private.h b/xen/common/libelf/libelf-private.h
index b56c43e4f6..4ae587cd5d 100644
--- a/xen/common/libelf/libelf-private.h
+++ b/xen/common/libelf/libelf-private.h
@@ -43,7 +43,7 @@
#define bswap_16(x) swap16(x)
#define bswap_32(x) swap32(x)
#define bswap_64(x) swap64(x)
-#elif defined(__linux__) || defined(__Linux__)
+#elif defined(__linux__) || defined(__Linux__) || defined(__MINIOS__)
#include <byteswap.h>
#else
#error Unsupported OS