diff --git a/etc/make/conf.mk b/etc/make/conf.mk index 4928f37..7a08f87 100644 --- a/etc/make/conf.mk +++ b/etc/make/conf.mk @@ -65,7 +65,8 @@ OBJS+=$(O)/sys/debug.o \ $(O)/sys/net/arp.o \ $(O)/sys/net/in.o \ $(O)/sys/net/netdev.o \ - $(O)/sys/vfs/devfs.o + $(O)/sys/vfs/devfs.o \ + $(O)/sys/vfs/pseudo.o DIRS+=$(O)/sys/vfs/ext2 \ $(O)/sys/net \ $(O)/sys/blk diff --git a/include/sys/chr.h b/include/sys/chr.h index 9a75bc7..a687e21 100644 --- a/include/sys/chr.h +++ b/include/sys/chr.h @@ -2,7 +2,6 @@ #include "sys/types.h" struct chrdev { - char name[64]; void *dev_data; // TODO: maybe something like flush() diff --git a/include/sys/dev.h b/include/sys/dev.h index 343c477..74edc89 100644 --- a/include/sys/dev.h +++ b/include/sys/dev.h @@ -13,6 +13,7 @@ enum dev_class { #define DEV_BLOCK_HDx 2 #define DEV_BLOCK_RAM 3 #define DEV_BLOCK_PART 127 +#define DEV_BLOCK_PSEUDO 128 struct dev_entry { char dev_name[64]; diff --git a/sys/dev.c b/sys/dev.c index e4bde30..8fa837f 100644 --- a/sys/dev.c +++ b/sys/dev.c @@ -51,7 +51,7 @@ static int dev_post_add(struct dev_entry *ent) { blk->ent = ent; - if (ent->dev_subclass != DEV_BLOCK_PART) { + if (ent->dev_subclass < DEV_BLOCK_PART) { if (blk_enumerate_partitions((struct blkdev *) ent->dev) != 0) { return -1; } diff --git a/sys/tty.c b/sys/tty.c index ae1a658..32c31f9 100644 --- a/sys/tty.c +++ b/sys/tty.c @@ -17,7 +17,6 @@ static ssize_t tty_write(struct chrdev *tty, const void *buf, size_t pos, size_t static ssize_t tty_read(struct chrdev *tty, void *buf, size_t pos, size_t lim); static struct chrdev _dev_tty0 = { - .name = "tty0", .dev_data = DEV_DATA_TTY(0), .write = tty_write, .read = tty_read diff --git a/sys/vfs/pseudo.c b/sys/vfs/pseudo.c new file mode 100644 index 0000000..5d9189c --- /dev/null +++ b/sys/vfs/pseudo.c @@ -0,0 +1,61 @@ +#include "sys/string.h" +#include "sys/panic.h" +#include "sys/attr.h" +#include "sys/blk.h" +#include "sys/dev.h" + +#define DEV_ZERO 0 +#define DEV_NULL 1 + +static ssize_t pseudo_write(struct blkdev *dev, const void *buf, size_t pos, size_t lim); +static ssize_t pseudo_read(struct blkdev *dev, void *buf, size_t pos, size_t lim); + +static struct blkdev _dev_null = { + .dev_data = (void *) DEV_NULL, + .write = pseudo_write, + .read = pseudo_read +}; +static struct dev_entry _ent_null = { + .dev = &_dev_null, + .dev_class = DEV_CLASS_BLOCK, + .dev_subclass = DEV_BLOCK_PSEUDO, + .dev_name = "null" +}; +static struct blkdev _dev_zero = { + .dev_data = (void *) DEV_ZERO, + .write = pseudo_write, + .read = pseudo_read +}; +static struct dev_entry _ent_zero = { + .dev = &_dev_zero, + .dev_class = DEV_CLASS_BLOCK, + .dev_subclass = DEV_BLOCK_PSEUDO, + .dev_name = "zero" +}; + +static ssize_t pseudo_write(struct blkdev *dev, const void *buf, size_t pos, size_t lim) { + switch ((uint64_t) dev->dev_data) { + case DEV_NULL: + case DEV_ZERO: + return lim; + default: + panic("Unexpected dev id: %p\n", dev->dev_data); + } +} + +static ssize_t pseudo_read(struct blkdev *dev, void *buf, size_t pos, size_t lim) { + switch ((uint64_t) dev->dev_data) { + case DEV_ZERO: + memset(buf, 0, lim); + return lim; + case DEV_NULL: + return 0; + default: + panic("Unexpected dev id: %p\n", dev->dev_data); + } +} + +static __init void pseudo_init(void) { + dev_entry_add(&_ent_null); + dev_entry_add(&_ent_zero); +}