Skip to contentSkip to conversation

Begin to disentangle libxenctrl and provide some stable libraries

RFC PATCH Superseded Ian Campbell 7 participants 29 messages Jun 10, 2015 – Sep 22, 2015 Kbuild

v1 of 8 Superseded Latest is v8 →

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 Begin to disentangle libxenctrl and provide some stable libraries

In <[email protected]> I proposed stabilising some parts of the libxenctrl API/ABI by disaggregating into separate libraries.

As a proof of concept these three intertangled series[0] splits out the xentoollog and event channel device interfaces.

Still to come would be at least the grant table interfaces and a basic hypercall making facility (including the buffers etc), followed by libraries for specific out of tree purposes (device model, kexec).

The new libraries use linker version-scripts to hopefully make future ABI changes be possible in a compatible way.

I decided to move the event channel functions into a new namespace (xenevtchn_*) in order to provide a clean break from the old unstable interfaces to the new stable ones. I've updated all the in tree callers and qemu-trad and provided a compat shim in libxenctrl for other out of tree users (which is used for qemu-upstream). My hope is that this can be removed sooner rather than later. I intend to do the same for the other interfaces. I haven't done this for the xentoollog stuff since it already had a separate namespace.

I mulled over putting everything into tools/libs/FOO instead of tools/libxenFOO, I didn't but I could if people think it is worthwhile. Eventually I'd like to split libxc into libxenguest and libxenctrl to cut down on the amount of strange cross talk...

As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from xc_minios.c and xc_netbsd.c. Once the hypercall calling and grant interfaces are in separate libraries are split this would become easier since each library can independently choose the desired backend.

The whole thing has been build tested on Linux and stubdoms, but not FreeBSD, NetBSD or Solaris. It's certainly not impossible that I've not got the #includes in the new files quite right.

Ian.

[0] There are 3 series, against xen.git, mini-os.git and qemu-xen-trad.git. The patches against xen.git point to the patches in the other two trees with instructions to update the relevant Config.mk field. The perils of changing unstable interfaces...

#1 lore raw

RFC PATCH 1/6 tools: Refactor "xentoollog" into its own library

In attempting to disaggregate libxenctrl I found that many of the pieces were going to want access to this library, so split it out (as it probably should always have been).

Various build adjustments are needed. In particular things which use xtl_* themselves now need to explicity link against the library.

This has a nice side effect which is that users of libxl no longer need to link against libxenctrl just to create a logger.

The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.

---
Must be applied with:

- "qemu-xen-traditional: Use xentoollog as a separate library" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxentoollog with libxc" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.

---
 .gitignore                               |    1 +
 stubdom/Makefile                         |   20 +++-
 stubdom/grub/Makefile                    |    1 +
 tools/Makefile                           |    3 +
 tools/Rules.mk                           |   15 ++-
 tools/libxc/Makefile                     |    7 +-
 tools/libxc/include/xentoollog.h         |  137 ---------------------
 tools/libxc/xtl_core.c                   |   84 -------------
 tools/libxc/xtl_logger_stdio.c           |  190 ------------------------------
 tools/libxentoollog/Makefile             |   59 ++++++++++
 tools/libxentoollog/include/xentoollog.h |  137 +++++++++++++++++++++
 tools/libxentoollog/libxentoollog.map    |   12 ++
 tools/libxentoollog/xtl_core.c           |   84 +++++++++++++
 tools/libxentoollog/xtl_logger_stdio.c   |  190 ++++++++++++++++++++++++++++++
 tools/libxl/Makefile                     |   15 +--
 tools/ocaml/Makefile.rules               |   26 ++--
 tools/ocaml/libs/xentoollog/Makefile     |    6 +-
 tools/ocaml/libs/xentoollog/genlevels.py |    2 +-
 tools/python/setup.py                    |    5 +-
 tools/xenpaging/Makefile                 |    2 +-
 20 files changed, 548 insertions(+), 448 deletions(-)
 delete mode 100644 tools/libxc/include/xentoollog.h
 delete mode 100644 tools/libxc/xtl_core.c
 delete mode 100644 tools/libxc/xtl_logger_stdio.c
 create mode 100644 tools/libxentoollog/Makefile
 create mode 100644 tools/libxentoollog/include/xentoollog.h
 create mode 100644 tools/libxentoollog/libxentoollog.map
 create mode 100644 tools/libxentoollog/xtl_core.c
 create mode 100644 tools/libxentoollog/xtl_logger_stdio.c
.gitignore +1 -0
index 3bc9cd9..49935f2 100644
@@ -59,6 +59,7 @@ stubdom/gcc-*
 stubdom/include
 stubdom/ioemu
 stubdom/xenstore
+stubdom/libxentoollog-*
 stubdom/libxc-*
 stubdom/lwip-*
 stubdom/mini-os-*
stubdom/Makefile +19 -1
index faa7c21..b8b0d43 100644
@@ -313,6 +313,11 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET)
 	  ln -sf $(wildcard $(XEN_ROOT)/tools/include/xen-foreign/*) include/xen-foreign/ && \
 	  $(MAKE) DESTDIR= -C include/xen-foreign/ && \
 	  ( [ -h include/xen/foreign ] || ln -sf ../xen-foreign include/xen/foreign )
+	mkdir -p libxentoollog-$(XEN_TARGET_ARCH)
+	[ -h libxentoollog-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxentoollog-$(XEN_TARGET_ARCH) && \
+	  ln -sf $(XEN_ROOT)/tools/libxentoollog/include/*.h . && \
+	  ln -sf $(XEN_ROOT)/tools/libxentoollog/*.c . && \
+	  ln -sf $(XEN_ROOT)/tools/libxentoollog/Makefile . )
 	mkdir -p libxc-$(XEN_TARGET_ARCH)
 	[ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \
 	  ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -336,12 +341,23 @@ $(TARGETS_MINIOS): mini-os-%:
 	done
 
 #######
+# libxentoollog
+#######
+
+.PHONY: libxentoollog
+libxentoollog: libxentoollog-$(XEN_TARGET_ARCH)/libxentoollog.a
+libxentoollog-$(XEN_TARGET_ARCH)/libxentoollog.a: $(NEWLIB_STAMPFILE)
+	$(MAKE) -C $(XEN_ROOT)/tools/include
+	$(MAKE) DESTDIR= -C $(MINI_OS) links
+	CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libxentoollog-$(XEN_TARGET_ARCH)
+
+#######
 # libxc
 #######
 
 .PHONY: libxc
 libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a
-libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: cross-zlib
+libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog cross-zlib
 	$(MAKE) -C $(XEN_ROOT)/tools/include
 	$(MAKE) DESTDIR= -C $(MINI_OS) links
 	CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
@@ -519,6 +535,7 @@ clean:
 	$(MAKE) -C vtpmmgr clean
 	rm -fr grub-$(XEN_TARGET_ARCH)
 	rm -f $(STUBDOMPATH)
+	[ ! -e libxentoollog-$(XEN_TARGET_ARCH)/Makefile ] || $(MAKE) DESTDIR= -C libxentoollog-$(XEN_TARGET_ARCH) clean
 	[ ! -e libxc-$(XEN_TARGET_ARCH)/Makefile ] || $(MAKE) DESTDIR= -C libxc-$(XEN_TARGET_ARCH) clean
 	-[ ! -d ioemu ] || $(MAKE) DESTDIR= -C ioemu clean
 	-[ ! -d xenstore ] || $(MAKE) DESTDIR= -C xenstore clean
@@ -529,6 +546,7 @@ crossclean: clean
 	rm -fr $(CROSS_ROOT)
 	rm -fr newlib-$(XEN_TARGET_ARCH)
 	rm -fr zlib-$(XEN_TARGET_ARCH) pciutils-$(XEN_TARGET_ARCH)
+	rm -fr libxentoollog-$(XEN_TARGET_ARCH)
 	rm -fr libxc-$(XEN_TARGET_ARCH) ioemu xenstore
 	rm -fr gmp-$(XEN_TARGET_ARCH)
 	rm -fr polarssl-$(XEN_TARGET_ARCH)
stubdom/grub/Makefile +1 -0
index 934cc4c..4969274 100644
@@ -5,6 +5,7 @@ vpath %.c ../grub-upstream
 
 BOOT=$(OBJ_DIR)/boot-$(XEN_TARGET_ARCH).o
 
+DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libxentoollog/include
 DEF_CPPFLAGS += -I$(XEN_ROOT)/tools/libxc/include -I$(XEN_ROOT)/tools/include -I.
 DEF_CPPFLAGS += -I../grub-upstream/stage1
 DEF_CPPFLAGS += -I../grub-upstream/stage2
tools/Makefile +3 -0
index 45cb4b2..777591a 100644
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS-y :=
 SUBDIRS-y += include
+SUBDIRS-y += libxentoollog
 SUBDIRS-y += libxc
 SUBDIRS-$(FLASK_ENABLE) += flask
 SUBDIRS-y += xenstore
@@ -248,12 +249,14 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find
 		--includedir=$(LIBEXEC_INC) \
 		--source-path=$$source \
 		--extra-cflags="-I$(XEN_ROOT)/tools/include \
+		-I$(XEN_ROOT)/tools/libxentoollog/include \
 		-I$(XEN_ROOT)/tools/libxc/include \
 		-I$(XEN_ROOT)/tools/xenstore/include \
 		-I$(XEN_ROOT)/tools/xenstore/compat/include \
 		$(EXTRA_CFLAGS_QEMU_XEN)" \
 		--extra-ldflags="-L$(XEN_ROOT)/tools/libxc \
 		-L$(XEN_ROOT)/tools/xenstore \
+		-Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog \
 		$(QEMU_UPSTREAM_RPATH)" \
 		--bindir=$(LIBEXEC_BIN) \
 		--datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +10 -5
index 3c29d07..bf85e5e 100644
@@ -10,6 +10,7 @@ export _INSTALL := $(INSTALL)
 INSTALL = $(XEN_ROOT)/tools/cross-install
 
 XEN_INCLUDE        = $(XEN_ROOT)/tools/include
+XEN_LIBXENTOOLLOG  = $(XEN_ROOT)/tools/libxentoollog
 XEN_LIBXC          = $(XEN_ROOT)/tools/libxc
 XEN_XENLIGHT       = $(XEN_ROOT)/tools/libxl
 XEN_XENSTORE       = $(XEN_ROOT)/tools/xenstore
@@ -34,9 +35,13 @@ INSTALL_SHLIB = : install-shlib-unsupported-fail
 SYMLINK_SHLIB = : symlink-shlib-unsupported-fail
 endif
 
-CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude)
-LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl$(libextension)
-SHLIB_libxenctrl  = -Wl,-rpath-link=$(XEN_LIBXC)
+CFLAGS_libxentoollog = -I$(XEN_LIBXENTOOLLOG)/include $(CFLAGS_xeninclude)
+LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension)
+SHLIB_libxentoollog  = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG)
+
+CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude)
+LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(XEN_LIBXC)/libxenctrl$(libextension)
+SHLIB_libxenctrl  =  $(SHLIB_libxentoollog) -Wl,-rpath-link=$(XEN_LIBXC)
 
 CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude)
 LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest$(libextension)
@@ -48,11 +53,11 @@ SHLIB_libxenstore  = -Wl,-rpath-link=$(XEN_XENSTORE)
 
 CFLAGS_libxenstat  = -I$(XEN_LIBXENSTAT)
 LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat$(libextension)
-SHLIB_libxenstat  = -Wl,-rpath-link=$(XEN_LIBXENSTAT)
+SHLIB_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN)
 LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBVCHAN) -lxenvchan
-SHLIB_libxenvchan  = -Wl,-rpath-link=$(XEN_LIBVCHAN)
+SHLIB_libxenvchan  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN)
 
 ifeq ($(debug),y)
 # Disable optimizations and enable debugging information for macros
tools/libxc/Makefile +3 -4
index 55782c8..877ea62 100644
@@ -39,8 +39,6 @@ CTRL_SRCS-y       += xc_memshr.c
 CTRL_SRCS-y       += xc_hcall_buf.c
 CTRL_SRCS-y       += xc_foreign_memory.c
 CTRL_SRCS-y       += xc_kexec.c
-CTRL_SRCS-y       += xtl_core.c
-CTRL_SRCS-y       += xtl_logger_stdio.c
 CTRL_SRCS-y       += xc_resource.c
 CTRL_SRCS-$(CONFIG_X86) += xc_psr.c
 CTRL_SRCS-$(CONFIG_X86) += xc_pagetab.c
@@ -115,6 +113,7 @@ CFLAGS   += -I. -I./include $(CFLAGS_xeninclude)
 CFLAGS-$(CONFIG_Linux) += -D_GNU_SOURCE
 
 CFLAGS	+= $(PTHREAD_CFLAGS)
+CFLAGS	+= $(CFLAGS_libxentoollog)
 
 CTRL_LIB_OBJS := $(patsubst %.c,%.o,$(CTRL_SRCS-y))
 CTRL_PIC_OBJS := $(patsubst %.c,%.opic,$(CTRL_SRCS-y))
@@ -168,7 +167,7 @@ install: build
 	$(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(libdir)
 	$(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenctrl.so.$(MAJOR)
 	$(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR) $(DESTDIR)$(libdir)/libxenctrl.so
-	$(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h include/xentoollog.h $(DESTDIR)$(includedir)
+	$(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h $(DESTDIR)$(includedir)
 	$(INSTALL_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)
 	$(INSTALL_DATA) libxenguest.a $(DESTDIR)$(libdir)
 	$(SYMLINK_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenguest.so.$(MAJOR)
@@ -211,7 +210,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR)
 	$(SYMLINK_SHLIB) $< $@
 
 libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS)
-	$(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
 
 # libxenguest
 
tools/libxc/include/xentoollog.h deleted +0 -137

137 lines not on this page · raw message

tools/libxc/xtl_core.c deleted +0 -84

84 lines not on this page · raw message

tools/libxc/xtl_logger_stdio.c deleted +0 -190

190 lines not on this page · raw message

tools/libxentoollog/Makefile new file +59 -0

59 lines not on this page · raw message

tools/libxentoollog/include/xentoollog.h new file +137 -0

137 lines not on this page · raw message

tools/libxentoollog/libxentoollog.map new file +12 -0
new file mode 100644
index 0000000..c183cf5
@@ -0,0 +1,12 @@
+VERS_1.0 {
+	global:
+		xtl_createlogger_stdiostream;
+		xtl_level_to_string;
+		xtl_log;
+		xtl_logger_destroy;
+		xtl_logv;
+		xtl_progress;
+		xtl_stdiostream_adjust_flags;
+		xtl_stdiostream_set_minlevel;
+	local: *; /* Do not expose anything by default */
+};
tools/libxentoollog/xtl_core.c new file +84 -0

84 lines not on this page · raw message

tools/libxentoollog/xtl_logger_stdio.c new file +190 -0

190 lines not on this page · raw message

tools/libxl/Makefile +8 -7
index cc9c152..387dc91 100644
@@ -20,11 +20,12 @@ LIBUUID_LIBS += -luuid
 endif
 
 LIBXL_LIBS =
-LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
+LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
 ifeq ($(CONFIG_REMUS_NETBUF),y)
 LIBXL_LIBS += $(LIBNL3_LIBS)
 endif
 
+CFLAGS_LIBXL += $(CFLAGS_libxentoollog)
 CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
 CFLAGS_LIBXL += $(CFLAGS_libxenguest)
 CFLAGS_LIBXL += $(CFLAGS_libxenstore)
