#include #include #include #include #include #include #include #include #include #include int sys_puts(char *s) { char buf[8]; if(ctask->ctty < 0) return EOF; sprintf(buf, "[%04x] ", ctask->pid); switch(ctask->ctty) { case 1: /* rsputs(buf); */ return rsputs(s); break; default: printk("%s", buf); return printk(s); break; } } time_t sys_time(void) { return ticks / 100; } pid_t sys_getpid(void) { return ctask->pid; } void *sys_getpdir(void) { uint32_t pdir; __asm__ ("mov %%cr3, %%eax" : "=a" (pdir)); return (void*) pdir; } void *sys_signal(int sig, void (*func)(int)) { if(sig < 0 || sig >= NRSIG) return NULL; /* SIGKILL and SIGSTOP cannot be caught */ if(sig == SIGKILL || sig == SIGSTOP) return NULL; ctask->sig_handlers[sig] = func; return func; } int sys_alarm(unsigned int seconds) { if(!seconds) { ctask->alarm = 0; return 0; } ctask->alarm = ticks + (seconds * 100); } int sys_pause(void) { ctask->state = TSTATE_INTERRUPTIBLE; reschedule(); return -1; } int sys_ctty(int ctty) { ctask->ctty = ctty; return 0; } ssize_t sys_read(void *buf, size_t len) { switch(ctask->ctty) { case 1: return rsread(buf, len); break; default: return -EBADF; break; } } int sys_dummy(void) { return -ENOSYS; }