78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
#include "rusgx_stub.h"
|
|
|
|
static long __read(int fd, void* buf, unsigned long size) {
|
|
long ret;
|
|
__asm__ __volatile__ (
|
|
"syscall"
|
|
: "=a" (ret)
|
|
: "0" (SYS_read), "D" (fd), "S" (buf), "d" (size)
|
|
: "cc", "rcx", "r11", "memory"
|
|
);
|
|
return ret;
|
|
}
|
|
|
|
static long __write(int fd, const void* buf, unsigned long size) {
|
|
long ret;
|
|
__asm__ __volatile__ (
|
|
"syscall"
|
|
: "=a" (ret)
|
|
: "0" (SYS_write), "D" (fd), "S" (buf), "d" (size)
|
|
: "cc", "rcx", "r11", "memory"
|
|
);
|
|
return ret;
|
|
}
|
|
|
|
static long __open(const char* path, int flags, int mode) {
|
|
long ret;
|
|
__asm__ __volatile__ (
|
|
"syscall"
|
|
: "=a" (ret)
|
|
: "0" (SYS_open), "D" (path), "S" (flags), "d" (mode)
|
|
: "cc", "rcx", "r11", "memory"
|
|
);
|
|
return ret;
|
|
}
|
|
|
|
static long __close(int fd) {
|
|
long ret;
|
|
__asm__ __volatile__ (
|
|
"syscall"
|
|
: "=a" (ret)
|
|
: "a" (SYS_close), "D" (fd)
|
|
: "cc", "rcx", "r11", "memory" );
|
|
return ret;
|
|
}
|
|
|
|
static void __exit(int status) {
|
|
__asm__ __volatile__ (
|
|
"syscall"
|
|
:
|
|
: "a" (SYS_exit), "D" (status)
|
|
: "cc", "rcx", "r11", "memory" );
|
|
return;
|
|
}
|
|
|
|
long rusgx_syscall(int num, long arg0, long arg1, long arg2, long arg3, long arg4) {
|
|
long ret = 0;
|
|
switch (num) {
|
|
case SYS_exit:
|
|
__exit((int)arg0);
|
|
break;
|
|
case SYS_read:
|
|
ret = __read((int)arg0, (void*)arg1, (unsigned long)arg2);
|
|
break;
|
|
case SYS_write:
|
|
ret = __write((int)arg0, (const void*)arg1, (unsigned long)arg2);
|
|
break;
|
|
case SYS_open:
|
|
ret = __open((const char*)arg0, (int)arg1, (int)arg2);
|
|
break;
|
|
case SYS_close:
|
|
ret = __close((int)arg0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|