#include #include #include #include "linuxsys.h" #include "linux.h" /* * Try to set ``personality'', a system-emulation thing. * 0 is Linux. */ SYSCALL(sys_personality) { ulong p = ARG1; DPRINT("personality(%lud)...", p); if(p != 0 && p != 0xffffffff) RETURN(-EINVAL); RETURN(0); } struct new_utsname { char sysname[65]; char nodename[65]; char release[65]; char version[65]; char machine[65]; char domainname[65]; }; SYSCALL(sys_newuname) { struct new_utsname *p; p = (struct new_utsname*)ARG1; DPRINT("newuname(0x%p)...", p); strncpy(p->sysname, "Linux", 65); strncpy(p->nodename, sysname(), 65); strncpy(p->release, "2.6.11", 65); strncpy(p->version, "blah", 65); strncpy(p->machine, "i386", 65); strncpy(p->domainname, sysname(), 65); RETURN(0); } SYSCALL(sys_sethostname) { RETURN(-EPERM); } SYSCALL(sys_setdomainname) { RETURN(-EPERM); } SYSCALL(sys_time) { long *p = (long*)ARG1; DPRINT("time()..."); RETURN(time(p)); } struct timeval { long tv_sec; long tv_usec; }; struct timezone { int tz_minuteswest; int tz_dsttime; }; SYSCALL(sys_gettimeofday) { struct timeval *tv; struct timezone *tz; vlong t; tv = (struct timeval*)ARG1; tz = (struct timezone*)ARG2; DPRINT("gettimeofday(0x%p, 0x%p)...", tv, tz); t = nsec(); tv->tv_sec = (long)(t/1000000000LL); tv->tv_usec = (long)((t%1000000000LL)/1000); if(tz){ // FIXME: figure out what this is tz->tz_minuteswest = 0; tz->tz_dsttime = 0; } RETURN(0); } struct timespec { long tv_sec; long tvnsec; }; SYSCALL(sys_nanosleep) { struct timespec *req; struct timespec *rem; vlong t; vlong s; int r; DPRINT("nanosleep()..."); req = (struct timespec*)ARG1; rem = (struct timespec*)ARG2; s = nsec(); t = req->tv_sec*1000000000LL + req->tvnsec; r = sleep((long)(t/1000000LL)); if(r < 0 && rem){ t = t - (nsec() - s); if(t < 0) t = 0; rem->tv_sec = (long)(t/1000000000LL); rem->tvnsec = (long)(t%1000000000LL); } RETURN(r); } SYSCALL(sys_sched_setscheduler) { DPRINT("sched_setscheduler()..."); RETURN(-EPERM); }