#ifndef _KERNEL_DEVICE_DEVICE_H #define _KERNEL_DEVICE_DEVICE_H #include #include #include #include #include #include #include #define DEVICES_MAX 1024 #define device_op1(d, op, proc, rctx, lockflags, a1, a2, a3, a4, ...) \ (d)->ops[(op)]((d), (proc), (rctx), lockflags, (void*)(a1), (void*)(a2), (void*)(a3), (void*)(a4)) #define device_op(d, op, proc, rctx, lockflags, ...) \ device_op1 (d, op, proc, rctx, lockflags, __VA_ARGS__, NULL, NULL, NULL, NULL) struct device; typedef int (*device_op_func_t) (struct device* device, struct proc*, struct reschedule_ctx* rctx, uint64_t* lockflags, void* a1, void* a2, void* a3, void* a4); typedef bool (*device_init_func_t) (struct device* device, void* arg, struct proc* proc, struct reschedule_ctx* rctx); typedef void (*device_fini_func_t) (struct device* device, struct proc* proc, struct reschedule_ctx* rctx); struct device { char key[0x100]; device_op_func_t ops[32]; spin_lock_t lock; struct hash_node_link device_table_link; device_init_func_t init; device_fini_func_t fini; void* udata; }; struct device* device_create (const char* key, device_op_func_t* ops, size_t ops_len, device_init_func_t init, device_fini_func_t fini, void* arg, struct proc* proc, struct reschedule_ctx* rctx); struct device* device_find (const char* key); void devices_init (void); #endif // _KERNEL_DEVICE_DEVICE_H