Files
bsb2/kernel/syscall/stub.h
2026-02-25 00:33:16 +01:00

105 lines
4.0 KiB
C++

#pragma once
#include "types.h"
namespace Syscall {
/*! \brief Syscall IDs
* \note the syscall number must correspond to the values in the syscall stub!
*/
enum class ID : size_t {
TEST = 0,
WRITE = 1,
READ = 2,
SLEEP = 3,
SEM_INIT=4,
SEM_DESTROY=5,
SEM_WAIT=6,
SEM_SIGNAL=7,
SYS_GETPID = 8,
SYS_EXIT = 9,
SYS_KILL = 10,
MAP = 11,
UNMAP = 12,
SEND = 13,
RECEIVE = 14,
REPLY = 15,
FORK = 16
};
} // namespace Syscall
/// \brief Syscall stub
extern "C" ssize_t sys_call(Syscall::ID id, size_t p1, size_t p2, size_t p3,
size_t p4, size_t p5);
extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2,
size_t p3, size_t p4, size_t p5);
// Interrupt based syscalls
[[gnu::always_inline]] static inline ssize_t sys_test(size_t p1, size_t p2,
size_t p3, size_t p4,
size_t p5) {
return sys_call(Syscall::ID::TEST, p1, p2, p3, p4, p5);
}
[[gnu::always_inline]] static inline int write(int fd, const void *buf, size_t len, int x = -1, int y = -1) {
return sys_call(Syscall::ID::WRITE, fd, (size_t)buf, len, x, y);
}
[[gnu::always_inline]] static inline int read(int fd, void *buf, size_t len){
return sys_call(Syscall::ID::READ, fd, (size_t)buf, len, 0, 0);
}
[[gnu::always_inline]] static inline int sleep(size_t ms){
return sys_call(Syscall::ID::SLEEP, ms,0,0,0,0);
}
[[gnu::always_inline]] static inline int sem_init(int fd, int semid, int value) {
return sys_call(Syscall::ID::SEM_INIT, fd, semid, value, 0,0);
}
[[gnu::always_inline]] static inline int sem_destroy(int fd, int semid) {
return sys_call(Syscall::ID::SEM_DESTROY, fd, semid,0,0,0);
}
[[gnu::always_inline]] static inline int sem_wait(int fd, int semid) {
return sys_call(Syscall::ID::SEM_WAIT, fd, semid,0,0,0);
}
[[gnu::always_inline]] static inline int sem_signal(int fd, int semid) {
return sys_call(Syscall::ID::SEM_SIGNAL, fd, semid,0,0,0);
}
[[gnu::always_inline]] static inline int sys_getpid(){
return sys_call(Syscall::ID::SYS_GETPID, 0,0,0,0,0);
}
[[gnu::always_inline]] static inline void sys_exit(){
sys_call(Syscall::ID::SYS_EXIT, 0, 0, 0, 0, 0);
}
[[gnu::always_inline]] static inline void sys_kill(size_t pid){
sys_call(Syscall::ID::SYS_KILL, pid, 0, 0, 0, 0);
}
[[gnu::always_inline]] static inline void* map(size_t size) {
return (void*) sys_call(Syscall::ID::MAP, size,0,0,0,0);
}
[[gnu::always_inline]] static inline int unmap(void* start, size_t size) {
return sys_call(Syscall::ID::UNMAP, (size_t) start, size,0,0,0);
}
[[gnu::always_inline]] static inline bool send(int pid, const void* sbuffer, size_t ssize, void* rbuffer, size_t rsize) {
return sys_call(Syscall::ID::SEND, pid, (size_t)sbuffer, ssize, (size_t)rbuffer, rsize);
}
[[gnu::always_inline]] static inline int receive(void* buffer, size_t size) {
return sys_call(Syscall::ID::RECEIVE, (size_t)buffer, size,0,0,0);
}
[[gnu::always_inline]] static inline bool reply(const void* buffer, size_t size) {
return sys_call(Syscall::ID::REPLY, (size_t)buffer, size,0,0,0);
}
[[gnu::always_inline]] static inline int fork() {
return sys_call(Syscall::ID::FORK,0,0,0,0,0);
}