@@ -132,7 +133,7 @@ CFLAGS_XL += -Wshadow
 
 XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o
 $(XL_OBJS) $(TEST_PROG_OBJS) _libxl.api-for-check: \
-            CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h
+            CFLAGS += $(CFLAGS_libxentoollog)
 $(XL_OBJS): CFLAGS += $(CFLAGS_XL)
 $(XL_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h # libxl_json.h needs it.
 
@@ -236,19 +237,19 @@ libxlutil.a: $(LIBXLU_OBJS)
 	$(AR) rcs libxlutil.a $^
 
 xl: $(XL_OBJS) libxlutil.so libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) -lyajl $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) -lyajl $(APPEND_LDFLAGS)
 
 xen-init-dom0: $(XEN_INIT_DOM0_OBJS) libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $(XEN_INIT_DOM0_OBJS) $(LDLIBS_libxenstore) $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) $(APPEND_LDFLAGS)
 
 test_%: test_%.o test_common.o libxlutil.so libxenlight_test.so
-	$(CC) $(LDFLAGS) -o $@ $^ $(filter-out %libxenlight.so, $(LDLIBS_libxenlight)) $(LDLIBS_libxenctrl) -lyajl $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $^ $(filter-out %libxenlight.so, $(LDLIBS_libxenlight)) $(LDLIBS_libxentoollog) -lyajl $(APPEND_LDFLAGS)
 
 libxl-save-helper: $(SAVE_HELPER_OBJS) libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ $(SAVE_HELPER_OBJS) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $(SAVE_HELPER_OBJS) $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
 
 testidl: testidl.o libxlutil.so libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxentoollog) $(APPEND_LDFLAGS)
 
 $(PKG_CONFIG): % : %.in Makefile
 	@sed -e 's/@@version@@/$(MAJOR).$(MINOR)/g' < $< > [email protected]
tools/ocaml/Makefile.rules +13 -13
index 1796060..45e71f2 100644
@@ -1,18 +1,18 @@
-ifdef V
-  ifeq ("$(origin V)", "command line")
-    BUILD_VERBOSE = $(V)
-  endif
-endif
-ifndef BUILD_VERBOSE
-  BUILD_VERBOSE = 0
-endif
-ifeq ($(BUILD_VERBOSE),1)
+#ifdef V
+#  ifeq ("$(origin V)", "command line")
+#    BUILD_VERBOSE = $(V)
+#  endif
+#endif
+#ifndef BUILD_VERBOSE
+#  BUILD_VERBOSE = 0
+#endif
+#ifeq ($(BUILD_VERBOSE),1)
   E = @true
   Q =
-else
-  E = @echo
-  Q = @
-endif
+#else
+#  E = @echo
+#  Q = @
+#endif
 
 .NOTPARALLEL:
 
tools/ocaml/libs/xentoollog/Makefile +3 -3
index 666eb66..084a3f4 100644
@@ -5,7 +5,7 @@ include $(TOPLEVEL)/common.make
 # allow mixed declarations and code
 CFLAGS += -Wno-declaration-after-statement
 
-CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
+CFLAGS += $(CFLAGS_libxentoollog)
 CFLAGS += $(APPEND_CFLAGS)
 OCAMLINCLUDE +=
 
@@ -13,7 +13,7 @@ OBJS = xentoollog
 INTF = xentoollog.cmi
 LIBS = xentoollog.cma xentoollog.cmxa
 
-LIBS_xentoollog = $(LDLIBS_libxenctrl)
+LIBS_xentoollog = $(LDLIBS_libxentoollog)
 
 xentoollog_OBJS = $(OBJS)
 xentoollog_C_OBJS = xentoollog_stubs
@@ -49,7 +49,7 @@ xentoollog.mli: xentoollog.mli.in _xtl_levels.mli.in
 
 libs: $(LIBS)
 
-_xtl_levels.ml.in _xtl_levels.mli.in _xtl_levels.inc: genlevels.py $(XEN_ROOT)/tools/libxc/include/xentoollog.h
+_xtl_levels.ml.in _xtl_levels.mli.in _xtl_levels.inc: genlevels.py $(XEN_ROOT)/tools/libxentoollog/include/xentoollog.h
 	$(PYTHON) genlevels.py _xtl_levels.mli.in _xtl_levels.ml.in _xtl_levels.inc
 
 .PHONY: install
tools/ocaml/libs/xentoollog/genlevels.py +1 -1
index 65d334f..4de4fb1 100755
@@ -3,7 +3,7 @@
 import sys
 
 def read_levels():
-	f = open('../../../libxc/include/xentoollog.h', 'r')
+	f = open('../../../libxentoollog/include/xentoollog.h', 'r')
 
 	levels = []
 	record = False
tools/python/setup.py +3 -2
index 439c429..e55ee01 100644
@@ -7,16 +7,17 @@ XEN_ROOT = "../.."
 extra_compile_args  = [ "-fno-strict-aliasing", "-Werror" ]
 
 PATH_XEN      = XEN_ROOT + "/tools/include"
+PATH_LIBXENTOOLLOG = XEN_ROOT + "/tools/libxentoollog"
 PATH_LIBXC    = XEN_ROOT + "/tools/libxc"
 PATH_LIBXL    = XEN_ROOT + "/tools/libxl"
 PATH_XENSTORE = XEN_ROOT + "/tools/xenstore"
 
 xc = Extension("xc",
                extra_compile_args = extra_compile_args,
-               include_dirs       = [ PATH_XEN, PATH_LIBXC + "/include", "xen/lowlevel/xc" ],
+               include_dirs       = [ PATH_XEN, PATH_LIBXENTOOLLOG + "/include", PATH_LIBXC + "/include", "xen/lowlevel/xc" ],
                library_dirs       = [ PATH_LIBXC ],
                libraries          = [ "xenctrl", "xenguest" ],
-               depends            = [ PATH_LIBXC + "/libxenctrl.so", PATH_LIBXC + "/libxenguest.so" ],
+               depends            = [ PATH_LIBXC + "/libxenctrl.so", PATH_LIBXC + "/libxenguest.so",  "-Wl,-rpath-link="+PATH_LIBXENTOOLLOG ],
                sources            = [ "xen/lowlevel/xc/xc.c" ])
 
 xs = Extension("xs",
tools/xenpaging/Makefile +1 -1
index 2407a30..e63d894 100644
@@ -3,7 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 # xenpaging.c and file_ops.c incorrectly use libxc internals
 CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenstore) $(PTHREAD_CFLAGS) -I$(XEN_ROOT)/tools/libxc
-LDLIBS += $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(PTHREAD_LIBS)
+LDLIBS += $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(PTHREAD_LIBS)
 LDFLAGS += $(PTHREAD_LDFLAGS)
 
 POLICY    = default
Signature · 1 line
1.7.10.4
#2 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 9 lines · Ian Campbell
tools/libxentoollog/include/xentoollog.h new file +9 -0
+
+#define XTL_NEW_LOGGER(LOGGER,buffer) ({                                \
+    xentoollog_logger_##LOGGER *new_consumer;                           \
+                                                                        \
+    (buffer).vtable.vmessage = LOGGER##_vmessage;                       \
+    (buffer).vtable.progress = LOGGER##_progress;                       \
+    (buffer).vtable.destroy  = LOGGER##_destroy;                        \
+                                                                        \
+    new_consumer = malloc(sizeof(*new_consumer));                       \

tools/libxentoollog/include/xentoollog.h line 134

Quoted 10 lines
tools/libxentoollog/include/xentoollog.h new file +10 -0
+    if (!new_consumer) {                                                \
+        xtl_log((xentoollog_logger*)&buffer,                            \
+                XTL_CRITICAL, errno, "xtl",                             \
+                "failed to allocate memory for new message logger");    \
+    } else {                                                            \
+        *new_consumer = buffer;                                         \
+    }                                                                   \
+                                                                        \
+    new_consumer;                                                       \
+});

This macro should be ditched.

It is a gnu-ism which shouldn't be present in the public library header, violates several principles of least supprise, and can literally only be used by its sole user in xtl_logger_stdio.c because of its internal expectations of xentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.

~Andrew

#3 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 23 lines · Andrew Cooper
Quoted 9 lines · Ian Campbell
tools/libxentoollog/include/xentoollog.h new file +9 -0
+
+#define XTL_NEW_LOGGER(LOGGER,buffer) ({                                \
+    xentoollog_logger_##LOGGER *new_consumer;                           \
+                                                                        \
+    (buffer).vtable.vmessage = LOGGER##_vmessage;                       \
+    (buffer).vtable.progress = LOGGER##_progress;                       \
+    (buffer).vtable.destroy  = LOGGER##_destroy;                        \
+                                                                        \
+    new_consumer = malloc(sizeof(*new_consumer));                       \

tools/libxentoollog/include/xentoollog.h line 134

Quoted 10 lines
tools/libxentoollog/include/xentoollog.h new file +10 -0
+    if (!new_consumer) {                                                \
+        xtl_log((xentoollog_logger*)&buffer,                            \
+                XTL_CRITICAL, errno, "xtl",                             \
+                "failed to allocate memory for new message logger");    \
+    } else {                                                            \
+        *new_consumer = buffer;                                         \
+    }                                                                   \
+                                                                        \
+    new_consumer;                                                       \
+});

This macro should be ditched.

Quoted 5 lines

It is a gnu-ism which shouldn't be present in the public library header, violates several principles of least supprise, and can literally only be used by its sole user in xtl_logger_stdio.c because of its internal expectations of xentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)

Ian? Do you agree?

Quoted 4 lines

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

Shall we just follow what we do for xen/include/public i.e.

        $(CC) -x c -ansi -Wall -Werror

? It seems sensible that the two should follow similar rules.

Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)

Quoted 4 lines

As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.

True, but this is already quite a big job, with lots of moving parts already. If I find time I could do a pass, but I don't think it is super ciritical

#4 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 7 lines
Quoted 1 line
Quoted 1 line · On 11.06.15 at 13:35, <[email protected]> wrote:
Quoted 4 lines · Andrew Cooper

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

Quoted 6 lines

Shall we just follow what we do for xen/include/public i.e.

        $(CC) -x c -ansi -Wall -Werror

? It seems sensible that the two should follow similar rules.

Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)

We certainly shouldn't weaken what we do for the public headers. How far standard compliance matters for the library interface headers I really don't know.

Jan

#5 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 11 lines · Jan Beulich
Quoted 11 lines
Quoted 1 line
Quoted 1 line · On 11.06.15 at 13:35, <[email protected]> wrote:
Quoted 4 lines · Andrew Cooper

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

Shall we just follow what we do for xen/include/public i.e.

        $(CC) -x c -ansi -Wall -Werror

? It seems sensible that the two should follow similar rules.

Quoted 6 lines
Quoted 2 lines

Or if not shall we change the requirements for xen/include/public to match? (Jan CCd for comments)

We certainly shouldn't weaken what we do for the public headers. How far standard compliance matters for the library interface headers I really don't know.

Actually, since -ansi is the same as -std=c89 I don't think there is a practical difference between the two.

Ian.

#6 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

In reply to Andrew Cooper

Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):

Quoted 12 lines · Ian Campbell
Quoted 11 lines
tools/libxentoollog/include/xentoollog.h new file +11 -0
+
+#define XTL_NEW_LOGGER(LOGGER,buffer) ({                                \
+    xentoollog_logger_##LOGGER *new_consumer;                           \
+                                                                        \
+    (buffer).vtable.vmessage = LOGGER##_vmessage;                       \
+    (buffer).vtable.progress = LOGGER##_progress;                       \
+    (buffer).vtable.destroy  = LOGGER##_destroy;                        \
+                                                                        \
+    new_consumer = malloc(sizeof(*new_consumer));                       \
+    if (!new_consumer) {                                                \
+        xtl_log((xentoollog_logger*)&buffer,                            \
Quoted 8 lines

tools/libxentoollog/include/xentoollog.h line 134

Quoted 8 lines
tools/libxentoollog/include/xentoollog.h new file +8 -0
+                XTL_CRITICAL, errno, "xtl",                             \
+                "failed to allocate memory for new message logger");    \
+    } else {                                                            \
+        *new_consumer = buffer;                                         \
+    }                                                                   \
+                                                                        \
+    new_consumer;                                                       \
+});

Ian Campbell just pointed me at this.

Quoted 3 lines

This macro should be ditched.

It is a gnu-ism which shouldn't be present in the public library header,

Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.

Quoted 1 line

violates several principles of least supprise,

This is just invective.

Quoted 4 lines

and can literally only be
used by its sole user in xtl_logger_stdio.c because of its internal expectations of xentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)

There is only one place in tree that calls this because there are only two in-tree loggers and the other one (tools/ocaml/libs/xentoollog/xentoollog_stubs.c) chose not to use it. It seems to me that stub_xtl_create_logger could use this macro.

Quoted 4 lines

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

-pedantic is certainly a bad idea.

Quoted 4 lines

As another thought, it would also be a good time to sort out a consistent coding style, although that doesn't necessarily need to be folded into the split-out patch. The current source is very mixed when it comes to coding style.

This sounds like it's going to lead to a lot of bikeshedding. If there are components with internally inconsistent coding styles that should be fixed. But I don't think it is a good idea to go around reformatting areas that are coherent to make them like other areas which are differently coherent.

Ian.

#7 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 23 lines · Ian Jackson

Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):

Quoted 12 lines · Ian Campbell
Quoted 11 lines
tools/libxentoollog/include/xentoollog.h new file +11 -0
+
+#define XTL_NEW_LOGGER(LOGGER,buffer) ({                                \
+    xentoollog_logger_##LOGGER *new_consumer;                           \
+                                                                        \
+    (buffer).vtable.vmessage = LOGGER##_vmessage;                       \
+    (buffer).vtable.progress = LOGGER##_progress;                       \
+    (buffer).vtable.destroy  = LOGGER##_destroy;                        \
+                                                                        \
+    new_consumer = malloc(sizeof(*new_consumer));                       \
+    if (!new_consumer) {                                                \
+        xtl_log((xentoollog_logger*)&buffer,                            \
Quoted 8 lines

tools/libxentoollog/include/xentoollog.h line 134

Quoted 8 lines
tools/libxentoollog/include/xentoollog.h new file +8 -0
+                XTL_CRITICAL, errno, "xtl",                             \
+                "failed to allocate memory for new message logger");    \
+    } else {                                                            \
+        *new_consumer = buffer;                                         \
+    }                                                                   \
+                                                                        \
+    new_consumer;                                                       \
+});

Ian Campbell just pointed me at this.

Quoted 6 lines
Quoted 3 lines

This macro should be ditched.

It is a gnu-ism which shouldn't be present in the public library header,

Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.

It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.

Quoted 3 lines
Quoted 2 lines

violates several principles of least supprise,

This is just invective.

/me googles and discovered a new word. I stand by my statement.

It requires the user to embed one structure inside another structure (with half a undocumented magic name), under a specific undocumented field name, and have three functions (with half undocumented magic names) in scope with undocumented types. It also mandates an original copy of the half-magically-named struct in scope to be partially initialised, just to have another copy created in the heap.

The error handling is also broken; It will follow a wild function pointer, if vtable is not the first element in the structure (again undocumented).

This macro is not fit for any purpose it attempts to perform.

https://github.com/xenserver/xen-4.5.pg/blob/master/master/xenguest.patch#L609
is the correct way to use a setup like this, even if it does require embedding other data alongside it.

Quoted 9 lines
Quoted 5 lines

and can literally only be
used by its sole user in xtl_logger_stdio.c because of its internal expectations of xentoollog_logger_stdiostream. (Its sole user could do the above in a cleaner manner anyway.)

