58 lines
1.7 KiB
C++
58 lines
1.7 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
|
|
};
|
|
} // 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 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);
|
|
}
|
|
|