Revision 0bfe3ca5

b/Makefile
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
b/Makefile.target
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 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 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 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

  
b/module.c
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
}
b/module.h
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
b/qemu-common.h
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
b/rules.mak
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)$@")

Also available in: Unified diff