Merge branch 'master' into iso-9660
authorMinep <zelong56@gmail.com>
Sun, 23 Oct 2022 01:34:09 +0000 (02:34 +0100)
committerMinep <zelong56@gmail.com>
Sun, 23 Oct 2022 01:34:09 +0000 (02:34 +0100)
22 files changed:
README.md
lunaix-os/config/make-cc
lunaix-os/debug/sdbg.c
lunaix-os/hal/acpi/acpi.c
lunaix-os/hal/ahci/ahci.c
lunaix-os/hal/ioapic.c
lunaix-os/includes/arch/x86/interrupts.h
lunaix-os/includes/hal/acpi/acpi.h
lunaix-os/includes/lunaix/isrm.h [new file with mode: 0644]
lunaix-os/includes/lunaix/spike.h
lunaix-os/includes/lunaix/syscall.h
lunaix-os/kernel/asm/x86/i386_isrm.c [new file with mode: 0644]
lunaix-os/kernel/asm/x86/interrupts.c
lunaix-os/kernel/asm/x86/intr_routines.c
lunaix-os/kernel/fs/mount.c
lunaix-os/kernel/k_init.c
lunaix-os/kernel/peripheral/ps2kbd.c
lunaix-os/kernel/proc0.c
lunaix-os/kernel/syscall.c
lunaix-os/kernel/time/timer.c
lunaix-os/kernel/tty/lxconsole.c
lunaix-os/makefile

index 0cc76fe2d3865d187e9bdb38c2e865791a143672..cdeecbe60280b3467a1cff844d9ca3e0d2e05640 100644 (file)
--- a/README.md
+++ b/README.md
@@ -63,7 +63,8 @@ LunaixOS - 一个简单的,详细的,POSIX兼容的(但愿!),带有
 本项目支持的make命令:
 | 命令 | 用途 |
 |---|---|
-| `make all` | 构建镜像(`-O2`) |
+| `make all` | 构建镜像(`-O2`,但禁用CSE相关的优化项 **※** ) |
+| `make instable` | 构建镜像(`-O2`,开启CSE相关优化) |
 | `make all-debug` | 构建适合调试用的镜像(`-Og`) |
 | `make run` | 使用QEMU运行build目录下的镜像|
 | `make debug-qemu` | 构建并使用QEMU进行调试 |
@@ -71,6 +72,8 @@ LunaixOS - 一个简单的,详细的,POSIX兼容的(但愿!),带有
 | `make debug-qemu-vscode` | 用于vscode整合 |
 | `make clean` | 删除build目录 |
 
+**※:由于在`-O2`模式下,GCC会进行CSE优化,这导致LunaixOS会出现一些非常奇怪、离谱的bug,从而影响到基本运行。具体原因有待调查。**
+
 ## 运行以及Issue
 
 运行该操作系统需要一个虚拟磁盘镜像,可以使用如下命令快速创建一个:
index 7a1899c327622e7abe2fdb86482ceb0b42dc3176..ed1f6786021a640316dc2fba02a091fb78d12a61 100644 (file)
@@ -10,6 +10,13 @@ W := -Wall -Wextra -Wno-unknown-pragmas \
                -Wno-unused-parameter \
                -Wno-unused-variable\
                -Werror=incompatible-pointer-types
-               
-CFLAGS := -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT)
+
+OFLAGS := -fno-gcse\
+                 -fno-gcse-lm\
+                 -fno-cse-follow-jumps\
+                 -fno-cse-skip-blocks\
+                 -fno-optimize-strlen\
+                 -fno-tree-builtin-call-dce 
+
+CFLAGS := -std=gnu99 -ffreestanding $(O) $(OFLAGS) $(W) $(ARCH_OPT)
 LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
\ No newline at end of file
index 2309ece105496d9e09416f9a7f4e468ee49f0592..3cc23cf29d388068ec7668b89ab6955d749acd04 100644 (file)
@@ -1,6 +1,7 @@
 #include <hal/acpi/acpi.h>
 #include <hal/ioapic.h>
 #include <klibc/stdio.h>
+#include <lunaix/isrm.h>
 #include <lunaix/lxconsole.h>
 #include <lunaix/peripheral/serial.h>
 #include <lunaix/syslog.h>
@@ -99,18 +100,11 @@ sdbg_imm(const isr_param* param)
     while (1)
         ;
 }
