feat: experimental tty console with scrollback buffer.
[lunaix-os.git] / lunaix-os / kernel / lxinit.c
index 2de87c5900d59d773499f956123eaae871ba89fe..8a19841f5c87c88b0e48b528a7e6a29a5fe01d73 100644 (file)
@@ -2,6 +2,7 @@
 #include <lunaix/clock.h>
 #include <lunaix/keyboard.h>
 #include <lunaix/lunistd.h>
 #include <lunaix/clock.h>
 #include <lunaix/keyboard.h>
 #include <lunaix/lunistd.h>
+#include <lunaix/lxconsole.h>
 #include <lunaix/mm/kalloc.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/proc.h>
 #include <lunaix/mm/kalloc.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/proc.h>
@@ -9,7 +10,6 @@
 #include <lunaix/spike.h>
 #include <lunaix/syslog.h>
 #include <lunaix/timer.h>
 #include <lunaix/spike.h>
 #include <lunaix/syslog.h>
 #include <lunaix/timer.h>
-#include <lunaix/tty/tty.h>
 
 extern uint8_t __kernel_start;
 
 
 extern uint8_t __kernel_start;
 
@@ -25,6 +25,21 @@ sigchild_handler(int signum)
     kprintf(KINFO "SIGCHLD received\n");
 }
 
     kprintf(KINFO "SIGCHLD received\n");
 }
 
+void __USER__
+sigsegv_handler(int signum)
+{
+    pid_t pid = getpid();
+    kprintf(KWARN "SIGSEGV received on process %d\n", pid);
+    _exit(signum);
+}
+
+void __USER__
+sigalrm_handler(int signum)
+{
+    pid_t pid = getpid();
+    kprintf(KWARN "I, pid %d, have received an alarm!\n", pid);
+}
+
 void __USER__
 _lxinit_main()
 {
 void __USER__
 _lxinit_main()
 {
@@ -39,6 +54,10 @@ _lxinit_main()
 #endif
 
     signal(_SIGCHLD, sigchild_handler);
 #endif
 
     signal(_SIGCHLD, sigchild_handler);
+    signal(_SIGSEGV, sigsegv_handler);
+    signal(_SIGALRM, sigalrm_handler);
+
+    alarm(5);
 
     int status;
 #ifdef WAIT_DEMO
 
     int status;
 #ifdef WAIT_DEMO
@@ -67,15 +86,15 @@ _lxinit_main()
 
     waitpid(-1, &status, WNOHANG);
 
 
     waitpid(-1, &status, WNOHANG);
 
-    for (size_t i = 0; i < 10; i++) {
+    for (size_t i = 0; i < 5; i++) {
         pid_t pid = 0;
         if (!(pid = fork())) {
         pid_t pid = 0;
         if (!(pid = fork())) {
+            signal(_SIGSEGV, sigsegv_handler);
             sleep(i);
             if (i == 3) {
                 i = *(int*)0xdeadc0de; // seg fault!
             }
             sleep(i);
             if (i == 3) {
                 i = *(int*)0xdeadc0de; // seg fault!
             }
-            tty_put_char('0' + i);
-            tty_put_char('\n');
+            kprintf(KINFO "%d\n", i);
             _exit(0);
         }
         kprintf(KINFO "Forked %d\n", pid);
             _exit(0);
         }
         kprintf(KINFO "Forked %d\n", pid);
@@ -83,7 +102,11 @@ _lxinit_main()
 
     while ((p = wait(&status)) >= 0) {
         short code = WEXITSTATUS(status);
 
     while ((p = wait(&status)) >= 0) {
         short code = WEXITSTATUS(status);
-        if (WIFEXITED(status)) {
+        if (WIFSIGNALED(status)) {
+            kprintf(KINFO "Process %d terminated by signal, exit_code: %d\n",
+                    p,
+                    code);
+        } else if (WIFEXITED(status)) {
             kprintf(KINFO "Process %d exited with code %d\n", p, code);
         } else {
             kprintf(KWARN "Process %d aborted with code %d\n", p, code);
             kprintf(KINFO "Process %d exited with code %d\n", p, code);
         } else {
             kprintf(KWARN "Process %d aborted with code %d\n", p, code);
@@ -109,7 +132,7 @@ _lxinit_main()
         }
         if ((keyevent.state & KBD_KEY_FPRESSED) &&
             (keyevent.keycode & 0xff00) <= KEYPAD) {
         }
         if ((keyevent.state & KBD_KEY_FPRESSED) &&
             (keyevent.keycode & 0xff00) <= KEYPAD) {
-            tty_put_char((char)(keyevent.keycode & 0x00ff));
+            console_write_char((char)(keyevent.keycode & 0x00ff));
             // FIXME: io to vga port is privileged and cause #GP in user mode
             // tty_sync_cursor();
         }
             // FIXME: io to vga port is privileged and cause #GP in user mode
             // tty_sync_cursor();
         }