diff options
Diffstat (limited to 'sys/include/sys/driver.h')
-rw-r--r-- | sys/include/sys/driver.h | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/sys/include/sys/driver.h b/sys/include/sys/driver.h index 9f08de3..e10021a 100644 --- a/sys/include/sys/driver.h +++ b/sys/include/sys/driver.h @@ -43,6 +43,7 @@ struct driver_var { struct driver { int(*init)(void); + const char *name; struct driver_var *data; }; @@ -56,7 +57,7 @@ extern char __drivers_init_end[]; extern char __driversd_init_start[]; extern char __driversd_init_end[]; -#define DRIVER_EXPORT(INIT) \ +#define DRIVER_EXPORT(INIT, NAME) \ static struct driver_var __driver_var = { \ .deferred = 0 \ }; \ @@ -64,7 +65,8 @@ extern char __driversd_init_end[]; __attribute__((used, section(".drivers"))) \ static struct driver __driver_desc = { \ .init = INIT, \ - .data = &__driver_var \ + .data = &__driver_var, \ + .name = NAME \ } /* @@ -84,7 +86,7 @@ extern char __driversd_init_end[]; * context has yet to be initialized. The driver may * use this to defer requests for I/O. */ -#define DRIVER_DEFER(INIT) \ +#define DRIVER_DEFER(INIT, NAME) \ static struct driver_var __driver_var = { \ .deferred = 1 \ }; \ @@ -92,7 +94,8 @@ extern char __driversd_init_end[]; __attribute__((used, section(".drivers.defer"))) \ static struct driver __driver_desc = { \ .init = INIT, \ - .data = &__driver_var \ + .data = &__driver_var, \ + .name = NAME \ } #define DRIVER_DEFERRED() __driver_var.deferred @@ -101,12 +104,20 @@ extern char __driversd_init_end[]; for (struct driver *__d = (struct driver *)__drivers_init_start; \ (uintptr_t)__d < (uintptr_t)__drivers_init_end; ++__d) \ { \ + if (driver_blacklist_check((__d)->name)) { \ + continue; \ + } \ __d->init(); \ } #define DRIVERS_SCHED() \ spawn(&g_proc0, __driver_init_td, NULL, 0, NULL) +/* Driver blacklist framework */ +int driver_blacklist(const char *name); +int driver_blacklist_check(const char *name); +void driver_blacklist_init(void); + void __driver_init_td(void); #endif /* _KERNEL */ |