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