From c2364fbd48f038c4f389d2765abcf37540871590 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Tue, 11 Nov 2025 23:44:43 +0100 Subject: [PATCH] Add MBus syscalls --- kernel/dev/ps2kbdev.c | 2 +- kernel/ipc/mbus/mbus.c | 4 +- kernel/ipc/mbus/mbus.h | 4 +- kernel/syscall/ipcmbus.c | 79 ++++++++++++++++++++++++++++++++++++++++ kernel/syscall/ipcmbus.h | 15 ++++++++ kernel/syscall/syscall.c | 8 ++++ share/sysdefs/syscall.h | 6 +++ 7 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 kernel/syscall/ipcmbus.c create mode 100644 kernel/syscall/ipcmbus.h diff --git a/kernel/dev/ps2kbdev.c b/kernel/dev/ps2kbdev.c index e15190b..2b21251 100644 --- a/kernel/dev/ps2kbdev.c +++ b/kernel/dev/ps2kbdev.c @@ -170,7 +170,7 @@ int32_t ps2kbdev_readch(struct Dev *dev, uint8_t *buffer, size_t len, uint64_t p int32_t ps2kbdev_attchcons(struct Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) { (void)dev; (void)buffer; (void)len; - return ipc_mbusattchcons("ps2kb", pid); + return ipc_mbusattch("ps2kb", pid); } void ps2kbdev_intr(void) { diff --git a/kernel/ipc/mbus/mbus.c b/kernel/ipc/mbus/mbus.c index 5d14d92..4006deb 100644 --- a/kernel/ipc/mbus/mbus.c +++ b/kernel/ipc/mbus/mbus.c @@ -117,7 +117,7 @@ int32_t ipc_mbusconsume(const char *name, uint8_t *const buffer, uint64_t pid) { return i; } -int32_t ipc_mbusattchcons(const char *name, uint64_t pid) { +int32_t ipc_mbusattch(const char *name, uint64_t pid) { IpcMBus *mbus = NULL; spinlock_acquire(&IPC_MBUSES.spinlock); @@ -148,7 +148,7 @@ int32_t ipc_mbusattchcons(const char *name, uint64_t pid) { return E_OK; } -int32_t ipc_mbusdttchcons(const char *name, uint64_t pid) { +int32_t ipc_mbusdttch(const char *name, uint64_t pid) { IpcMBus *mbus = NULL; spinlock_acquire(&IPC_MBUSES.spinlock); diff --git a/kernel/ipc/mbus/mbus.h b/kernel/ipc/mbus/mbus.h index c3e0486..bd517c1 100644 --- a/kernel/ipc/mbus/mbus.h +++ b/kernel/ipc/mbus/mbus.h @@ -32,8 +32,8 @@ IpcMBus *ipc_mbusmake(const char *name, size_t objsize, size_t objmax); int32_t ipc_mbusdelete(const char *name); int32_t ipc_mbuspublish(const char *name, const uint8_t *const buffer); int32_t ipc_mbusconsume(const char *name, uint8_t *const buffer, uint64_t pid); -int32_t ipc_mbusattchcons(const char *name, uint64_t pid); -int32_t ipc_mbusdttchcons(const char *name, uint64_t pid); +int32_t ipc_mbusattch(const char *name, uint64_t pid); +int32_t ipc_mbusdttch(const char *name, uint64_t pid); void ipc_mbustick(void); #endif // IPC_MBUS_MBUS_H_ diff --git a/kernel/syscall/ipcmbus.c b/kernel/syscall/ipcmbus.c new file mode 100644 index 0000000..61453e2 --- /dev/null +++ b/kernel/syscall/ipcmbus.c @@ -0,0 +1,79 @@ +#include +#include +#include "syscall/syscall.h" +#include "syscall/ipcmbus.h" +#include "ipc/mbus/mbus.h" +#include "errors.h" + +int32_t SYSCALL3(sys_ipc_mbusmake, name1, objsize1, objmax1) { + const char *name = (const char *)name1; + size_t objsize = objsize1; + size_t objmax = objmax1; + + if (name == NULL) { + return E_INVALIDARGUMENT; + } + + IpcMBus *mbus = ipc_mbusmake(name, objsize, objmax); + if (mbus == NULL) { + return E_NOMEMORY; + } + + return E_OK; +} + +int32_t SYSCALL1(sys_ipc_mbusdelete, name1) { + const char *name = (const char *)name1; + + return ipc_mbusdelete(name); +} + +int32_t SYSCALL2(sys_ipc_mbuspublish, name1, buffer1) { + const char *name = (const char *)name1; + const uint8_t *const buffer = (const uint8_t *const)buffer1; + + if (name == NULL) { + return E_INVALIDARGUMENT; + } + + if (buffer == NULL) { + return E_INVALIDARGUMENT; + } + + return ipc_mbuspublish(name, buffer); +} + +int32_t SYSCALL2(sys_ipc_mbusconsume, name1, buffer1) { + const char *name = (const char *)name1; + uint8_t *const buffer = (int8_t *const)buffer1; + + if (name == NULL) { + return E_INVALIDARGUMENT; + } + + if (buffer == NULL) { + return E_INVALIDARGUMENT; + } + + return ipc_mbusconsume(name, buffer, _caller_pid); +} + +int32_t SYSCALL1(sys_ipc_mbusattch, name1) { + const char *name = (const char *)name1; + + if (name == NULL) { + return E_INVALIDARGUMENT; + } + + return ipc_mbusattch(name, _caller_pid); +} + +int32_t SYSCALL1(sys_ipc_mbusdttch, name1) { + const char *name = (const char *)name1; + + if (name == NULL) { + return E_INVALIDARGUMENT; + } + + return ipc_mbusattch(name, _caller_pid); +} diff --git a/kernel/syscall/ipcmbus.h b/kernel/syscall/ipcmbus.h new file mode 100644 index 0000000..0d0e456 --- /dev/null +++ b/kernel/syscall/ipcmbus.h @@ -0,0 +1,15 @@ +#ifndef SYSCALL_IPCMBUS_H_ +#define SYSCALL_IPCMBUS_H_ + +#include +#include +#include "syscall/syscall.h" + +int32_t SYSCALL3(sys_ipc_mbusmake, name1, objsize1, objmax1); +int32_t SYSCALL1(sys_ipc_mbusdelete, name1); +int32_t SYSCALL2(sys_ipc_mbuspublish, name1, buffer1); +int32_t SYSCALL2(sys_ipc_mbusconsume, name1, buffer1); +int32_t SYSCALL1(sys_ipc_mbusattch, name1); +int32_t SYSCALL1(sys_ipc_mbusdttch, name1); + +#endif // SYSCALL_IPCMBUS_H_ diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 44d0c92..a2ae82b 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -10,6 +10,7 @@ #include "syscall/fs.h" #include "syscall/dev.h" #include "syscall/time.h" +#include "syscall/ipcmbus.h" #include "errors.h" #include "kprintf.h" @@ -67,4 +68,11 @@ SyscallFn SYSCALL_TABLE[SYSCALLS_MAX] = { [SYS_DEV_DELHANDLE] = &sys_dev_delhandle, [SYS_TIME] = &sys_time, + + [SYS_IPC_MBUSMAKE] = &sys_ipc_mbusmake, + [SYS_IPC_MBUSDELETE] = &sys_ipc_mbusdelete, + [SYS_IPC_MBUSPUBLISH] = &sys_ipc_mbuspublish, + [SYS_IPC_MBUSCONSUME] = &sys_ipc_mbusconsume, + [SYS_IPC_MBUSATTCH] = &sys_ipc_mbusattch, + [SYS_IPC_MBUSDTTCH] = &sys_ipc_mbusdttch, }; diff --git a/share/sysdefs/syscall.h b/share/sysdefs/syscall.h index dab9e82..af652fc 100644 --- a/share/sysdefs/syscall.h +++ b/share/sysdefs/syscall.h @@ -39,5 +39,11 @@ #define SYS_DEV_CMD 36 #define SYS_DEV_DELHANDLE 39 #define SYS_TIME 38 +#define SYS_IPC_MBUSMAKE 40 +#define SYS_IPC_MBUSDELETE 41 +#define SYS_IPC_MBUSPUBLISH 42 +#define SYS_IPC_MBUSCONSUME 43 +#define SYS_IPC_MBUSATTCH 44 +#define SYS_IPC_MBUSDTTCH 45 #endif // SHARE_HDRS_SYSCALL_H_