about summary refs log tree commit diff stats
path: root/tools/iso/kernel.soso/devfs.c
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-01-01 18:22:19 -0800
committerKartik Agaram <vc@akkartik.com>2020-01-01 18:42:48 -0800
commit65409d2312e702a48d3cf5b32479d25266bda3c3 (patch)
tree62a7262fce61f2302109246da4536ce6f8e9ef80 /tools/iso/kernel.soso/devfs.c
parenta6da50ad30d2e1825575ffef497ab450a8f26e94 (diff)
downloadmu-65409d2312e702a48d3cf5b32479d25266bda3c3.tar.gz
5858
Move script to create a Soso boot image into a sub-directory.

I'm trying to streamline newcomer attention to just a couple of use cases.
Diffstat (limited to 'tools/iso/kernel.soso/devfs.c')
-rw-r--r--tools/iso/kernel.soso/devfs.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/tools/iso/kernel.soso/devfs.c b/tools/iso/kernel.soso/devfs.c
new file mode 100644
index 00000000..bfff39cb
--- /dev/null
+++ b/tools/iso/kernel.soso/devfs.c
@@ -0,0 +1,132 @@
+#include "devfs.h"
+#include "common.h"
+#include "fs.h"
+#include "alloc.h"
+#include "device.h"
+#include "screen.h"
+#include "list.h"
+#include "spinlock.h"
+
+static FileSystemNode* gDevRoot = NULL;
+
+static List* gDeviceList = NULL;
+static Spinlock gDeviceListLock;
+
+static BOOL devfs_open(File *node, uint32 flags);
+static FileSystemDirent *devfs_readdir(FileSystemNode *node, uint32 index);
+static FileSystemNode *devfs_finddir(FileSystemNode *node, char *name);
+
+static FileSystemDirent gDirent;
+
+void initializeDevFS() {
+    gDevRoot = kmalloc(sizeof(FileSystemNode));
+    memset((uint8*)gDevRoot, 0, sizeof(FileSystemNode));
+
+    gDevRoot->nodeType = FT_Directory;
+
+    FileSystemNode* rootFs = getFileSystemRootNode();
+
+    FileSystemNode* devNode = finddir_fs(rootFs, "dev");
+
+    if (devNode) {
+        devNode->nodeType |= FT_MountPoint;
+        devNode->mountPoint = gDevRoot;
+        gDevRoot->parent = devNode->parent;
+        strcpy(gDevRoot->name, devNode->name);
+    }
+    else {
+        PANIC("/dev does not exist!");
+    }
+
+    gDevRoot->open = devfs_open;
+    gDevRoot->finddir = devfs_finddir;
+    gDevRoot->readdir = devfs_readdir;
+
+    gDeviceList = List_Create();
+    Spinlock_Init(&gDeviceListLock);
+}
+
+static BOOL devfs_open(File *node, uint32 flags) {
+    return TRUE;
+}
+
+static FileSystemDirent *devfs_readdir(FileSystemNode *node, uint32 index) {
+    FileSystemDirent * result = NULL;
+
+    uint32 counter = 0;
+
+    Spinlock_Lock(&gDeviceListLock);
+
+    List_Foreach(n, gDeviceList) {
+        if (index == counter) {
+            FileSystemNode* deviceNode = (FileSystemNode*)n->data;
+            strcpy(gDirent.name, deviceNode->name);
+            gDirent.fileType = deviceNode->nodeType;
+            gDirent.inode = index;
+            result = &gDirent;
+            break;
+        }
+
+        ++counter;
+    }
+    Spinlock_Unlock(&gDeviceListLock);
+
+    return result;
+}
+
+static FileSystemNode *devfs_finddir(FileSystemNode *node, char *name) {
+    FileSystemNode* result = NULL;
+
+
+    Spinlock_Lock(&gDeviceListLock);
+
+    List_Foreach(n, gDeviceList) {
+        FileSystemNode* deviceNode = (FileSystemNode*)n->data;
+
+        if (strcmp(name, deviceNode->name) == 0) {
+            result = deviceNode;
+            break;
+        }
+    }
+
+    Spinlock_Unlock(&gDeviceListLock);
+
+    return result;
+}
+
+FileSystemNode* registerDevice(Device* device) {
+    Spinlock_Lock(&gDeviceListLock);
+
+    List_Foreach(n, gDeviceList) {
+        FileSystemNode* deviceNode = (FileSystemNode*)n->data;
+
+        if (strcmp(device->name, deviceNode->name) == 0) {
+            //There is already a device with the same name
+            Spinlock_Unlock(&gDeviceListLock);
+            return NULL;
+        }
+    }
+
+    FileSystemNode* deviceNode = (FileSystemNode*)kmalloc(sizeof(FileSystemNode));
+    memset((uint8*)deviceNode, 0, sizeof(FileSystemNode));
+    strcpy(deviceNode->name, device->name);
+    deviceNode->nodeType = device->deviceType;
+    deviceNode->open = device->open;
+    deviceNode->close = device->close;
+    deviceNode->readBlock = device->readBlock;
+    deviceNode->writeBlock = device->writeBlock;
+    deviceNode->read = device->read;
+    deviceNode->write = device->write;
+    deviceNode->ioctl = device->ioctl;
+    deviceNode->ftruncate = device->ftruncate;
+    deviceNode->mmap = device->mmap;
+    deviceNode->munmap = device->munmap;
+    deviceNode->privateNodeData = device->privateData;
+    deviceNode->parent = gDevRoot;
+
+    List_Append(gDeviceList, deviceNode);
+
+    Spinlock_Unlock(&gDeviceListLock);
+
+    return deviceNode;
+}