summaryrefslogtreecommitdiff
path: root/sys/include/sys/driver.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/include/sys/driver.h')
-rw-r--r--sys/include/sys/driver.h19
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 */