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