stubdom: complete libxc support
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
diff -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/Config.mk
--- a/extras/mini-os/Config.mk Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/Config.mk Thu May 22 14:28:40 2008 +0100
@@ -41,10 +41,7 @@
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 -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/Makefile
--- a/extras/mini-os/Makefile Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/Makefile Thu May 22 14:28:40 2008 +0100
@@ -96,7 +96,7 @@
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 -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/arch/ia64/mm.c
--- a/extras/mini-os/arch/ia64/mm.c Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/arch/ia64/mm.c Thu May 22 14:28:40 2008 +0100
@@ -131,6 +131,14 @@
}
/* 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 -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/include/lib.h
--- a/extras/mini-os/include/lib.h Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/include/lib.h Thu May 22 14:28:40 2008 +0100
@@ -136,6 +136,7 @@
FTYPE_CONSOLE,
FTYPE_FILE,
FTYPE_XENBUS,
+ FTYPE_XC,
FTYPE_EVTCHN,
FTYPE_SOCKET,
FTYPE_TAP,
diff -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/include/mm.h Thu May 22 14:28:40 2008 +0100
@@ -69,6 +69,9 @@
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 -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/include/x86/arch_mm.h
--- a/extras/mini-os/include/x86/arch_mm.h Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/include/x86/arch_mm.h Thu May 22 14:28:40 2008 +0100
@@ -219,11 +219,6 @@
#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 -r 73e2fc5117ac -r f4a293cbec1b extras/mini-os/lib/sys.c
--- a/extras/mini-os/lib/sys.c Thu May 22 12:54:02 2008 +0100
+++ b/extras/mini-os/lib/sys.c Thu May 22 14:28:40 2008 +0100
@@ -82,6 +82,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] = {
@@ -260,10 +261,7 @@
}
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);
@@ -296,12 +294,7 @@
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);
@@ -352,15 +345,7 @@
}
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);
@@ -392,6 +377,9 @@
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;
@@ -496,13 +484,7 @@
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;
}
@@ -523,15 +505,7 @@
}
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;
}
@@ -637,9 +611,10 @@
[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',
@@ -723,7 +698,7 @@
/* 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. */
@@ -1084,14 +1059,20 @@
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")));
@@ -1111,7 +1092,7 @@
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 -r 73e2fc5117ac -r f4a293cbec1b tools/libxc/Makefile
--- a/tools/libxc/Makefile Thu May 22 12:54:02 2008 +0100
+++ b/tools/libxc/Makefile Thu May 22 14:28:40 2008 +0100
@@ -5,11 +5,9 @@
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_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 @@
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-$(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 -r 73e2fc5117ac -r f4a293cbec1b tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c Thu May 22 12:54:02 2008 +0100
+++ b/tools/libxc/xc_core.c Thu May 22 14:28:40 2008 +0100
@@ -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 @@
/* index 0 represents none */
strtab->strings[0] = '\0';
- strtab->current = 1;
+ strtab->length = 1;
return strtab;
}
@@ -107,14 +107,14 @@
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 @@
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 @@
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 @@
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 -r 73e2fc5117ac -r f4a293cbec1b tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c Thu May 22 12:54:02 2008 +0100
+++ b/tools/libxc/xc_minios.c Thu May 22 14:28:40 2008 +0100
@@ -35,11 +35,12 @@
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 @@
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 @@
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 -r 73e2fc5117ac -r f4a293cbec1b xen/common/libelf/libelf-private.h
--- a/xen/common/libelf/libelf-private.h Thu May 22 12:54:02 2008 +0100
+++ b/xen/common/libelf/libelf-private.h Thu May 22 14:28:40 2008 +0100
@@ -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
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|