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