Commit 0bfe3ca51ebddbf2cc099fa34f359bd1ac4f65e6

Authored by Anthony Liguori
Committed by Paul Brook
1 parent 70ec5dc0

Constructor support

Allow devices/drivers to register themselves via constructors.
Destructors are not needed (can be registered from a constructor)
and "priority" has been renamed and changed to an enum for clarity.

Signed-off-by: Paul Brook <paul@codesourcery.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Makefile
... ... @@ -63,7 +63,7 @@ recurse-all: $(SUBDIR_RULES)
63 63 #######################################################################
64 64 # BLOCK_OBJS is code used by both qemu system emulation and qemu-img
65 65  
66   -BLOCK_OBJS=cutils.o cache-utils.o qemu-malloc.o
  66 +BLOCK_OBJS=cutils.o cache-utils.o qemu-malloc.o module.o
67 67 BLOCK_OBJS+=block-cow.o block-qcow.o aes.o block-vmdk.o block-cloop.o
68 68 BLOCK_OBJS+=block-dmg.o block-bochs.o block-vpc.o block-vvfat.o
69 69 BLOCK_OBJS+=block-qcow2.o block-parallels.o block-nbd.o
... ...
Makefile.target
... ... @@ -340,14 +340,13 @@ ifeq ($(TARGET_ARCH), m68k)
340 340 OBJS+= m68k-sim.o m68k-semi.o
341 341 endif
342 342  
343   -OBJS+= libqemu.a
344   -
345 343 # Note: this is a workaround. The real fix is to avoid compiling
346 344 # cpu_signal_handler() in cpu-exec.c.
347 345 signal.o: CFLAGS += $(HELPER_CFLAGS)
348 346  
349   -$(QEMU_PROG): $(OBJS) ../libqemu_user.a
350   - $(LINK)
  347 +$(QEMU_PROG): ARLIBS=../libqemu_user.a libqemu.a
  348 +$(QEMU_PROG): $(OBJS) ../libqemu_user.a libqemu.a
  349 + $(call LINK,$(OBJS))
351 350 ifeq ($(ARCH),alpha)
352 351 # Mark as 32 bit binary, i. e. it will be mapped into the low 31 bit of
353 352 # the address space (31 bit so sign extending doesn't matter)
... ... @@ -372,14 +371,13 @@ LIBS+=-lmx
372 371 OBJS= main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o \
373 372 gdbstub.o gdbstub-xml.o
374 373  
375   -OBJS+= libqemu.a
376   -
377 374 # Note: this is a workaround. The real fix is to avoid compiling
378 375 # cpu_signal_handler() in cpu-exec.c.
379 376 signal.o: CFLAGS += $(HELPER_CFLAGS)
380 377  
381   -$(QEMU_PROG): $(OBJS)
382   - $(LINK)
  378 +$(QEMU_PROG): ARLIBS=libqemu.a
  379 +$(QEMU_PROG): $(OBJS) libqemu.a
  380 + $(call LINK,$(OBJS))
383 381  
384 382 endif #CONFIG_DARWIN_USER
385 383  
... ... @@ -473,14 +471,13 @@ OBJS= main.o bsdload.o elfload.o mmap.o path.o signal.o strace.o syscall.o \
473 471 gdbstub.o gdbstub-xml.o
474 472 OBJS+= uaccess.o
475 473  
476   -OBJS+= libqemu.a
477   -
478 474 # Note: this is a workaround. The real fix is to avoid compiling
479 475 # cpu_signal_handler() in cpu-exec.c.
480 476 signal.o: CFLAGS += $(HELPER_CFLAGS)
481 477  
482   -$(QEMU_PROG): $(OBJS) ../libqemu_user.a
483   - $(LINK)
  478 +$(QEMU_PROG): ARLIBS=libqemu.a ../libqemu_user.a
  479 +$(QEMU_PROG): $(OBJS) libqemu.a ../libqemu_user.a
  480 + $(call LINK,$(OBJS))
484 481  
485 482 endif #CONFIG_BSD_USER
486 483  
... ... @@ -716,9 +713,9 @@ endif
716 713 vl.o: qemu-options.h
717 714  
718 715 $(QEMU_PROG): LIBS += $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS)
719   -
  716 +$(QEMU_PROG): ARLIBS=../libqemu_common.a libqemu.a
720 717 $(QEMU_PROG): $(OBJS) ../libqemu_common.a libqemu.a
721   - $(LINK)
  718 + $(call LINK,$(OBJS))
