Add pseudo devices
This commit is contained in:
+2
-1
@@ -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
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
#include "sys/types.h"
|
||||
|
||||
struct chrdev {
|
||||
char name[64];
|
||||
void *dev_data;
|
||||
|
||||
// TODO: maybe something like flush()
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user