From 04a4b1395c172d09a3081c45ba351ce7f759a58c Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Fri, 3 Oct 2025 23:47:58 +0200 Subject: [PATCH] Store devices as a hashtable --- kernel/dev/dev.c | 18 ++++++++++++++++++ kernel/dev/dev.h | 16 ++++++++++++++-- kernel/dev/ps2kbdev.c | 11 +++++------ kernel/dev/ps2kbdev.h | 2 -- kernel/dev/termdev.c | 10 ++++------ kernel/dev/termdev.h | 2 -- kernel/hshtb.h | 2 +- kernel/syscall/devctl.c | 21 +++++++++------------ kernel/syscall/devctl.h | 2 -- ulib/dev.h | 3 --- user/init/main.c | 4 ++-- 11 files changed, 53 insertions(+), 38 deletions(-) create mode 100644 kernel/dev/dev.c diff --git a/kernel/dev/dev.c b/kernel/dev/dev.c new file mode 100644 index 0000000..c1351f5 --- /dev/null +++ b/kernel/dev/dev.c @@ -0,0 +1,18 @@ +#include +#include +#include "spinlock/spinlock.h" +#include "dev.h" +#include "hshtb.h" +#include "hal/hal.h" +#include "termdev.h" +#include "ps2kbdev.h" + +DevTable DEVTABLE; + +void dev_init(void) { + hal_memset(&DEVTABLE, 0, sizeof(DEVTABLE)); + spinlock_init(&DEVTABLE.spinlock); + + termdev_init(); + ps2kbdev_init(); +} diff --git a/kernel/dev/dev.h b/kernel/dev/dev.h index cb3760d..00410fb 100644 --- a/kernel/dev/dev.h +++ b/kernel/dev/dev.h @@ -2,14 +2,26 @@ #define DEV_DEV_H_ #include +#include "spinlock/spinlock.h" #define DEV_FNS_MAX 32 typedef int32_t (*DevFn)(uint8_t *buffer, size_t len, void *extra); -typedef struct Dev { - struct Dev *next; +typedef struct { + int _hshtbstate; + char ident[0x100]; DevFn fns[DEV_FNS_MAX]; } Dev; + +typedef struct { + SpinLock spinlock; + Dev devs[0x100]; +} DevTable; + +extern DevTable DEVTABLE; + +void dev_init(void); + #endif // DEV_DEV_H_ diff --git a/kernel/dev/ps2kbdev.c b/kernel/dev/ps2kbdev.c index 458a715..5f0b029 100644 --- a/kernel/dev/ps2kbdev.c +++ b/kernel/dev/ps2kbdev.c @@ -7,9 +7,8 @@ #include "errors.h" #include "dlmalloc/malloc.h" #include "util/util.h" -#include "syscall/devctl.h" +#include "hshtb.h" -Dev PS2KBDEV; Ps2KbFastBuf PS2KB_BUF; int32_t ps2kbdev_readch(uint8_t *buffer, size_t len, void *extra) { @@ -27,12 +26,12 @@ int32_t ps2kbdev_readch(uint8_t *buffer, size_t len, void *extra) { } void ps2kbdev_init(void) { - hal_memset(&PS2KBDEV, 0, sizeof(PS2KBDEV)); - PS2KBDEV.fns[0] = &ps2kbdev_readch; - const int bufsz = 0x1000; uint8_t *buf = dlmalloc(bufsz); rbuf_init(&PS2KB_BUF.rbuf, buf, bufsz); PS2KB_BUF.init = true; - LL_APPEND(DEVS, &PS2KBDEV); + + Dev *ps2kbdev; + HSHTB_ALLOC(DEVTABLE.devs, ident, "ps2kbdev", ps2kbdev); + ps2kbdev->fns[0] = &ps2kbdev_readch; } diff --git a/kernel/dev/ps2kbdev.h b/kernel/dev/ps2kbdev.h index a9cb3ef..384857b 100644 --- a/kernel/dev/ps2kbdev.h +++ b/kernel/dev/ps2kbdev.h @@ -15,8 +15,6 @@ typedef struct { void ps2kbdev_init(void); -extern Dev PS2KBDEV; - extern Ps2KbFastBuf PS2KB_BUF; #endif // DEV_PS2KBDEV_H_ diff --git a/kernel/dev/termdev.c b/kernel/dev/termdev.c index 43799d8..2723a5d 100644 --- a/kernel/dev/termdev.c +++ b/kernel/dev/termdev.c @@ -6,9 +6,7 @@ #include "dev.h" #include "errors.h" #include "util/util.h" -#include "syscall/devctl.h" - -Dev TERMDEV; +#include "hshtb.h" int32_t termdev_putch(uint8_t *buffer, size_t len, void *extra) { kprintf("%.*s", (int)len, (char *)buffer); @@ -16,7 +14,7 @@ int32_t termdev_putch(uint8_t *buffer, size_t len, void *extra) { } void termdev_init(void) { - hal_memset(&TERMDEV, 0, sizeof(TERMDEV)); - TERMDEV.fns[0] = &termdev_putch; - LL_APPEND(DEVS, &TERMDEV); + Dev *termdev = NULL; + HSHTB_ALLOC(DEVTABLE.devs, ident, "termdev", termdev); + termdev->fns[0] = &termdev_putch; } diff --git a/kernel/dev/termdev.h b/kernel/dev/termdev.h index 6c72f07..e56533d 100644 --- a/kernel/dev/termdev.h +++ b/kernel/dev/termdev.h @@ -8,6 +8,4 @@ int32_t termdev_putch(uint8_t *buffer, size_t len, void *extra); void termdev_init(void); -extern Dev TERMDEV; - #endif // DEV_TERMDEV_H_ diff --git a/kernel/hshtb.h b/kernel/hshtb.h index 63baa41..307805e 100644 --- a/kernel/hshtb.h +++ b/kernel/hshtb.h @@ -29,7 +29,7 @@ enum { #define HSHTB_ALLOC(tb, keyfield, k, out) \ do { \ size_t __len = sizeof((tb)) / sizeof((tb)[0]); \ - uint32_t __h = hshtb_fnv32((k), strlen((k))); \ + uint32_t __h = hshtb_fnv32((k), hal_strlen((k))); \ size_t __idx = __h % __len; \ size_t __start = __idx; \ typeof(&(tb)[0]) __tomb = NULL; \ diff --git a/kernel/syscall/devctl.c b/kernel/syscall/devctl.c index 8f1179f..c8aae23 100644 --- a/kernel/syscall/devctl.c +++ b/kernel/syscall/devctl.c @@ -6,11 +6,9 @@ #include "spinlock/spinlock.h" #include "proc/proc.h" #include "sysdefs/devctl.h" -#include "dev/termdev.h" -#include "dev/ps2kbdev.h" #include "util/util.h" - -Dev *DEVS = NULL; +#include "hshtb.h" +#include "dev/dev.h" int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { uint64_t *devh = (uint64_t *)devh1; @@ -23,16 +21,15 @@ int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { switch (cmd) { case DEVCTL_GET_HANDLE: { - Dev *founddev = NULL; - size_t i = 0; - Dev *dev, *devtmp; - LL_FOREACH_SAFE_IDX(DEVS, dev, devtmp, i) { - if (i == buffer1) { - founddev = dev; - break; - } + char *ident = (char *)buffer1; + if (ident == NULL) { + ret = E_INVALIDARGUMENT; + goto done; } + Dev *founddev; + HSHTB_GET(DEVTABLE.devs, ident, ident, founddev); + if (founddev == NULL) { ret = E_NOENTRY; goto done; diff --git a/kernel/syscall/devctl.h b/kernel/syscall/devctl.h index 6585077..2df1e91 100644 --- a/kernel/syscall/devctl.h +++ b/kernel/syscall/devctl.h @@ -5,8 +5,6 @@ #include "syscall.h" #include "dev/dev.h" -extern Dev *DEVS; - int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1); #endif // SYSCALL_DEVCTL_H_ diff --git a/ulib/dev.h b/ulib/dev.h index b716005..26346fd 100644 --- a/ulib/dev.h +++ b/ulib/dev.h @@ -1,9 +1,6 @@ #ifndef ULIB_DEV_H_ #define ULIB_DEV_H_ -#define DEV_TERMDEV 0 -#define DEV_PS2KBDEV 1 - #define DEV_TERMDEV_PUTCH 0 #define DEV_PS2KBDEV_READCH 0 diff --git a/user/init/main.c b/user/init/main.c index d76c470..0d99c0b 100644 --- a/user/init/main.c +++ b/user/init/main.c @@ -6,7 +6,7 @@ Dev_t ps2kbdev; Dev_t termdev; void tb_runinitscript(void) { - devctl(&termdev, DEVCTL_GET_HANDLE, (uint8_t *)DEV_TERMDEV, 0, 0); + devctl(&termdev, DEVCTL_GET_HANDLE, (uint8_t *)"termdev", 0, 0); char *tbargs[] = { "-m", "runfile", "-f", "base:/scripts/init.tb", "-logcmds", "yes" }; int32_t tb = processctl(-1, PCTL_SPAWN, (uint64_t)"base:/bin/tb", (uint64_t)(char **)tbargs, ARRLEN(tbargs)); @@ -33,7 +33,7 @@ void tb_runinitscript(void) { void main(void) { PID = (uint64_t)processctl(-1, PCTL_GETPID, 0, 0, 0); - devctl(&ps2kbdev, DEVCTL_GET_HANDLE, (uint8_t *)DEV_PS2KBDEV, 0, 0); + devctl(&ps2kbdev, DEVCTL_GET_HANDLE, (uint8_t *)"ps2kbdev", 0, 0); tb_runinitscript();