From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:57510) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T5EHC-000733-7P for qemu-devel@nongnu.org; Sat, 25 Aug 2012 07:11:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T5EHB-0001dW-0W for qemu-devel@nongnu.org; Sat, 25 Aug 2012 07:11:38 -0400 Received: from mail-ee0-f45.google.com ([74.125.83.45]:50752) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T5EHA-0001dN-Q9 for qemu-devel@nongnu.org; Sat, 25 Aug 2012 07:11:36 -0400 Received: by eeke53 with SMTP id e53so1003518eek.4 for ; Sat, 25 Aug 2012 04:11:35 -0700 (PDT) From: =?UTF-8?q?Dominik=20=C5=BBeromski?= Date: Sat, 25 Aug 2012 13:10:20 +0200 Message-Id: <1345893020-4894-1-git-send-email-dzeromsk@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH] Support for loading devices as dynamic libraries List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Dominik=20=C5=BBeromski?= Adding support for loading DSO with -device option. Example Makefile for out of tree modules: #v+ DEVICENAME=pcnet2 hw-obj-y=pcnet-pci.o hw-obj-y+=pcnet.o include rules.mak .PHONY: all QEMU_CFLAGS=-I../qemu-kvm -I../qemu-kvm/hw QEMU_CFLAGS+=-I../qemu-kvm/fpu -I../qemu-kvm/include QEMU_CFLAGS+=-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=64 -fPIC LDFLAGS+=-shared LIBNAME=libqemu_$(DEVICENAME).so all: $(LIBNAME) $(LIBNAME): $(hw-obj-y) $(call LINK,$^) clean: rm -f *.o rm -f *.d rm -f $(LIBNAME) # Include automatically generated dependency files -include $(patsubst %.o, %.d, $(hw-obj-y)) #v- Signed-off-by: Dominik Żeromski --- Makefile.target | 4 +++- hw/qdev-monitor.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletions(-) diff --git a/Makefile.target b/Makefile.target index 74f7a4a..7fd9245 100644 --- a/Makefile.target +++ b/Makefile.target @@ -130,7 +130,9 @@ obj-$(CONFIG_HAVE_GET_MEMORY_MAPPING) += memory_mapping.o obj-$(CONFIG_HAVE_CORE_DUMP) += dump.o obj-$(CONFIG_NO_GET_MEMORY_MAPPING) += memory_mapping-stub.o obj-$(CONFIG_NO_CORE_DUMP) += dump-stub.o -LIBS+=-lz +LIBS+=-lz -ldl + +LDFLAGS+=-rdynamic QEMU_CFLAGS += $(VNC_TLS_CFLAGS) QEMU_CFLAGS += $(VNC_SASL_CFLAGS) diff --git a/hw/qdev-monitor.c b/hw/qdev-monitor.c index 7915b45..3b5b0b0 100644 --- a/hw/qdev-monitor.c +++ b/hw/qdev-monitor.c @@ -17,6 +17,8 @@ * License along with this library; if not, see . */ +#include + #include "qdev.h" #include "monitor.h" #include "qmp-commands.h" @@ -402,6 +404,8 @@ DeviceState *qdev_device_add(QemuOpts *opts) const char *driver, *path, *id; DeviceState *qdev; BusState *bus; + void *libhandle; + char libname[NAME_MAX]; driver = qemu_opt_get(opts, "driver"); if (!driver) { @@ -419,7 +423,14 @@ DeviceState *qdev_device_add(QemuOpts *opts) obj = object_class_by_name(driver); } } + if (!obj) { + snprintf(libname, sizeof(libname), "libqemu_%s.so", driver); + libhandle = dlopen(libname, RTLD_NOW); + if (libhandle != NULL) { + obj = object_class_by_name(driver); + } + } if (!obj) { qerror_report(QERR_INVALID_PARAMETER_VALUE, "driver", "device type"); return NULL; -- 1.7.0.4