[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] Support for loading devices as dynamic libraries
From: |
Dominik Żeromski |
Subject: |
[Qemu-devel] [PATCH] Support for loading devices as dynamic libraries |
Date: |
Sat, 25 Aug 2012 13:10:20 +0200 |
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 <address@hidden>
---
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 <http://www.gnu.org/licenses/>.
*/
+#include <dlfcn.h>
+
#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
- [Qemu-devel] [PATCH] Support for loading devices as dynamic libraries,
Dominik Żeromski <=