There is only one place in tree that calls this because there are only two in-tree loggers and the other one (tools/ocaml/libs/xentoollog/xentoollog_stubs.c) chose not to use it. It seems to me that stub_xtl_create_logger could use this macro.

Or better yet, ditch it completely.

All that needs to happen is for struct xentoollog_logger to have the three function pointers filled in appropriately. This in turn does not mandate that the structure is allocated from the heap, or the prescribed layout/naming scheme.

Quoted 6 lines
Quoted 5 lines

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

-pedantic is certainly a bad idea.

Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.

The APIs of each of these new libraries should be just as usable on windows systems as Linux systems.

~Andrew

#8 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):

Quoted 7 lines · Ian Jackson
Quoted 3 lines

Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.

It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.

I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.

Quoted 4 lines
Quoted 2 lines
Quoted 1 line

violates several principles of least supprise,

This is just invective.

/me googles and discovered a new word. I stand by my statement.

Well, if you feel so strongly, I won't object to a patch to remove it.

Quoted 8 lines
Quoted 5 lines
Quoted 4 lines

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

-pedantic is certainly a bad idea.

Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.

No, that is not what -pedantic does. Please RTFM.

Ian.

#9 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 9 lines · Ian Jackson

Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library"):

Quoted 6 lines · Ian Jackson
Quoted 3 lines

Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.

It is fine (in principle) to be used internally. Not in a public header for what is supposed to be a clean API.

I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.

There shouldn't be items in a public header which can't be used by all compilers which might want to compile it.

GCC is not the only compiler liable to encounter this new header file.

Quoted 5 lines
Quoted 4 lines
Quoted 3 lines
Quoted 2 lines

violates several principles of least supprise,

This is just invective.

/me googles and discovered a new word. I stand by my statement.

Well, if you feel so strongly, I won't object to a patch to remove it.

This is exactly why I raise the point now when the ABI is deliberately changing. Having said that, it was previously in libxc so anything went. I would be happy to submit a patch either to libxc now, or to libxentoollog later.

Quoted 9 lines
Quoted 8 lines
Quoted 6 lines
Quoted 5 lines

As part of the tidyup, we should choose a particular C standard (89, probably) and ensure that the API/ABI complies with gcc -std=c$VER -pedantic. This will help to provide a consistent API on other platforms (I seem to recall an effort to port libvchan to windows.)

-pedantic is certainly a bad idea.

Pedantic is absolutely the correct answer. It will cause gcc to reject any non C compliant statements.

No, that is not what -pedantic does. Please RTFM.

Please explain why you believe it to be unsuitable? It is not perfect, but is far better than nothing.

~Andrew

#10 lore raw

Re: [PATCH RFC tools 1/6] tools: Refactor "xentoollog" into its own library

Quoted 18 lines · Andrew Cooper
Quoted 11 lines · Ian Jackson

Andrew Cooper writes ("Re: [Xen-devel] [PATCH RFC tools 1/6] tools:
Refactor "xentoollog" into its own library"):

Quoted 7 lines · Ian Jackson
Quoted 3 lines

Do you mean that statement expressions (originally a GNU extension) should be avoided in tools code ? A quick git-grep discovered that xenctrl already contains numerous statement expressions.

It is fine (in principle) to be used internally. Not in a public header
for what is supposed to be a clean API.

I don't understand why this distinction is relevant. Either the compiler supports it, or it doesn't.

There shouldn't be items in a public header which can't be used by all compilers which might want to compile it.

GCC is not the only compiler liable to encounter this new header file.

[...]

Quoted 2 lines

Please explain why you believe it to be unsuitable? It is not perfect, but is far better than nothing.

It's a #define, so unless the including application actually uses it the compiler proper (as opposed to cpp) will never see it.

Ian.

#11 lore raw

RFC PATCH 2/6 tools: Link in-tree libvchan users against libxenvchan.so

In reply to Ian Campbell

As with other in-tree users avoid -L + -l.

---
 tools/Rules.mk |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tools/Rules.mk +1 -1
index bf85e5e..b8b8559 100644
@@ -56,7 +56,7 @@ LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/
 SHLIB_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN)
-LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBVCHAN) -lxenvchan
+LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBVCHAN)/libxenvchan$(libextension)
 SHLIB_libxenvchan  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN)
 
 ifeq ($(debug),y)
Signature · 1 line
1.7.10.4
#12 lore raw

RFC PATCH 3/6 tools: Do not add top-level tools dir to include path

In reply to Ian Campbell

Instead switch to an explicit -include $(XEN_ROOT)/tools/config.h to pickup config.h.

Most places already do this, fixup the rest.

---
 tools/libfsimage/ext2fs-lib/Makefile     |    4 ++--
 tools/libfsimage/ext2fs-lib/ext2fs-lib.c |    3 ---
 tools/misc/Makefile                      |    4 +++-
 tools/misc/gtraceview.c                  |    3 ---
 tools/ocaml/xenstored/Makefile           |    3 ++-
 tools/ocaml/xenstored/systemd_stubs.c    |    1 -
 tools/xenstat/xentop/Makefile            |    4 ++--
 tools/xenstat/xentop/xentop.c            |    3 ---
 tools/xenstore/Makefile                  |    3 ++-
 tools/xenstore/xenstored_core.c          |    1 -
 10 files changed, 11 insertions(+), 18 deletions(-)
tools/libfsimage/ext2fs-lib/Makefile +2 -2
index 671fbff..0e00fde 100644
@@ -6,8 +6,8 @@ FS = ext2fs-lib
 
 FS_LIBDEPS = $(EXTFS_LIBS)
 
-# Include configure output (config.h) to headers search path
-CFLAGS += -I$(XEN_ROOT)/tools
+# Include configure output (config.h)
+CFLAGS += -include $(XEN_ROOT)/tools/config.h
 
 .PHONY: all
 all: fs-all
tools/libfsimage/ext2fs-lib/ext2fs-lib.c +0 -3
index ed47146..84b6d1e 100644
@@ -21,9 +21,6 @@
  * Use is subject to license terms.
  */
 
-/* Include output from configure */
-#include <config.h>
-
 #include <fsimage_plugin.h>
 #include INCLUDE_EXTFS_H
 #include <errno.h>
tools/misc/Makefile +3 -1
index 82c361f..c4490f3 100644
@@ -1,7 +1,9 @@
 XEN_ROOT=$(CURDIR)/../..
 include $(XEN_ROOT)/tools/Rules.mk
 
-CFLAGS += -Werror -I$(XEN_ROOT)/tools
+CFLAGS += -Werror
+# Include configure output (config.h)
+CFLAGS += -include $(XEN_ROOT)/tools/config.h
 CFLAGS += $(CFLAGS_libxenctrl)
 CFLAGS += $(CFLAGS_xeninclude)
 CFLAGS += $(CFLAGS_libxenstore)
tools/misc/gtraceview.c +0 -3
index 501f86a..d9f1185 100644
@@ -16,9 +16,6 @@
  * Place - Suite 330, Boston, MA 02111-1307 USA.
  */
 
-/* Include output from configure */
-#include <config.h>
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
tools/ocaml/xenstored/Makefile +2 -1
index bcf09d4..d861f11 100644
@@ -2,7 +2,8 @@ XEN_ROOT = $(CURDIR)/../../..
 OCAML_TOPLEVEL = $(CURDIR)/..
 include $(OCAML_TOPLEVEL)/common.make
 
-CFLAGS += -I$(XEN_ROOT)/tools/
+# Include configure output (config.h)
+CFLAGS += -include $(XEN_ROOT)/tools/config.h
 CFLAGS-$(CONFIG_SYSTEMD)  += $(SYSTEMD_CFLAGS)
 LDFLAGS-$(CONFIG_SYSTEMD) += $(SYSTEMD_LIBS)
 
tools/ocaml/xenstored/systemd_stubs.c +0 -1
index 623592c..d924ff1 100644
@@ -22,7 +22,6 @@
 #include <caml/custom.h>
 #include <caml/signals.h>
 #include <caml/fail.h>
-#include <config.h>
 
 #if defined(HAVE_SYSTEMD)
 
tools/xenstat/xentop/Makefile +2 -2
index 97950b9..e67c9ab 100644
@@ -22,8 +22,8 @@ CFLAGS += -DGCC_PRINTF -Werror $(CFLAGS_libxenstat)
 LDLIBS += $(LDLIBS_libxenstat) $(CURSES_LIBS) $(TINFO_LIBS) $(SOCKET_LIBS) -lm -lyajl
 CFLAGS += -DHOST_$(XEN_OS)
 
-# Include configure output (config.h) to headers search path
-CFLAGS += -I$(XEN_ROOT)/tools
+# Include configure output (config.h)
+CFLAGS += -include $(XEN_ROOT)/tools/config.h
 LDFLAGS += $(APPEND_LDFLAGS)
 
 .PHONY: all
tools/xenstat/xentop/xentop.c +0 -3
index 23b57f1..8173886 100644
@@ -19,9 +19,6 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/* Include output from configure */
-#include <config.h>
-
 /* get curses header from configure */
 #include INCLUDE_CURSES_H
 
tools/xenstore/Makefile +2 -1
index 30f3b46..1b4a494 100644
@@ -6,7 +6,8 @@ MINOR = 3
 
 CFLAGS += -Werror
 CFLAGS += -I.
-CFLAGS += -I$(XEN_ROOT)/tools/
+# Include configure output (config.h)
+CFLAGS += -include $(XEN_ROOT)/tools/config.h
 CFLAGS += -I./include
 CFLAGS += $(CFLAGS_libxenctrl)
 CFLAGS += -DXEN_LIB_STORED="\"$(XEN_LIB_STORED)\""
tools/xenstore/xenstored_core.c +0 -1
index 3fd9a20..b18000d 100644
@@ -40,7 +40,6 @@
 #include <signal.h>
 #include <assert.h>
 #include <setjmp.h>
-#include <config.h>
 
 #include "utils.h"
 #include "list.h"
Signature · 1 line
1.7.10.4
#13 lore raw

RFC PATCH 4/6 tools/libxc: Remove osdep indirection for xc_evtchn

In reply to Ian Campbell

The alternative backend (a xen-api/xapi shim) is no longer around and so this stuff is now just baggage which is getting in the way of refactoring libxenctrl.

Note that the intention is to move this into a separate library shortly.

Nested virt probably suffices for this use case now.

For now only evtchn is done as a PoC, other sub-APIs will follow.

One incorrect instance of using xc_interface where xc_evtchn (in ocaml stubs) is removed, this used to work because they were typedefs to the same struct, but is no longer permitted.

Build tested for Linux and stubdom, but not FreeBSd, NetBSD or Solaris.

---
 tools/libxc/include/xenctrl.h                 |    2 +-
 tools/libxc/include/xenctrlosdep.h            |   16 -----
 tools/libxc/xc_evtchn.c                       |   45 -------------
 tools/libxc/xc_freebsd_osdep.c                |   79 ++++++++--------------
 tools/libxc/xc_linux_osdep.c                  |   76 ++++++++-------------
 tools/libxc/xc_minios.c                       |   63 +++++++-----------
 tools/libxc/xc_netbsd.c                       |   72 ++++++++------------
 tools/libxc/xc_private.c                      |   37 +++++++++--
 tools/libxc/xc_private.h                      |   17 +++++
 tools/libxc/xc_solaris.c                      |   71 ++++++++------------
 tools/libxc/xenctrl_osdep_ENOSYS.c            |   87 -------------------------
 tools/ocaml/libs/eventchn/xeneventchn_stubs.c |    4 +-
 12 files changed, 180 insertions(+), 389 deletions(-)
tools/libxc/include/xenctrl.h +1 -1
index 50fa9e7..f7b6533 100644
@@ -118,7 +118,7 @@
  */
 
 typedef struct xc_interface_core xc_interface;
-typedef struct xc_interface_core xc_evtchn;
+typedef struct xenevtchn_handle xc_evtchn;
 typedef struct xc_interface_core xc_gnttab;
 typedef struct xc_interface_core xc_gntshr;
 
tools/libxc/include/xenctrlosdep.h +0 -16
index e97944b..a8b27ae 100644
@@ -52,7 +52,6 @@
 
 enum xc_osdep_type {
     XC_OSDEP_PRIVCMD,
-    XC_OSDEP_EVTCHN,
     XC_OSDEP_GNTTAB,
     XC_OSDEP_GNTSHR,
 };
@@ -91,21 +90,6 @@ struct xc_osdep_ops
                                         int nentries);
         } privcmd;
         struct {
-            int (*fd)(xc_evtchn *xce, xc_osdep_handle h);
-
-            int (*notify)(xc_evtchn *xce, xc_osdep_handle h, evtchn_port_t port);
-
-            evtchn_port_or_error_t (*bind_unbound_port)(xc_evtchn *xce, xc_osdep_handle h, int domid);
-            evtchn_port_or_error_t (*bind_interdomain)(xc_evtchn *xce, xc_osdep_handle h, int domid,
-                                                       evtchn_port_t remote_port);
-            evtchn_port_or_error_t (*bind_virq)(xc_evtchn *xce, xc_osdep_handle h, unsigned int virq);
-
-            int (*unbind)(xc_evtchn *xce, xc_osdep_handle h, evtchn_port_t port);
-
-            evtchn_port_or_error_t (*pending)(xc_evtchn *xce, xc_osdep_handle h);
-            int (*unmask)(xc_evtchn *xce, xc_osdep_handle h, evtchn_port_t port);
-        } evtchn;
-        struct {
 #define XC_GRANT_MAP_SINGLE_DOMAIN 0x1
             void *(*grant_map)(xc_gnttab *xcg, xc_osdep_handle h,
                                uint32_t count, int flags, int prot,
tools/libxc/xc_evtchn.c +0 -45

51 lines not on this page · raw message

tools/libxc/xc_freebsd_osdep.c +26 -53

152 lines not on this page · raw message

tools/libxc/xc_linux_osdep.c +28 -48

155 lines not on this page · raw message

tools/libxc/xc_minios.c +24 -39

138 lines not on this page · raw message

tools/libxc/xc_netbsd.c +26 -46

141 lines not on this page · raw message

tools/libxc/xc_private.c +30 -7
index 2ffebd9..9f0ada7 100644
@@ -120,7 +120,6 @@ static const char *xc_osdep_type_name(enum xc_osdep_type type)
     switch ( type )
     {
     case XC_OSDEP_PRIVCMD: return "privcmd";
-    case XC_OSDEP_EVTCHN:  return "evtchn";
     case XC_OSDEP_GNTTAB:  return "gnttab";
     case XC_OSDEP_GNTSHR:  return "gntshr";
     }
@@ -253,20 +252,44 @@ int do_xen_hypercall(xc_interface *xch, privcmd_hypercall_t *hypercall)
     return xch->ops->u.privcmd.hypercall(xch, xch->ops_handle, hypercall);
 }
 
-xc_evtchn *xc_evtchn_open(xentoollog_logger *logger,
-                             unsigned open_flags)
+xc_evtchn *xc_evtchn_open(xentoollog_logger *logger, unsigned open_flags)
 {
-    xc_evtchn *xce;
+    xc_evtchn *xce = malloc(sizeof(*xce));
+    int rc;
+
+    if (!xce) return NULL;
+
+    xce->fd = -1;
+    xce->logger = logger;
+    xce->logger_tofree  = NULL;
 
-    xce = xc_interface_open_common(logger, NULL, open_flags,
-                                   XC_OSDEP_EVTCHN);
+    if (!xce->logger) {
+        xce->logger = xce->logger_tofree =
+            (xentoollog_logger*)
+            xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0);
+        if (!xce->logger) goto err;
+    }
+
+    rc = osdep_evtchn_open(xce);
+    if ( rc  < 0 ) goto err;
 
     return xce;
+
+err:
+    osdep_evtchn_close(xce);
+    xtl_logger_destroy(xce->logger_tofree);
+    free(xce);
+    return NULL;
 }
 
 int xc_evtchn_close(xc_evtchn *xce)
 {
-    return xc_interface_close_common(xce);
+    int rc;
+
+    rc = osdep_evtchn_close(xce);
+    xtl_logger_destroy(xce->logger_tofree);
+    free(xce);
+    return rc;
 }
 
 xc_gnttab *xc_gnttab_open(xentoollog_logger *logger,
tools/libxc/xc_private.h +17 -0
index 247a408..4c66766 100644
@@ -124,6 +124,13 @@ struct xc_interface_core {
     xc_osdep_handle  ops_handle; /* opaque data for xc_osdep_ops */
 };
 
+struct xenevtchn_handle {
+    xentoollog_logger *logger, *logger_tofree;
+    int fd;
+};
+int osdep_evtchn_open(xc_evtchn *xce);
+int osdep_evtchn_close(xc_evtchn *xce);
+
 void xc_report_error(xc_interface *xch, int code, const char *fmt, ...)
     __attribute__((format(printf,3,4)));
 void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
@@ -447,3 +454,13 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param,
                          uint32_t *port);
 
 #endif /* __XC_PRIVATE_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
