Add pseudo devices

This commit is contained in:
Mark
2019-12-30 01:43:40 +02:00
parent 6545e05462
commit 164022b8d1
6 changed files with 65 additions and 4 deletions
+2 -1
View File
@@ -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
-1
View File
@@ -2,7 +2,6 @@
#include "sys/types.h"
struct chrdev {
char name[64];
void *dev_data;
// TODO: maybe something like flush()
+1
View File
@@ -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];
+1 -1
View File
@@ -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;
}
-1
View File
@@ -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
+61
View File
@@ -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);
}