xref: /kvmtool/include/kvm/util-init.h (revision 50cb6dc9209f79a687edf3d7307b446c48f57c74)
1*50cb6dc9SSasha Levin #ifndef KVM__UTIL_INIT_H
2*50cb6dc9SSasha Levin #define KVM__UTIL_INIT_H
3*50cb6dc9SSasha Levin 
4*50cb6dc9SSasha Levin struct kvm;
5*50cb6dc9SSasha Levin 
6*50cb6dc9SSasha Levin struct init_item {
7*50cb6dc9SSasha Levin 	struct hlist_node n;
8*50cb6dc9SSasha Levin 	const char *fn_name;
9*50cb6dc9SSasha Levin 	int (*init)(struct kvm *);
10*50cb6dc9SSasha Levin };
11*50cb6dc9SSasha Levin 
12*50cb6dc9SSasha Levin int init_list__init(struct kvm *kvm);
13*50cb6dc9SSasha Levin int init_list__exit(struct kvm *kvm);
14*50cb6dc9SSasha Levin 
15*50cb6dc9SSasha Levin int init_list_add(struct init_item *t, int (*init)(struct kvm *),
16*50cb6dc9SSasha Levin 			int priority, const char *name);
17*50cb6dc9SSasha Levin int exit_list_add(struct init_item *t, int (*init)(struct kvm *),
18*50cb6dc9SSasha Levin 			int priority, const char *name);
19*50cb6dc9SSasha Levin 
20*50cb6dc9SSasha Levin #define __init_list_add(cb, l)						\
21*50cb6dc9SSasha Levin static void __attribute__ ((constructor)) __init__##cb(void)		\
22*50cb6dc9SSasha Levin {									\
23*50cb6dc9SSasha Levin 	static char name[] = #cb;					\
24*50cb6dc9SSasha Levin 	static struct init_item t;					\
25*50cb6dc9SSasha Levin 	init_list_add(&t, cb, l, name);					\
26*50cb6dc9SSasha Levin }
27*50cb6dc9SSasha Levin 
28*50cb6dc9SSasha Levin #define __exit_list_add(cb, l)						\
29*50cb6dc9SSasha Levin static void __attribute__ ((constructor)) __init__##cb(void)		\
30*50cb6dc9SSasha Levin {									\
31*50cb6dc9SSasha Levin 	static char name[] = #cb;					\
32*50cb6dc9SSasha Levin 	static struct init_item t;					\
33*50cb6dc9SSasha Levin 	exit_list_add(&t, cb, l, name);					\
34*50cb6dc9SSasha Levin }
35*50cb6dc9SSasha Levin 
36*50cb6dc9SSasha Levin #define core_init(cb) __init_list_add(cb, 0)
37*50cb6dc9SSasha Levin #define base_init(cb) __init_list_add(cb, 2)
38*50cb6dc9SSasha Levin #define dev_base_init(cb)  __init_list_add(cb, 4)
39*50cb6dc9SSasha Levin #define dev_init(cb) __init_list_add(cb, 5)
40*50cb6dc9SSasha Levin #define virtio_dev_init(cb) __init_list_add(cb, 6)
41*50cb6dc9SSasha Levin #define firmware_init(cb) __init_list_add(cb, 7)
42*50cb6dc9SSasha Levin #define late_init(cb) __init_list_add(cb, 9)
43*50cb6dc9SSasha Levin 
44*50cb6dc9SSasha Levin #define core_exit(cb) __exit_list_add(cb, 0)
45*50cb6dc9SSasha Levin #define base_exit(cb) __exit_list_add(cb, 2)
46*50cb6dc9SSasha Levin #define dev_base_exit(cb) __exit_list_add(cb, 4)
47*50cb6dc9SSasha Levin #define dev_exit(cb) __exit_list_add(cb, 5)
48*50cb6dc9SSasha Levin #define virtio_dev_exit(cb) __exit_list_add(cb, 6)
49*50cb6dc9SSasha Levin #define firmware_exit(cb) __exit_list_add(cb, 7)
50*50cb6dc9SSasha Levin #define late_exit(cb) __exit_list_add(cb, 9)
51*50cb6dc9SSasha Levin #endif
52