722 719  
723 720 endif # !CONFIG_USER_ONLY
724 721  
... ...
module.c 0 → 100644
  1 +/*
  2 + * QEMU Module Infrastructure
  3 + *
  4 + * Copyright IBM, Corp. 2009
  5 + *
  6 + * Authors:
  7 + * Anthony Liguori <aliguori@us.ibm.com>
  8 + *
  9 + * This work is licensed under the terms of the GNU GPL, version 2. See
  10 + * the COPYING file in the top-level directory.
  11 + *
  12 + */
  13 +
  14 +#include "qemu-common.h"
  15 +#include "sys-queue.h"
  16 +#include "module.h"
  17 +
  18 +typedef struct ModuleEntry
  19 +{
  20 + module_init_type type;
  21 + void (*init)(void);
  22 + TAILQ_ENTRY(ModuleEntry) node;
  23 +} ModuleEntry;
  24 +
  25 +typedef struct ModuleTypeList
  26 +{
  27 + module_init_type type;
  28 + TAILQ_HEAD(, ModuleEntry) entry_list;
  29 + TAILQ_ENTRY(ModuleTypeList) node;
  30 +} ModuleTypeList;
  31 +
  32 +static TAILQ_HEAD(, ModuleTypeList) init_type_list;
  33 +
  34 +static ModuleTypeList *find_type_or_alloc(module_init_type type, int alloc)
  35 +{
  36 + ModuleTypeList *n;
  37 +
  38 + TAILQ_FOREACH(n, &init_type_list, node) {
  39 + if (type >= n->type)
  40 + break;
  41 + }
  42 +
  43 + if (!n || n->type != type) {
  44 + ModuleTypeList *o;
  45 +
  46 + if (!alloc)
  47 + return NULL;
  48 +
  49 + o = qemu_mallocz(sizeof(*o));
  50 + o->type = type;
  51 + TAILQ_INIT(&o->entry_list);
  52 +
  53 + if (n) {
  54 + TAILQ_INSERT_AFTER(&init_type_list, n, o, node);
  55 + } else {
  56 + TAILQ_INSERT_HEAD(&init_type_list, o, node);
  57 + }
  58 +
  59 + n = o;
  60 + }
  61 +
  62 + return n;
  63 +}
  64 +
  65 +void register_module_init(void (*fn)(void), module_init_type type)
  66 +{
  67 + ModuleEntry *e;
  68 + ModuleTypeList *l;
  69 +
  70 + e = qemu_mallocz(sizeof(*e));
  71 + e->init = fn;
  72 +
  73 + l = find_type_or_alloc(type, 1);
  74 +
  75 + TAILQ_INSERT_TAIL(&l->entry_list, e, node);
  76 +}
  77 +
  78 +void module_call_init(module_init_type type)
  79 +{
  80 + ModuleTypeList *l;
  81 + ModuleEntry *e;
  82 +
  83 + l = find_type_or_alloc(type, 0);
  84 + if (!l) {
  85 + return;
  86 + }
  87 +
  88 + TAILQ_FOREACH(e, &l->entry_list, node) {
  89 + e->init();
  90 + }
  91 +}
... ...
module.h 0 → 100644
  1 +/*
  2 + * QEMU Module Infrastructure
  3 + *
  4 + * Copyright IBM, Corp. 2009
  5 + *
  6 + * Authors:
  7 + * Anthony Liguori <aliguori@us.ibm.com>
  8 + *
  9 + * This work is licensed under the terms of the GNU GPL, version 2. See
  10 + * the COPYING file in the top-level directory.
  11 + *
  12 + */
  13 +
  14 +#ifndef QEMU_MODULE_H
  15 +#define QEMU_MODULE_H
  16 +
  17 +/* This should not be used directly. Use block_init etc. instead. */
  18 +#define module_init(function, type) \
  19 +static void __attribute__((constructor)) do_qemu_init_ ## function(void) { \
  20 + register_module_init(function, type); \
  21 +}
  22 +
  23 +typedef enum {
  24 + MODULE_INIT_BLOCK,
  25 + MODULE_INIT_DEVICE
  26 +} module_init_type;
  27 +
  28 +#define block_init(function) module_init(function, MODULE_INIT_BLOCK)
  29 +#define device_init(function) module_init(function, MODULE_INIT_DEVICE)
  30 +
  31 +void register_module_init(void (*fn)(void), module_init_type type);
  32 +
  33 +void module_call_init(module_init_type type);
  34 +
  35 +#endif
... ...
qemu-common.h
... ... @@ -221,6 +221,8 @@ void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count);
221 221 struct Monitor;
222 222 typedef struct Monitor Monitor;
223 223  
  224 +#include "module.h"
  225 +
224 226 #endif /* dyngen-exec.h hack */
225 227  
226 228 #endif
... ...
rules.mak
... ... @@ -8,10 +8,13 @@
8 8 %.o: %.m
9 9 $(call quiet-command,$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<," OBJC $(TARGET_DIR)$@")
10 10  
11   -LINK = $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)," LINK $(TARGET_DIR)$@")
  11 +WAS=-Wl,--whole-archive
  12 +WAE=-Wl,--no-whole-archive
  13 +
  14 +LINK = $(call quiet-command,$(CC) $(LDFLAGS) -o $@ $(1) $(LIBS) $(WAS) $(ARLIBS) $(WAE)," LINK $(TARGET_DIR)$@")
12 15  
13 16 %$(EXESUF): %.o
14   - $(LINK)
  17 + $(call LINK,$^)
15 18  
16 19 %.a:
17 20 $(call quiet-command,rm -f $@ && $(AR) rcs $@ $^," AR $(TARGET_DIR)$@")
... ...