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 #include "qemu/osdep.h" 18 19 #define DSO_STAMP_FUN glue(qemu_stamp, CONFIG_STAMP) 20 #define DSO_STAMP_FUN_STR stringify(DSO_STAMP_FUN) 21 22 #ifdef BUILD_DSO 23 void DSO_STAMP_FUN(void); 24 /* This is a dummy symbol to identify a loaded DSO as a QEMU module, so we can 25 * distinguish "version mismatch" from "not a QEMU module", when the stamp 26 * check fails during module loading */ 27 void qemu_module_dummy(void); 28 29 #define module_init(function, type) \ 30 static void __attribute__((constructor)) do_qemu_init_ ## function(void) \ 31 { \ 32 register_dso_module_init(function, type); \ 33 } 34 #else 35 /* This should not be used directly. Use block_init etc. instead. */ 36 #define module_init(function, type) \ 37 static void __attribute__((constructor)) do_qemu_init_ ## function(void) \ 38 { \ 39 register_module_init(function, type); \ 40 } 41 #endif 42 43 typedef enum { 44 MODULE_INIT_BLOCK, 45 MODULE_INIT_MACHINE, 46 MODULE_INIT_QAPI, 47 MODULE_INIT_QOM, 48 MODULE_INIT_MAX 49 } module_init_type; 50 51 #define block_init(function) module_init(function, MODULE_INIT_BLOCK) 52 #define machine_init(function) module_init(function, MODULE_INIT_MACHINE) 53 #define qapi_init(function) module_init(function, MODULE_INIT_QAPI) 54 #define type_init(function) module_init(function, MODULE_INIT_QOM) 55 56 void register_module_init(void (*fn)(void), module_init_type type); 57 void register_dso_module_init(void (*fn)(void), module_init_type type); 58 59 void module_call_init(module_init_type type); 60 61 #endif 62