tools/libxc/xc_solaris.c +26 -45

145 lines not on this page · raw message

tools/libxc/xenctrl_osdep_ENOSYS.c +0 -87

99 lines not on this page · raw message

tools/ocaml/libs/eventchn/xeneventchn_stubs.c +2 -2
index abefd6b..5939e7c 100644
@@ -34,14 +34,14 @@
 #include <caml/callback.h>
 #include <caml/fail.h>
 
-#define _H(__h) ((xc_interface *)(__h))
+#define _H(__h) ((xc_evtchn *)(__h))
 
 CAMLprim value stub_eventchn_init(void)
 {
 	CAMLparam0();
 	CAMLlocal1(result);
 
-	xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
+	xc_evtchn *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
 	if (xce == NULL)
 		caml_failwith("open failed");
 
Signature · 1 line
1.7.10.4
#14 lore raw

RFC PATCH 5/6 tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.

In reply to Ian Campbell

libxenevtchn will provide a stable API and ABI for accessing the evtchn device.

The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.

All in-tree users are updated to use the new names.

Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names, which is used by qemu-xen for the time being.

The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).

This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:

- xc_evtchn_alloc_unbound
- xc_evtchn_reset
- xc_evtchn_status

These functions do not appear to be needed by qemu-dm, qemu-pv (provision of device model to HVM guests and PV backends respectively) or by libvchan suggesting they are not needed by non-toolstack uses of event channels. QEMU does use these in hw/xenpv/xen_domainbuild.c but that is a "toolstack use".

The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.

Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.

---

Must be applied with:

- "qemu-xen-traditional: Use libxenevtchn" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.

---
 .gitignore                                    |    1 +
 docs/misc/libxenctrl-functions.pandoc         |    9 +-
 stubdom/Makefile                              |   19 +-
 tools/Makefile                                |    6 +-
 tools/Rules.mk                                |   19 +-
 tools/console/Makefile                        |    2 +
 tools/console/daemon/io.c                     |   43 +++--
 tools/libvchan/Makefile                       |    6 +-
 tools/libvchan/init.c                         |   20 +-
 tools/libvchan/io.c                           |   12 +-
 tools/libvchan/libxenvchan.h                  |    3 +-
 tools/libxc/Makefile                          |    8 +-
 tools/libxc/include/xenctrl.h                 |   99 +---------
 tools/libxc/include/xenctrl_compat.h          |   48 +++++
 tools/libxc/include/xenguest.h                |   10 +-
 tools/libxc/xc_evtchn_compat.c                |   75 ++++++++
 tools/libxc/xc_freebsd_osdep.c                |  101 ----------
 tools/libxc/xc_linux_osdep.c                  |   95 ---------
 tools/libxc/xc_minios.c                       |  221 ---------------------
 tools/libxc/xc_netbsd.c                       |  109 -----------
 tools/libxc/xc_private.c                      |   40 ----
 tools/libxc/xc_private.h                      |    7 -
 tools/libxc/xc_solaris.c                      |   97 ----------
 tools/libxc/xc_suspend.c                      |   18 +-
 tools/libxenevtchn/Makefile                   |   65 +++++++
 tools/libxenevtchn/core.c                     |   60 ++++++
 tools/libxenevtchn/freebsd.c                  |  122 ++++++++++++
 tools/libxenevtchn/include/xenevtchn.h        |  154 +++++++++++++++
 tools/libxenevtchn/libxenevtchn.map           |   14 ++
 tools/libxenevtchn/linux.c                    |  133 +++++++++++++
 tools/libxenevtchn/minios.c                   |  257 +++++++++++++++++++++++++
 tools/libxenevtchn/netbsd.c                   |  132 +++++++++++++
 tools/libxenevtchn/private.h                  |   15 ++
 tools/libxenevtchn/solaris.c                  |  120 ++++++++++++
 tools/libxl/Makefile                          |    5 +-
 tools/libxl/libxl.c                           |    2 +-
 tools/libxl/libxl_dom.c                       |    4 +-
 tools/libxl/libxl_event.c                     |   14 +-
 tools/libxl/libxl_internal.h                  |    5 +-
 tools/misc/Makefile                           |    7 +-
 tools/misc/xen-hptool.c                       |   13 +-
 tools/misc/xen-lowmemd.c                      |   15 +-
 tools/ocaml/libs/eventchn/Makefile            |    4 +-
 tools/ocaml/libs/eventchn/xeneventchn_stubs.c |   20 +-
 tools/python/setup.py                         |    7 +-
 tools/tests/xen-access/xen-access.c           |    2 +-
 tools/xcutils/Makefile                        |    4 +-
 tools/xenmon/Makefile                         |    2 +
 tools/xenmon/xenbaked.c                       |   13 +-
 tools/xenpaging/Makefile                      |    4 +-
 tools/xenpaging/xenpaging.c                   |   18 +-
 tools/xenpaging/xenpaging.h                   |    3 +-
 tools/xenstore/Makefile                       |    5 +-
 tools/xenstore/xenstored_core.c               |    6 +-
 tools/xenstore/xenstored_domain.c             |   25 +--
 tools/xentrace/Makefile                       |    2 +
 tools/xentrace/xentrace.c                     |   13 +-
 57 files changed, 1413 insertions(+), 920 deletions(-)
 create mode 100644 tools/libxc/include/xenctrl_compat.h
 create mode 100644 tools/libxc/xc_evtchn_compat.c
 create mode 100644 tools/libxenevtchn/Makefile
 create mode 100644 tools/libxenevtchn/core.c
 create mode 100644 tools/libxenevtchn/freebsd.c
 create mode 100644 tools/libxenevtchn/include/xenevtchn.h
 create mode 100644 tools/libxenevtchn/libxenevtchn.map
 create mode 100644 tools/libxenevtchn/linux.c
 create mode 100644 tools/libxenevtchn/minios.c
 create mode 100644 tools/libxenevtchn/netbsd.c
 create mode 100644 tools/libxenevtchn/private.h
 create mode 100644 tools/libxenevtchn/solaris.c
.gitignore +1 -0
index 49935f2..24fab66 100644
@@ -60,6 +60,7 @@ stubdom/include
 stubdom/ioemu
 stubdom/xenstore
 stubdom/libxentoollog-*
+stubdom/libxenevtchn-*
 stubdom/libxc-*
 stubdom/lwip-*
 stubdom/mini-os-*
docs/misc/libxenctrl-functions.pandoc +6 -3
index 60aa6fb..5d09e62 100644
@@ -1009,9 +1009,6 @@ Gathered by:
     - xc_pfn_to_mfn
     - xc_query_page_offline_status
     - xc_read_image
-    - xc_suspend_evtchn_init_exclusive
-    - xc_suspend_evtchn_init_sane
-    - xc_suspend_evtchn_release
     - xc_try_bzip2_decode
     - xc_try_lz4_decode
     - _xc_try_lzma_decode
@@ -1019,6 +1016,12 @@ Gathered by:
     - xc_try_lzo1x_decode
     - xc_try_xz_decode
 
+Use privcmd and evtchn device handles:
+
+    - xc_suspend_evtchn_init_exclusive. Used by xen-hptool and libxl.
+    - xc_suspend_evtchn_init_sane. Unused
+    - xc_suspend_evtchn_release. Used by xen-hptool and libxl.
+
 # Symbols used by qemu
 
     $ nm tools/qemu-xen-dir-remote/i386-softmmu/qemu-system-i386 | grep \\bU.xc_
stubdom/Makefile +18 -1
index b8b0d43..b4dd39a 100644
@@ -318,6 +318,12 @@ mk-headers-$(XEN_TARGET_ARCH): $(IOEMU_LINKFARM_TARGET)
 	  ln -sf $(XEN_ROOT)/tools/libxentoollog/include/*.h . && \
 	  ln -sf $(XEN_ROOT)/tools/libxentoollog/*.c . && \
 	  ln -sf $(XEN_ROOT)/tools/libxentoollog/Makefile . )
+	mkdir -p libxenevtchn-$(XEN_TARGET_ARCH)/include
+	[ -h libxenevtchn-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxenevtchn-$(XEN_TARGET_ARCH) && \
+	  ln -sf $(XEN_ROOT)/tools/libxenevtchn/*.h . && \
+	  ln -sf $(XEN_ROOT)/tools/libxenevtchn/include/*.h include/ && \
+	  ln -sf $(XEN_ROOT)/tools/libxenevtchn/*.c . && \
+	  ln -sf $(XEN_ROOT)/tools/libxenevtchn/Makefile . )
 	mkdir -p libxc-$(XEN_TARGET_ARCH)
 	[ -h libxc-$(XEN_TARGET_ARCH)/Makefile ] || ( cd libxc-$(XEN_TARGET_ARCH) && \
 	  ln -sf $(XEN_ROOT)/tools/libxc/*.h . && \
@@ -352,12 +358,23 @@ libxentoollog-$(XEN_TARGET_ARCH)/libxentoollog.a: $(NEWLIB_STAMPFILE)
 	CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libxentoollog-$(XEN_TARGET_ARCH)
 
 #######
+# libxenevtchn
+#######
+
+.PHONY: libxenevtchn
+libxenevtchn: libxenevtchn-$(XEN_TARGET_ARCH)/libxenevtchn.a
+libxenevtchn-$(XEN_TARGET_ARCH)/libxenevtchn.a: $(NEWLIB_STAMPFILE)
+	$(MAKE) -C $(XEN_ROOT)/tools/include
+	$(MAKE) DESTDIR= -C $(MINI_OS) links
+	CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= -C libxenevtchn-$(XEN_TARGET_ARCH)
+
+#######
 # libxc
 #######
 
 .PHONY: libxc
 libxc: libxc-$(XEN_TARGET_ARCH)/libxenctrl.a libxc-$(XEN_TARGET_ARCH)/libxenguest.a
-libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog cross-zlib
+libxc-$(XEN_TARGET_ARCH)/libxenctrl.a: libxentoollog libxenevtchn cross-zlib
 	$(MAKE) -C $(XEN_ROOT)/tools/include
 	$(MAKE) DESTDIR= -C $(MINI_OS) links
 	CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(MAKE) DESTDIR= CONFIG_LIBXC_MINIOS=y -C libxc-$(XEN_TARGET_ARCH)
tools/Makefile +5 -1
index 777591a..3497c53 100644
@@ -4,6 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 SUBDIRS-y :=
 SUBDIRS-y += include
 SUBDIRS-y += libxentoollog
+SUBDIRS-y += libxenevtchn
 SUBDIRS-y += libxc
 SUBDIRS-$(FLASK_ENABLE) += flask
 SUBDIRS-y += xenstore
@@ -248,8 +249,10 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find
 		--libdir=$(LIBEXEC_LIB) \
 		--includedir=$(LIBEXEC_INC) \
 		--source-path=$$source \
-		--extra-cflags="-I$(XEN_ROOT)/tools/include \
+		--extra-cflags="-DXC_WANT_COMPAT_EVTCHN_API=1 \
+		-I$(XEN_ROOT)/tools/include \
 		-I$(XEN_ROOT)/tools/libxentoollog/include \
+		-I$(XEN_ROOT)/tools/libxenevtchn/include \
 		-I$(XEN_ROOT)/tools/libxc/include \
 		-I$(XEN_ROOT)/tools/xenstore/include \
 		-I$(XEN_ROOT)/tools/xenstore/compat/include \
@@ -257,6 +260,7 @@ subdir-all-qemu-xen-dir: qemu-xen-dir-find
 		--extra-ldflags="-L$(XEN_ROOT)/tools/libxc \
 		-L$(XEN_ROOT)/tools/xenstore \
 		-Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog \
+		-Wl,-rpath-link=$(XEN_ROOT)/tools/libxenevtchn \
 		$(QEMU_UPSTREAM_RPATH)" \
 		--bindir=$(LIBEXEC_BIN) \
 		--datadir=$(SHAREDIR)/qemu-xen \
tools/Rules.mk +12 -7
index b8b8559..fd3a7db 100644
@@ -11,6 +11,7 @@ INSTALL = $(XEN_ROOT)/tools/cross-install
 
 XEN_INCLUDE        = $(XEN_ROOT)/tools/include
 XEN_LIBXENTOOLLOG  = $(XEN_ROOT)/tools/libxentoollog
+XEN_LIBXENEVTCHN   = $(XEN_ROOT)/tools/libxenevtchn
 XEN_LIBXC          = $(XEN_ROOT)/tools/libxc
 XEN_XENLIGHT       = $(XEN_ROOT)/tools/libxl
 XEN_XENSTORE       = $(XEN_ROOT)/tools/xenstore
@@ -39,13 +40,17 @@ CFLAGS_libxentoollog = -I$(XEN_LIBXENTOOLLOG)/include $(CFLAGS_xeninclude)
 LDLIBS_libxentoollog = $(XEN_LIBXENTOOLLOG)/libxentoollog$(libextension)
 SHLIB_libxentoollog  = -Wl,-rpath-link=$(XEN_LIBXENTOOLLOG)
 
+CFLAGS_libxenevtchn = -I$(XEN_LIBXENEVTCHN)/include $(CFLAGS_xeninclude)
+LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension)
+SHLIB_libxenevtchn  = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN)
+
 CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude)
-LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(XEN_LIBXC)/libxenctrl$(libextension)
-SHLIB_libxenctrl  =  $(SHLIB_libxentoollog) -Wl,-rpath-link=$(XEN_LIBXC)
+LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenctrl$(libextension)
+SHLIB_libxenctrl  =  $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBXC)
 
-CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_xeninclude)
-LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest$(libextension)
-SHLIB_libxenguest  = -Wl,-rpath-link=L$(XEN_LIBXC)
+CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude)
+LDLIBS_libxenguest = $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenguest$(libextension)
+SHLIB_libxenguest  = $(SHLIB_libxenevtchn) -Wl,-rpath-link=L$(XEN_LIBXC)
 
 CFLAGS_libxenstore = -I$(XEN_XENSTORE)/include $(CFLAGS_xeninclude)
 LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore$(libextension)
@@ -56,8 +61,8 @@ LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/
 SHLIB_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN)
-LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBVCHAN)/libxenvchan$(libextension)
-SHLIB_libxenvchan  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBVCHAN)
+LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) $(XEN_LIBVCHAN)/libxenvchan$(libextension)
+SHLIB_libxenvchan  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBVCHAN)
 
 ifeq ($(debug),y)
 # Disable optimizations and enable debugging information for macros
tools/console/Makefile +2 -0
index 71f8088..0141d7f 100644
@@ -3,8 +3,10 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 CFLAGS  += -Werror
 
+CFLAGS  += $(CFLAGS_libxenevtchn)
 CFLAGS  += $(CFLAGS_libxenctrl)
 CFLAGS  += $(CFLAGS_libxenstore)
+LDLIBS += $(LDLIBS_libxenevtchn)
 LDLIBS += $(LDLIBS_libxenctrl)
 LDLIBS += $(LDLIBS_libxenstore)
 LDLIBS += $(SOCKET_LIBS)
tools/console/daemon/io.c +22 -21

165 lines not on this page · raw message

tools/libvchan/Makefile +3 -3
index 3c50fe6..84128a3 100644
@@ -10,9 +10,9 @@ NODE_OBJS = node.o
 NODE2_OBJS = node-select.o
 
 LIBVCHAN_PIC_OBJS = $(patsubst %.o,%.opic,$(LIBVCHAN_OBJS))
-LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxenctrl)
-$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxenctrl)
-$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxenctrl)
+LIBVCHAN_LIBS = $(LDLIBS_libxenstore) $(LDLIBS_libxenctrl) $(LDLIBS_libxenevtchn)
+$(LIBVCHAN_OBJS) $(LIBVCHAN_PIC_OBJS): CFLAGS += $(CFLAGS_libxenstore) $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn)
+$(NODE_OBJS) $(NODE2_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn)
 
 MAJOR = 1.0
 MINOR = 0
tools/libvchan/init.c +10 -10
index de10817..fef6c8d 100644
@@ -217,25 +217,25 @@ static int init_evt_srv(struct libxenvchan *ctrl, int domain, xentoollog_logger
 {
 	evtchn_port_or_error_t port;
 
-	ctrl->event = xc_evtchn_open(logger, 0);
+	ctrl->event = xenevtchn_open(logger, 0);
 	if (!ctrl->event)
 		return -1;
 
-	port = xc_evtchn_bind_unbound_port(ctrl->event, domain);
+	port = xenevtchn_bind_unbound_port(ctrl->event, domain);
 	if (port < 0)
 		goto fail;
 	ctrl->event_port = port;
 
-	if (xc_evtchn_unmask(ctrl->event, ctrl->event_port))
+	if (xenevtchn_unmask(ctrl->event, ctrl->event_port))
 		goto fail;
 
 	return 0;
 
 fail:
 	if (port >= 0)
-		xc_evtchn_unbind(ctrl->event, port);
+		xenevtchn_unbind(ctrl->event, port);
 
-	xc_evtchn_close(ctrl->event);
+	xenevtchn_close(ctrl->event);
 	ctrl->event = NULL;
 
 	return -1;
@@ -347,26 +347,26 @@ static int init_evt_cli(struct libxenvchan *ctrl, int domain, xentoollog_logger
 {
 	evtchn_port_or_error_t port;
 
-	ctrl->event = xc_evtchn_open(logger, 0);
+	ctrl->event = xenevtchn_open(logger, 0);
 	if (!ctrl->event)
 		return -1;
 
-	port = xc_evtchn_bind_interdomain(ctrl->event,
+	port = xenevtchn_bind_interdomain(ctrl->event,
 		domain, ctrl->event_port);
 	if (port < 0)
 		goto fail;
 	ctrl->event_port = port;
 
-	if (xc_evtchn_unmask(ctrl->event, ctrl->event_port))
+	if (xenevtchn_unmask(ctrl->event, ctrl->event_port))
 		goto fail;
 
 	return 0;
 
 fail:
 	if (port >= 0)
-		xc_evtchn_unbind(ctrl->event, port);
+		xenevtchn_unbind(ctrl->event, port);
 
-	xc_evtchn_close(ctrl->event);
+	xenevtchn_close(ctrl->event);
 	ctrl->event = NULL;
 
 	return -1;
tools/libvchan/io.c +6 -6
index e66bc4e..4bd15ed 100644
@@ -106,7 +106,7 @@ static inline int send_notify(struct libxenvchan *ctrl, uint8_t bit)
 	notify = ctrl->is_server ? &ctrl->ring->srv_notify : &ctrl->ring->cli_notify;
 	prev = __sync_fetch_and_and(notify, ~bit);
 	if (prev & bit)
-		return xc_evtchn_notify(ctrl->event, ctrl->event_port);
+		return xenevtchn_notify(ctrl->event, ctrl->event_port);
 	else
 		return 0;
 }
@@ -195,10 +195,10 @@ int libxenvchan_buffer_space(struct libxenvchan *ctrl)
 
 int libxenvchan_wait(struct libxenvchan *ctrl)
 {
-	int ret = xc_evtchn_pending(ctrl->event);
+	int ret = xenevtchn_pending(ctrl->event);
 	if (ret < 0)
 		return -1;
-	xc_evtchn_unmask(ctrl->event, ret);
+	xenevtchn_unmask(ctrl->event, ret);
 	return 0;
 }
 
@@ -351,7 +351,7 @@ int libxenvchan_is_open(struct libxenvchan* ctrl)
 
 int libxenvchan_fd_for_select(struct libxenvchan *ctrl)
 {
-	return xc_evtchn_fd(ctrl->event);
+	return xenevtchn_fd(ctrl->event);
 }
 
 void libxenvchan_close(struct libxenvchan *ctrl)
@@ -373,8 +373,8 @@ void libxenvchan_close(struct libxenvchan *ctrl)
 	}
 	if (ctrl->event) {
 		if (ctrl->ring)
-			xc_evtchn_notify(ctrl->event, ctrl->event_port);
-		xc_evtchn_close(ctrl->event);
+			xenevtchn_notify(ctrl->event, ctrl->event_port);
+		xenevtchn_close(ctrl->event);
 	}
 	if (ctrl->is_server) {
 		if (ctrl->gntshr)
tools/libvchan/libxenvchan.h +2 -1
index 6365d36..0517dda 100644
@@ -45,6 +45,7 @@
 
 #include <xen/io/libxenvchan.h>
 #include <xen/sys/evtchn.h>
+#include <xenevtchn.h>
 #include <xenctrl.h>
 
 struct libxenvchan_ring {
@@ -72,7 +73,7 @@ struct libxenvchan {
 	/* Pointer to shared ring page */
 	struct vchan_interface *ring;
 	/* event channel interface */
