summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/kernel/con.h2
-rw-r--r--include/kernel/sched.h1
-rw-r--r--include/kernel/sys.h8
-rw-r--r--include/stdio.h7
-rw-r--r--include/unistd.h6
-rw-r--r--kernel/serial.c20
-rw-r--r--kernel/sys.c25
-rw-r--r--kernel/traps.s4
-rw-r--r--lib/stdio.c8
-rw-r--r--usrbin/main.c11
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();
}