Compare commits
5 Commits
4fe907a733
...
ef7a45e7cf
| Author | SHA1 | Date | |
|---|---|---|---|
| ef7a45e7cf | |||
| a530304e18 | |||
| f8863d19bd | |||
| f9d3fde4ad | |||
| c2364fbd48 |
@ -155,24 +155,6 @@ int32_t ps2kb_intr(void) {
|
|||||||
|
|
||||||
IpcMBus *PS2KB_MBUS;
|
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) {
|
void ps2kbdev_intr(void) {
|
||||||
int32_t c = ps2kb_intr();
|
int32_t c = ps2kb_intr();
|
||||||
if (c >= 0) {
|
if (c >= 0) {
|
||||||
@ -188,6 +170,4 @@ void ps2kbdev_init(void) {
|
|||||||
HSHTB_ALLOC(DEVTABLE.devs, ident, "ps2kbdev", ps2kbdev);
|
HSHTB_ALLOC(DEVTABLE.devs, ident, "ps2kbdev", ps2kbdev);
|
||||||
spinlock_init(&ps2kbdev->spinlock);
|
spinlock_init(&ps2kbdev->spinlock);
|
||||||
PS2KB_MBUS = ipc_mbusmake("ps2kb", 1, 0x100);
|
PS2KB_MBUS = ipc_mbusmake("ps2kb", 1, 0x100);
|
||||||
ps2kbdev->fns[DEV_PS2KBDEV_READCH] = &ps2kbdev_readch;
|
|
||||||
ps2kbdev->fns[DEV_PS2KBDEV_ATTCHCONS] = &ps2kbdev_attchcons;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -117,7 +117,7 @@ int32_t ipc_mbusconsume(const char *name, uint8_t *const buffer, uint64_t pid) {
|
|||||||
return i;
|
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;
|
IpcMBus *mbus = NULL;
|
||||||
|
|
||||||
spinlock_acquire(&IPC_MBUSES.spinlock);
|
spinlock_acquire(&IPC_MBUSES.spinlock);
|
||||||
@ -148,7 +148,7 @@ int32_t ipc_mbusattchcons(const char *name, uint64_t pid) {
|
|||||||
return E_OK;
|
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;
|
IpcMBus *mbus = NULL;
|
||||||
|
|
||||||
spinlock_acquire(&IPC_MBUSES.spinlock);
|
spinlock_acquire(&IPC_MBUSES.spinlock);
|
||||||
|
|||||||
@ -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_mbusdelete(const char *name);
|
||||||
int32_t ipc_mbuspublish(const char *name, const uint8_t *const buffer);
|
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_mbusconsume(const char *name, uint8_t *const buffer, uint64_t pid);
|
||||||
int32_t ipc_mbusattchcons(const char *name, uint64_t pid);
|
int32_t ipc_mbusattch(const char *name, uint64_t pid);
|
||||||
int32_t ipc_mbusdttchcons(const char *name, uint64_t pid);
|
int32_t ipc_mbusdttch(const char *name, uint64_t pid);
|
||||||
void ipc_mbustick(void);
|
void ipc_mbustick(void);
|
||||||
|
|
||||||
#endif // IPC_MBUS_MBUS_H_
|
#endif // IPC_MBUS_MBUS_H_
|
||||||
|
|||||||
79
kernel/syscall/ipcmbus.c
Normal file
79
kernel/syscall/ipcmbus.c
Normal 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
15
kernel/syscall/ipcmbus.h
Normal 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_
|
||||||
@ -10,6 +10,7 @@
|
|||||||
#include "syscall/fs.h"
|
#include "syscall/fs.h"
|
||||||
#include "syscall/dev.h"
|
#include "syscall/dev.h"
|
||||||
#include "syscall/time.h"
|
#include "syscall/time.h"
|
||||||
|
#include "syscall/ipcmbus.h"
|
||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
#include "kprintf.h"
|
#include "kprintf.h"
|
||||||
|
|
||||||
@ -67,4 +68,11 @@ SyscallFn SYSCALL_TABLE[SYSCALLS_MAX] = {
|
|||||||
[SYS_DEV_DELHANDLE] = &sys_dev_delhandle,
|
[SYS_DEV_DELHANDLE] = &sys_dev_delhandle,
|
||||||
|
|
||||||
[SYS_TIME] = &sys_time,
|
[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,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,9 +6,6 @@
|
|||||||
|
|
||||||
#define DEV_TERMDEV_PUTCH 0
|
#define DEV_TERMDEV_PUTCH 0
|
||||||
|
|
||||||
#define DEV_PS2KBDEV_READCH 0
|
|
||||||
#define DEV_PS2KBDEV_ATTCHCONS 1
|
|
||||||
|
|
||||||
#define DEV_SERIALDEV_SENDB 0
|
#define DEV_SERIALDEV_SENDB 0
|
||||||
#define DEV_SERIALDEV_SENDREADY 1
|
#define DEV_SERIALDEV_SENDREADY 1
|
||||||
#define DEV_SERIALDEV_RECVB 2
|
#define DEV_SERIALDEV_RECVB 2
|
||||||
|
|||||||
@ -39,5 +39,11 @@
|
|||||||
#define SYS_DEV_CMD 36
|
#define SYS_DEV_CMD 36
|
||||||
#define SYS_DEV_DELHANDLE 39
|
#define SYS_DEV_DELHANDLE 39
|
||||||
#define SYS_TIME 38
|
#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_
|
#endif // SHARE_HDRS_SYSCALL_H_
|
||||||
|
|||||||
@ -159,3 +159,26 @@ int32_t time(Time *time) {
|
|||||||
return syscall(SYS_TIME, (uint64_t)time, 0, 0, 0, 0, 0);
|
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);
|
||||||
|
}
|
||||||
|
|||||||
@ -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_cmd(Dev_t *dev, uint64_t cmd, void *buf, size_t len);
|
||||||
int32_t dev_delhandle(Dev_t *dev);
|
int32_t dev_delhandle(Dev_t *dev);
|
||||||
int32_t time(Time *time);
|
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_
|
#endif // ULIB_SYSTEM_SYSTEM_H_
|
||||||
|
|||||||
@ -255,10 +255,11 @@ bool interp_runstring(char *string, InterpResult **res, bool interactive) {
|
|||||||
proc_run(app);
|
proc_run(app);
|
||||||
|
|
||||||
if (wait) {
|
if (wait) {
|
||||||
|
uint8_t key = 0;
|
||||||
while(proc_pollstate(app) != 4) {
|
while(proc_pollstate(app) != 4) {
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
int32_t key = dev_cmd(&ps2kbdev, DEV_PS2KBDEV_READCH, NULL, 0);
|
int32_t read = ipc_mbusconsume("ps2kb", &key);
|
||||||
if (key > 0 && (uint8_t)key == C('S')) {
|
if (read > 0 && key == C('S')) {
|
||||||
proc_kill(app);
|
proc_kill(app);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,6 @@
|
|||||||
#define LINEBUF_MAX 1024
|
#define LINEBUF_MAX 1024
|
||||||
|
|
||||||
PID_t PID;
|
PID_t PID;
|
||||||
Dev_t ps2kbdev;
|
|
||||||
|
|
||||||
Config CONFIG;
|
Config CONFIG;
|
||||||
|
|
||||||
@ -90,9 +89,8 @@ void do_mode_interactive(void) {
|
|||||||
|
|
||||||
uint8_t b = 0;
|
uint8_t b = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int32_t key = dev_cmd(&ps2kbdev, DEV_PS2KBDEV_READCH, NULL, 0);
|
int32_t read = ipc_mbusconsume("ps2kb", &b);
|
||||||
if (key > 0) {
|
if (read > 0) {
|
||||||
b = (uint8_t)key;
|
|
||||||
switch (b) {
|
switch (b) {
|
||||||
case C('C'):
|
case C('C'):
|
||||||
case 0xE9:
|
case 0xE9:
|
||||||
@ -149,8 +147,7 @@ void main(void) {
|
|||||||
do_file("base:/scripts/rc.tb");
|
do_file("base:/scripts/rc.tb");
|
||||||
|
|
||||||
if (CONFIG.mode == MODE_INTERACTIVE) {
|
if (CONFIG.mode == MODE_INTERACTIVE) {
|
||||||
dev_gethandle(&ps2kbdev, "ps2kbdev");
|
ipc_mbusattch("ps2kb");
|
||||||
dev_cmd(&ps2kbdev, DEV_PS2KBDEV_ATTCHCONS, NULL, 0);
|
|
||||||
do_mode_interactive();
|
do_mode_interactive();
|
||||||
} else if (CONFIG.mode == MODE_RUNFILE) {
|
} else if (CONFIG.mode == MODE_RUNFILE) {
|
||||||
if (CONFIG.filepath == NULL) {
|
if (CONFIG.filepath == NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user