#ifndef KVM__UTIL_INIT_H #define KVM__UTIL_INIT_H struct kvm; struct init_item { struct hlist_node n; const char *fn_name; int (*init)(struct kvm *); }; int init_list__init(struct kvm *kvm); int init_list__exit(struct kvm *kvm); int init_list_add(struct init_item *t, int (*init)(struct kvm *), int priority, const char *name); int exit_list_add(struct init_item *t, int (*init)(struct kvm *), int priority, const char *name); #define __init_list_add(cb, l) \ static void __attribute__ ((constructor)) __init__##cb(void) \ { \ static char name[] = #cb; \ static struct init_item t; \ init_list_add(&t, cb, l, name); \ } #define __exit_list_add(cb, l) \ static void __attribute__ ((constructor)) __init__##cb(void) \ { \ static char name[] = #cb; \ static struct init_item t; \ exit_list_add(&t, cb, l, name); \ } #define core_init(cb) __init_list_add(cb, 0) #define base_init(cb) __init_list_add(cb, 2) #define dev_base_init(cb) __init_list_add(cb, 4) #define dev_init(cb) __init_list_add(cb, 5) #define virtio_dev_init(cb) __init_list_add(cb, 6) #define firmware_init(cb) __init_list_add(cb, 7) #define late_init(cb) __init_list_add(cb, 9) #define core_exit(cb) __exit_list_add(cb, 0) #define base_exit(cb) __exit_list_add(cb, 2) #define dev_base_exit(cb) __exit_list_add(cb, 4) #define dev_exit(cb) __exit_list_add(cb, 5) #define virtio_dev_exit(cb) __exit_list_add(cb, 6) #define firmware_exit(cb) __exit_list_add(cb, 7) #define late_exit(cb) __exit_list_add(cb, 9) #endif