jmp
命令で次の処理に移動する__code
で宣言する__code cbc_read(__code (*next)(int ret)){
struct file *f;
int n;
char *p;
if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) {
goto next(-1);
}
goto cbc_fileread(f, p, n, next);
}
read
システムコールの例cbc_read_stub
内で必要な引数をcontextから取り出す
__code cbc_read_stub(struct Context* cbc_context, enum Code next) {
goto cbc_read(cbc_context, next);
}
goto
文で呼び出す
void syscall(void)
{
int num;
int ret;
if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) {
proc->cbc_arg.cbc_console_arg.num = num;
goto (cbccodes[num])(cbc_ret);
}
jmp
命令で次の処理に移動する__code
で宣言する__code cbc_read(__code (*next)(int ret)){
struct file *f;
int n;
char *p;
if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) {
goto next(-1);
}
goto cbc_fileread(f, p, n, next);
}
read
システムコールの例cbc_read_stub
内で必要な引数をcontextから取り出す
__code cbc_read_stub(struct Context* cbc_context, enum Code next) {
goto cbc_read(cbc_context, next);
}
goto
文で呼び出す
void syscall(void)
{
int num;
int ret;
if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) {
proc->cbc_arg.cbc_console_arg.num = num;
goto (cbccodes[num])(cbc_ret);
}