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 "qemu-queue.h" 16#include "module.h" 17 18typedef struct ModuleEntry 19{ 20 module_init_type type; 21 void (*init)(void); 22 QTAILQ_ENTRY(ModuleEntry) node; 23} ModuleEntry; 24 25typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList; 26 27static ModuleTypeList init_type_list[MODULE_INIT_MAX]; 28 29static void init_types(void) 30{ 31 static int inited; 32 int i; 33 34 if (inited) { 35 return; 36 } 37 38 for (i = 0; i < MODULE_INIT_MAX; i++) { 39 QTAILQ_INIT(&init_type_list[i]); 40 } 41 42 inited = 1; 43} 44 45 46static ModuleTypeList *find_type(module_init_type type) 47{ 48 ModuleTypeList *l; 49 50 init_types(); 51 52 l = &init_type_list[type]; 53 54 return l; 55} 56 57void register_module_init(void (*fn)(void), module_init_type type) 58{ 59 ModuleEntry *e; 60 ModuleTypeList *l; 61 62 e = qemu_mallocz(sizeof(*e)); 63 e->init = fn; 64 65 l = find_type(type); 66 67 QTAILQ_INSERT_TAIL(l, e, node); 68} 69 70void module_call_init(module_init_type type) 71{ 72 ModuleTypeList *l; 73 ModuleEntry *e; 74 75 l = find_type(type); 76 77 QTAILQ_FOREACH(e, l, node) { 78 e->init(); 79 } 80} 81