From: Samuel Thibault <samuel.thibault@eu.citrix.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH] stubdom: complete libxc support
Date: Thu, 22 May 2008 15:27:46 +0100 [thread overview]
Message-ID: <20080522142746.GO4845@implementation.uk.xensource.com> (raw)
stubdom: complete libxc support
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
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
reply other threads:[~2008-05-22 14:27 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080522142746.GO4845@implementation.uk.xensource.com \
--to=samuel.thibault@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.