diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-03-02 23:05:26 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-03-02 23:05:26 +0000 |
commit | 8c2e0ce946012a4275e8dfa9d8dfd1d5a68d6e3e (patch) | |
tree | 1877a33c6488a5b16fb7962e1ffb0f72f13a5052 /kernel/drivers/memdevs.c | |
parent | 9c90e73fda0d5df2e1f11b32d459d3bb07a63192 (diff) |
decent coding session
Diffstat (limited to 'kernel/drivers/memdevs.c')
-rw-r--r-- | kernel/drivers/memdevs.c | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/kernel/drivers/memdevs.c b/kernel/drivers/memdevs.c index 50815d3..815143a 100644 --- a/kernel/drivers/memdevs.c +++ b/kernel/drivers/memdevs.c @@ -43,7 +43,31 @@ chardev_ops_t zero_dev_ops = {.read = zero_read, */ void memdevs_init() { - NOT_YET_IMPLEMENTED("DRIVERS: memdevs_init"); + // NOT_YET_IMPLEMENTED("DRIVERS: memdevs_init"); + + // create chardev_t's for null and zero + chardev_t *null_dev = kmalloc(sizeof(chardev_t)); + if (null_dev == NULL) + { + dbg(DBG_DISK, "ERROR: kmalloc failed on null_dev in memdevs_init\n"); + return; + } + chardev_t *zero_dev = kmalloc(sizeof(chardev_t)); + if (zero_dev == NULL) + { + dbg(DBG_DISK, "ERROR: kmalloc failed on zero_dev in memdevs_init\n"); + return; + } + + // fill them in + null_dev->cd_id = MEM_NULL_DEVID; + null_dev->cd_ops = &null_dev_ops; + zero_dev->cd_id = MEM_ZERO_DEVID; + zero_dev->cd_ops = &zero_dev_ops; + + // register them + chardev_register(null_dev); + chardev_register(zero_dev); } /** @@ -58,8 +82,9 @@ void memdevs_init() */ static ssize_t null_read(chardev_t *dev, size_t pos, void *buf, size_t count) { - NOT_YET_IMPLEMENTED("DRIVERS: null_read"); - return -ENOMEM; + // NOT_YET_IMPLEMENTED("DRIVERS: null_read"); + // TODO: ask about buffer checking + return 0; // return reading no bytes } /** @@ -76,8 +101,18 @@ static ssize_t null_read(chardev_t *dev, size_t pos, void *buf, size_t count) static ssize_t null_write(chardev_t *dev, size_t pos, const void *buf, size_t count) { - NOT_YET_IMPLEMENTED("DRIVERS: null_write"); - return -ENOMEM; + // NOT_YET_IMPLEMENTED("DRIVERS: null_write"); + + // check if the buffer is NULL + if (buf == NULL) + { + return -EINVAL; + } + + // there is no true writing, so just do nothing here + + // return the number of bytes written + return count; } /** @@ -93,8 +128,19 @@ static ssize_t null_write(chardev_t *dev, size_t pos, const void *buf, */ static ssize_t zero_read(chardev_t *dev, size_t pos, void *buf, size_t count) { - NOT_YET_IMPLEMENTED("DRIVERS: zero_read"); - return 0; + // NOT_YET_IMPLEMENTED("DRIVERS: zero_read"); + + // check if the buffer is NULL + if (buf == NULL) + { + return -EINVAL; + } + + // fill the buffer with zeros + memset(buf, 0, count); + + // return the number of bytes read + return count; } /** |