From 8c2e0ce946012a4275e8dfa9d8dfd1d5a68d6e3e Mon Sep 17 00:00:00 2001 From: sotech117 Date: Sat, 2 Mar 2024 23:05:26 +0000 Subject: decent coding session --- kernel/drivers/memdevs.c | 60 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'kernel/drivers/memdevs.c') 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; } /** -- cgit v1.2.3-70-g09d2