-	xc_evtchn *event;
+	xenevtchn_handle *event;
 	uint32_t event_port;
 	/* informative flags: are we acting as server? */
 	int is_server:1;
tools/libxc/Makefile +5 -3
index 877ea62..8b69f93 100644
@@ -47,6 +47,7 @@ CTRL_SRCS-$(CONFIG_FreeBSD) += xc_freebsd.c xc_freebsd_osdep.c
 CTRL_SRCS-$(CONFIG_SunOS) += xc_solaris.c
 CTRL_SRCS-$(CONFIG_NetBSD) += xc_netbsd.c
 CTRL_SRCS-$(CONFIG_MiniOS) += xc_minios.c
+CTRL_SRCS-y       += xc_evtchn_compat.c
 
 GUEST_SRCS-y :=
 GUEST_SRCS-y += xg_private.c xc_suspend.c
@@ -114,6 +115,7 @@ CFLAGS-$(CONFIG_Linux) += -D_GNU_SOURCE
 
 CFLAGS	+= $(PTHREAD_CFLAGS)
 CFLAGS	+= $(CFLAGS_libxentoollog)
+CFLAGS	+= $(CFLAGS_libxenevtchn)
 
 CTRL_LIB_OBJS := $(patsubst %.c,%.o,$(CTRL_SRCS-y))
 CTRL_PIC_OBJS := $(patsubst %.c,%.opic,$(CTRL_SRCS-y))
