[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 3/7] [xen-ocaml-tools.hg] allow linking against external libxc



Do not reimplement libxc routines if HAVE_LIBXC is defined.

If we're compiling for a platform that has a libxc then use it
rather than reimplementing the code in xenstored.

This saves us from having to port these low level routines from
linux to mini-OS in order to run xenstored in a stub domain.

Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>

diff -r 7a4f8a26f48d libs/eventchn/eventchn_stubs.c
--- a/libs/eventchn/eventchn_stubs.c    Wed Mar 25 15:11:31 2009 +0000
+++ b/libs/eventchn/eventchn_stubs.c    Thu Apr 16 14:19:43 2009 +0100
@@ -27,11 +27,15 @@
 
 #include <xen/sysctl.h>
 
-#if XEN_SYSCTL_INTERFACE_VERSION < 4
-#include <xen/linux/evtchn.h>
+#ifdef HAVE_LIBXC
+# include <xenctrl.h>
 #else
-#include <xen/xen.h>
-#include <xen/sys/evtchn.h>
+# if XEN_SYSCTL_INTERFACE_VERSION < 4
+#  include <xen/linux/evtchn.h>
+# else
+#  include <xen/xen.h>
+#  include <xen/sys/evtchn.h>
+# endif
 #endif
 
 #include <xenctrl.h>
@@ -53,6 +57,7 @@
        return ioctl(handle, cmd, arg);
 }
 
+#ifndef HAVE_LIBXC
 static int do_read_port(int handle, evtchn_port_t *port)
 {
        return (read(handle, port, sizeof(evtchn_port_t)) != 
sizeof(evtchn_port_t));
@@ -62,9 +67,13 @@
 {
        return (write(handle, &port, sizeof(evtchn_port_t)) != 
sizeof(evtchn_port_t));
 }
+#endif
 
 int eventchn_do_open(void)
 {
+#ifdef HAVE_LIBXC
+       return xc_evtchn_open();
+#else
        int fd;
 
        fd = open(EVENTCHN_PATH, O_RDWR);
@@ -74,6 +83,7 @@
                fd = open(EVENTCHN_PATH, O_RDWR);
        }
        return fd;
+#endif
 }
 
 CAMLprim value stub_eventchn_init(value unit)
@@ -88,14 +98,16 @@
 CAMLprim value stub_eventchn_notify(value fd, value port)
 {
        CAMLparam2(fd, port);
+       int rc;
+#ifdef HAVE_LIBXC
+       rc = xc_evtchn_notify(Int_val(fd), Int_val(port));
+#else
        struct ioctl_evtchn_notify notify;
-       int rc;
-
        notify.port = Int_val(port);
        rc = do_ioctl(Int_val(fd), IOCTL_EVTCHN_NOTIFY, &notify);
+#endif
        if (rc == -1)
                caml_failwith("ioctl notify failed");
-
        CAMLreturn(Val_unit);
 }
 