-
-extern uint8_t
-ioapic_get_irq(acpi_context* acpi_ctx, uint8_t old_irq);
-
 void
 sdbg_init()
 {
-    intr_subscribe(UART_COM1, sdbg_loop);
-    intr_subscribe(INSTR_DEBUG, sdbg_loop); // #DB
-    intr_subscribe(INSTR_BREAK, sdbg_loop); // #BRK
+    isrm_bindiv(INSTR_DEBUG, sdbg_loop); // #DB
+    isrm_bindiv(INSTR_BREAK, sdbg_loop); // #BRK
 
-    acpi_context* acpi_ctx = acpi_get_context();
-    uint8_t irq = ioapic_get_irq(acpi_ctx, COM1_IRQ);
-    ioapic_redirect(irq, UART_COM1, 0, IOAPIC_DELMOD_FIXED);
+    isrm_bindirq(COM1_IRQ, sdbg_loop);
 }
\ No newline at end of file
index c6a566e47b713849f320920f74eeecd696bc0fdf..3f8a25f3bf987182856cf5eed1bf4ec7b9c99fab 100644 (file)
@@ -76,6 +76,16 @@ acpi_rsdp_validate(acpi_rsdp_t* rsdp)
     return sum == 0;
 }
 
+uint8_t
+acpi_gistranslate(uint8_t old_irq)
+{
+    if (old_irq >= 24) {
+        return old_irq;
+    }
+    acpi_intso_t* int_override = ctx->madt.irq_exception[old_irq];
+    return int_override ? (uint8_t)int_override->gsi : old_irq;
+}
+
 #define VIRTUAL_BOX_PROBLEM
 
 acpi_rsdp_t*
index 43b8f1ea6e1f0978b3429b7cfb2ccac643574c92..74ba92885c61cc9674a4b33c0dffaeb03de10e6b 100644 (file)
@@ -16,6 +16,7 @@
 #include <hal/pci.h>
 #include <klibc/string.h>
 #include <lunaix/block.h>
+#include <lunaix/isrm.h>
 #include <lunaix/mm/mmio.h>
 #include <lunaix/mm/pmm.h>
 #include <lunaix/mm/valloc.h>
@@ -88,8 +89,7 @@ ahci_init()
 
     pci_write_cspace(ahci_dev->cspace_base, PCI_REG_STATUS_CMD, cmd);
 
-    pci_setup_msi(ahci_dev, AHCI_HBA_IV);
-    intr_subscribe(AHCI_HBA_IV, __ahci_hba_isr);
+    pci_setup_msi(ahci_dev, isrm_ivexalloc(__ahci_hba_isr));
 
     memset(&hba, 0, sizeof(hba));
 
index 5a03eff11bd3809b6f752d733af7009700a1f12d..edd374fcc2056936283e1cfb52d0a8fcae70a002 100644 (file)
@@ -9,9 +9,6 @@
 
 static volatile uintptr_t _ioapic_base;
 
-uint8_t
-ioapic_get_irq(acpi_context* acpi_ctx, uint8_t old_irq);
-
 void
 ioapic_init()
 {
@@ -20,31 +17,6 @@ ioapic_init()
     acpi_context* acpi_ctx = acpi_get_context();
 
     _ioapic_base = ioremap(acpi_ctx->madt.ioapic->ioapic_addr & ~0xfff, 4096);
-
-    // Remap the IRQ 8 (rtc timer's vector) to RTC_TIMER_IV in ioapic
-    //       (Remarks IRQ 8 is pin INTIN8)
-    //       See IBM PC/AT Technical Reference 1-10 for old RTC IRQ
-    //       See Intel's Multiprocessor Specification for IRQ - IOAPIC INTIN
-    //       mapping config.
-
-    // The ioapic_get_irq is to make sure we capture those overriden IRQs
-
-    // grab ourselves these irq numbers
-    uint8_t irq_rtc = ioapic_get_irq(acpi_ctx, PC_AT_IRQ_RTC);
-
-    // PC_AT_IRQ_RTC -> RTC_TIMER_IV, fixed, edge trigged, polarity=high,
-    // physical, APIC ID 0
-    ioapic_redirect(irq_rtc, RTC_TIMER_IV, 0, IOAPIC_DELMOD_FIXED);
-}
-
-uint8_t
-ioapic_get_irq(acpi_context* acpi_ctx, uint8_t old_irq)
-{
-    if (old_irq >= 24) {
-        return old_irq;
-    }
-    acpi_intso_t* int_override = acpi_ctx->madt.irq_exception[old_irq];
-    return int_override ? (uint8_t)int_override->gsi : old_irq;
 }
 
 void