@@ -167,7 +169,7 @@ install: build
 	$(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(libdir)
 	$(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenctrl.so.$(MAJOR)
 	$(SYMLINK_SHLIB) libxenctrl.so.$(MAJOR) $(DESTDIR)$(libdir)/libxenctrl.so
-	$(INSTALL_DATA) include/xenctrl.h include/xenctrlosdep.h $(DESTDIR)$(includedir)
+	$(INSTALL_DATA) include/xenctrl.h include/xenctrl_compat.h include/xenctrlosdep.h $(DESTDIR)$(includedir)
 	$(INSTALL_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)
 	$(INSTALL_DATA) libxenguest.a $(DESTDIR)$(libdir)
 	$(SYMLINK_SHLIB) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(libdir)/libxenguest.so.$(MAJOR)
@@ -210,7 +212,7 @@ libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR)
 	$(SYMLINK_SHLIB) $< $@
 
 libxenctrl.so.$(MAJOR).$(MINOR): $(CTRL_PIC_OBJS)
-	$(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) $(PTHREAD_LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(DLOPEN_LIBS) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
 
 # libxenguest
 
@@ -233,7 +235,7 @@ xc_dom_bzimageloader.opic: CFLAGS += $(call zlib-options,D)
 
 libxenguest.so.$(MAJOR).$(MINOR): COMPRESSION_LIBS = $(call zlib-options,l)
 libxenguest.so.$(MAJOR).$(MINOR): $(GUEST_PIC_OBJS) libxenctrl.so
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(PTHREAD_LIBS) $(APPEND_LDFLAGS)
 
 xenctrl_osdep_ENOSYS.so: $(OSDEP_PIC_OBJS) libxenctrl.so
 	$(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
tools/libxc/include/xenctrl.h +3 -96

124 lines not on this page · raw message

tools/libxc/include/xenctrl_compat.h new file +48 -0

48 lines not on this page · raw message

tools/libxc/include/xenguest.h +6 -4
index 7581263..6fcdb4f 100644
@@ -23,6 +23,8 @@
 #ifndef XENGUEST_H
 #define XENGUEST_H
 
+#include <xenevtchn.h>
+
 #define XC_NUMA_NO_NODE   (~0U)
 
 #define XCFLAGS_LIVE      (1 << 0)
@@ -281,18 +283,18 @@ int xc_hvm_build_target_mem(xc_interface *xch,
  * Sets *lockfd to -1.
  * Has deallocated everything even on error.
  */
-int xc_suspend_evtchn_release(xc_interface *xch, xc_evtchn *xce, int domid, int suspend_evtchn, int *lockfd);
+int xc_suspend_evtchn_release(xc_interface *xch, xenevtchn_handle *xce, int domid, int suspend_evtchn, int *lockfd);
 
 /**
  * This function eats the initial notification.
  * xce must not be used for anything else
  * See xc_suspend_evtchn_init_sane re lockfd.
  */
-int xc_suspend_evtchn_init_exclusive(xc_interface *xch, xc_evtchn *xce,
+int xc_suspend_evtchn_init_exclusive(xc_interface *xch, xenevtchn_handle *xce,
                                      int domid, int port, int *lockfd);
 
 /* xce must not be used for anything else */
-int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn);
+int xc_await_suspend(xc_interface *xch, xenevtchn_handle *xce, int suspend_evtchn);
 
 /**
  * The port will be signaled immediately after this call
@@ -301,7 +303,7 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn);
  * and fed to xc_suspend_evtchn_release.  (On error *lockfd is
  * undefined and xc_suspend_evtchn_release is not allowed.)
  */
-int xc_suspend_evtchn_init_sane(xc_interface *xch, xc_evtchn *xce,
+int xc_suspend_evtchn_init_sane(xc_interface *xch, xenevtchn_handle *xce,
                                 int domid, int port, int *lockfd);
 
 int xc_get_bit_size(xc_interface *xch,
tools/libxc/xc_evtchn_compat.c new file +75 -0

75 lines not on this page · raw message

tools/libxc/xc_freebsd_osdep.c +0 -101

118 lines not on this page · raw message

tools/libxc/xc_linux_osdep.c +0 -95

107 lines not on this page · raw message

tools/libxc/xc_minios.c +0 -221

247 lines not on this page · raw message

tools/libxc/xc_netbsd.c +0 -109

121 lines not on this page · raw message

tools/libxc/xc_private.c +0 -40
index 9f0ada7..375430c 100644
@@ -252,46 +252,6 @@ int do_xen_hypercall(xc_interface *xch, privcmd_hypercall_t *hypercall)
     return xch->ops->u.privcmd.hypercall(xch, xch->ops_handle, hypercall);
 }
 
-xc_evtchn *xc_evtchn_open(xentoollog_logger *logger, unsigned open_flags)
-{
-    xc_evtchn *xce = malloc(sizeof(*xce));
-    int rc;
-
-    if (!xce) return NULL;
-
-    xce->fd = -1;
-    xce->logger = logger;
-    xce->logger_tofree  = NULL;
-
-    if (!xce->logger) {
-        xce->logger = xce->logger_tofree =
-            (xentoollog_logger*)
-            xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0);
-        if (!xce->logger) goto err;
-    }
-
-    rc = osdep_evtchn_open(xce);
-    if ( rc  < 0 ) goto err;
-
-    return xce;
-
-err:
-    osdep_evtchn_close(xce);
-    xtl_logger_destroy(xce->logger_tofree);
-    free(xce);
-    return NULL;
-}
-
-int xc_evtchn_close(xc_evtchn *xce)
-{
-    int rc;
-
-    rc = osdep_evtchn_close(xce);
-    xtl_logger_destroy(xce->logger_tofree);
-    free(xce);
-    return rc;
-}
-
 xc_gnttab *xc_gnttab_open(xentoollog_logger *logger,
                              unsigned open_flags)
 {
tools/libxc/xc_private.h +0 -7
index 4c66766..61f2f45 100644
@@ -124,13 +124,6 @@ struct xc_interface_core {
     xc_osdep_handle  ops_handle; /* opaque data for xc_osdep_ops */
 };
 
-struct xenevtchn_handle {
-    xentoollog_logger *logger, *logger_tofree;
-    int fd;
-};
-int osdep_evtchn_open(xc_evtchn *xce);
-int osdep_evtchn_close(xc_evtchn *xce);
-
 void xc_report_error(xc_interface *xch, int code, const char *fmt, ...)
     __attribute__((format(printf,3,4)));
 void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
tools/libxc/xc_solaris.c +0 -97

109 lines not on this page · raw message

tools/libxc/xc_suspend.c +10 -8
index e22f4ac..139edb4 100644
@@ -17,6 +17,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 
+#include <xenevtchn.h>
+
 #include "xc_private.h"
 #include "xenguest.h"
 
@@ -125,12 +127,12 @@ static int unlock_suspend_event(xc_interface *xch, int domid, int *lockfd)
     return -1;
 }
 
-int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn)
+int xc_await_suspend(xc_interface *xch, xenevtchn_handle *xce, int suspend_evtchn)
 {
     int rc;
 
     do {
-        rc = xc_evtchn_pending(xce);
+        rc = xenevtchn_pending(xce);
         if (rc < 0) {
             ERROR("error polling suspend notification channel: %d", rc);
             return -1;
@@ -138,7 +140,7 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn)
     } while (rc != suspend_evtchn);
 
     /* harmless for one-off suspend */
-    if (xc_evtchn_unmask(xce, suspend_evtchn) < 0)
+    if (xenevtchn_unmask(xce, suspend_evtchn) < 0)
         ERROR("failed to unmask suspend notification channel: %d", rc);
 
     return 0;
@@ -146,16 +148,16 @@ int xc_await_suspend(xc_interface *xch, xc_evtchn *xce, int suspend_evtchn)
 
 /* Internal callers are allowed to call this with suspend_evtchn<0
  * but *lockfd>0. */
-int xc_suspend_evtchn_release(xc_interface *xch, xc_evtchn *xce,
+int xc_suspend_evtchn_release(xc_interface *xch, xenevtchn_handle *xce,
                               int domid, int suspend_evtchn, int *lockfd)
 {
     if (suspend_evtchn >= 0)
-        xc_evtchn_unbind(xce, suspend_evtchn);
+        xenevtchn_unbind(xce, suspend_evtchn);
 
     return unlock_suspend_event(xch, domid, lockfd);
 }
 
-int xc_suspend_evtchn_init_sane(xc_interface *xch, xc_evtchn *xce,
+int xc_suspend_evtchn_init_sane(xc_interface *xch, xenevtchn_handle *xce,
                                 int domid, int port, int *lockfd)
 {
     int rc, suspend_evtchn = -1;
@@ -165,7 +167,7 @@ int xc_suspend_evtchn_init_sane(xc_interface *xch, xc_evtchn *xce,
         goto cleanup;
     }
 
-    suspend_evtchn = xc_evtchn_bind_interdomain(xce, domid, port);
+    suspend_evtchn = xenevtchn_bind_interdomain(xce, domid, port);
     if (suspend_evtchn < 0) {
         ERROR("failed to bind suspend event channel: %d", suspend_evtchn);
         goto cleanup;
@@ -185,7 +187,7 @@ cleanup:
     return -1;
 }
 
-int xc_suspend_evtchn_init_exclusive(xc_interface *xch, xc_evtchn *xce,
+int xc_suspend_evtchn_init_exclusive(xc_interface *xch, xenevtchn_handle *xce,
                                      int domid, int port, int *lockfd)
 {
     int suspend_evtchn;
tools/libxenevtchn/Makefile new file +65 -0

65 lines not on this page · raw message

tools/libxenevtchn/core.c new file +60 -0

60 lines not on this page · raw message

tools/libxenevtchn/freebsd.c new file +122 -0

122 lines not on this page · raw message

tools/libxenevtchn/include/xenevtchn.h new file +154 -0

154 lines not on this page · raw message

tools/libxenevtchn/libxenevtchn.map new file +14 -0
new file mode 100644
index 0000000..1437940
@@ -0,0 +1,14 @@
+VERS_1.0 {
+	global:
+		xenevtchn_fd;
+		xenevtchn_bind_unbound_port;
+		xenevtchn_unbind;
+		xenevtchn_unmask;
+		xenevtchn_notify;
+		xenevtchn_bind_interdomain;
+		xenevtchn_bind_virq;
+		xenevtchn_open;
+		xenevtchn_close;
+		xenevtchn_pending;
+	local: *; /* Do not expose anything by default */
+};
tools/libxenevtchn/linux.c new file +133 -0

133 lines not on this page · raw message

tools/libxenevtchn/minios.c new file +257 -0

257 lines not on this page · raw message

tools/libxenevtchn/netbsd.c new file +132 -0

132 lines not on this page · raw message

tools/libxenevtchn/private.h new file +15 -0
new file mode 100644
index 0000000..107c438
@@ -0,0 +1,15 @@
+#ifndef XENEVTCHN_PRIVATE_H
+#define XENEVTCHN_PRIVATE_H
+
+#include <xentoollog.h>
+#include <xenevtchn.h>
+
+struct xenevtchn_handle {
+    xentoollog_logger *logger, *logger_tofree;
+    int fd;
+};
+
+int osdep_evtchn_open(xenevtchn_handle *xce);
+int osdep_evtchn_close(xenevtchn_handle *xce);
+
+#endif
tools/libxenevtchn/solaris.c new file +120 -0

120 lines not on this page · raw message

tools/libxl/Makefile +3 -2
index 387dc91..6183f5a 100644
@@ -20,12 +20,13 @@ LIBUUID_LIBS += -luuid
 endif
 
 LIBXL_LIBS =
-LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
+LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
 ifeq ($(CONFIG_REMUS_NETBUF),y)
 LIBXL_LIBS += $(LIBNL3_LIBS)
 endif
 
 CFLAGS_LIBXL += $(CFLAGS_libxentoollog)
+CFLAGS_LIBXL += $(CFLAGS_libxenevtchn)
 CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
 CFLAGS_LIBXL += $(CFLAGS_libxenguest)
 CFLAGS_LIBXL += $(CFLAGS_libxenstore)
@@ -142,7 +143,7 @@ $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenctrl)
 $(XEN_INIT_DOM0_OBJS): CFLAGS += $(CFLAGS_libxenstore)
 
 SAVE_HELPER_OBJS = libxl_save_helper.o _libxl_save_msgs_helper.o
-$(SAVE_HELPER_OBJS): CFLAGS += $(CFLAGS_libxenctrl)
+$(SAVE_HELPER_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn)
 
 PKG_CONFIG = xenlight.pc xlutil.pc
 
tools/libxl/libxl.c +1 -1
index 9117b01..45a9493 100644
@@ -178,7 +178,7 @@ int libxl_ctx_free(libxl_ctx *ctx)
     if (ctx->xch) xc_interface_close(ctx->xch);
     libxl_version_info_dispose(&ctx->version_info);
     if (ctx->xsh) xs_daemon_close(ctx->xsh);
-    if (ctx->xce) xc_evtchn_close(ctx->xce);
+    if (ctx->xce) xenevtchn_close(ctx->xce);
 
     libxl__poller_dispose(&ctx->poller_app);
     assert(LIBXL_LIST_EMPTY(&ctx->pollers_event));
tools/libxl/libxl_dom.c +2 -2
index 867172a..843741d 100644
@@ -1424,9 +1424,9 @@ static void domain_suspend_callback_common(libxl__egc *egc,
     if ((hvm_s_state == 0) && (dss->guest_evtchn.port >= 0)) {
         LOG(DEBUG, "issuing %s suspend request via event channel",
             dss->hvm ? "PVHVM" : "PV");
-        ret = xc_evtchn_notify(CTX->xce, dss->guest_evtchn.port);
+        ret = xenevtchn_notify(CTX->xce, dss->guest_evtchn.port);
         if (ret < 0) {
-            LOG(ERROR, "xc_evtchn_notify failed ret=%d", ret);
+            LOG(ERROR, "xenevtchn_notify failed ret=%d", ret);
             goto err;
         }
 
tools/libxl/libxl_event.c +7 -7
index 9ff4e78..0e842bf 100644
@@ -705,7 +705,7 @@ static void evtchn_fd_callback(libxl__egc *egc, libxl__ev_fd *ev,
         /* OK, that's that workaround done.  We can actually check for
          * work for us to do: */
 
-        port = xc_evtchn_pending(CTX->xce);
+        port = xenevtchn_pending(CTX->xce);
         if (port < 0) {
             if (errno == EAGAIN)
                 break;
@@ -731,20 +731,20 @@ static void evtchn_fd_callback(libxl__egc *egc, libxl__ev_fd *ev,
 }
 
 int libxl__ctx_evtchn_init(libxl__gc *gc) {
-    xc_evtchn *xce;
+    xenevtchn_handle *xce;
     int rc, fd;
 
     if (CTX->xce)
         return 0;
 
-    xce = xc_evtchn_open(CTX->lg, 0);
+    xce = xenevtchn_open(CTX->lg, 0);
     if (!xce) {
         LOGE(ERROR,"cannot open libxc evtchn handle");
         rc = ERROR_FAIL;
         goto out;
     }
 
-    fd = xc_evtchn_fd(xce);
+    fd = xenevtchn_fd(xce);
     assert(fd >= 0);
 
     rc = libxl_fd_set_nonblock(CTX, fd, 1);
@@ -754,7 +754,7 @@ int libxl__ctx_evtchn_init(libxl__gc *gc) {
     return 0;
 
  out:
-    xc_evtchn_close(xce);
+    xenevtchn_close(xce);
     return rc;
 }
 
@@ -776,14 +776,14 @@ int libxl__ev_evtchn_wait(libxl__gc *gc, libxl__ev_evtchn *evev)
 
     if (!libxl__ev_fd_isregistered(&CTX->evtchn_efd)) {
         rc = libxl__ev_fd_register(gc, &CTX->evtchn_efd, evtchn_fd_callback,
-                                   xc_evtchn_fd(CTX->xce), POLLIN);
+                                   xenevtchn_fd(CTX->xce), POLLIN);
         if (rc) goto out;
     }
 
     if (evev->waiting)
         return 0;
 
-    r = xc_evtchn_unmask(CTX->xce, evev->port);
+    r = xenevtchn_unmask(CTX->xce, evev->port);
     if (r) {
         LOGE(ERROR,"cannot unmask event channel %d",evev->port);
         rc = ERROR_FAIL;
tools/libxl/libxl_internal.h +3 -2
index bb3a5c7..f6ad21f 100644
@@ -46,6 +46,7 @@
 #include <sys/file.h>
 #include <sys/ioctl.h>
 
+#include <xenevtchn.h>
 #include <xenstore.h>
 #include <xenctrl.h>
 #include <xenguest.h>
@@ -377,7 +378,7 @@ struct libxl__ctx {
     uint32_t watch_counter; /* helps disambiguate slot reuse */
     libxl__ev_fd watch_efd;
 
-    xc_evtchn *xce; /* waiting must be done only with libxl__ev_evtchn* */
+    xenevtchn_handle *xce; /* waiting must be done only with libxl__ev_evtchn* */
     LIBXL_LIST_HEAD(, libxl__ev_evtchn) evtchns_waiting;
     libxl__ev_fd evtchn_efd;
 
@@ -829,7 +830,7 @@ static inline int libxl__ev_xswatch_isregistered(const libxl__ev_xswatch *xw)
  * When the event is signaled then the callback will be made, once.
  * Then you must call libxl__ev_evtchn_wait again, if desired.
  *
- * You must NOT call xc_evtchn_unmask.  wait will do that for you.
+ * You must NOT call xenevtchn_unmask.  wait will do that for you.
  *
  * Calling libxl__ev_evtchn_cancel will arrange for libxl to disregard
  * future occurrences of event.  Both libxl__ev_evtchn_wait and
tools/misc/Makefile +4 -3
index c4490f3..cf6a475 100644
@@ -4,6 +4,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 CFLAGS += -Werror
 # Include configure output (config.h)
 CFLAGS += -include $(XEN_ROOT)/tools/config.h
+CFLAGS += $(CFLAGS_libxenevtchn)
 CFLAGS += $(CFLAGS_libxenctrl)
 CFLAGS += $(CFLAGS_xeninclude)
 CFLAGS += $(CFLAGS_libxenstore)
@@ -88,18 +89,18 @@ xenlockprof: xenlockprof.o
 # xen-hptool incorrectly uses libxc internals
 xen-hptool.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc
 xen-hptool: xen-hptool.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
 
 # xen-mfndump incorrectly uses libxc internals
 xen-mfndump.o: CFLAGS += -I$(XEN_ROOT)/tools/libxc
 xen-mfndump: xen-mfndump.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS)
 
 xenwatchdogd: xenwatchdogd.o
 	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
 
 xen-lowmemd: xen-lowmemd.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
 
 gtraceview: gtraceview.o
 	$(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS) $(TINFO_LIBS) $(APPEND_LDFLAGS)
tools/misc/xen-hptool.c +7 -6
index c7561a9..ebcc9e8 100644
@@ -1,3 +1,4 @@
+#include <xenevtchn.h>
 #include <xenctrl.h>
 #include <xc_private.h>
 #include <xc_core.h>
@@ -98,7 +99,7 @@ static int hp_mem_query_func(int argc, char *argv[])
     return ret;
 }
 
-static int suspend_guest(xc_interface *xch, xc_evtchn *xce, int domid,
+static int suspend_guest(xc_interface *xch, xenevtchn_handle *xce, int domid,
                          int *evtchn, int *lockfd)
 {
     int port, rc, suspend_evtchn = -1;
@@ -123,7 +124,7 @@ static int suspend_guest(xc_interface *xch, xc_evtchn *xce, int domid,
     }
     *evtchn = suspend_evtchn;
 
-    rc = xc_evtchn_notify(xce, suspend_evtchn);
+    rc = xenevtchn_notify(xce, suspend_evtchn);
     if (rc < 0)
     {
         fprintf(stderr, "Failed to notify suspend channel: errno %d\n", rc);
@@ -198,8 +199,8 @@ static int hp_mem_offline_func(int argc, char *argv[])
                 else if (status & PG_OFFLINE_OWNED)
                 {
                     int result, suspend_evtchn = -1, suspend_lockfd = -1;
-                    xc_evtchn *xce;
-                    xce = xc_evtchn_open(NULL, 0);
+                    xenevtchn_handle *xce;
+                    xce = xenevtchn_open(NULL, 0);
 
                     if (xce == NULL)
                     {
@@ -214,7 +215,7 @@ static int hp_mem_offline_func(int argc, char *argv[])
                     {
                         fprintf(stderr, "Failed to suspend guest %d for"
                                 " mfn %lx\n", domid, mfn);
-                        xc_evtchn_close(xce);
+                        xenevtchn_close(xce);
                         return -1;
                     }
 
@@ -238,7 +239,7 @@ static int hp_mem_offline_func(int argc, char *argv[])
                     xc_domain_resume(xch, domid, 1);
                     xc_suspend_evtchn_release(xch, xce, domid,
                                               suspend_evtchn, &suspend_lockfd);
-                    xc_evtchn_close(xce);
+                    xenevtchn_close(xce);
                 }
                 break;
             }
tools/misc/xen-lowmemd.c +8 -7
index 82ffd75..3200404 100644
@@ -4,22 +4,23 @@
  */
 
 #include <stdio.h>
+#include <xenevtchn.h>
 #include <xenctrl.h>
 #include <xenstore.h>
 #include <stdlib.h>
 #include <string.h>
 
 static evtchn_port_t virq_port      = -1;
-static xc_evtchn *xce_handle        = NULL;
+static xenevtchn_handle *xce_handle = NULL;
 static xc_interface *xch            = NULL;
 static struct xs_handle *xs_handle  = NULL;
 
 void cleanup(void)
 {
     if (virq_port > -1)
-        xc_evtchn_unbind(xce_handle, virq_port);
+        xenevtchn_unbind(xce_handle, virq_port);
     if (xce_handle)
-        xc_evtchn_close(xce_handle);
+        xenevtchn_close(xce_handle);
     if (xch)
         xc_interface_close(xch);
     if (xs_handle)
@@ -94,7 +95,7 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-	xce_handle = xc_evtchn_open(NULL, 0);
+	xce_handle = xenevtchn_open(NULL, 0);
 	if (xce_handle == NULL)
     {
         perror("Failed to open evtchn device");
@@ -108,7 +109,7 @@ int main(int argc, char *argv[])
         return 3;
     }
 
-	if ((rc = xc_evtchn_bind_virq(xce_handle, VIRQ_ENOMEM)) == -1)
+	if ((rc = xenevtchn_bind_virq(xce_handle, VIRQ_ENOMEM)) == -1)
     {
         perror("Failed to bind to domain exception virq port");
         return 4;
@@ -120,7 +121,7 @@ int main(int argc, char *argv[])
     {
         evtchn_port_t port;
 
-        if ((port = xc_evtchn_pending(xce_handle)) == -1)
+        if ((port = xenevtchn_pending(xce_handle)) == -1)
         {
             perror("Failed to listen for pending event channel");
             return 5;
@@ -134,7 +135,7 @@ int main(int argc, char *argv[])
             return 6;
         }
 
-        if (xc_evtchn_unmask(xce_handle, port) == -1)
+        if (xenevtchn_unmask(xce_handle, port) == -1)
         {
             perror("Failed to unmask port");
             return 7;
tools/ocaml/libs/eventchn/Makefile +2 -2
index 2d8d618..154efd4 100644
@@ -2,13 +2,13 @@ TOPLEVEL=$(CURDIR)/../..
 XEN_ROOT=$(TOPLEVEL)/../..
 include $(TOPLEVEL)/common.make
 
-CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
+CFLAGS += $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude)
 
 OBJS = xeneventchn
 INTF = $(foreach obj, $(OBJS),$(obj).cmi)
 LIBS = xeneventchn.cma xeneventchn.cmxa
 
-LIBS_xeneventchn = $(LDLIBS_libxenctrl)
+LIBS_xeneventchn = $(LDLIBS_libxenevtchn)
 
 all: $(INTF) $(LIBS) $(PROGRAMS)
 
tools/ocaml/libs/eventchn/xeneventchn_stubs.c +10 -10
index 5939e7c..c2d4737 100644
@@ -24,7 +24,7 @@
 #include <xen/sysctl.h>
 #include <xen/xen.h>
 #include <xen/sys/evtchn.h>
-#include <xenctrl.h>
+#include <xenevtchn.h>
 
 #define CAML_NAME_SPACE
 #include <caml/mlvalues.h>
@@ -34,14 +34,14 @@
 #include <caml/callback.h>
 #include <caml/fail.h>
 
-#define _H(__h) ((xc_evtchn *)(__h))
+#define _H(__h) ((xenevtchn_handle *)(__h))
 
 CAMLprim value stub_eventchn_init(void)
 {
 	CAMLparam0();
 	CAMLlocal1(result);
 
-	xc_evtchn *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
+	xenevtchn_handle *xce = xenevtchn_open(NULL, 0);
 	if (xce == NULL)
 		caml_failwith("open failed");
 
@@ -55,7 +55,7 @@ CAMLprim value stub_eventchn_fd(value xce)
 	CAMLlocal1(result);
 	int fd;
 
-	fd = xc_evtchn_fd(_H(xce));
+	fd = xenevtchn_fd(_H(xce));
 	if (fd == -1)
 		caml_failwith("evtchn fd failed");
 
@@ -69,7 +69,7 @@ CAMLprim value stub_eventchn_notify(value xce, value port)
 	CAMLparam2(xce, port);
 	int rc;
 
-	rc = xc_evtchn_notify(_H(xce), Int_val(port));
+	rc = xenevtchn_notify(_H(xce), Int_val(port));
 	if (rc == -1)
 		caml_failwith("evtchn notify failed");
 
@@ -83,7 +83,7 @@ CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
 	CAMLlocal1(port);
 	evtchn_port_or_error_t rc;
 
-	rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
+	rc = xenevtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
 	if (rc == -1)
 		caml_failwith("evtchn bind_interdomain failed");
 	port = Val_int(rc);
@@ -97,7 +97,7 @@ CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
 	CAMLlocal1(port);
 	evtchn_port_or_error_t rc;
 
-	rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
+	rc = xenevtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
 	if (rc == -1)
 		caml_failwith("evtchn bind_dom_exc_virq failed");
 	port = Val_int(rc);
@@ -110,7 +110,7 @@ CAMLprim value stub_eventchn_unbind(value xce, value port)
 	CAMLparam2(xce, port);
 	int rc;
 
-	rc = xc_evtchn_unbind(_H(xce), Int_val(port));
+	rc = xenevtchn_unbind(_H(xce), Int_val(port));
 	if (rc == -1)
 		caml_failwith("evtchn unbind failed");
 
@@ -123,7 +123,7 @@ CAMLprim value stub_eventchn_pending(value xce)
 	CAMLlocal1(result);
 	evtchn_port_or_error_t port;
 
-	port = xc_evtchn_pending(_H(xce));
+	port = xenevtchn_pending(_H(xce));
 	if (port == -1)
 		caml_failwith("evtchn pending failed");
 	result = Val_int(port);
@@ -137,7 +137,7 @@ CAMLprim value stub_eventchn_unmask(value xce, value _port)
 	evtchn_port_t port;
 
 	port = Int_val(_port);
-	if (xc_evtchn_unmask(_H(xce), port))
+	if (xenevtchn_unmask(_H(xce), port))
 		caml_failwith("evtchn unmask failed");
 	CAMLreturn(Val_unit);
 }
tools/python/setup.py +6 -1
index e55ee01..906d880 100644
@@ -8,13 +8,18 @@ extra_compile_args  = [ "-fno-strict-aliasing", "-Werror" ]
 
 PATH_XEN      = XEN_ROOT + "/tools/include"
 PATH_LIBXENTOOLLOG = XEN_ROOT + "/tools/libxentoollog"
+PATH_LIBXENEVTCHN = XEN_ROOT + "/tools/libxenevtchn"
 PATH_LIBXC    = XEN_ROOT + "/tools/libxc"
[… more lines in the raw message]

Lines of this file are not shown. View the raw message.

tools/tests/xen-access/xen-access.c +1 -1
index 12ab921..d68ae84 100644

Lines of this file are not shown. View the raw message.

tools/xcutils/Makefile +2 -2
index fff519d..2d1f112 100644

Lines of this file are not shown. View the raw message.

tools/xenmon/Makefile +2 -0
index 5095682..fa80983 100644

Lines of this file are not shown. View the raw message.

tools/xenmon/xenbaked.c +7 -6
index dc61d14..f092aec 100644

Lines of this file are not shown. View the raw message.

tools/xenpaging/Makefile +2 -2
index e63d894..d491867 100644

Lines of this file are not shown. View the raw message.

tools/xenpaging/xenpaging.c +9 -9
index 3f4c2e9..6776896 100644

Lines of this file are not shown. View the raw message.

tools/xenpaging/xenpaging.h +2 -1
index 25d511d..6c12030 100644

Lines of this file are not shown. View the raw message.

tools/xenstore/Makefile +3 -2
index 1b4a494..c161046 100644

Lines of this file are not shown. View the raw message.

tools/xenstore/xenstored_core.c +4 -2
index b18000d..7f1e489 100644

Lines of this file are not shown. View the raw message.

tools/xenstore/xenstored_domain.c +13 -12
index 6d0394d..51959da 100644

Lines of this file are not shown. View the raw message.

tools/xentrace/Makefile +2 -0
index 5360960..fc94e04 100644

Lines of this file are not shown. View the raw message.

tools/xentrace/xentrace.c +7 -6
index 4ee1458..c970d42 100644

Lines of this file are not shown. View the raw message.

The rest of this diff is not shown. View the raw message.

Signature · 1 line
1.7.10.4

Part of the diff is not shown here. View the raw message.

#15 lore raw

Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.

Quoted 17 lines · Ian Campbell

libxenevtchn will provide a stable API and ABI for accessing the evtchn device.

The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.

All in-tree users are updated to use the new names.

Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names, which is used by qemu-xen for the time being.

The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).

Quoted 5 lines

This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:

- xc_evtchn_alloc_unbound

I was about to complain that this is important functionality for this new lib, but the library provides the more useful xenevtchn_bind_unbound_port() instead. Might be worth mentioning this in the commit.

David

#16 lore raw

Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.

Quoted 22 lines · David Vrabel
Quoted 21 lines · Ian Campbell

libxenevtchn will provide a stable API and ABI for accessing the evtchn device.

The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.

All in-tree users are updated to use the new names.

Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names, which is used by qemu-xen for the time being.

The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).

This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:

Quoted 6 lines
Quoted 1 line

- xc_evtchn_alloc_unbound

I was about to complain that this is important functionality for this new lib, but the library provides the more useful xenevtchn_bind_unbound_port() instead. Might be worth mentioning this in the commit.

Yes, I hadn't realised the two were redundant in that way. I'll mention it.

Perhaps we should even consider removing xc_evtchn_alloc_unbound? Other then the language bindings I can't see an in tree user apart from the language bindings. I suspect the user was xend.

Ian.

#17 lore raw

Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.

In reply to Ian Campbell
Quoted 41 lines · Ian Campbell

libxenevtchn will provide a stable API and ABI for accessing the evtchn device.

The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.

All in-tree users are updated to use the new names.

Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names, which is used by qemu-xen for the time being.

The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).

This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:

- xc_evtchn_alloc_unbound
- xc_evtchn_reset
- xc_evtchn_status

These functions do not appear to be needed by qemu-dm, qemu-pv (provision of device model to HVM guests and PV backends respectively) or by libvchan suggesting they are not needed by non-toolstack uses of event channels. QEMU does use these in hw/xenpv/xen_domainbuild.c but that is a "toolstack use".

The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.

Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.

---

Quoted 7 lines

Must be applied with:

- "qemu-xen-traditional: Use libxenevtchn" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
---

As we are taking the hit of updating all in-tree users, and providing a compat shim, can we take the opportunity to make amends to the ABI.

For xenevtchn, it is never realistically going to gain logging. It seems like it would be a good idea to ditch all knowledge of xentoollog from the new library, as the cost is just dropping one parameter in the callsites.

~Andrew

#18 lore raw

Re: [PATCH RFC tools 5/6] tools: Refactor /dev/xen/evtchn wrappers into libxenevtchn.

Quoted 44 lines · Andrew Cooper
Quoted 43 lines · Ian Campbell

libxenevtchn will provide a stable API and ABI for accessing the evtchn device.

The functions are moved into the xenevtchn namespace to make a clean break from libxc and avoid ambiguity regarding which interfaces are stable.

All in-tree users are updated to use the new names.

Upon request (via #define XC_WANT_COMPAT_EVTCHN_API) libxenctrl will provide a compat API for the old names, which is used by qemu-xen for the time being.

The dynamic osdep mechanism from libxc is not preserved, the alternative backend (a xen-api/xapi shim) is no longer around. (Nested virt probably suffices for this use case now).

This leaves a few event channel related functions which go via privcmd (EVTCHNOP) rather than ioctls on the /dev/xen/evtchn device in libxenctrl. Specifically:

- xc_evtchn_alloc_unbound
- xc_evtchn_reset
- xc_evtchn_status

These functions do not appear to be needed by qemu-dm, qemu-pv (provision of device model to HVM guests and PV backends respectively) or by libvchan suggesting they are not needed by non-toolstack uses of event channels. QEMU does use these in hw/xenpv/xen_domainbuild.c but that is a "toolstack use".

The new library uses a version script to ensure that only expected symbols are exported and to version them such that ABI guarantees can be kept in the future.

Build tested with Linux and mini-os/stubdom, but not FreeBSD, NetBSD or Solaris.

---

Must be applied with:

Quoted 8 lines
Quoted 5 lines

- "qemu-xen-traditional: Use libxenevtchn" and a corresponding QEMU_TAG update folded here.
- "mini-os: Include libxenevtchn with libxc"" and a corresponding bump to MINIOS_UPSTREAM_REVISION folded in here.
---

As we are taking the hit of updating all in-tree users, and providing a compat shim, can we take the opportunity to make amends to the ABI.

Yes, we should in general take the opportunity.

In particular fixing the error reporting behaviour would be a very good idea...

Quoted 1 line

For xenevtchn, it is never realistically going to gain logging.

I thought about this but I wasn't sure and at least the Solaris backend does log (or tries to, who knows if it works!).

Quoted 4 lines

It
seems like it would be a good idea to ditch all knowledge of xentoollog from the new library, as the cost is just dropping one parameter in the callsites.

I don't think the overhead of an extra NULL is worth it, and it's possible something might want to log there in the future.

Ian.

#19 lore raw

RFC PATCH 6/6 Cleanup SHLIBDEPS

In reply to Ian Campbell
---
 tools/Rules.mk |   25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)
tools/Rules.mk +15 -10
index fd3a7db..fbb0fb4 100644
@@ -45,24 +45,28 @@ LDLIBS_libxenevtchn = $(XEN_LIBXENEVTCHN)/libxenevtchn$(libextension)
 SHLIB_libxenevtchn  = -Wl,-rpath-link=$(XEN_LIBXENEVTCHN)
 
 CFLAGS_libxenctrl = -I$(XEN_LIBXC)/include $(CFLAGS_libxentoollog) $(CFLAGS_xeninclude)
-LDLIBS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenctrl$(libextension)
-SHLIB_libxenctrl  =  $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBXC)
+SHDEPS_libxenctrl = $(SHLIB_libxentoollog) $(SHLIB_libxenevtchn)
+LDLIBS_libxenctrl = $(SHDEPS_libxenctrl) $(XEN_LIBXC)/libxenctrl$(libextension)
+SHLIB_libxenctrl  = $(SHDEPS_libxenctrl) -Wl,-rpath-link=$(XEN_LIBXC)
 
 CFLAGS_libxenguest = -I$(XEN_LIBXC)/include $(CFLAGS_libxenevtchn) $(CFLAGS_xeninclude)
-LDLIBS_libxenguest = $(SHLIB_libxenevtchn) $(XEN_LIBXC)/libxenguest$(libextension)
-SHLIB_libxenguest  = $(SHLIB_libxenevtchn) -Wl,-rpath-link=L$(XEN_LIBXC)
+SHDEPS_libxenguest = $(SHLIB_libxenevtchn)
+LDLIBS_libxenguest = $(SHDEPS_libxenguest) $(XEN_LIBXC)/libxenguest$(libextension)
+SHLIB_libxenguest  = $(SHDEPS_libxenguest) -Wl,-rpath-link=L$(XEN_LIBXC)
 
 CFLAGS_libxenstore = -I$(XEN_XENSTORE)/include $(CFLAGS_xeninclude)
 LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore$(libextension)
 SHLIB_libxenstore  = -Wl,-rpath-link=$(XEN_XENSTORE)
 
 CFLAGS_libxenstat  = -I$(XEN_LIBXENSTAT)
-LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat$(libextension)
-SHLIB_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -Wl,-rpath-link=$(XEN_LIBXENSTAT)
+SHDEPS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore)
+LDLIBS_libxenstat  = $(SHDEPS_libxenstat) $(XEN_LIBXENSTAT)/libxenstat$(libextension)
+SHLIB_libxenstat   = $(SHDEPS_libxenstat) -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 CFLAGS_libxenvchan = -I$(XEN_LIBVCHAN)
-LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) $(XEN_LIBVCHAN)/libxenvchan$(libextension)
-SHLIB_libxenvchan  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn) -Wl,-rpath-link=$(XEN_LIBVCHAN)
+SHDEPS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libxenevtchn)
+LDLIBS_libxenvchan = $(SHDEPS_libxenvchan) $(XEN_LIBVCHAN)/libxenvchan$(libextension)
+SHLIB_libxenvchan  = $(SHDEPS_libxenvchan) -Wl,-rpath-link=$(XEN_LIBVCHAN)
 
 ifeq ($(debug),y)
 # Disable optimizations and enable debugging information for macros
@@ -84,8 +88,9 @@ SHLIB_libblktapctl  =
 endif
 
 CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
-LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight$(libextension) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
-SHLIB_libxenlight  = -Wl,-rpath-link=$(XEN_XENLIGHT)
+SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
+LDLIBS_libxenlight = $(SHDEPS_libxenlight) $(XEN_XENLIGHT)/libxenlight$(libextension)
+SHLIB_libxenlight  = $(SHDEPS_libxenlight) -Wl,-rpath-link=$(XEN_XENLIGHT)
 
 CFLAGS += -D__XEN_TOOLS__
 
Signature · 1 line
1.7.10.4
#20 lore raw

RFC PATCH 1/2 qemu-xen-traditional: Use xentoollog as a separate library

In reply to Ian Campbell

This has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).

---
 xen-hooks.mak |    2 ++
 1 file changed, 2 insertions(+)
xen-hooks.mak +2 -0
index bc7f1f1..2e53c04 100644
@@ -1,3 +1,4 @@
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libxentoollog/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/include
@@ -19,6 +20,7 @@ CFLAGS += $(CMDLINE_CFLAGS)
 
 LIBS += -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest
 LIBS += -L$(XEN_ROOT)/tools/xenstore -lxenstore
+LIBS += -Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog
 
 LDFLAGS := $(CFLAGS) $(LDFLAGS)
 
Signature · 1 line
1.7.10.4
Acked-by on v1 1/2
#21 lore raw

Re: [PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library

Ian Campbell writes ("[PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library"):

Quoted 4 lines

This has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).

I guess this is harmless to apply right away ?

Ian.

#22 lore raw

Re: [PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library

Quoted 9 lines · Ian Jackson

Ian Campbell writes ("[PATCH RFC qemu-trad 1/2] qemu-xen-traditional: Use xentoollog as a separate library"):

Quoted 4 lines

This has been split out of libxenctrl, so the build needs to be able to find the header and the library. QEMU does not use xtl_* itself so -rpath-link is sufficient to allow linking to libxenctrl.so (which links against libxentoollog).

I guess this is harmless to apply right away ?

I suppose so, although the paths it references won't actually exist until later

Ian.

#23 lore raw

RFC PATCH 1/2 mini-os: Include libxentoollog with libxc

In reply to Ian Campbell

libxentoollog has just been split out from libxc. From mini-os's point of view we don't care about the distinction, so keep things simple by just including libxentoollog if libxc is enabled.

---
 Makefile |    1 +
 1 file changed, 1 insertion(+)
Makefile +1 -0
index 2cb5e51..757bd70 100644
@@ -165,6 +165,7 @@ OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS))
 
 ifeq ($(libc),y)
 ifeq ($(CONFIG_XC),y)
+APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxentoollog-$(MINIOS_TARGET_ARCH) -whole-archive -lxentoollog -no-whole-archive
 APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(MINIOS_TARGET_ARCH) -whole-archive -lxenguest -lxenctrl -no-whole-archive
 endif
 APP_LDLIBS += -lpci
Signature · 1 line
1.7.10.4
#24 lore raw

RFC PATCH 2/2 qemu-xen-traditional: Use libxenevtchn

In reply to Ian Campbell

/dev/xen/evtchn related wrappers have been moved out of libxenctrl into their own library.

Note that i386-dm/helper2.c's xc_interface * was always really an xc_evtchn *, it's just they used to be typedefs to the same thing...

---
 hw/xen_backend.c  |   26 +++++++++++++-------------
 hw/xen_backend.h  |    2 +-
 hw/xen_common.h   |    1 +
 i386-dm/helper2.c |   19 ++++++++++---------
 xen-hooks.mak     |    2 ++
 5 files changed, 27 insertions(+), 23 deletions(-)
hw/xen_backend.c +13 -13
index 92b3506..40f6887 100644
@@ -208,19 +208,19 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
     xendev->debug      = debug;
     xendev->local_port = -1;
 
-    xendev->evtchndev = xc_evtchn_open(NULL, 0);
+    xendev->evtchndev = xenevtchn_open(NULL, 0);
     if (xendev->evtchndev == NULL) {
 	xen_be_printf(NULL, 0, "can't open evtchn device\n");
 	qemu_free(xendev);
 	return NULL;
     }
-    fcntl(xc_evtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC);
+    fcntl(xenevtchn_fd(xendev->evtchndev), F_SETFD, FD_CLOEXEC);
 
     if (ops->flags & DEVOPS_FLAG_NEED_GNTDEV) {
 	xendev->gnttabdev = xc_gnttab_open(NULL, 0);
 	if (xendev->gnttabdev == NULL) {
 	    xen_be_printf(NULL, 0, "can't open gnttab device\n");
-	    xc_evtchn_close(xendev->evtchndev);
+	    xenevtchn_close(xendev->evtchndev);
 	    qemu_free(xendev);
 	    return NULL;
 	}
@@ -268,7 +268,7 @@ static struct XenDevice *xen_be_del_xendev(int dom, int dev)
 	}
 
 	if (xendev->evtchndev != NULL)
-	    xc_evtchn_close(xendev->evtchndev);
+	    xenevtchn_close(xendev->evtchndev);
 	if (xendev->gnttabdev != NULL)
 	    xc_gnttab_close(xendev->gnttabdev);
 
@@ -630,13 +630,13 @@ static void xen_be_evtchn_event(void *opaque)
     struct XenDevice *xendev = opaque;
     evtchn_port_t port;
 
-    port = xc_evtchn_pending(xendev->evtchndev);
+    port = xenevtchn_pending(xendev->evtchndev);
     if (port != xendev->local_port) {
-	xen_be_printf(xendev, 0, "xc_evtchn_pending returned %d (expected %d)\n",
+	xen_be_printf(xendev, 0, "xenevtchn_pending returned %d (expected %d)\n",
 		      port, xendev->local_port);
 	return;
     }
-    xc_evtchn_unmask(xendev->evtchndev, port);
+    xenevtchn_unmask(xendev->evtchndev, port);
 
     if (xendev->ops->event)
 	xendev->ops->event(xendev);
@@ -683,14 +683,14 @@ int xen_be_bind_evtchn(struct XenDevice *xendev)
 {
     if (xendev->local_port != -1)
 	return 0;
-    xendev->local_port = xc_evtchn_bind_interdomain
+    xendev->local_port = xenevtchn_bind_interdomain
 	(xendev->evtchndev, xendev->dom, xendev->remote_port);
     if (xendev->local_port == -1) {
-	xen_be_printf(xendev, 0, "xc_evtchn_bind_interdomain failed\n");
+	xen_be_printf(xendev, 0, "xenevtchn_bind_interdomain failed\n");
 	return -1;
     }
     xen_be_printf(xendev, 2, "bind evtchn port %d\n", xendev->local_port);
-    qemu_set_fd_handler(xc_evtchn_fd(xendev->evtchndev),
+    qemu_set_fd_handler(xenevtchn_fd(xendev->evtchndev),
 			xen_be_evtchn_event, NULL, xendev);
     return 0;
 }
@@ -699,15 +699,15 @@ void xen_be_unbind_evtchn(struct XenDevice *xendev)
 {
     if (xendev->local_port == -1)
 	return;
-    qemu_set_fd_handler(xc_evtchn_fd(xendev->evtchndev), NULL, NULL, NULL);
-    xc_evtchn_unbind(xendev->evtchndev, xendev->local_port);
+    qemu_set_fd_handler(xenevtchn_fd(xendev->evtchndev), NULL, NULL, NULL);
+    xenevtchn_unbind(xendev->evtchndev, xendev->local_port);
     xen_be_printf(xendev, 2, "unbind evtchn port %d\n", xendev->local_port);
     xendev->local_port = -1;
 }
 
 int xen_be_send_notify(struct XenDevice *xendev)
 {
-    return xc_evtchn_notify(xendev->evtchndev, xendev->local_port);
+    return xenevtchn_notify(xendev->evtchndev, xendev->local_port);
 }
 
 /*
hw/xen_backend.h +1 -1
index e421391..60f18f8 100644
@@ -44,7 +44,7 @@ struct XenDevice {
     int                remote_port;
     int                local_port;
 
-    xc_evtchn          *evtchndev;
+    xenevtchn_handle   *evtchndev;
     xc_gnttab          *gnttabdev;
 
     struct XenDevOps   *ops;
hw/xen_common.h +1 -0
index a615052..cee908f 100644
@@ -4,6 +4,7 @@
 #include <stddef.h>
 #include <inttypes.h>
 
+#include <xenevtchn.h>
 #include <xenctrl.h>
 #include <xenstore.h>
 #include <xen/io/xenbus.h>
i386-dm/helper2.c +10 -9
index 63a938b..e4df0d7 100644
@@ -48,6 +48,7 @@
 #include <limits.h>
 #include <fcntl.h>
 
+#include <xenevtchn.h>
 #include <xenctrl.h>
 #include <xen/hvm/ioreq.h>
 #include <xen/hvm/hvm_info_table.h>
@@ -104,7 +105,7 @@ buffered_iopage_t *buffered_io_page = NULL;
 QEMUTimer *buffered_io_timer;
 
 /* the evtchn fd for polling */
-xc_interface *xce_handle = NULL;
+xenevtchn_handle *xce_handle = NULL;
 
 /* which vcpu we are serving */
 int send_vcpu = 0;
@@ -141,7 +142,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
 
         cpu_single_env = env;
 
-        xce_handle = xc_evtchn_open(NULL, 0);
+        xce_handle = xenevtchn_open(NULL, 0);
         if (xce_handle == NULL) {
             perror("open");
             return NULL;
@@ -149,7 +150,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
 
         /* FIXME: how about if we overflow the page here? */
         for (i = 0; i < vcpus; i++) {
-            rc = xc_evtchn_bind_interdomain(
+            rc = xenevtchn_bind_interdomain(
                 xce_handle, domid, shared_page->vcpu_ioreq[i].vp_eport);
             if (rc == -1) {
                 fprintf(logfile, "bind interdomain ioctl error %d\n", errno);
@@ -164,7 +165,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
                     errno);
             return NULL;
         }
-        rc = xc_evtchn_bind_interdomain(xce_handle, domid, (uint32_t)bufioreq_evtchn);
+        rc = xenevtchn_bind_interdomain(xce_handle, domid, (uint32_t)bufioreq_evtchn);
         if (rc == -1) {
             fprintf(logfile, "bind interdomain ioctl error %d\n", errno);
             return NULL;
@@ -278,7 +279,7 @@ static ioreq_t *cpu_get_ioreq(void)
     int i;
     evtchn_port_t port;
 
-    port = xc_evtchn_pending(xce_handle);
+    port = xenevtchn_pending(xce_handle);
     if (port == bufioreq_local_port) {
         qemu_mod_timer(buffered_io_timer,
                 BUFFER_IO_MAX_DELAY + qemu_get_clock(rt_clock));
@@ -296,7 +297,7 @@ static ioreq_t *cpu_get_ioreq(void)
         }
 
         // unmask the wanted port again
-        xc_evtchn_unmask(xce_handle, port);
+        xenevtchn_unmask(xce_handle, port);
 
         //get the io packet from shared memory
         send_vcpu = i;
@@ -531,7 +532,7 @@ static void handle_buffered_io(void *opaque)
                 BUFFER_IO_MAX_DELAY + qemu_get_clock(rt_clock));
     } else {
         qemu_del_timer(buffered_io_timer);
-        xc_evtchn_unmask(xce_handle, bufioreq_local_port);
+        xenevtchn_unmask(xce_handle, bufioreq_local_port);
     }
 }
 
@@ -575,7 +576,7 @@ static void cpu_handle_ioreq(void *opaque)
 	}
 
         req->state = STATE_IORESP_READY;
-        xc_evtchn_notify(xce_handle, ioreq_local_port[send_vcpu]);
+        xenevtchn_notify(xce_handle, ioreq_local_port[send_vcpu]);
     }
 }
 
@@ -584,7 +585,7 @@ int xen_pause_requested;
 int main_loop(void)
 {
     CPUState *env = cpu_single_env;
-    int evtchn_fd = xce_handle == NULL ? -1 : xc_evtchn_fd(xce_handle);
+    int evtchn_fd = xce_handle == NULL ? -1 : xenevtchn_fd(xce_handle);
     char *qemu_file;
     fd_set fds;
 
xen-hooks.mak +2 -0
index 2e53c04..ec5fbab 100644
@@ -1,4 +1,5 @@
 CPPFLAGS+= -I$(XEN_ROOT)/tools/libxentoollog/include
+CPPFLAGS+= -I$(XEN_ROOT)/tools/libxenevtchn/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/libxc/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/xenstore/include
 CPPFLAGS+= -I$(XEN_ROOT)/tools/include
@@ -18,6 +19,7 @@ endif
 
 CFLAGS += $(CMDLINE_CFLAGS)
 
+LIBS += -L$(XEN_ROOT)/tools/libxenevtchn -lxenevtchn
 LIBS += -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest
 LIBS += -L$(XEN_ROOT)/tools/xenstore -lxenstore
 LIBS += -Wl,-rpath-link=$(XEN_ROOT)/tools/libxentoollog
Signature · 1 line
1.7.10.4
#25 lore raw

RFC PATCH 2/2 mini-os: Include libxenevtchn with libxc

In reply to Ian Campbell

libxenevtchn has just been split out from libxc. From mini-os's point of view we don't care about the distinction, so keep things simple by just including libxenevtchn if libxc is enabled.

---
 Makefile |    1 +
 1 file changed, 1 insertion(+)
Makefile +1 -0
index 757bd70..66ed510 100644
@@ -166,6 +166,7 @@ OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS))
 ifeq ($(libc),y)
 ifeq ($(CONFIG_XC),y)
 APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxentoollog-$(MINIOS_TARGET_ARCH) -whole-archive -lxentoollog -no-whole-archive
+APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxenevtchn-$(MINIOS_TARGET_ARCH) -whole-archive -lxenevtchn -no-whole-archive
 APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(MINIOS_TARGET_ARCH) -whole-archive -lxenguest -lxenctrl -no-whole-archive
 endif
 APP_LDLIBS += -lpci
Signature · 1 line
1.7.10.4
#26 lore raw
In reply to Ian Campbell

Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):

Quoted 1 line

[stuff]

Most of this looks good to me.

Quoted 4 lines

As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from xc_minios.c and xc_netbsd.c.

Replacing those tricks with appropriate #ifdefs would be fine.

Ian.

#27 lore raw
Quoted 12 lines · Ian Jackson

Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):

Quoted 1 line

[stuff]

Most of this looks good to me.

Quoted 4 lines

As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from xc_minios.c and xc_netbsd.c.

Replacing those tricks with appropriate #ifdefs would be fine.

FYI I think I will write more glue code to make rump kernel to just use netbsd code, because they don't want to expose underlying minios functionalities to application level.

Wei.

Quoted 1 line

Ian.

#28 lore raw
Quoted 11 lines · Wei Liu
Quoted 10 lines · Ian Jackson

Ian Campbell writes ("[PATCH RFC 0/6+2+2] Begin to disentangle libxenctrl and provide some stable libraries"):

Quoted 1 line

[stuff]

Most of this looks good to me.

Quoted 4 lines

As part of this change I've begun to get rid of the osdep interface layer, since it is obsolete and just gets in the way. IIRC there were some tricks being played to use this on rumpkernels to mix and match facilities from xc_minios.c and xc_netbsd.c.

Quoted 6 lines
Quoted 2 lines

Replacing those tricks with appropriate #ifdefs would be fine.

FYI I think I will write more glue code to make rump kernel to just use netbsd code, because they don't want to expose underlying minios functionalities to application level.

It's not so much that we outright "don't want to" as "prefer not to". If there's a strong reason, e.g. a measurably significant performance improvement, then we can talk. However, anything calling past the libc interface is dipping into internal interfaces. We make no guarantee about internal interface stability.

One good summary of 8 years of rump kernel development would be "lack of compartmentalization always comes back to bite you", so IMO it's better to conceptually maintain separation even where not enforced by a MMU and just make everything go through the guaranteed-stable syscall interfaces.