From 5b53168c5f16c010893b3273a47819c3a7909ec7 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 3 Apr 2023 16:59:14 +0100 Subject: [PATCH] dev: add functions to create device objects --- Makefile | 2 +- dev/block.c | 12 ++++++++++++ dev/bus.c | 12 ++++++++++++ dev/char.c | 12 ++++++++++++ dev/core.c | 40 ++++++++++++++++++++++++++++++++++++++++ dev/input.c | 12 ++++++++++++ dev/net.c | 12 ++++++++++++ include/socks/device.h | 4 ++++ 8 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 dev/block.c create mode 100644 dev/bus.c create mode 100644 dev/char.c create mode 100644 dev/core.c create mode 100644 dev/input.c create mode 100644 dev/net.c diff --git a/Makefile b/Makefile index 8e8a97a..be150c8 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ include arch/$(SOCKS_ARCH)/config.mk # Platform-independent kernel source files #################################### -KERNEL_SRC_DIRS := init kernel vm ds util obj sched test +KERNEL_SRC_DIRS := init kernel vm ds util obj sched dev test KERNEL_C_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.c)) KERNEL_CXX_FILES := $(foreach dir,$(KERNEL_SRC_DIRS),$(wildcard $(dir)/*.cpp)) KERNEL_OBJ := $(addprefix $(BUILD_DIR)/,$(KERNEL_C_FILES:.c=.o) $(KERNEL_CXX_FILES:.cpp=.o)) diff --git a/dev/block.c b/dev/block.c new file mode 100644 index 0000000..e50a50c --- /dev/null +++ b/dev/block.c @@ -0,0 +1,12 @@ +#include + +struct block_device *block_device_create(void) +{ + struct device *dev = device_alloc(); + if (!dev) { + return NULL; + } + + dev->dev_type = DEV_TYPE_BLOCK; + return BLOCK_DEVICE(dev); +} diff --git a/dev/bus.c b/dev/bus.c new file mode 100644 index 0000000..1fcdcbc --- /dev/null +++ b/dev/bus.c @@ -0,0 +1,12 @@ +#include + +struct bus_device *bus_device_create(void) +{ + struct device *dev = device_alloc(); + if (!dev) { + return NULL; + } + + dev->dev_type = DEV_TYPE_BUS; + return BUS_DEVICE(dev); +} diff --git a/dev/char.c b/dev/char.c new file mode 100644 index 0000000..238da97 --- /dev/null +++ b/dev/char.c @@ -0,0 +1,12 @@ +#include + +struct char_device *char_device_create(void) +{ + struct device *dev = device_alloc(); + if (!dev) { + return NULL; + } + + dev->dev_type = DEV_TYPE_CHAR; + return CHAR_DEVICE(dev); +} diff --git a/dev/core.c b/dev/core.c new file mode 100644 index 0000000..c82aa68 --- /dev/null +++ b/dev/core.c @@ -0,0 +1,40 @@ +#include +#include +#include + +static struct device *root_device = NULL; +static object_type_t device_type = { + .ob_name = "device", + .ob_size = sizeof(struct device), + .ob_ops = { + .destroy = NULL, + } +}; + +kern_status_t device_init(void) +{ + object_type_register(&device_type); + return KERN_OK; +} + +kern_status_t set_root_device(struct device *dev) +{ + if (root_device) { + object_deref(object_header(root_device)); + } + + object_ref(object_header(dev)); + root_device = dev; + + return KERN_OK; +} + +struct device *device_alloc(void) +{ + object_t *dev_object = object_create(&device_type); + if (!dev_object) { + return NULL; + } + + return object_data(dev_object); +} diff --git a/dev/input.c b/dev/input.c new file mode 100644 index 0000000..6b6be23 --- /dev/null +++ b/dev/input.c @@ -0,0 +1,12 @@ +#include + +struct input_device *input_device_create(void) +{ + struct device *dev = device_alloc(); + if (!dev) { + return NULL; + } + + dev->dev_type = DEV_TYPE_INPUT; + return INPUT_DEVICE(dev); +} diff --git a/dev/net.c b/dev/net.c new file mode 100644 index 0000000..773a36d --- /dev/null +++ b/dev/net.c @@ -0,0 +1,12 @@ +#include + +struct net_device *net_device_create(void) +{ + struct device *dev = device_alloc(); + if (!dev) { + return NULL; + } + + dev->dev_type = DEV_TYPE_NET; + return NET_DEVICE(dev); +} diff --git a/include/socks/device.h b/include/socks/device.h index f7bb62f..314a2ef 100644 --- a/include/socks/device.h +++ b/include/socks/device.h @@ -10,12 +10,14 @@ struct device; #define CHAR_DEVICE(dev) ((dev)->dev_type == DEV_TYPE_CHAR ? &(dev)->chr : NULL); #define NET_DEVICE(dev) ((dev)->dev_type == DEV_TYPE_NET ? &(dev)->net : NULL); #define INPUT_DEVICE(dev) ((dev)->dev_type == DEV_TYPE_INPUT ? &(dev)->input : NULL); +#define BUS_DEVICE(dev) ((dev)->dev_type == DEV_TYPE_BUS ? &(dev)->bus : NULL); enum device_type { DEV_TYPE_BLOCK, DEV_TYPE_CHAR, DEV_TYPE_NET, DEV_TYPE_INPUT, + DEV_TYPE_BUS, }; struct block_device_ops { @@ -84,6 +86,8 @@ struct device { extern kern_status_t device_init(void); extern kern_status_t set_root_device(struct device *dev); +extern struct device *device_alloc(void); + extern struct char_device *char_device_create(void); extern struct block_device *block_device_create(void); extern struct net_device *net_device_create(void);