15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/*
25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * QEMU Module Infrastructure
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Copyright IBM, Corp. 2009
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Authors:
75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *  Anthony Liguori   <aliguori@us.ibm.com>
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This work is licensed under the terms of the GNU GPL, version 2.  See
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * the COPYING file in the top-level directory.
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner *
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */
135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef QEMU_MODULE_H
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QEMU_MODULE_H
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* This should not be used directly.  Use block_init etc. instead.  */
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define module_init(function, type)                                         \
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic void __attribute__((constructor)) do_qemu_init_ ## function(void) {  \
205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    register_module_init(function, type);                                   \
215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef enum {
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    MODULE_INIT_BLOCK,
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    MODULE_INIT_DEVICE,
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    MODULE_INIT_MACHINE,
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    MODULE_INIT_MAX
285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} module_init_type;
295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define block_init(function) module_init(function, MODULE_INIT_BLOCK)
315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define device_init(function) module_init(function, MODULE_INIT_DEVICE)
325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define machine_init(function) module_init(function, MODULE_INIT_MACHINE)
335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid register_module_init(void (*fn)(void), module_init_type type);
355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid module_call_init(module_init_type type);
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
39