index 70e7149596aea3b326da00f80d7e6a3b2cd20b3f..d25fbe3b68d9e931b7062d559b7f9cbf6ad411ed 100644 (file)
@@ -21,7 +21,7 @@ typedef struct
         reg32 fs;
         reg32 gs;
         reg32 esp;
-    } registers;
+    } __attribute__((packed)) registers;
 
     unsigned int vector;
     unsigned int err_code;
@@ -32,16 +32,6 @@ typedef struct
     unsigned int ss;
 } __attribute__((packed)) isr_param;
 
-typedef void (*int_subscriber)(const isr_param*);
-
-void
-intr_subscribe(const uint8_t vector, int_subscriber);
-
-void
-intr_unsubscribe(const uint8_t vector, int_subscriber);
-
-void intr_set_fallback_handler(int_subscriber);
-
 void
 intr_handler(isr_param* param);
 
index 2e788d27414f3cc0959a9c97c3ed7123e392c6aa..46713b8f54f618fed20db0bed74bed181831dd13 100644 (file)
@@ -56,4 +56,7 @@ acpi_init(multiboot_info_t* mb_info);
 acpi_context*
 acpi_get_context();
 
+uint8_t
+acpi_gistranslate(uint8_t old_irq);
+
 #endif /* __LUNAIX_ACPI_ACPI_H */
diff --git a/lunaix-os/includes/lunaix/isrm.h b/lunaix-os/includes/lunaix/isrm.h
new file mode 100644 (file)
index 0000000..32ba31d
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * @file irqm.h
+ * @author Lunaixsky
+ * @brief ISR Manager, managing the interrupt service routine allocations
+ * @version 0.1
+ * @date 2022-10-18
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef __LUNAIX_ISRM_H
+#define __LUNAIX_ISRM_H
+
+#include <arch/x86/interrupts.h>
+#include <lunaix/types.h>
+
+#define IV_BASE 32
+#define IV_OS IV_BASE
+#define IV_EX 48
+#define IV_MAX 256
+
+typedef void (*isr_cb)(const isr_param*);
+
+void
+isrm_init();
+
+void
+isrm_ivfree(uint32_t iv);
+
+uint32_t
+isrm_ivosalloc(isr_cb handler);
+
+uint32_t
+isrm_ivexalloc(isr_cb handler);
+
+uint32_t
+isrm_bindirq(uint32_t irq, isr_cb irq_handler);
+
+uint32_t
+isrm_bindiv(uint32_t iv, isr_cb handler);
+
+isr_cb
+isrm_get(uint32_t iv);
+
+#endif /* __LUNAIX_ISRM_H */
index 274bcf63f670efdb009de2509ccc11b5de76b2b9..298593d5d3015e540f43650fb1ebabe5a948538b 100644 (file)
@@ -14,7 +14,7 @@
 // 获取v最近的最大k倍数
 #define ROUNDUP(v, k) (((v) + (k)-1) & ~((k)-1))
 
-// 获取v最近的最小k倍数
+// 获取v最近的最小k倍数 (k=2^m)
 #define ROUNDDOWN(v, k) ((v) & ~((k)-1))
 
 #define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -71,7 +71,7 @@ spin()
         ;
 }
 
