Compare commits

..

5 Commits

Author SHA1 Message Date
ef7a45e7cf Remove ps2kbdev dev functions in favour of MBus 2025-11-11 23:50:24 +01:00
a530304e18 tb Use ps2kb MBus to handle C-S 2025-11-11 23:49:51 +01:00
f8863d19bd tb Use MBus for keyboard handling 2025-11-11 23:45:10 +01:00
f9d3fde4ad ulib Add MBus syscalls 2025-11-11 23:44:55 +01:00
c2364fbd48 Add MBus syscalls 2025-11-11 23:44:43 +01:00
12 changed files with 147 additions and 35 deletions

View File

@ -155,24 +155,6 @@ int32_t ps2kb_intr(void) {
IpcMBus *PS2KB_MBUS;
int32_t ps2kbdev_readch(struct Dev *dev, uint8_t *buffer, size_t len, uint64_t pid) {
(void)dev; (void)buffer; (void)len;
uint8_t b;
int32_t r = ipc_mbusconsume("ps2kb", &b, pid);
if (r > 0) {
return b;
} else {
return E_NOTYET;
}
}
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);
}
void ps2kbdev_intr(void) {
int32_t c = ps2kb_intr();
if (c >= 0) {
@ -188,6 +170,4 @@ void ps2kbdev_init(void) {
HSHTB_ALLOC(DEVTABLE.devs, ident, "ps2kbdev", ps2kbdev);
spinlock_init(&ps2kbdev->spinlock);
PS2KB_MBUS = ipc_mbusmake("ps2kb", 1, 0x100);
ps2kbdev->fns[DEV_PS2KBDEV_READCH] = &ps2kbdev_readch;
ps2kbdev->fns[DEV_PS2KBDEV_ATTCHCONS] = &ps2kbdev_attchcons;
}

View File

@ -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);

View File

@ -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_

79
kernel/syscall/ipcmbus.c Normal file
View File

@ -0,0 +1,79 @@
#include <stdint.h>
#include <stddef.h>
#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);
}

15
kernel/syscall/ipcmbus.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef SYSCALL_IPCMBUS_H_
#define SYSCALL_IPCMBUS_H_
#include <stdint.h>
#include <stddef.h>
#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_

View File

@ -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,
};

View File

@ -6,9 +6,6 @@
#define DEV_TERMDEV_PUTCH 0
#define DEV_PS2KBDEV_READCH 0
#define DEV_PS2KBDEV_ATTCHCONS 1
#define DEV_SERIALDEV_SENDB 0
#define DEV_SERIALDEV_SENDREADY 1
#define DEV_SERIALDEV_RECVB 2

View File

@ -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_

View File

@ -159,3 +159,26 @@ int32_t time(Time *time) {
return syscall(SYS_TIME, (uint64_t)time, 0, 0, 0, 0, 0);
}
int32_t ipc_mbusmake(char *name, size_t objsize, size_t objmax) {
return syscall(SYS_IPC_MBUSMAKE, (uint64_t)name, (uint64_t)objsize, (uint64_t)objmax, 0, 0, 0);
}
int32_t ipc_mbusdelete(char *name) {
return syscall(SYS_IPC_MBUSDELETE, (uint64_t)name, 0, 0, 0, 0, 0);
}
int32_t ipc_mbuspublish(char *name, const uint8_t *const buffer) {
return syscall(SYS_IPC_MBUSPUBLISH, (uint64_t)name, (uint64_t)buffer, 0, 0, 0, 0);
}
int32_t ipc_mbusconsume(char *name, uint8_t *const buffer) {
return syscall(SYS_IPC_MBUSCONSUME, (uint64_t)name, (uint64_t)buffer, 0, 0, 0, 0);
}
int32_t ipc_mbusattch(char *name) {
return syscall(SYS_IPC_MBUSATTCH, (uint64_t)name, 0, 0, 0, 0, 0);
}
int32_t ipc_mbusdttch(char *name) {
return syscall(SYS_IPC_MBUSATTCH, (uint64_t)name, 0, 0, 0, 0, 0);
}

View File

@ -48,5 +48,11 @@ int32_t dev_stat(DevStat *devstatbuf, size_t idx);
int32_t dev_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len);
int32_t dev_delhandle(Dev_t *dev);
int32_t time(Time *time);
int32_t ipc_mbusmake(char *name, size_t objsize, size_t objmax);
int32_t ipc_mbusdelete(char *name);
int32_t ipc_mbuspublish(char *name, const uint8_t *const buffer);
int32_t ipc_mbusconsume(char *name, uint8_t *const buffer);
int32_t ipc_mbusattch(char *name);
int32_t ipc_mbusdttch(char *name);
#endif // ULIB_SYSTEM_SYSTEM_H_

View File

@ -255,10 +255,11 @@ bool interp_runstring(char *string, InterpResult **res, bool interactive) {
proc_run(app);
if (wait) {
uint8_t key = 0;
while(proc_pollstate(app) != 4) {
if (interactive) {
int32_t key = dev_cmd(&ps2kbdev, DEV_PS2KBDEV_READCH, NULL, 0);
if (key > 0 && (uint8_t)key == C('S')) {
int32_t read = ipc_mbusconsume("ps2kb", &key);
if (read > 0 && key == C('S')) {
proc_kill(app);
goto cleanup;
}

View File

@ -8,7 +8,6 @@
#define LINEBUF_MAX 1024
PID_t PID;
Dev_t ps2kbdev;
Config CONFIG;
@ -90,9 +89,8 @@ void do_mode_interactive(void) {
uint8_t b = 0;
for (;;) {
int32_t key = dev_cmd(&ps2kbdev, DEV_PS2KBDEV_READCH, NULL, 0);
if (key > 0) {
b = (uint8_t)key;
int32_t read = ipc_mbusconsume("ps2kb", &b);
if (read > 0) {
switch (b) {
case C('C'):
case 0xE9:
@ -149,8 +147,7 @@ void main(void) {
do_file("base:/scripts/rc.tb");
if (CONFIG.mode == MODE_INTERACTIVE) {
dev_gethandle(&ps2kbdev, "ps2kbdev");
dev_cmd(&ps2kbdev, DEV_PS2KBDEV_ATTCHCONS, NULL, 0);
ipc_mbusattch("ps2kb");
do_mode_interactive();
} else if (CONFIG.mode == MODE_RUNFILE) {
if (CONFIG.filepath == NULL) {