@@ -104,12 +116,15 @@
 {
        CAMLparam3(fd, domid, remote_port);
        CAMLlocal1(port);
+       int rc;
+#ifdef HAVE_LIBXC
+       rc = xc_evtchn_bind_interdomain(Int_val(fd), Int_val(domid), 
Int_val(remote_port));
+#else
        struct ioctl_evtchn_bind_interdomain bind;
-       int rc;
-
        bind.remote_domain = Int_val(domid);
        bind.remote_port = Int_val(remote_port);
        rc = do_ioctl(Int_val(fd), IOCTL_EVTCHN_BIND_INTERDOMAIN, &bind);
+#endif
        if (rc == -1)
                caml_failwith("ioctl bind_interdomain failed");
        port = Val_int(rc);
@@ -121,11 +136,14 @@
 {
        CAMLparam1(fd);
        CAMLlocal1(port);
+       int rc;
+#ifdef HAVE_LIBXC
+       rc = xc_evtchn_bind_virq(Int_val(fd), VIRQ_DOM_EXC);
+#else
        struct ioctl_evtchn_bind_virq bind;
-       int rc;
-
        bind.virq = VIRQ_DOM_EXC;
        rc = do_ioctl(Int_val(fd), IOCTL_EVTCHN_BIND_VIRQ, &bind);
+#endif
        if (rc == -1)
                caml_failwith("ioctl bind_virq failed");
        port = Val_int(rc);
@@ -136,11 +154,14 @@
 CAMLprim value stub_eventchn_unbind(value fd, value port)
 {
        CAMLparam2(fd, port);
+       int rc;
+#ifdef HAVE_LIBXC
+       rc = xc_evtchn_unbind(Int_val(fd), Int_val(port));
+#else
        struct ioctl_evtchn_unbind unbind;
-       int rc;
-
        unbind.port = Int_val(port);
        rc = do_ioctl(Int_val(fd), IOCTL_EVTCHN_UNBIND, &unbind);
+#endif
        if (rc == -1)
                caml_failwith("ioctl unbind failed");
 
@@ -153,8 +174,13 @@
        CAMLlocal1(result);
        evtchn_port_t port;
 
+#ifdef HAVE_LIBXC
+       if ((port = xc_evtchn_pending(Int_val(fd))) == -1)
+               caml_failwith("xc_evtchn_pending failed");
+#else
        if (do_read_port(Int_val(fd), &port))
                caml_failwith("read port failed");
+#endif
        result = Val_int(port);
 
        CAMLreturn(result);
@@ -166,7 +192,12 @@
        evtchn_port_t port;
 
        port = Int_val(_port);
+#ifdef HAVE_LIBXC
+       if (xc_evtchn_unmask(Int_val(fd), port) == -1)
+               caml_failwith("xc_evtchn_unmask failed");
+#else
        if (do_write_port(Int_val(fd), port))
                caml_failwith("write port failed");
+#endif
        CAMLreturn(Val_unit);
 }
diff -r 7a4f8a26f48d libs/xc/xc.h
--- a/libs/xc/xc.h      Wed Mar 25 15:11:31 2009 +0000
+++ b/libs/xc/xc.h      Thu Apr 16 14:19:43 2009 +0100
@@ -22,11 +22,6 @@
 #include <xen/domctl.h>
 #include <xen/sched.h>
 #include <xen/sysctl.h>
-#if XEN_SYSCTL_INTERFACE_VERSION < 4
-#include <xen/linux/privcmd.h>
-#else
-#include <xen/sys/privcmd.h>
-#endif
 #include <xen/version.h>
 #include <xen/foreign/x86_32.h>
 #include <xen/foreign/x86_64.h>
@@ -39,15 +34,21 @@
 
 int xc_using_injection(void);
 
+#ifdef HAVE_LIBXC
+#include <xenctrl.h>
+#else
+# if XEN_SYSCTL_INTERFACE_VERSION < 4
+#  include <xen/linux/privcmd.h>
+# else
+#  include <xen/sys/privcmd.h>
+# endif
 int xc_interface_open(void);
 int xc_interface_close(int handle);
 
 int xc_domain_getinfolist(int handle, unsigned int first_domain,
                           unsigned int max_domains, xc_domaininfo_t *info);
-int xc_domain_getinfo(int handle, unsigned int first_domain,
-                      xc_domaininfo_t *info);
-
 void *xc_map_foreign_range(int handle, unsigned int domid,
                            int size, int prot, unsigned long mfn);
 int xc_map_foreign_ranges(int handle, unsigned int domid,
                           privcmd_mmap_entry_t *entries, int nr);
+#endif /* HAVE_LIBXC */
diff -r 7a4f8a26f48d libs/xc/xc_lib.c
--- a/libs/xc/xc_lib.c  Wed Mar 25 15:11:31 2009 +0000
+++ b/libs/xc/xc_lib.c  Thu Apr 16 14:19:43 2009 +0100
@@ -28,10 +28,6 @@
 #include <stdarg.h>
 
 #include "xc.h"
-
-#define PAGE_SHIFT             12
-#define PAGE_SIZE               (1UL << PAGE_SHIFT)
-#define PAGE_MASK               (~(PAGE_SIZE-1))
 
 #define MIN(a, b)              (((a) < (b)) ? (a) : (b))
 
@@ -68,6 +64,7 @@
        return __error_str;
 }
 
+#ifndef HAVE_LIBXC
 static void xc_error_set(const char *fmt, ...)
 {
        va_list ap;
@@ -93,6 +90,7 @@
                 " failed: %s", xc_error_get());
        memcpy(__error_str, __errordup, ERROR_STRLEN);
 }
+#endif /* HAVE_LIBXC */
 
 void xc_error_clear(void)
 {
@@ -116,6 +114,7 @@
        return 0;
 }
 
+#ifndef HAVE_LIBXC
 /*---- Trivia ----*/
 int xc_interface_open(void)
 {
@@ -221,25 +220,9 @@
        return ret;
 }
 
-int xc_domain_getinfo(int handle, unsigned int domid, xc_domaininfo_t *info)
-{
-       int ret;
-       ret = xc_domain_getinfolist(handle, domid, 1, info);
-       if (ret != 1) {
-               xc_error_set("getinfo failed: domain %d: %s", domid, 
xc_error_get());
-               return -1;
-       }
-
-       /* If the requested domain didn't exist but there exists one with a 
-          higher domain ID, this will be returned. We consider this an error 
since
-          we only wanted info about a specific domain. */
-       if (info->domain != domid) {
-               xc_error_set("getinfo failed: domain %d nolonger exists", 
domid);
-               return -1;
-       }
-
-       return 0;
-}
+#define PAGE_SHIFT             12
+#define PAGE_SIZE               (1UL << PAGE_SHIFT)
+#define PAGE_MASK               (~(PAGE_SIZE-1))
 
 void *xc_map_foreign_range(int handle, unsigned int domid,
                            int size, int prot, unsigned long mfn)
@@ -291,3 +274,4 @@
        }
        return ret;
 }
+#endif /* HAVE_LIBXC */
diff -r 7a4f8a26f48d libs/xc/xc_stubs.c
--- a/libs/xc/xc_stubs.c        Wed Mar 25 15:11:31 2009 +0000
+++ b/libs/xc/xc_stubs.c        Thu Apr 16 14:19:43 2009 +0100
@@ -119,8 +119,8 @@
        xc_domaininfo_t info;
        int ret;
 
-       ret = xc_domain_getinfo(_H(xc_handle), _D(domid), &info);
-       if (ret != 0)
+       ret = xc_domain_getinfolist(_H(xc_handle), _D(domid), 1, &info);
+       if (ret != 1 || info.domain != _D(domid))
                failwith_xc();
 
        result = alloc_domaininfo(&info);

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.