Implement (half) simple semaphore & mutex lock, and ...
[lunaix-os.git] / lunaix-os / kernel / k_main.c
index 3899336d00950bd5d150611c18ecc2c0726f11ff..c3819d9d8050b1e54a8f15d420f328b8ca1ea3b0 100644 (file)
@@ -1,41 +1,85 @@
-#include <stdint.h>
-#include <lunaix/mm/vmm.h>
-#include <lunaix/mm/dmm.h>
 #include <hal/cpu.h>
-#include <libc/stdio.h>
+#include <lunaix/syslog.h>
+#include <lunaix/mm/kalloc.h>
+#include <lunaix/mm/vmm.h>
+#include <lunaix/spike.h>
+#include <lunaix/clock.h>
+#include <lunaix/timer.h>
+#include <lunaix/keyboard.h>
+#include <lunaix/tty/tty.h>
+#include <stdint.h>
 
 extern uint8_t __kernel_start;
 
+LOG_MODULE("LX")
+
+void 
+test_timer(void* payload);
+
 void
 _kernel_main()
 {
     char buf[64];
-    
-    printf("Hello higher half kernel world!\nWe are now running in virtual "
+
+    kprintf(KINFO "Hello higher half kernel world!\nWe are now running in virtual "
            "address space!\n\n");
-    
+
     cpu_get_brand(buf);
-    printf("CPU: %s\n\n", buf);
+    kprintf("CPU: %s\n\n", buf);
 
     void* k_start = vmm_v2p(&__kernel_start);
-    printf("The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
-
-    dmm_init();
+    kprintf(KINFO "The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
 
     // test malloc & free
-    
-    uint32_t** arr = (uint32_t**) lx_malloc(10 * sizeof(uint32_t*));
-    
-    for (size_t i = 0; i < 10; i++)
-    {
-        arr[i] = (uint32_t*) lx_malloc((i + 1) * 2);
+
+    uint8_t** arr = (uint8_t**)lxmalloc(10 * sizeof(uint8_t*));
+
+    for (size_t i = 0; i < 10; i++) {
+        arr[i] = (uint8_t*)lxmalloc((i + 1) * 2);
+    }
+
+    for (size_t i = 0; i < 10; i++) {
+        lxfree(arr[i]);
     }
 
-    for (size_t i = 0; i < 10; i++)
+    uint8_t* big_ = lxmalloc(8192);
+    big_[0] = 123;
+    big_[1] = 23;
+    big_[2] = 3;
+
+    kprintf(KINFO "%u, %u, %u\n", big_[0], big_[1], big_[2]);
+
+    // good free
+    lxfree(arr);
+    lxfree(big_);
+
+    // timer_run_second(1, test_timer, NULL, TIMER_MODE_PERIODIC);
+
+    struct kdb_keyinfo_pkt keyevent;
+    while (1)
     {
-        lx_free(arr[i]);
+        if (!kbd_recv_key(&keyevent)) {
+            continue;
+        }
+        if ((keyevent.state & KBD_KEY_FPRESSED) && (keyevent.keycode & 0xff00) <= KEYPAD) {
+            tty_put_char((char)(keyevent.keycode & 0x00ff));
+            tty_sync_cursor();
+        }
     }
-    
-    lx_free(arr);
-    // assert(0);
+
+    spin();
+}
+
+static datetime_t datetime;
+
+void test_timer(void* payload) {
+    clock_walltime(&datetime);
+
+    kprintf(KWARN "%u/%02u/%02u %02u:%02u:%02u\r",
+           datetime.year,
+           datetime.month,
+           datetime.day,
+           datetime.hour,
+           datetime.minute,
+           datetime.second);
 }
\ No newline at end of file