All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/7] [xen-ocaml-tools.hg] allow linking against external libxc
@ 2009-04-17 15:44 Alex Zeffertt
  0 siblings, 0 replies; only message in thread
From: Alex Zeffertt @ 2009-04-17 15:44 UTC (permalink / raw)
  To: xen-devel@lists.xensource.com

[-- Attachment #1: Type: text/plain, Size: 61 bytes --]

Do not reimplement libxc routines if HAVE_LIBXC is defined.


[-- Attachment #2: have-libxc --]
[-- Type: text/plain, Size: 7305 bytes --]

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@eu.citrix.com>

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);


[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-04-17 15:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-17 15:44 [PATCH 3/7] [xen-ocaml-tools.hg] allow linking against external libxc Alex Zeffertt

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.