diff --git a/src/sys/include/ubixos/syscalls_new.h b/src/sys/include/ubixos/syscalls_new.h index 784bb22..fc68107 100644 --- a/src/sys/include/ubixos/syscalls_new.h +++ b/src/sys/include/ubixos/syscalls_new.h @@ -30,23 +30,26 @@ #ifndef _SYSCALLS_NEW_H #define _SYSCALLS_NEW_H -void sysExit(); -void sys_write(); -void getpid(); -void fcntl(); -void issetugid(); -void __sysctl(); -void pipe(); -void readlink(); -void getuid(); -void getgid(); -void close(); -void mmap(); -void obreak(); +int sysExit(); +int sys_write(); +int getpid(); +int fcntl(); +int issetugid(); +int __sysctl(); +int pipe(); +int readlink(); +int getuid(); +int getgid(); +int close(); +int mmap(); +int obreak(); -#define invalid_call 0x0 +#define invalid_call 0x0 +#define PSL_C 0x00000001 /* carry bit */ +#define EJUSTRETURN (-2) /* don't modify regs, just return */ +#define ERESTART (-1) /* restart syscall */ -typedef void (*functionPTR)(); +typedef int (*functionPTR)(); functionPTR systemCalls_new[] = { invalid_call, /** 0 **/ diff --git a/src/sys/kernel/syscall_new.c b/src/sys/kernel/syscall_new.c index 118c9ae..3ab02bc 100644 --- a/src/sys/kernel/syscall_new.c +++ b/src/sys/kernel/syscall_new.c @@ -40,6 +40,7 @@ caddr_t params; struct thread *td = &_current->td; int args[8]; + int error = 0x0; params = (caddr_t)frame.tf_esp + sizeof(int); @@ -59,9 +60,27 @@ } else { memcpy(args,params,8 * sizeof(int)); - systemCalls_new[code](td,args); - frame.tf_eax = td->td_retval[0]; - frame.tf_edx = td->td_retval[1]; + td->td_retval[0] = 0; + td->td_retval[1] = frame.tf_edx; + + error = (int)systemCalls_new[code](td,args); + switch (error) { + case 0: + frame.tf_eax = td->td_retval[0]; + frame.tf_edx = td->td_retval[1]; + frame.tf_eflags &= ~PSL_C; + break; + case ERESTART: + frame.tf_eip -= frame.tf_err; + break; + case EJUSTRETURN: + break; + default: + frame.tf_eax = error; + frame.tf_eflags |= PSL_C; + break; + + } } }