diff options
| -rw-r--r-- | include/kernel/con.h | 2 | ||||
| -rw-r--r-- | include/kernel/sched.h | 1 | ||||
| -rw-r--r-- | include/kernel/sys.h | 8 | ||||
| -rw-r--r-- | include/stdio.h | 7 | ||||
| -rw-r--r-- | include/unistd.h | 6 | ||||
| -rw-r--r-- | kernel/serial.c | 20 | ||||
| -rw-r--r-- | kernel/sys.c | 25 | ||||
| -rw-r--r-- | kernel/traps.s | 4 | ||||
| -rw-r--r-- | lib/stdio.c | 8 | ||||
| -rw-r--r-- | usrbin/main.c | 11 |
10 files changed, 64 insertions, 28 deletions
diff --git a/include/kernel/con.h b/include/kernel/con.h index 9dd9dbe..d28daff 100644 --- a/include/kernel/con.h +++ b/include/kernel/con.h @@ -13,4 +13,6 @@ void con_clear(void); int printk(char*, ...); +int rsputs(char*); + #endif diff --git a/include/kernel/sched.h b/include/kernel/sched.h index 6b0488e..4d2aca0 100644 --- a/include/kernel/sched.h +++ b/include/kernel/sched.h @@ -50,6 +50,7 @@ struct task_struct { pid_t pid; int state; uint32_t signal; + int ctty; unsigned int alarm; void *sig_handlers[NRSIG]; struct tss_struct tss; diff --git a/include/kernel/sys.h b/include/kernel/sys.h index ba2dc0c..32788b1 100644 --- a/include/kernel/sys.h +++ b/include/kernel/sys.h @@ -5,9 +5,9 @@ extern int sys_time(void); extern int sys_getpid(void); extern int sys_getpdir(void); extern int sys_signal(void); -extern int sys_rsputs(void); extern int sys_alarm(void); extern int sys_pause(void); +extern int sys_ctty(void); extern int sys_dummy(void); syscall_t call_table[256] = { @@ -16,9 +16,9 @@ syscall_t call_table[256] = { [2] = &sys_getpid, [3] = &sys_getpdir, [4] = &sys_signal, - [5] = &sys_rsputs, - [6] = &sys_alarm, - [7] = &sys_pause, + [5] = &sys_alarm, + [6] = &sys_pause, + [7] = &sys_ctty, [8] = &sys_dummy, [9] = &sys_dummy, [10] = &sys_dummy, diff --git a/include/stdio.h b/include/stdio.h index 94cf227..824eb31 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -3,12 +3,15 @@ #include <stdarg.h> +#define EOF -1 + int puts(char*); -int rsputs(char*); int printf(char*, ...); -int rsprintf(char*, ...); +int sprintf(char*, char*, ...); int vsprintf(char*, char*, va_list); +int ctty(int ctty); + #endif diff --git a/include/unistd.h b/include/unistd.h index 30d41c6..746c829 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -10,9 +10,9 @@ typedef uint16_t pid_t; #define __SYS_getpid 2 #define __SYS_getpdir 3 #define __SYS_signal 4 -#define __SYS_rsputs 5 -#define __SYS_alarm 6 -#define __SYS_pause 7 +#define __SYS_alarm 5 +#define __SYS_pause 6 +#define __SYS_ctty 7 #define _syscall0(type, name) \ type name(void) { \ diff --git a/kernel/serial.c b/kernel/serial.c index 7f23298..86bbd87 100644 --- a/kernel/serial.c +++ b/kernel/serial.c @@ -15,10 +15,20 @@ #define RSMODEMS (RSBASE + 6) #define RSSCRATCH (RSBASE + 7) -static int rsputs(char *s) { +#define rswait()\ + while((inb(RSLINES) & 0x20) == 0); + +int rsputs(char *s) { while(*s) { - while((inb(RSLINES) & 0x20) == 0); - outb(RSDATA, *s++); + rswait(); + if(*s == '\n') { + outb(RSDATA, '\n'); + rswait(); + outb(RSDATA, '\r'); + s++; + } else { + outb(RSDATA, *s++); + } } return 0; @@ -46,7 +56,3 @@ void serial_init(void) { rsputs("[kernel] Serial monitor initialized!\n\r"); printk("[rs] Serial port COM0 initialized!\n"); } - -int sys_rsputs(char *s) { - return rsputs(s); -} diff --git a/kernel/sys.c b/kernel/sys.c index c2256c1..986c4dd 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -3,13 +3,28 @@ #include <kernel/sched.h> #include <signal.h> #include <stdint.h> +#include <stdio.h> #include <sys/types.h> #include <time.h> #include <unistd.h> int sys_puts(char *s) { - printk("[%04x] ", ctask->pid); - return printk(s); + char buf[8]; + sprintf(buf, "[%04x] ", ctask->pid); + + if(ctask->ctty < 0) + return EOF; + + switch(ctask->ctty) { + case 1: + rsputs(buf); + return rsputs(s); + break; + default: + printk("%s", buf); + return printk(s); + break; + } } time_t sys_time(void) { @@ -56,6 +71,12 @@ int sys_pause(void) { return -1; } +int sys_ctty(int ctty) { + ctask->ctty = ctty; + + return 0; +} + int sys_dummy(void) { return -ENOSYS; } diff --git a/kernel/traps.s b/kernel/traps.s index 0a0d202..408a650 100644 --- a/kernel/traps.s +++ b/kernel/traps.s @@ -21,8 +21,8 @@ extern ticked ; too. %define ts_signal 6 -%define ts_sig_handlers 14 -%define ts_tss_esp0 146 +%define ts_sig_handlers 18 +%define ts_tss_esp0 150 %macro SAVE 0 pusha diff --git a/lib/stdio.c b/lib/stdio.c index a718ee4..67f0a54 100644 --- a/lib/stdio.c +++ b/lib/stdio.c @@ -3,7 +3,7 @@ #include <unistd.h> _syscall1(int, puts, char*, s); -_syscall1(int, rsputs, char*, s); +_syscall1(int, ctty, int, ctty); int printf(char *fmt, ...) { int ret; @@ -18,15 +18,13 @@ int printf(char *fmt, ...) { return ret; } -int rsprintf(char *fmt, ...) { +int sprintf(char *str, char *fmt, ...) { int ret; - char buf[1024]; va_list ap; va_start(ap, fmt); - ret = vsprintf(buf, fmt, ap); + ret = vsprintf(str, fmt, ap); va_end(ap); - rsputs(buf); return ret; } diff --git a/usrbin/main.c b/usrbin/main.c index 8c8d2dc..68f1a5c 100644 --- a/usrbin/main.c +++ b/usrbin/main.c @@ -9,6 +9,8 @@ void sighandler(int sig) { } void pid1(void) { + printf("We did it ma!\n"); + signal(SIGALRM, &sighandler); alarm(2); pause(); @@ -22,6 +24,8 @@ void pid1(void) { void pid2(void) { int x = 0; + printf("We did it ma!\n"); + while(1) { sleep(1); printf("0x%04x:0x%08x: 0x%08x, 0x%08x\n", getpid(), (uint32_t) getpdir(), time(), x++); @@ -29,9 +33,10 @@ void pid2(void) { } void main(void) { - printf("We did it ma!\n"); - - if(getpid() == 1) + if(getpid() == 1) { + ctty(1); pid1(); + } + pid2(); } |