-#ifdef __LUNAIXOS_DEBUG__
+#ifndef __LUNAIXOS_NASSERT__
 #define assert(cond)                                                           \
     if (!(cond)) {                                                             \
         __assert_fail(#cond, __FILE__, __LINE__);                              \
@@ -87,7 +87,8 @@ __assert_fail(const char* expr, const char* file, unsigned int line)
 #else
 #define assert(cond) (void)(cond);          // assert nothing
 #define assert_msg(cond, msg) (void)(cond); // assert nothing
-#endif
+
+#endif // __LUNAIXOS_NASSERT__
 
 void
 panick(const char* msg);
index 8a523ad2c4ea787a2b866b56dee567865643fabc..6169781c2ab12efb58fc69a999ec83c668f50470 100644 (file)
@@ -136,8 +136,10 @@ syscall_install();
     }
 
 #define __LXSYSCALL2_VARG(rettype, name, t1, p1, t2, p2)                       \
-    static rettype name(__PARAM_MAP2(t1, p1, t2, p2), ...)                     \
+    __attribute__((noinline)) static rettype name(                             \
+      __PARAM_MAP2(t1, p1, t2, p2), ...)                                       \
     {                                                                          \
+        /* No inlining! This depends on the call frame assumption */           \
         void* _last = (void*)&p2 + sizeof(void*);                              \
         asm("\n" ::"b"(p1), "c"(p2), "d"(_last));                              \
         ___DOINT33(__SYSCALL_##name, rettype)                                  \
diff --git a/lunaix-os/kernel/asm/x86/i386_isrm.c b/lunaix-os/kernel/asm/x86/i386_isrm.c
new file mode 100644 (file)
index 0000000..0a26c3b
--- /dev/null
@@ -0,0 +1,101 @@
+#include <hal/acpi/acpi.h>
+#include <hal/ioapic.h>
+
+#include <lunaix/isrm.h>
+#include <lunaix/spike.h>
+
+/*
+    total: 256 ivs
+    0~31: reserved for sys use (x32)
+    32~47: reserved for os use (x16)
+    48~  : free to allocate for external hardware use. (x208)
+*/
+
+static char iv_bmp[(IV_MAX - IV_BASE) / 8];
+static isr_cb handlers[IV_MAX];
+
+extern void
+intr_routine_fallback(const isr_param* param);
+
+void
+isrm_init()
+{
+    for (size_t i = 0; i < 256; i++) {
+        handlers[i] = intr_routine_fallback;
+    }
+}
+
+static inline uint32_t
+__ivalloc_within(size_t a, size_t b, isr_cb handler)
+{
+    a = (a - IV_BASE) / 8;
+    b = (b - IV_BASE) / 8;
+    for (size_t i = a; i < b; i++) {
+        char chunk = iv_bmp[i], j = 0;
+        if (chunk == 0xff)
+            continue;
+        while ((chunk & 0x1)) {
+            chunk >>= 1;
+            j++;
+        }
+        iv_bmp[i] |= 1 << j;
+        uint32_t iv = IV_BASE + i * 8 + j;
+        handlers[iv] = handler ? handler : intr_routine_fallback;
+        return iv;
+    }
+    return 0;
+}
+
+uint32_t
+isrm_ivosalloc(isr_cb handler)
+{
+    return __ivalloc_within(IV_BASE, IV_EX, handler);
+}
+
+uint32_t
+isrm_ivexalloc(isr_cb handler)
+{
+    return __ivalloc_within(IV_EX, IV_MAX, handler);
+}
+
+void
+isrm_ivfree(uint32_t iv)
+{
+    assert(iv < 256);
+    if (iv >= IV_BASE) {
+        iv_bmp[(iv - IV_BASE) / 8] &= ~(1 << ((iv - IV_BASE) % 8));
+    }
+    handlers[iv] = intr_routine_fallback;
+}
+
+uint32_t
+isrm_bindirq(uint32_t irq, isr_cb irq_handler)
+{
+    uint32_t iv;
+    if (!(iv = isrm_ivexalloc(irq_handler))) {
+        panickf("out of IV resource. (irq=%d)", irq);
+        return 0; // never reach
+    }
+
+    // PC_AT_IRQ_RTC -> RTC_TIMER_IV, fixed, edge trigged, polarity=high,
+    // physical, APIC ID 0
+    ioapic_redirect(acpi_gistranslate(irq), iv, 0, IOAPIC_DELMOD_FIXED);
+    return iv;
+}
+
+uint32_t
+isrm_bindiv(uint32_t iv, isr_cb handler)
+{
+    assert(iv < 256);
+    if (iv >= IV_BASE) {
+        iv_bmp[(iv - IV_BASE) / 8] |= 1 << ((iv - IV_BASE) % 8);
+    }
+    handlers[iv] = handler;
+}
+
+isr_cb
+isrm_get(uint32_t iv)
+{
+    assert(iv < 256);
+    return handlers[iv];
+}
\ No newline at end of file
index 864c7da58af3df7f09a292feee299df532474e43..25b3791e7415f73af0d632d3702e020ced94a9a3 100644 (file)
@@ -1,7 +1,10 @@
 #include <arch/x86/interrupts.h>
 #include <arch/x86/tss.h>
+
 #include <hal/apic.h>
 #include <hal/cpu.h>
+
+#include <lunaix/isrm.h>
 #include <lunaix/mm/page.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/process.h>
@@ -9,31 +12,7 @@
 #include <lunaix/syslog.h>
 #include <lunaix/tty/tty.h>
 
-LOG_MODULE("intr")
-
-static int_subscriber subscribers[256];
-
-static int_subscriber fallback = (int_subscriber)0;
-
-void
-intr_subscribe(const uint8_t vector, int_subscriber subscriber)
-{
-    subscribers[vector] = subscriber;
-}
-
-void
-intr_unsubscribe(const uint8_t vector, int_subscriber subscriber)
-{
-    if (subscribers[vector] == subscriber) {
-        subscribers[vector] = (int_subscriber)0;
-    }
-}
-
-void
-intr_set_fallback_handler(int_subscriber subscribers)
-{
-    fallback = subscribers;
-}
+LOG_MODULE("INTR")
 
 extern x86_page_table* __kernel_ptd;
 
@@ -45,15 +24,8 @@ intr_handler(isr_param* param)
     isr_param* lparam = &__current->intr_ctx;
 
     if (lparam->vector <= 255) {
-        int_subscriber subscriber = subscribers[lparam->vector];
-        if (subscriber) {
-            subscriber(param);
-            goto done;
-        }
-    }
-
-    if (fallback) {
-        fallback(lparam);
+        isr_cb subscriber = isrm_get(lparam->vector);
+        subscriber(param);
         goto done;
     }
 
@@ -66,8 +38,7 @@ intr_handler(isr_param* param)
 done:
     // for all external interrupts except the spurious interrupt
     //  this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
-    if (lparam->vector >= EX_INTERRUPT_BEGIN &&
-        lparam->vector != APIC_SPIV_IV) {
+    if (lparam->vector >= IV_EX && lparam->vector != APIC_SPIV_IV) {
         apic_done_servicing();
     }
 
index 402ceeaf2648090ef030d6542538d81504f7abb8..285356f8aa9753aa84daaf258bffb53acf9c972f 100644 (file)
@@ -1,4 +1,6 @@
 #include <arch/x86/interrupts.h>
+
+#include <lunaix/isrm.h>
 #include <lunaix/lxconsole.h>
 #include <lunaix/process.h>
 #include <lunaix/sched.h>
@@ -94,16 +96,14 @@ intr_routine_sched(const isr_param* param)
 void
 intr_routine_init()
 {
-    intr_subscribe(FAULT_DIVISION_ERROR, intr_routine_divide_zero);
-    intr_subscribe(FAULT_GENERAL_PROTECTION, intr_routine_general_protection);
-    intr_subscribe(FAULT_PAGE_FAULT, intr_routine_page_fault);
-    intr_subscribe(FAULT_STACK_SEG_FAULT, intr_routine_page_fault);
-
-    intr_subscribe(LUNAIX_SYS_PANIC, intr_routine_sys_panic);
-    intr_subscribe(LUNAIX_SCHED, intr_routine_sched);
+    isrm_bindiv(FAULT_DIVISION_ERROR, intr_routine_divide_zero);
+    isrm_bindiv(FAULT_GENERAL_PROTECTION, intr_routine_general_protection);
+    isrm_bindiv(FAULT_PAGE_FAULT, intr_routine_page_fault);
+    isrm_bindiv(FAULT_STACK_SEG_FAULT, intr_routine_page_fault);
 
-    intr_subscribe(APIC_SPIV_IV, intr_routine_apic_spi);
-    intr_subscribe(APIC_ERROR_IV, intr_routine_apic_error);
+    isrm_bindiv(LUNAIX_SYS_PANIC, intr_routine_sys_panic);
+    isrm_bindiv(LUNAIX_SCHED, intr_routine_sched);
 
-    intr_set_fallback_handler(intr_routine_fallback);
+    isrm_bindiv(APIC_SPIV_IV, intr_routine_apic_spi);
+    isrm_bindiv(APIC_ERROR_IV, intr_routine_apic_error);
 }
\ No newline at end of file
index c1e9784bef642dfc4302445bf2a1e0b172b0665a..ca8023805fc19435d1b6c61294721e007abf3356 100644 (file)
@@ -2,6 +2,7 @@
 #include <lunaix/fs.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/process.h>
+#include <lunaix/spike.h>
 #include <lunaix/types.h>
 
 struct llist_header all_mnts = { .next = &all_mnts, .prev = &all_mnts };
@@ -18,12 +19,12 @@ vfs_create_mount(struct v_mount* parent, struct v_dnode* mnt_point)
     llist_append(&all_mnts, &mnt->list);
     mutex_init(&mnt->lock);
 
-    mnt_mkbusy(parent);
     mnt->parent = parent;
     mnt->mnt_point = mnt_point;
     mnt->super_block = mnt_point->super_block;
 
     if (parent) {
+        mnt_mkbusy(parent);
         mutex_lock(&mnt->parent->lock);
         llist_append(&parent->submnts, &mnt->sibmnts);
         mutex_unlock(&mnt->parent->lock);
@@ -84,6 +85,7 @@ mnt_chillax(struct v_mount* mnt)
 int
 vfs_mount_root(const char* fs_name, struct device* device)
 {
+    extern struct v_dnode* vfs_sysroot;
     int errno = 0;
     if (vfs_sysroot->mnt && (errno = vfs_unmount_at(vfs_sysroot))) {
         return errno;
index ce4ac6aab8d44585c04e04a0e219da3283e68741..32164c88aa832cafad68c919068cf2dbe227d679 100644 (file)
@@ -4,6 +4,7 @@
 #include <lunaix/device.h>
 #include <lunaix/foptions.h>
 #include <lunaix/input.h>
+#include <lunaix/isrm.h>
 #include <lunaix/lxconsole.h>
 #include <lunaix/mm/mmio.h>
 #include <lunaix/mm/page.h>
@@ -46,9 +47,12 @@ setup_memory(multiboot_memory_map_t* map, size_t map_size);
 void
 _kernel_pre_init()
 {
+    // interrupts
     _init_idt();
+    isrm_init();
     intr_routine_init();
 
+    // memory
     pmm_init(MEM_1MB + (_k_init_mb_info->mem_upper << 10));
     vmm_init();
 
@@ -68,12 +72,16 @@ void
 _kernel_init()
 {
     int errno = 0;
+
+    // allocators
     cake_init();
     valloc_init();
 
+    // crt
     tty_init(ioremap(VGA_FRAMEBUFFER, PG_SIZE));
     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
 
+    // file system & device subsys
     vfs_init();
     fsm_init();
     input_init();
@@ -92,6 +100,8 @@ _kernel_init()
 
     sched_init();
 
+    syscall_install();
+
     spawn_proc0();
 }
 
index df6ffc1ade4ed728e19a87fa9906d21ca6284e97..fbd7e751a1a18c5227947cc7c1a0784af8819bdc 100644 (file)
@@ -3,6 +3,7 @@
 #include <lunaix/clock.h>
 #include <lunaix/common.h>
 #include <lunaix/input.h>
+#include <lunaix/isrm.h>
 #include <lunaix/peripheral/ps2kbd.h>
 #include <lunaix/syslog.h>
 #include <lunaix/timer.h>
@@ -188,9 +189,6 @@ ps2_kbd_init()
 
     // 至此,PS/2控制器和设备已完成初始化,可以正常使用。
 
-    // 将我们的键盘驱动挂载到第204号中断上(已由IOAPIC映射至IRQ#1),
-    intr_subscribe(PC_KBD_IV, intr_ps2_kbd_handler);
-
     // 搞一个计时器,将我们的 ps2_process_cmd
     // 挂上去。每隔5毫秒执行排在队头的命令。
     //  为什么只执行队头的命令,而不是全部的命令?
@@ -207,8 +205,7 @@ ps2_kbd_init()
      *
      *  所以,保险的方法是:在初始化后才去设置ioapic,这样一来我们就能有一个稳定的IRQ#1以放心使用。
      */
-    uint8_t irq_kbd = ioapic_get_irq(acpi_ctx, PC_AT_IRQ_KBD);
-    ioapic_redirect(irq_kbd, PC_KBD_IV, 0, IOAPIC_DELMOD_FIXED);
+    isrm_bindirq(PC_AT_IRQ_KBD, intr_ps2_kbd_handler);
 
 done:
     cpu_enable_interrupt();
index 2a410322345706414a4d2d4719c548e63b8e7c4a..14e48621a356ecaba5d750868c6cde5d1ec4b45f 100644 (file)
@@ -86,9 +86,6 @@ __proc0_usr()
     int fdstdin = dup2(stdout, 1);
 
     pid_t p;
-    // if (!fork()) {
-    //     _pconsole_main();
-    // }
 
     if (!(p = fork())) {
 #ifndef USE_DEMO
@@ -132,6 +129,7 @@ __proc0()
 
     init_proc_user_space(__current);
 
+    // user space
     asm volatile("movw %0, %%ax\n"
                  "movw %%ax, %%es\n"
                  "movw %%ax, %%ds\n"
@@ -159,32 +157,44 @@ init_platform()
     // 锁定所有系统预留页(内存映射IO,ACPI之类的),并且进行1:1映射
     lock_reserved_memory();
 
-    rtc_init();
+    // firmware
     acpi_init(_k_init_mb_info);
+
+    // die
     apic_init();
     ioapic_init();
+
+    // debugger
     serial_init();
     sdbg_init();
+
+    // timers & clock
+    rtc_init();
     timer_init(SYS_TIMER_FREQUENCY_HZ);
     clock_init();
+
+    // peripherals & chipset features
     ps2_kbd_init();
     pci_init();
     block_init();
     ahci_init();
 
-    syscall_install();
-
+    // console
     console_start_flushing();
     console_flush();
 
+    // expose cake allocator states to vfs
     cake_export();
+
     unlock_reserved_memory();
 
+    // clean up
     for (size_t i = 0; i < (uintptr_t)(&__init_hhk_end); i += PG_SIZE) {
         vmm_del_mapping(PD_REFERENCED, (void*)i);
         pmm_free_page(KERNEL_PID, (void*)i);
     }
 
+    // reserve higher half
     for (size_t i = L1_INDEX(KERNEL_MM_BASE); i < 1023; i++) {
         vmm_set_mapping(PD_REFERENCED, i << 22, 0, 0, VMAP_NOMAP);
     }
index 5cee205f8fc0bd7e621e8a0f9b6839cb54687855..6f0a2ba25997060774fdb54390631fded5bc0180 100644 (file)
@@ -1,4 +1,5 @@
 #include <arch/x86/interrupts.h>
+#include <lunaix/isrm.h>
 #include <lunaix/process.h>
 #include <lunaix/sched.h>
 #include <lunaix/syscall.h>
@@ -12,5 +13,5 @@ syscall_hndlr(const isr_param* param);
 void
 syscall_install()
 {
-    intr_subscribe(LUNAIX_SYS_CALL, syscall_hndlr);
+    isrm_bindiv(LUNAIX_SYS_CALL, syscall_hndlr);
 }
\ No newline at end of file
index 7d9a391ee3624f1f2f3227d361ed745aed5b10b7..bf99328b8a41dbbb94a7aa9e2972181acd658d72 100644 (file)
@@ -13,6 +13,7 @@
 #include <hal/apic.h>
 #include <hal/rtc.h>
 
+#include <lunaix/isrm.h>
 #include <lunaix/mm/cake.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/sched.h>
@@ -20,6 +21,8 @@
 #include <lunaix/syslog.h>
 #include <lunaix/timer.h>
 
+#include <hal/acpi/acpi.h>
+
 #define LVT_ENTRY_TIMER(vector, mode) (LVT_DELIVERY_FIXED | mode | vector)
 
 LOG_MODULE("TIMER");
@@ -69,10 +72,20 @@ timer_init(uint32_t frequency)
 
     // Setup APIC timer
 
+    // Remap the IRQ 8 (rtc timer's vector) to RTC_TIMER_IV in ioapic
+    //       (Remarks IRQ 8 is pin INTIN8)
+    //       See IBM PC/AT Technical Reference 1-10 for old RTC IRQ
+    //       See Intel's Multiprocessor Specification for IRQ - IOAPIC INTIN
+    //       mapping config.
+
+    // grab ourselves these irq numbers
+    uint32_t iv_rtc = isrm_bindirq(PC_AT_IRQ_RTC, temp_intr_routine_rtc_tick);
+    uint32_t iv_timer = isrm_ivexalloc(temp_intr_routine_apic_timer);
+
     // Setup a one-shot timer, we will use this to measure the bus speed. So we
     // can then calibrate apic timer to work at *nearly* accurate hz
     apic_write_reg(APIC_TIMER_LVT,
-                   LVT_ENTRY_TIMER(APIC_TIMER_IV, LVT_TIMER_ONESHOT));
+                   LVT_ENTRY_TIMER(iv_timer, LVT_TIMER_ONESHOT));
 
     // Set divider to 64
     apic_write_reg(APIC_TIMER_DCR, APIC_TIMER_DIV64);
@@ -110,9 +123,6 @@ timer_init(uint32_t frequency)
     rtc_counter = 0;
     apic_timer_done = 0;
 
-    intr_subscribe(APIC_TIMER_IV, temp_intr_routine_apic_timer);
-    intr_subscribe(RTC_TIMER_IV, temp_intr_routine_rtc_tick);
-
     rtc_enable_timer();                                     // start RTC timer
     apic_write_reg(APIC_TIMER_ICR, APIC_CALIBRATION_CONST); // start APIC timer
 
@@ -129,12 +139,12 @@ timer_init(uint32_t frequency)
     timer_ctx->tphz = timer_ctx->base_frequency / frequency;
 
     // cleanup
-    intr_unsubscribe(APIC_TIMER_IV, temp_intr_routine_apic_timer);
-    intr_unsubscribe(RTC_TIMER_IV, temp_intr_routine_rtc_tick);
+    isrm_ivfree(iv_timer);
+    isrm_ivfree(iv_rtc);
 
-    apic_write_reg(APIC_TIMER_LVT,
-                   LVT_ENTRY_TIMER(APIC_TIMER_IV, LVT_TIMER_PERIODIC));
-    intr_subscribe(APIC_TIMER_IV, timer_update);
+    apic_write_reg(
+      APIC_TIMER_LVT,
+      LVT_ENTRY_TIMER(isrm_ivexalloc(timer_update), LVT_TIMER_PERIODIC));
 
     apic_write_reg(APIC_TIMER_ICR, timer_ctx->tphz);
 
index ad3fc420af8520413ee46e1036b5e1daa62c7e77..3404450048a9802cd638e0bdac58170db5abc902 100644 (file)
@@ -27,7 +27,7 @@ console_flush();
 static waitq_t lx_reader;
 static volatile char ttychr;
 
-static pid_t fg_pgid = 0;
+static volatile pid_t fg_pgid = 0;
 
 inline void
 print_control_code(const char cntrl)
index 27ce9b7bdd9d86fe35d373881b10db56e28cbb9a..058bcc8e8da5a5741a3f1e76f71028663bc7f008 100644 (file)
@@ -20,16 +20,16 @@ $(ISO_DIR):
 
 $(OBJECT_DIR)/%.S.o: %.S
        @mkdir -p $(@D)
-       @echo " BUILD: $<"
+       @echo "  CC    $<"
        @$(CC) $(INCLUDES) -c $< -o $@
 
 $(OBJECT_DIR)/%.c.o: %.c 
        @mkdir -p $(@D)
-       @echo " BUILD: $<"
+       @echo "  CC    $<"
        @$(CC) $(INCLUDES) -c $< -o $@ $(CFLAGS)
 
 $(BIN_DIR)/$(OS_BIN): $(OBJECT_DIR) $(BIN_DIR) $(SRC)
-       @echo " LINK: $(BIN_DIR)/$(OS_BIN)"
+       @echo "  LD    $(BIN_DIR)/$(OS_BIN)"
        @$(CC) -T link/linker.ld -o $(BIN_DIR)/$(OS_BIN) $(SRC) $(LDFLAGS)
 
 $(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
@@ -39,6 +39,9 @@ $(BUILD_DIR)/$(OS_ISO): $(ISO_DIR) $(BIN_DIR)/$(OS_BIN) GRUB_TEMPLATE
 
 all: clean $(BUILD_DIR)/$(OS_ISO)
 
+instable: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT) -D__LUNAIXOS_DEBUG__
+instable: all
+
 all-debug: O := -Og
 all-debug: CFLAGS := -g -std=gnu99 -ffreestanding $(O) $(W) $(ARCH_OPT) -D__LUNAIXOS_DEBUG__
 all-debug: LDFLAGS := -g -ffreestanding $(O) -nostdlib -lgcc