From 57ba9ff1268a3b001e60bd73260175c7f15b1fd3 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Fri, 3 Oct 2025 22:25:16 +0200 Subject: [PATCH] Store device structs in a dynamic list --- kernel/dev/dev.h | 3 ++- kernel/dev/ps2kbdev.c | 3 +++ kernel/dev/termdev.c | 3 +++ kernel/syscall/devctl.c | 28 +++++++++++++++++++--------- kernel/syscall/devctl.h | 3 +++ ulib/_premain.c | 2 -- ulib/dev.h | 11 +++++++++++ ulib/devids.h | 9 --------- ulib/ulib.h | 2 +- user/init/main.c | 4 ++-- 10 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 ulib/dev.h delete mode 100644 ulib/devids.h diff --git a/kernel/dev/dev.h b/kernel/dev/dev.h index 7a16a9e..cb3760d 100644 --- a/kernel/dev/dev.h +++ b/kernel/dev/dev.h @@ -7,7 +7,8 @@ typedef int32_t (*DevFn)(uint8_t *buffer, size_t len, void *extra); -typedef struct { +typedef struct Dev { + struct Dev *next; DevFn fns[DEV_FNS_MAX]; } Dev; diff --git a/kernel/dev/ps2kbdev.c b/kernel/dev/ps2kbdev.c index 8e74739..458a715 100644 --- a/kernel/dev/ps2kbdev.c +++ b/kernel/dev/ps2kbdev.c @@ -6,6 +6,8 @@ #include "dev.h" #include "errors.h" #include "dlmalloc/malloc.h" +#include "util/util.h" +#include "syscall/devctl.h" Dev PS2KBDEV; Ps2KbFastBuf PS2KB_BUF; @@ -32,4 +34,5 @@ void ps2kbdev_init(void) { uint8_t *buf = dlmalloc(bufsz); rbuf_init(&PS2KB_BUF.rbuf, buf, bufsz); PS2KB_BUF.init = true; + LL_APPEND(DEVS, &PS2KBDEV); } diff --git a/kernel/dev/termdev.c b/kernel/dev/termdev.c index 6a47a7f..43799d8 100644 --- a/kernel/dev/termdev.c +++ b/kernel/dev/termdev.c @@ -5,6 +5,8 @@ #include "termdev.h" #include "dev.h" #include "errors.h" +#include "util/util.h" +#include "syscall/devctl.h" Dev TERMDEV; @@ -16,4 +18,5 @@ 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); } diff --git a/kernel/syscall/devctl.c b/kernel/syscall/devctl.c index a9eeaf3..8f1179f 100644 --- a/kernel/syscall/devctl.c +++ b/kernel/syscall/devctl.c @@ -10,10 +10,7 @@ #include "dev/ps2kbdev.h" #include "util/util.h" -Dev *DEVS[] = { - [0x10] = &TERMDEV, - [0x11] = &PS2KBDEV, -}; +Dev *DEVS = NULL; int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { uint64_t *devh = (uint64_t *)devh1; @@ -26,9 +23,18 @@ int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { switch (cmd) { case DEVCTL_GET_HANDLE: { - uint64_t devid = buffer1; - if (devid >= LEN(DEVS)) { - ret = E_INVALIDARGUMENT; + Dev *founddev = NULL; + size_t i = 0; + Dev *dev, *devtmp; + LL_FOREACH_SAFE_IDX(DEVS, dev, devtmp, i) { + if (i == buffer1) { + founddev = dev; + break; + } + } + + if (founddev == NULL) { + ret = E_NOENTRY; goto done; } @@ -36,14 +42,14 @@ int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { for (size_t i = 0; i < PROC_DEVHANDLES_MAX; i++) { if (proc->devs[i] == NULL) { found = true; - proc->devs[i] = DEVS[devid]; + proc->devs[i] = founddev; *devh = i; break; } } if (!found) { - ret = E_NOENTRY; + ret = E_NOMEMORY; goto done; } } break; @@ -59,6 +65,10 @@ int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1) { } Dev *dev = proc->devs[*devh]; + if (dev == NULL) { + ret = E_NOENTRY; + goto done; + } ret = dev->fns[cmd]((uint8_t *)buffer1, (size_t)len1, (void *)extra1); } break; } diff --git a/kernel/syscall/devctl.h b/kernel/syscall/devctl.h index 4a759f5..6585077 100644 --- a/kernel/syscall/devctl.h +++ b/kernel/syscall/devctl.h @@ -3,6 +3,9 @@ #include #include "syscall.h" +#include "dev/dev.h" + +extern Dev *DEVS; int32_t SYSCALL5(sys_devctl, devh1, cmd1, buffer1, len1, extra1); diff --git a/ulib/_premain.c b/ulib/_premain.c index 6dfc53d..2bd81e4 100644 --- a/ulib/_premain.c +++ b/ulib/_premain.c @@ -2,13 +2,11 @@ #include #include #include -#include #include #include #include #include #include -#include extern void main(void); extern uint8_t _bss_start[]; diff --git a/ulib/dev.h b/ulib/dev.h new file mode 100644 index 0000000..b716005 --- /dev/null +++ b/ulib/dev.h @@ -0,0 +1,11 @@ +#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 + +#endif // ULIB_DEV_H_ diff --git a/ulib/devids.h b/ulib/devids.h deleted file mode 100644 index 3925053..0000000 --- a/ulib/devids.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef ULIB_DEVIDS_H_ -#define ULIB_DEVIDS_H_ - -enum { - DEV_TERMDEV = 0x10, - DEV_PS2KBDEV = 0x11, -}; - -#endif // ULIB_DEVIDS_H_ diff --git a/ulib/ulib.h b/ulib/ulib.h index a9ee4d0..7eb6a7e 100644 --- a/ulib/ulib.h +++ b/ulib/ulib.h @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include diff --git a/user/init/main.c b/user/init/main.c index 7857b3b..d76c470 100644 --- a/user/init/main.c +++ b/user/init/main.c @@ -20,10 +20,10 @@ void tb_runinitscript(void) { string_memset(buf, 0, sizeof(buf)); r = ipcpipe(tb, IPCPIPE_OUT, IPCPIPE_READ, (uint8_t *)buf, sizeof(buf)-1); if (r > 0) { - devctl(&termdev, 0x00, (uint8_t *)buf, string_len(buf), 0); + devctl(&termdev, DEV_TERMDEV_PUTCH, (uint8_t *)buf, string_len(buf), 0); } - r = devctl(&ps2kbdev, 0x00, NULL, 0, 0); + r = devctl(&ps2kbdev, DEV_PS2KBDEV_READCH, NULL, 0, 0); if (r != E_NOTYET) { uint8_t b = r; ipcpipe(tb, IPCPIPE_IN, IPCPIPE_WRITE, &b, 1);