From b91be0033265b5b6bd716bd39cb0971da41906c4 Mon Sep 17 00:00:00 2001 From: Minep Date: Tue, 25 Jul 2023 19:24:03 +0100 Subject: [PATCH] refactor: decouple i386 specific instruction invocation refactor: re-organize the directory structure --- lunaix-os/arch/i386/{ => boot}/boot.S | 8 +- lunaix-os/arch/i386/{ => boot}/hhk.c | 15 +- lunaix-os/arch/i386/cpu.c | 153 +++++++++++++ lunaix-os/hal/apic.c | 6 +- lunaix-os/hal/cpu.c | 81 ------- lunaix-os/hal/ioapic.c | 2 +- lunaix-os/includes/arch/abi.h | 4 +- .../arch/{x86 => i386}/boot/multiboot.h | 0 lunaix-os/includes/arch/{x86 => i386}/gdt.h | 0 .../includes/arch/{x86 => i386}/i386_abi.h | 5 + .../includes/arch/{x86 => i386}/i386_asm.h | 0 lunaix-os/includes/arch/{x86 => i386}/idt.h | 0 .../arch/{x86 => i386}/interrupt.S.inc | 0 .../includes/arch/{x86 => i386}/interrupts.h | 24 +-- .../includes/arch/{x86 => i386}/intrhnds.h | 0 lunaix-os/includes/arch/{x86 => i386}/tss.h | 0 .../includes/arch/{x86 => i386}/vectors.h | 0 lunaix-os/includes/hal/acpi/acpi.h | 2 +- lunaix-os/includes/hal/cpu.h | 203 ++++++------------ lunaix-os/includes/lunaix/compiler.h | 8 + lunaix-os/includes/lunaix/isrm.h | 2 +- lunaix-os/includes/lunaix/process.h | 10 +- lunaix-os/includes/lunaix/spike.h | 2 - lunaix-os/includes/lunaix/syscall.h | 2 +- lunaix-os/includes/lunaix/types.h | 1 + lunaix-os/includes/sdbg/gdbstub.h | 2 +- lunaix-os/includes/sdbg/lsdbg.h | 2 +- lunaix-os/kernel/asm/{x86 => i386}/gdt.c | 4 +- .../kernel/asm/{x86 => i386}/i386_isrm.c | 0 .../kernel/asm/{x86 => i386}/interrupt.S | 8 +- .../kernel/asm/{x86 => i386}/interrupts.c | 4 +- .../kernel/asm/{x86 => i386}/intr_routines.c | 2 +- lunaix-os/kernel/asm/{x86 => i386}/intrhnds.S | 0 lunaix-os/kernel/asm/{x86 => i386}/intrhnds.c | 4 +- lunaix-os/kernel/asm/{x86 => i386}/pfault.c | 16 +- lunaix-os/kernel/asm/i386/proc.c | 28 +++ lunaix-os/kernel/asm/{x86 => i386}/prologue.S | 2 +- lunaix-os/kernel/asm/{x86 => i386}/syscall.S | 0 lunaix-os/kernel/asm/{x86 => i386}/tss.c | 2 +- lunaix-os/kernel/device/builtin/devrand.c | 7 +- lunaix-os/kernel/exe/exec.c | 5 +- lunaix-os/kernel/{k_init.c => kinit.c} | 24 +-- lunaix-os/kernel/mm/mmap.c | 4 +- lunaix-os/kernel/mm/vmm.c | 10 +- lunaix-os/kernel/peripheral/ps2kbd.c | 2 +- lunaix-os/kernel/proc0.c | 2 +- lunaix-os/kernel/process/process.c | 8 +- lunaix-os/kernel/process/sched.c | 28 +-- lunaix-os/kernel/spike.c | 6 +- lunaix-os/kernel/syscall.c | 2 +- lunaix-os/kernel/time/timer.c | 2 +- lunaix-os/link/linker.ld | 34 +-- lunaix-os/makeinc/toolchain.mkinc | 1 - lunaix-os/scripts/x86_idt_generator.py | 4 +- 54 files changed, 377 insertions(+), 364 deletions(-) rename lunaix-os/arch/i386/{ => boot}/boot.S (94%) rename lunaix-os/arch/i386/{ => boot}/hhk.c (95%) create mode 100644 lunaix-os/arch/i386/cpu.c delete mode 100644 lunaix-os/hal/cpu.c rename lunaix-os/includes/arch/{x86 => i386}/boot/multiboot.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/gdt.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/i386_abi.h (92%) rename lunaix-os/includes/arch/{x86 => i386}/i386_asm.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/idt.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/interrupt.S.inc (100%) rename lunaix-os/includes/arch/{x86 => i386}/interrupts.h (79%) rename lunaix-os/includes/arch/{x86 => i386}/intrhnds.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/tss.h (100%) rename lunaix-os/includes/arch/{x86 => i386}/vectors.h (100%) create mode 100644 lunaix-os/includes/lunaix/compiler.h rename lunaix-os/kernel/asm/{x86 => i386}/gdt.c (92%) rename lunaix-os/kernel/asm/{x86 => i386}/i386_isrm.c (100%) rename lunaix-os/kernel/asm/{x86 => i386}/interrupt.S (97%) rename lunaix-os/kernel/asm/{x86 => i386}/interrupts.c (94%) rename lunaix-os/kernel/asm/{x86 => i386}/intr_routines.c (98%) rename lunaix-os/kernel/asm/{x86 => i386}/intrhnds.S (100%) rename lunaix-os/kernel/asm/{x86 => i386}/intrhnds.c (99%) rename lunaix-os/kernel/asm/{x86 => i386}/pfault.c (93%) create mode 100644 lunaix-os/kernel/asm/i386/proc.c rename lunaix-os/kernel/asm/{x86 => i386}/prologue.S (97%) rename lunaix-os/kernel/asm/{x86 => i386}/syscall.S (100%) rename lunaix-os/kernel/asm/{x86 => i386}/tss.c (65%) rename lunaix-os/kernel/{k_init.c => kinit.c} (85%) diff --git a/lunaix-os/arch/i386/boot.S b/lunaix-os/arch/i386/boot/boot.S similarity index 94% rename from lunaix-os/arch/i386/boot.S rename to lunaix-os/arch/i386/boot/boot.S index f6550cd..452a983 100644 --- a/lunaix-os/arch/i386/boot.S +++ b/lunaix-os/arch/i386/boot/boot.S @@ -1,5 +1,5 @@ #define __ASM__ 1 -#include +#include #define MB_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN) #define KPG_SIZE 10*4096 @@ -9,7 +9,7 @@ .long MB_FLAGS .long CHECKSUM(MB_FLAGS) -.section .bss +.section .hhk_init_bss .global mb_info .align 16 /* 为Multiboot info struct 预留空间 */ @@ -35,7 +35,7 @@ .skip KPG_SIZE, 0 -.section .hhk_init +.section .hhk_init_text .global start_ .type start_, @function /* Optional, this just give the * linker more knowledge about the label @@ -50,7 +50,7 @@ /* 将咱们的 multiboot_info 挪个地儿,就是上述预留的空间里 - 而后在_hhk_init里,我们会对所有的高半核初始化代码(arch/x86下的所有)进行Identity map + 而后在_hhk_init里,我们会对所有的高半核初始化代码(arch/i386下的所有)进行Identity map 这样,我们能够保证当分页与虚拟地址开启后,我们的内核能够访问到multiboot info table */ diff --git a/lunaix-os/arch/i386/hhk.c b/lunaix-os/arch/i386/boot/hhk.c similarity index 95% rename from lunaix-os/arch/i386/hhk.c rename to lunaix-os/arch/i386/boot/hhk.c index 4250f79..d97fc91 100644 --- a/lunaix-os/arch/i386/hhk.c +++ b/lunaix-os/arch/i386/boot/hhk.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include @@ -32,7 +32,10 @@ extern u8_t __ktext_end; extern u8_t __init_hhk_end; extern u8_t _k_stack; -void +#define boot_text __attribute__((section(".hhk_init_text"))) +#define boot_data __attribute__((section(".hhk_init_data"))) + +void boot_text _init_page(x86_page_table* ptd) { ptd->entry[0] = NEW_L1_ENTRY(PG_PREM_RW, (ptd_t*)ptd + PG_MAX_ENTRIES); @@ -102,7 +105,7 @@ _init_page(x86_page_table* ptd) ptd->entry[PG_MAX_ENTRIES - 1] = NEW_L1_ENTRY(T_SELF_REF_PERM, ptd); } -u32_t +u32_t boot_text __save_subset(u8_t* destination, u8_t* base, unsigned int size) { unsigned int i = 0; @@ -112,7 +115,7 @@ __save_subset(u8_t* destination, u8_t* base, unsigned int size) return i; } -void +void boot_text _save_multiboot_info(multiboot_info_t* info, u8_t* destination) { u32_t current = 0; @@ -133,7 +136,7 @@ _save_multiboot_info(multiboot_info_t* info, u8_t* destination) } } -void +void boot_text _hhk_init(x86_page_table* ptd, u32_t kpg_size) { diff --git a/lunaix-os/arch/i386/cpu.c b/lunaix-os/arch/i386/cpu.c new file mode 100644 index 0000000..371d947 --- /dev/null +++ b/lunaix-os/arch/i386/cpu.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include + +#define BRAND_LEAF 0x80000000UL + +void +cpu_get_model(char* model_out) +{ + u32_t* out = (u32_t*)model_out; + u32_t eax = 0, ebx = 0, edx = 0, ecx = 0; + + __get_cpuid(0, &eax, &ebx, &ecx, &edx); + + out[0] = ebx; + out[1] = edx; + out[2] = ecx; + model_out[12] = '\0'; +} + +int +cpu_brand_string_supported() +{ + u32_t supported = __get_cpuid_max(BRAND_LEAF, 0); + return (supported >= 0x80000004UL); +} + +void +cpu_get_id(char* id_out) +{ + if (!cpu_brand_string_supported()) { + id_out[0] = '?'; + id_out[1] = '\0'; + } + u32_t* out = (u32_t*)id_out; + u32_t eax = 0, ebx = 0, edx = 0, ecx = 0; + for (u32_t i = 2, j = 0; i < 5; i++) { + __get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx); + out[j] = eax; + out[j + 1] = ebx; + out[j + 2] = ecx; + out[j + 3] = edx; + j += 4; + } + id_out[48] = '\0'; +} + +u32_t +cpu_ldstate() +{ + ptr_t val; + asm volatile("pushf\n" + "popl %0\n" + : "=r"(val)::); + return val; +} + +u32_t +cpu_ldconfig() +{ + ptr_t val; + asm volatile("movl %%cr0,%0" : "=r"(val)); + return val; +} + +void +cpu_chconfig(u32_t val) +{ + asm("mov %0, %%cr0" ::"r"(val)); +} + +u32_t +cpu_ldvmspace() +{ + ptr_t val; + asm volatile("movl %%cr3,%0" : "=r"(val)); + return val; +} + +void +cpu_chvmspace(u32_t val) +{ + asm("mov %0, %%cr3" ::"r"(val)); +} + +void +cpu_flush_page(ptr_t va) +{ + asm volatile("invlpg (%0)" ::"r"(va) : "memory"); +} + +void +cpu_flush_vmspace() +{ + asm("movl %%cr3, %%eax\n" + "movl %%eax, %%cr3" :: + : "eax"); +} + +void +cpu_enable_interrupt() +{ + asm volatile("sti"); +} + +void +cpu_disable_interrupt() +{ + asm volatile("cli"); +} + +void +cpu_trap_sched() +{ + asm("int %0" ::"i"(LUNAIX_SCHED)); +} + +void +cpu_trap_panic(char* message) +{ + asm("int %0" ::"i"(LUNAIX_SYS_PANIC), "D"(message)); +} + +void +cpu_wait() +{ + asm("hlt"); +} + +ptr_t +cpu_ldeaddr() +{ + ptr_t val; + asm volatile("movl %%cr2,%0" : "=r"(val)); + return val; +} + +void +cpu_rdmsr(u32_t msr_idx, u32_t* reg_high, u32_t* reg_low) +{ + u32_t h = 0, l = 0; + asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx)); + + *reg_high = h; + *reg_low = l; +} + +void +cpu_wrmsr(u32_t msr_idx, u32_t reg_high, u32_t reg_low) +{ + asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx)); +} \ No newline at end of file diff --git a/lunaix-os/hal/apic.c b/lunaix-os/hal/apic.c index 44385a4..29794eb 100644 --- a/lunaix-os/hal/apic.c +++ b/lunaix-os/hal/apic.c @@ -13,7 +13,7 @@ #include #include -#include +#include #include #include @@ -34,7 +34,9 @@ apic_init() // Make sure the APIC is there // FUTURE: Use 8259 as fallback - assert_msg(cpu_has_apic(), "No APIC detected!"); + + // FIXME apic abstraction as local interrupt controller + // assert_msg(cpu_has_apic(), "No APIC detected!"); // As we are going to use APIC, disable the old 8259 PIC pic_disable(); diff --git a/lunaix-os/hal/cpu.c b/lunaix-os/hal/cpu.c deleted file mode 100644 index 77059b6..0000000 --- a/lunaix-os/hal/cpu.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include -#include - -void -cpu_get_model(char* model_out) -{ - u32_t* out = (u32_t*)model_out; - reg32 eax = 0, ebx = 0, edx = 0, ecx = 0; - - __get_cpuid(0, &eax, &ebx, &ecx, &edx); - - out[0] = ebx; - out[1] = edx; - out[2] = ecx; - model_out[12] = '\0'; -} - -#define BRAND_LEAF 0x80000000UL - -int -cpu_brand_string_supported() -{ - reg32 supported = __get_cpuid_max(BRAND_LEAF, 0); - return (supported >= 0x80000004UL); -} - -void -cpu_get_brand(char* brand_out) -{ - if (!cpu_brand_string_supported()) { - brand_out[0] = '?'; - brand_out[1] = '\0'; - } - u32_t* out = (u32_t*)brand_out; - reg32 eax = 0, ebx = 0, edx = 0, ecx = 0; - for (u32_t i = 2, j = 0; i < 5; i++) { - __get_cpuid(BRAND_LEAF + i, &eax, &ebx, &ecx, &edx); - out[j] = eax; - out[j + 1] = ebx; - out[j + 2] = ecx; - out[j + 3] = edx; - j += 4; - } - brand_out[48] = '\0'; -} - -int -cpu_has_apic() -{ - // reference: Intel manual, section 10.4.2 - reg32 eax = 0, ebx = 0, edx = 0, ecx = 0; - __get_cpuid(1, &eax, &ebx, &ecx, &edx); - - return (edx & 0x100); -} - -void -cpu_rdmsr(u32_t msr_idx, u32_t* reg_high, u32_t* reg_low) -{ - u32_t h = 0, l = 0; - asm volatile("rdmsr" : "=d"(h), "=a"(l) : "c"(msr_idx)); - - *reg_high = h; - *reg_low = l; -} - -void -cpu_wrmsr(u32_t msr_idx, u32_t reg_high, u32_t reg_low) -{ - asm volatile("wrmsr" : : "d"(reg_high), "a"(reg_low), "c"(msr_idx)); -} - -int -rnd_is_supported() -{ - reg32 eax = 0, ebx = 0, ecx = 0, edx = 0; - __get_cpuid(0x01, &eax, &ebx, &ecx, &edx); - return (ecx & (1 << 30)); -} \ No newline at end of file diff --git a/lunaix-os/hal/ioapic.c b/lunaix-os/hal/ioapic.c index 3e64f52..bfde8a1 100644 --- a/lunaix-os/hal/ioapic.c +++ b/lunaix-os/hal/ioapic.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/lunaix-os/includes/arch/abi.h b/lunaix-os/includes/arch/abi.h index baf7ff6..8515974 100644 --- a/lunaix-os/includes/arch/abi.h +++ b/lunaix-os/includes/arch/abi.h @@ -9,9 +9,9 @@ #endif #ifdef __ARCH_IA32 - #include "x86/i386_asm.h" + #include "i386/i386_asm.h" #ifndef __ASM__ - #include "x86/i386_abi.h" + #include "i386/i386_abi.h" #endif #endif diff --git a/lunaix-os/includes/arch/x86/boot/multiboot.h b/lunaix-os/includes/arch/i386/boot/multiboot.h similarity index 100% rename from lunaix-os/includes/arch/x86/boot/multiboot.h rename to lunaix-os/includes/arch/i386/boot/multiboot.h diff --git a/lunaix-os/includes/arch/x86/gdt.h b/lunaix-os/includes/arch/i386/gdt.h similarity index 100% rename from lunaix-os/includes/arch/x86/gdt.h rename to lunaix-os/includes/arch/i386/gdt.h diff --git a/lunaix-os/includes/arch/x86/i386_abi.h b/lunaix-os/includes/arch/i386/i386_abi.h similarity index 92% rename from lunaix-os/includes/arch/x86/i386_abi.h rename to lunaix-os/includes/arch/i386/i386_abi.h index 8bc8cd2..0383031 100644 --- a/lunaix-os/includes/arch/x86/i386_abi.h +++ b/lunaix-os/includes/arch/i386/i386_abi.h @@ -5,6 +5,11 @@ #define store_retval_to(proc, retval) (proc)->intr_ctx->registers.eax = (retval) +#define eret_target(proc) (proc)->intr_ctx->execp->eip +#define eret_stack(proc) (proc)->intr_ctx->execp->esp +#define intr_ivec(proc) (proc)->intr_ctx->execp->vector +#define intr_ierr(proc) (proc)->intr_ctx->execp->err_code + #define j_usr(sp, pc) \ asm volatile("movw %0, %%ax\n" \ "movw %%ax, %%es\n" \ diff --git a/lunaix-os/includes/arch/x86/i386_asm.h b/lunaix-os/includes/arch/i386/i386_asm.h similarity index 100% rename from lunaix-os/includes/arch/x86/i386_asm.h rename to lunaix-os/includes/arch/i386/i386_asm.h diff --git a/lunaix-os/includes/arch/x86/idt.h b/lunaix-os/includes/arch/i386/idt.h similarity index 100% rename from lunaix-os/includes/arch/x86/idt.h rename to lunaix-os/includes/arch/i386/idt.h diff --git a/lunaix-os/includes/arch/x86/interrupt.S.inc b/lunaix-os/includes/arch/i386/interrupt.S.inc similarity index 100% rename from lunaix-os/includes/arch/x86/interrupt.S.inc rename to lunaix-os/includes/arch/i386/interrupt.S.inc diff --git a/lunaix-os/includes/arch/x86/interrupts.h b/lunaix-os/includes/arch/i386/interrupts.h similarity index 79% rename from lunaix-os/includes/arch/x86/interrupts.h rename to lunaix-os/includes/arch/i386/interrupts.h index 0d7c815..632e60d 100644 --- a/lunaix-os/includes/arch/x86/interrupts.h +++ b/lunaix-os/includes/arch/i386/interrupts.h @@ -10,17 +10,17 @@ struct exec_param; struct regcontext { - reg32 eax; - reg32 ebx; - reg32 ecx; - reg32 edx; - reg32 edi; - reg32 ebp; - reg32 esi; - reg32 ds; - reg32 es; - reg32 fs; - reg32 gs; + u32_t eax; + u32_t ebx; + u32_t ecx; + u32_t edx; + u32_t edi; + u32_t ebp; + u32_t esi; + u32_t ds; + u32_t es; + u32_t fs; + u32_t gs; } __attribute__((packed)); typedef struct @@ -29,7 +29,7 @@ typedef struct struct regcontext registers; union { - reg32 esp; + u32_t esp; volatile struct exec_param* execp; }; } __attribute__((packed)) isr_param; diff --git a/lunaix-os/includes/arch/x86/intrhnds.h b/lunaix-os/includes/arch/i386/intrhnds.h similarity index 100% rename from lunaix-os/includes/arch/x86/intrhnds.h rename to lunaix-os/includes/arch/i386/intrhnds.h diff --git a/lunaix-os/includes/arch/x86/tss.h b/lunaix-os/includes/arch/i386/tss.h similarity index 100% rename from lunaix-os/includes/arch/x86/tss.h rename to lunaix-os/includes/arch/i386/tss.h diff --git a/lunaix-os/includes/arch/x86/vectors.h b/lunaix-os/includes/arch/i386/vectors.h similarity index 100% rename from lunaix-os/includes/arch/x86/vectors.h rename to lunaix-os/includes/arch/i386/vectors.h diff --git a/lunaix-os/includes/hal/acpi/acpi.h b/lunaix-os/includes/hal/acpi/acpi.h index 0e93f20..f5ef523 100644 --- a/lunaix-os/includes/hal/acpi/acpi.h +++ b/lunaix-os/includes/hal/acpi/acpi.h @@ -1,7 +1,7 @@ #ifndef __LUNAIX_ACPI_ACPI_H #define __LUNAIX_ACPI_ACPI_H -#include +#include #include #include diff --git a/lunaix-os/includes/hal/cpu.h b/lunaix-os/includes/hal/cpu.h index 3b77c7e..c68bb95 100644 --- a/lunaix-os/includes/hal/cpu.h +++ b/lunaix-os/includes/hal/cpu.h @@ -3,144 +3,81 @@ #include -#define SEL_RPL(selector) ((selector)&0x3) - -typedef unsigned int reg32; -typedef unsigned short reg16; - -typedef struct -{ - reg32 eax; - reg32 ebx; - reg32 ecx; - reg32 edx; - reg32 edi; - reg32 ebp; - reg32 esi; - reg32 esp; -} __attribute__((packed)) gp_regs; - -typedef struct -{ - reg16 ds; - reg16 es; - reg16 fs; - reg16 gs; -} __attribute__((packed)) sg_reg; +/** + * @brief Get processor ID string + * + * @param id_out + */ +void +cpu_get_id(char* id_out); + +/** + * @brief Load current processor state + * + * @return u32_t + */ +u32_t +cpu_ldstate(); + +/** + * @brief Load current processor config + * + * @return u32_t + */ +u32_t +cpu_ldconfig(); + +/** + * @brief Change current processor state + * + * @return u32_t + */ +void +cpu_chconfig(u32_t val); + +/** + * @brief Load current virtual memory space + * + * @return u32_t + */ +u32_t +cpu_ldvmspace(); + +/** + * @brief Change current virtual memory space + * + * @return u32_t + */ +void +cpu_chvmspace(u32_t val); + +/** + * @brief Flush TLB + * + * @return u32_t + */ +void +cpu_flush_page(ptr_t va); + +void +cpu_flush_vmspace(); + +void +cpu_enable_interrupt(); + +void +cpu_disable_interrupt(); void -cpu_get_brand(char* brand_out); - -int -cpu_has_apic(); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wreturn-type" -static inline reg32 -cpu_rcr0() -{ - ptr_t val; - asm volatile("movl %%cr0,%0" : "=r"(val)); - return val; -} - -static inline reg32 -cpu_rcr2() -{ - ptr_t val; - asm volatile("movl %%cr2,%0" : "=r"(val)); - return val; -} - -static inline reg32 -cpu_rcr3() -{ - ptr_t val; - asm volatile("movl %%cr3,%0" : "=r"(val)); - return val; -} - -static inline reg32 -cpu_rcr4() -{ - ptr_t val; - asm volatile("movl %%cr4,%0" : "=r"(val)); - return val; -} - -static inline reg32 -cpu_reflags() -{ - ptr_t val; - asm volatile("pushf\n" - "popl %0\n" - : "=r"(val)::); - return val; -} -#pragma GCC diagnostic pop - -static inline void -cpu_lcr0(reg32 v) -{ - asm("mov %0, %%cr0" ::"r"(v)); -} - -static inline void -cpu_lcr2(reg32 v) -{ - asm("mov %0, %%cr2" ::"r"(v)); -} - -static inline void -cpu_lcr3(reg32 v) -{ - asm("mov %0, %%cr3" ::"r"(v)); -} - -static inline void -cpu_invplg(ptr_t va) -{ - asm volatile("invlpg (%0)" ::"r"(va) : "memory"); -} - -static inline void -cpu_enable_interrupt() -{ - asm volatile("sti"); -} - -static inline void -cpu_disable_interrupt() -{ - asm volatile("cli"); -} - -static inline void -cpu_invtlb() -{ - reg32 interm; - asm("movl %%cr3, %0\n" - "movl %0, %%cr3" - : "=r"(interm) - : "r"(interm)); -} - -static inline void -cpu_int(int vect) -{ - asm("int %0" ::"i"(vect)); -} +cpu_trap_sched(); void -cpu_rdmsr(u32_t msr_idx, u32_t* reg_high, u32_t* reg_low); +cpu_trap_panic(char* message); void -cpu_wrmsr(u32_t msr_idx, u32_t reg_high, u32_t reg_low); +cpu_wait(); -static inline void -cpu_ldvmspace(ptr_t vms) -{ - cpu_lcr3(vms); -} +ptr_t +cpu_ldeaddr(); -#endif \ No newline at end of file +#endif /* __LUNAIX_CPU_H */ diff --git a/lunaix-os/includes/lunaix/compiler.h b/lunaix-os/includes/lunaix/compiler.h new file mode 100644 index 0000000..da376c1 --- /dev/null +++ b/lunaix-os/includes/lunaix/compiler.h @@ -0,0 +1,8 @@ +#ifndef __LUNAIX_COMPILER_H +#define __LUNAIX_COMPILER_H + +#define likely(x) __builtin_expect((x), 1) + +#define weak_alias(name) __attribute__((weak, alias(name))) + +#endif /* __LUNAIX_COMPILER_H */ diff --git a/lunaix-os/includes/lunaix/isrm.h b/lunaix-os/includes/lunaix/isrm.h index c7be5ad..94b8de3 100644 --- a/lunaix-os/includes/lunaix/isrm.h +++ b/lunaix-os/includes/lunaix/isrm.h @@ -11,7 +11,7 @@ #ifndef __LUNAIX_ISRM_H #define __LUNAIX_ISRM_H -#include +#include #include #define IV_BASE 32 diff --git a/lunaix-os/includes/lunaix/process.h b/lunaix-os/includes/lunaix/process.h index 1453e71..5371e83 100644 --- a/lunaix-os/includes/lunaix/process.h +++ b/lunaix-os/includes/lunaix/process.h @@ -1,7 +1,7 @@ #ifndef __LUNAIX_PROCESS_H #define __LUNAIX_PROCESS_H -#include +#include #include #include #include @@ -74,7 +74,7 @@ struct proc_info { /* Any change to *critical section*, including layout, size - must be reflected in arch/x86/interrupt.S.inc to avoid + must be reflected in arch/i386/interrupt.S.inc to avoid disaster! */ @@ -195,4 +195,10 @@ proc_setsignal(struct proc_info* proc, int signum); void proc_clear_signal(struct proc_info* proc); +// enable interrupt upon transfer +#define TRANSFER_IE 1 + +void +proc_init_transfer(struct proc_info* proc, ptr_t stop, ptr_t target, int flags); + #endif /* __LUNAIX_PROCESS_H */ diff --git a/lunaix-os/includes/lunaix/spike.h b/lunaix-os/includes/lunaix/spike.h index 2d718f5..e663a03 100644 --- a/lunaix-os/includes/lunaix/spike.h +++ b/lunaix-os/includes/lunaix/spike.h @@ -20,8 +20,6 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define likely(x) __builtin_expect((x), 1) - /** * @brief Fast log base 2 for integer, utilizing constant unfolding. * Adopted from diff --git a/lunaix-os/includes/lunaix/syscall.h b/lunaix-os/includes/lunaix/syscall.h index 4a101fa..919f93a 100644 --- a/lunaix-os/includes/lunaix/syscall.h +++ b/lunaix-os/includes/lunaix/syscall.h @@ -1,7 +1,7 @@ #ifndef __LUNAIX_SYSCALL_H #define __LUNAIX_SYSCALL_H -#include +#include #include #ifndef __ASM__ diff --git a/lunaix-os/includes/lunaix/types.h b/lunaix-os/includes/lunaix/types.h index fc0ef1c..1d6556b 100644 --- a/lunaix-os/includes/lunaix/types.h +++ b/lunaix-os/includes/lunaix/types.h @@ -1,6 +1,7 @@ #ifndef __LUNAIX_TYPES_H #define __LUNAIX_TYPES_H +#include #include #include #include diff --git a/lunaix-os/includes/sdbg/gdbstub.h b/lunaix-os/includes/sdbg/gdbstub.h index 58e48ab..d2e329e 100644 --- a/lunaix-os/includes/sdbg/gdbstub.h +++ b/lunaix-os/includes/sdbg/gdbstub.h @@ -1,7 +1,7 @@ #ifndef __LUNAIX_GDBSTUB_H #define __LUNAIX_GDBSTUB_H -#include +#include void gdbstub_loop(isr_param* param); diff --git a/lunaix-os/includes/sdbg/lsdbg.h b/lunaix-os/includes/sdbg/lsdbg.h index 1667f31..16999b0 100644 --- a/lunaix-os/includes/sdbg/lsdbg.h +++ b/lunaix-os/includes/sdbg/lsdbg.h @@ -1,7 +1,7 @@ #ifndef __LUNAIX_LSDBG_H #define __LUNAIX_LSDBG_H -#include +#include #define SDBG_CLNT_HI 0x10 #define SDBG_CLNT_QUIT 0xff diff --git a/lunaix-os/kernel/asm/x86/gdt.c b/lunaix-os/kernel/asm/i386/gdt.c similarity index 92% rename from lunaix-os/kernel/asm/x86/gdt.c rename to lunaix-os/kernel/asm/i386/gdt.c index f84df20..92e31d1 100644 --- a/lunaix-os/kernel/asm/x86/gdt.c +++ b/lunaix-os/kernel/asm/i386/gdt.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #define GDT_ENTRY 6 diff --git a/lunaix-os/kernel/asm/x86/i386_isrm.c b/lunaix-os/kernel/asm/i386/i386_isrm.c similarity index 100% rename from lunaix-os/kernel/asm/x86/i386_isrm.c rename to lunaix-os/kernel/asm/i386/i386_isrm.c diff --git a/lunaix-os/kernel/asm/x86/interrupt.S b/lunaix-os/kernel/asm/i386/interrupt.S similarity index 97% rename from lunaix-os/kernel/asm/x86/interrupt.S rename to lunaix-os/kernel/asm/i386/interrupt.S index f308503..064e19e 100644 --- a/lunaix-os/kernel/asm/x86/interrupt.S +++ b/lunaix-os/kernel/asm/i386/interrupt.S @@ -1,9 +1,9 @@ #define __ASM__ -#include -#include -#include +#include +#include +#include #include -#include +#include #define __ASM_INTR_DIAGNOSIS diff --git a/lunaix-os/kernel/asm/x86/interrupts.c b/lunaix-os/kernel/asm/i386/interrupts.c similarity index 94% rename from lunaix-os/kernel/asm/x86/interrupts.c rename to lunaix-os/kernel/asm/i386/interrupts.c index 9f86cf2..17bde71 100644 --- a/lunaix-os/kernel/asm/x86/interrupts.c +++ b/lunaix-os/kernel/asm/i386/interrupts.c @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include diff --git a/lunaix-os/kernel/asm/x86/intr_routines.c b/lunaix-os/kernel/asm/i386/intr_routines.c similarity index 98% rename from lunaix-os/kernel/asm/x86/intr_routines.c rename to lunaix-os/kernel/asm/i386/intr_routines.c index ea7a324..678998d 100644 --- a/lunaix-os/kernel/asm/x86/intr_routines.c +++ b/lunaix-os/kernel/asm/i386/intr_routines.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/lunaix-os/kernel/asm/x86/intrhnds.S b/lunaix-os/kernel/asm/i386/intrhnds.S similarity index 100% rename from lunaix-os/kernel/asm/x86/intrhnds.S rename to lunaix-os/kernel/asm/i386/intrhnds.S diff --git a/lunaix-os/kernel/asm/x86/intrhnds.c b/lunaix-os/kernel/asm/i386/intrhnds.c similarity index 99% rename from lunaix-os/kernel/asm/x86/intrhnds.c rename to lunaix-os/kernel/asm/i386/intrhnds.c index 70b597f..b323271 100644 --- a/lunaix-os/kernel/asm/x86/intrhnds.c +++ b/lunaix-os/kernel/asm/i386/intrhnds.c @@ -1,6 +1,6 @@ -#include -#include +#include +#include #include #define IDT_ENTRY 256 diff --git a/lunaix-os/kernel/asm/x86/pfault.c b/lunaix-os/kernel/asm/i386/pfault.c similarity index 93% rename from lunaix-os/kernel/asm/x86/pfault.c rename to lunaix-os/kernel/asm/i386/pfault.c index f527e12..edff525 100644 --- a/lunaix-os/kernel/asm/x86/pfault.c +++ b/lunaix-os/kernel/asm/i386/pfault.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -42,7 +42,7 @@ void intr_routine_page_fault(const isr_param* param) { uint32_t errcode = param->execp->err_code; - ptr_t ptr = cpu_rcr2(); + ptr_t ptr = cpu_ldeaddr(); if (!ptr) { goto segv_term; } @@ -52,9 +52,7 @@ intr_routine_page_fault(const isr_param* param) goto segv_term; } - if (!SEL_RPL(param->execp->cs)) { - // TODO if kernel pfault - } + // XXX do kernel trigger pfault? vm_regions_t* vmr = (vm_regions_t*)&__current->mm.regions; struct mm_region* hit_region = region_get(vmr, ptr); @@ -76,7 +74,7 @@ intr_routine_page_fault(const isr_param* param) } if ((hit_region->attr & COW_MASK) == COW_MASK) { // normal page fault, do COW - cpu_invplg((ptr_t)pte); + cpu_flush_page((ptr_t)pte); ptr_t pa = (ptr_t)vmm_dup_page(__current->pid, PG_ENTRY_ADDR(*pte)); @@ -93,7 +91,7 @@ intr_routine_page_fault(const isr_param* param) // -> a new page need to be alloc if ((hit_region->attr & REGION_ANON)) { if (!PG_IS_PRESENT(*pte)) { - cpu_invplg((ptr_t)pte); + cpu_flush_page((ptr_t)pte); ptr_t pa = pmm_alloc_page(__current->pid, 0); if (!pa) { @@ -122,7 +120,7 @@ intr_routine_page_fault(const isr_param* param) goto oom; } - cpu_invplg((ptr_t)pte); + cpu_flush_page((ptr_t)pte); *pte = (*pte & 0xFFF) | pa | get_ptattr(hit_region); memset((void*)ptr, 0, PG_SIZE); @@ -167,6 +165,6 @@ segv_term: ; resolved: - cpu_invplg(ptr); + cpu_flush_page(ptr); return; } \ No newline at end of file diff --git a/lunaix-os/kernel/asm/i386/proc.c b/lunaix-os/kernel/asm/i386/proc.c new file mode 100644 index 0000000..67f3f73 --- /dev/null +++ b/lunaix-os/kernel/asm/i386/proc.c @@ -0,0 +1,28 @@ +#include + +void +proc_init_transfer(struct proc_info* proc, + ptr_t stack_top, + ptr_t target, + int flags) +{ + struct exec_param* execp = + (struct exec_param*)(stack_top - sizeof(struct exec_param)); + isr_param* isrp = (isr_param*)((ptr_t)execp - sizeof(isr_param)); + + *execp = (struct exec_param){ + .cs = KCODE_SEG, .ss = KDATA_SEG, .eip = target, .eflags = cpu_ldstate() + }; + + *isrp = (isr_param){ .registers = { .ds = KDATA_SEG, + .es = KDATA_SEG, + .fs = KDATA_SEG, + .gs = KDATA_SEG }, + .execp = execp }; + + if ((flags & TRANSFER_IE)) { + execp->eflags |= 0x200; + } + + proc->intr_ctx = isrp; +} \ No newline at end of file diff --git a/lunaix-os/kernel/asm/x86/prologue.S b/lunaix-os/kernel/asm/i386/prologue.S similarity index 97% rename from lunaix-os/kernel/asm/x86/prologue.S rename to lunaix-os/kernel/asm/i386/prologue.S index 4c183fb..572401b 100644 --- a/lunaix-os/kernel/asm/x86/prologue.S +++ b/lunaix-os/kernel/asm/i386/prologue.S @@ -1,7 +1,7 @@ /* 高半核入口点 - 0xC0000000 */ #define __ASM__ -#include +#include .section .text .global hhk_entry_ diff --git a/lunaix-os/kernel/asm/x86/syscall.S b/lunaix-os/kernel/asm/i386/syscall.S similarity index 100% rename from lunaix-os/kernel/asm/x86/syscall.S rename to lunaix-os/kernel/asm/i386/syscall.S diff --git a/lunaix-os/kernel/asm/x86/tss.c b/lunaix-os/kernel/asm/i386/tss.c similarity index 65% rename from lunaix-os/kernel/asm/x86/tss.c rename to lunaix-os/kernel/asm/i386/tss.c index 603eca6..cee33ad 100644 --- a/lunaix-os/kernel/asm/x86/tss.c +++ b/lunaix-os/kernel/asm/i386/tss.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/lunaix-os/kernel/device/builtin/devrand.c b/lunaix-os/kernel/device/builtin/devrand.c index 7526601..ce85c39 100644 --- a/lunaix-os/kernel/device/builtin/devrand.c +++ b/lunaix-os/kernel/device/builtin/devrand.c @@ -7,21 +7,22 @@ LOG_MODULE("rand") int __rand_rd_pg(struct device* dev, void* buf, size_t offset) { - rnd_fill(buf, PG_SIZE); + // rnd_fill(buf, PG_SIZE); return PG_SIZE; } int __rand_rd(struct device* dev, void* buf, size_t offset, size_t len) { - rnd_fill(buf, len); + // rnd_fill(buf, len); return len; } void devbuiltin_init_rand() { - if (!rnd_is_supported()) { + // TODO rnd device need better abstraction + if (1) { kprintf(KWARN "not supported.\n"); return; } diff --git a/lunaix-os/kernel/exe/exec.c b/lunaix-os/kernel/exe/exec.c index 21814d1..8a14c4a 100644 --- a/lunaix-os/kernel/exe/exec.c +++ b/lunaix-os/kernel/exe/exec.c @@ -220,9 +220,8 @@ __DEFINE_LXSYSCALL3(int, // we will jump to new entry point (_u_start) upon syscall's // return so execve 'will not return' from the perspective of it's invoker - volatile struct exec_param* execp = __current->intr_ctx->execp; - execp->esp = container.stack_top; - execp->eip = container.exe.entry; + eret_target(__current) = container.exe.entry; + eret_stack(__current) = container.stack_top; // these become meaningless once execved! __current->ustack_top = 0; diff --git a/lunaix-os/kernel/k_init.c b/lunaix-os/kernel/kinit.c similarity index 85% rename from lunaix-os/kernel/k_init.c rename to lunaix-os/kernel/kinit.c index 2dc39e6..726295c 100644 --- a/lunaix-os/kernel/k_init.c +++ b/lunaix-os/kernel/kinit.c @@ -17,9 +17,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -137,7 +137,7 @@ spawn_proc0() proc0->page_table = vmm_dup_vmspace(proc0->pid); // 直接切换到新的拷贝,进行配置。 - cpu_ldvmspace(proc0->page_table); + cpu_chvmspace(proc0->page_table); // 为内核创建一个专属栈空间。 for (size_t i = 0; i < (KSTACK_SIZE >> PG_SIZE_BITS); i++) { @@ -149,21 +149,7 @@ spawn_proc0() VMAP_NULL); } - struct exec_param* execp = - (struct exec_param*)(KSTACK_TOP - sizeof(struct exec_param)); - isr_param* isrp = (isr_param*)((ptr_t)execp - sizeof(isr_param)); - - *execp = (struct exec_param){ .cs = KCODE_SEG, - .eip = (ptr_t)__proc0, - .ss = KDATA_SEG, - .eflags = cpu_reflags() }; - *isrp = (isr_param){ .registers = { .ds = KDATA_SEG, - .es = KDATA_SEG, - .fs = KDATA_SEG, - .gs = KDATA_SEG }, - .execp = execp }; - - proc0->intr_ctx = isrp; + proc_init_transfer(proc0, KSTACK_TOP, (ptr_t)__proc0, 0); // 向调度器注册进程。 commit_process(proc0); diff --git a/lunaix-os/kernel/mm/mmap.c b/lunaix-os/kernel/mm/mmap.c index f23ff60..77e1264 100644 --- a/lunaix-os/kernel/mm/mmap.c +++ b/lunaix-os/kernel/mm/mmap.c @@ -177,7 +177,7 @@ mem_sync_pages(ptr_t mnt, *mapping.pte &= ~PG_DIRTY; - cpu_invplg((ptr_t)mapping.pte); + cpu_flush_page((ptr_t)mapping.pte); } else if ((options & MS_INVALIDATE)) { goto invalidate; } @@ -191,7 +191,7 @@ mem_sync_pages(ptr_t mnt, invalidate: *mapping.pte &= ~PG_PRESENT; pmm_free_page(KERNEL_PID, mapping.pa); - cpu_invplg((ptr_t)mapping.pte); + cpu_flush_page((ptr_t)mapping.pte); } } diff --git a/lunaix-os/kernel/mm/vmm.c b/lunaix-os/kernel/mm/vmm.c index 3340f11..5a868d4 100644 --- a/lunaix-os/kernel/mm/vmm.c +++ b/lunaix-os/kernel/mm/vmm.c @@ -55,7 +55,7 @@ vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options) NEW_L1_ENTRY(attr | PG_WRITE | PG_PRESENT, new_l1pt_pa); // make sure our new l2 table is visible to CPU - cpu_invplg((ptr_t)l2pt); + cpu_flush_page((ptr_t)l2pt); memset((void*)l2pt, 0, PG_SIZE); } else { @@ -66,7 +66,7 @@ vmm_set_mapping(ptr_t mnt, ptr_t va, ptr_t pa, pt_attr attr, int options) } if (mnt == VMS_SELF) { - cpu_invplg(va); + cpu_flush_page(va); } if ((options & VMAP_NOMAP)) { @@ -98,7 +98,7 @@ vmm_del_mapping(ptr_t mnt, ptr_t va) x86_page_table* l2pt = (x86_page_table*)(mnt | (l1_index << 12)); x86_pte_t l2pte = l2pt->entry[l2_index]; - cpu_invplg(va); + cpu_flush_page(va); l2pt->entry[l2_index] = PTE_NULL; return PG_ENTRY_ADDR(l2pte); @@ -184,7 +184,7 @@ vmm_mount_pd(ptr_t mnt, ptr_t pde) { x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR; l1pt->entry[(mnt >> 22)] = NEW_L1_ENTRY(T_SELF_REF_PERM, pde); - cpu_invplg(mnt); + cpu_flush_page(mnt); return mnt; } @@ -193,6 +193,6 @@ vmm_unmount_pd(ptr_t mnt) { x86_page_table* l1pt = (x86_page_table*)L1_BASE_VADDR; l1pt->entry[(mnt >> 22)] = 0; - cpu_invplg(mnt); + cpu_flush_page(mnt); return mnt; } \ No newline at end of file diff --git a/lunaix-os/kernel/peripheral/ps2kbd.c b/lunaix-os/kernel/peripheral/ps2kbd.c index c31d736..02e3b67 100644 --- a/lunaix-os/kernel/peripheral/ps2kbd.c +++ b/lunaix-os/kernel/peripheral/ps2kbd.c @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include diff --git a/lunaix-os/kernel/proc0.c b/lunaix-os/kernel/proc0.c index bb9b3d9..15afae4 100644 --- a/lunaix-os/kernel/proc0.c +++ b/lunaix-os/kernel/proc0.c @@ -26,7 +26,7 @@ #include #include -#include +#include #include diff --git a/lunaix-os/kernel/process/process.c b/lunaix-os/kernel/process/process.c index 63fc7ad..0ba6c63 100644 --- a/lunaix-os/kernel/process/process.c +++ b/lunaix-os/kernel/process/process.c @@ -177,12 +177,12 @@ __mark_region(ptr_t start_vpn, ptr_t end_vpn, int attr) x86_pte_t* curproc = &PTE_MOUNTED(VMS_SELF, i); x86_pte_t* newproc = &PTE_MOUNTED(VMS_MOUNT_1, i); - cpu_invplg((ptr_t)newproc); + cpu_flush_page((ptr_t)newproc); if ((attr & REGION_MODE_MASK) == REGION_RSHARED) { // 如果读共享,则将两者的都标注为只读,那么任何写入都将会应用COW策略。 - cpu_invplg((ptr_t)curproc); - cpu_invplg((ptr_t)(i << 12)); + cpu_flush_page((ptr_t)curproc); + cpu_flush_page((ptr_t)(i << 12)); *curproc = *curproc & ~PG_WRITE; *newproc = *newproc & ~PG_WRITE; @@ -272,7 +272,7 @@ copy_kernel_stack(struct proc_info* proc, ptr_t usedMnt) In the name of Celestia our glorious goddess, I will fucking HATE the TLB for the rest of my LIFE! */ - cpu_invplg((ptr_t)ppte); + cpu_flush_page((ptr_t)ppte); x86_pte_t p = *ppte; ptr_t ppa = vmm_dup_page(pid, PG_ENTRY_ADDR(p)); diff --git a/lunaix-os/kernel/process/sched.c b/lunaix-os/kernel/process/sched.c index acf04b7..2fa5ca6 100644 --- a/lunaix-os/kernel/process/sched.c +++ b/lunaix-os/kernel/process/sched.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -60,29 +60,13 @@ sched_init_dummy() extern void my_dummy(); static char dummy_stack[DUMMY_STACK_SIZE] __attribute__((aligned(16))); - struct exec_param* execp = - (void*)dummy_stack + DUMMY_STACK_SIZE - sizeof(struct exec_param); + ptr_t stktop = (ptr_t)dummy_stack + DUMMY_STACK_SIZE; - isr_param* isrp = (void*)execp - sizeof(isr_param); - - *execp = (struct exec_param){ - .cs = KCODE_SEG, - .eflags = cpu_reflags() | 0x0200, - .eip = (ptr_t)my_dummy, - .ss = KDATA_SEG, - }; - - *isrp = (isr_param){ .registers = { .ds = KDATA_SEG, - .es = KDATA_SEG, - .fs = KDATA_SEG, - .gs = KDATA_SEG }, - .execp = execp }; - - // memset to 0 dummy_proc = (struct proc_info){}; - dummy_proc.intr_ctx = isrp; - dummy_proc.page_table = cpu_rcr3(); + proc_init_transfer(&dummy_proc, stktop, (ptr_t)my_dummy, TRANSFER_IE); + + dummy_proc.page_table = cpu_ldvmspace(); dummy_proc.state = PS_READY; dummy_proc.parent = &dummy_proc; dummy_proc.pid = KERNEL_PID; @@ -209,7 +193,7 @@ void sched_yieldk() { cpu_enable_interrupt(); - cpu_int(LUNAIX_SCHED); + cpu_trap_sched(); } __DEFINE_LXSYSCALL1(unsigned int, sleep, unsigned int, seconds) diff --git a/lunaix-os/kernel/spike.c b/lunaix-os/kernel/spike.c index 4686b12..09f82b3 100644 --- a/lunaix-os/kernel/spike.c +++ b/lunaix-os/kernel/spike.c @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -13,7 +13,7 @@ __assert_fail(const char* expr, const char* file, unsigned int line) // This is a convention we made that the LUNAIX_SYS_PANIC syscall will // print the panic message passed via %edi. (see // kernel/asm/x86/interrupts.c) - asm("int %0" ::"i"(LUNAIX_SYS_PANIC), "D"(buffer)); + cpu_trap_panic(buffer); DO_SPIN // never reach } @@ -21,7 +21,7 @@ __assert_fail(const char* expr, const char* file, unsigned int line) void panick(const char* msg) { - asm("int %0" ::"i"(LUNAIX_SYS_PANIC), "D"(msg)); + cpu_trap_panic(msg); DO_SPIN } diff --git a/lunaix-os/kernel/syscall.c b/lunaix-os/kernel/syscall.c index 6f0a2ba..d62464d 100644 --- a/lunaix-os/kernel/syscall.c +++ b/lunaix-os/kernel/syscall.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/lunaix-os/kernel/time/timer.c b/lunaix-os/kernel/time/timer.c index 46b2e79..2aca8d5 100644 --- a/lunaix-os/kernel/time/timer.c +++ b/lunaix-os/kernel/time/timer.c @@ -9,7 +9,7 @@ * @copyright Copyright (c) 2022 * */ -#include +#include #include #include diff --git a/lunaix-os/link/linker.ld b/lunaix-os/link/linker.ld index d2d39f0..937777b 100644 --- a/lunaix-os/link/linker.ld +++ b/lunaix-os/link/linker.ld @@ -11,23 +11,21 @@ SECTIONS { . = 0x100000; /* 这里是我们的高半核初始化代码段和数据段 */ - .hhk_init_text BLOCK(4K) : { - * (.multiboot) - arch/*.o (.hhk_init) - arch/*.o (.text) + *(.multiboot) + *(.hhk_init_text) } .hhk_init_bss BLOCK(4K) : { - arch/*.o (.bss) + *(.hhk_init_bss) } .hhk_init_data BLOCK(4K) : { - arch/*.o (.data) + *(.hhk_init_data) } .hhk_init_rodata BLOCK(4K) : { - arch/*.o (.rodata) + *(.hhk_init_rodata) } __init_hhk_end = ALIGN(4K); @@ -39,37 +37,25 @@ SECTIONS { __kernel_start = .; PROVIDE(__ktext_start = .); - kernel/*.o (.text) - hal/*.o (.text) - debug/*.o (.text) - libs/*.o (.text) + *(.text) PROVIDE(__ktext_end = .); } .data BLOCK(4K) : AT ( ADDR(.data) - 0xC0000000 ) { - kernel/*.o (.data) - hal/*.o (.data) - debug/*.o (.data) - libs/*.o (.data) + *(.data) } .rodata BLOCK(4K) : AT ( ADDR(.rodata) - 0xC0000000 ) { - kernel/*.o (.rodata) - hal/*.o (.rodata) - debug/*.o (.rodata) - libs/*.o (.rodata) + *(.rodata) } .kpg BLOCK(4K) : AT ( ADDR(.kpg) - 0xC0000000 ) { - arch/*.o (.kpg) + *(.kpg) } .bss BLOCK(4K) : AT ( ADDR(.bss) - 0xC0000000 ) { - kernel/*.o (.bss) - hal/*.o (.bss) - debug/*.o (.bss) - libs/*.o (.bss) + *(.bss) } __kernel_end = ALIGN(4K); diff --git a/lunaix-os/makeinc/toolchain.mkinc b/lunaix-os/makeinc/toolchain.mkinc index 9496c5c..fffd182 100644 --- a/lunaix-os/makeinc/toolchain.mkinc +++ b/lunaix-os/makeinc/toolchain.mkinc @@ -19,7 +19,6 @@ OFLAGS := -fno-gcse\ -fno-cse-skip-blocks\ -fno-optimize-strlen\ -fno-inline-functions-called-once \ - -fno-inline-functions \ -fno-inline-small-functions \ -fno-indirect-inlining diff --git a/lunaix-os/scripts/x86_idt_generator.py b/lunaix-os/scripts/x86_idt_generator.py index b00d266..38fab80 100644 --- a/lunaix-os/scripts/x86_idt_generator.py +++ b/lunaix-os/scripts/x86_idt_generator.py @@ -1,6 +1,6 @@ from pathlib import Path -intr_handler_h = "arch/x86/intrhnds.h" +intr_handler_h = "arch/i386/intrhnds.h" intr_handler_c = "kernel/asm/x86/intrhnds.c" intr_handler_s = "kernel/asm/x86/intrhnds.S" @@ -81,7 +81,7 @@ def export_c(src: Path): code = '\n'.join(expr_list) with cfile.open(mode='w+') as f: f.write(f''' -#include +#include #include #include <{intr_handler_h}> -- 2.27.0