From ef5e8cc0abf7a81d919bed522d2749b3e64f194b Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Tue, 31 Oct 2023 19:06:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/arch.h | 2 ++ include/mem.h | 2 ++ include/mod.h | 6 ++++++ include/sys.h | 10 ++++++++-- include/tool.h | 4 +--- include/version.h | 2 +- kernel/arch/cpu.c | 11 +++++++++-- kernel/arch/idt.c | 8 ++++++-- kernel/sys.c | 40 +++++++++++++++++++++++++++------------- 9 files changed, 62 insertions(+), 23 deletions(-) diff --git a/include/arch.h b/include/arch.h index 96a57ce..850ace9 100644 --- a/include/arch.h +++ b/include/arch.h @@ -17,6 +17,8 @@ void cpu_init( ); void gdt_init( ); void idt_init( ); void idt_set_int(uint8_t vector, void *int_handler); +uint64_t arch_get_tick_b( ); +uint64_t arch_get_tick_l( ); uint64_t arch_get_tick( ); static inline void outb(uint16_t port, uint8_t val) { diff --git a/include/mem.h b/include/mem.h index e7deac6..180fab3 100644 --- a/include/mem.h +++ b/include/mem.h @@ -19,10 +19,12 @@ void mem_dump_memory( ); void mem_init( ); void *mem_alloc(size_t size); +void mem_add_block(void *addr, size_t size); void mem_free(void *addr); void *mem_realloc(void *addr, size_t size); void *mem_frame_alloc(uint64_t wanted_frames); void mem_frame_free(void *ptr, uint64_t frames); void *mem_frame_calloc(uint64_t frames); +void mem_merge_all_blocks( ); #endif // mem.h \ No newline at end of file diff --git a/include/mod.h b/include/mod.h index 4ddc843..3406fc9 100644 --- a/include/mod.h +++ b/include/mod.h @@ -10,6 +10,12 @@ #ifndef MOD_H #define MOD_H +// Максимальное количество модулей 16. Позже перепишем на динамический массив, +// сейчас для прототипа это не так важно +#define MOD_MAX 16 + void mod_init( ); +void mod_list_show( ); +void mod_find(char *name); #endif // mod.h \ No newline at end of file diff --git a/include/sys.h b/include/sys.h index fdf0340..1dc1b8e 100644 --- a/include/sys.h +++ b/include/sys.h @@ -13,6 +13,11 @@ #include typedef struct { + uint32_t *address; + uint64_t width; + uint64_t height; + uint64_t pitch; + uint16_t bpp; int reserved; } framebuffer_t; @@ -28,8 +33,9 @@ typedef struct { typedef struct { char *name; char *message; - int err_code; - uint64_t func_count; + uint64_t type; + int64_t err_code; + uint64_t module_id; } module_info_t; typedef struct { diff --git a/include/tool.h b/include/tool.h index f127b01..b7e0a55 100644 --- a/include/tool.h +++ b/include/tool.h @@ -35,9 +35,7 @@ static inline void pause( ) { for (uint64_t i = 0; i < 1024; i++) { - for (uint64_t j = 0; j < 1024; j++) { - for (uint64_t q = 0; q < 8; q++) { asm volatile("pause"); } - } + for (uint64_t j = 0; j < 4; j++) { asm volatile("pause"); } } } diff --git a/include/version.h b/include/version.h index e74f57d..dac98e0 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 1 -#define VERSION_BUILD 366 +#define VERSION_BUILD 426 diff --git a/kernel/arch/cpu.c b/kernel/arch/cpu.c index aab3b5b..b5ab37c 100644 --- a/kernel/arch/cpu.c +++ b/kernel/arch/cpu.c @@ -13,7 +13,6 @@ #include static bool acpi_msrs_support = false; -static bool mmx_support = false; static void cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { @@ -26,7 +25,8 @@ static void msr_get(uint32_t msr, uint32_t *lo, uint32_t *hi) { asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr)); } -static void msr_set(uint32_t msr, uint32_t lo, uint32_t hi) { +static void __attribute__((unused)) +msr_set(uint32_t msr, uint32_t lo, uint32_t hi) { asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr)); } @@ -92,6 +92,13 @@ static void brandname( ) { if (manufacturer[0] == 0x68747541) { do_amd( ); } } +void cpu_idle( ) { + if (acpi_msrs_support) { + LOG("Температура: %d (в QEMU/KVM всегда 0)\n", + get_cpu_temperature_intel( )); + } +} + void cpu_init( ) { uint32_t eax, ebx, ecx, edx; cpuid(1, &eax, &ebx, &ecx, &edx); diff --git a/kernel/arch/idt.c b/kernel/arch/idt.c index 716e167..4b1a857 100644 --- a/kernel/arch/idt.c +++ b/kernel/arch/idt.c @@ -70,6 +70,7 @@ void exception_handler(struct frame state) { state.rbp, state.rsp, state.r8, state.r9, state.r10, state.r11, state.r12, state.r13, state.r14, state.r15, state.rip, state.rflags, state.cs, state.ss, state.err, state.int_number); + LOG("stack_top = %x\n", stack_top); asm volatile("cli; hlt"); } @@ -90,11 +91,14 @@ static void idt_load( ) { asm volatile("lidt %0" : : "m"(*ptr)); } -void idt_set_int(uint8_t vector, void *int_handler) {} +void idt_set_int(uint8_t vector, void *int_handler) { + idt_desc_setup(&IDT[vector], KERNEL_CS, (uintptr_t)int_handler, + IDT_INTERRUPT_FLAGS); + idt_load( ); +} void idt_init( ) { asm volatile("sti"); - fb_printf("Настройка прерываний...\n"); for (int i = 0; i != IDT_EXCEPTIONS; ++i) { const uintptr_t handler = (uintptr_t)isr_stubs[i]; diff --git a/kernel/sys.c b/kernel/sys.c index b4cd230..c42c3b0 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -8,30 +8,44 @@ #include #include +module_info_t *current_module; + void sys_init( ) {} framebuffer_t *sys_alloc_framebuffer( ) { return (framebuffer_t *)0; } -void sys_free_framebuffer(framebuffer_t *frame) {} +void sys_free_framebuffer(framebuffer_t *frame) { + frame->reserved = 0; +} -void sys_exit(int code) {} +void sys_exit(int code) { + current_module->err_code = code; +} int sys_get_error( ) { - return 0; + return current_module->err_code; } -sys_info_t *sys_get_info( ) {} - -module_info_t *sys_get_module(uid_t module_id) {} - -uid_t sys_new_thread(func_t func) {} - -int sys_delete_thread(uid_t thread_id) { - return 0; +sys_info_t *sys_get_info( ) { + return &(sys_info_t){ .reserved = 0 }; } -time_t sys_get_time( ) {} +module_info_t *sys_get_module(uint64_t module_id) { + return (module_info_t *)module_id; +} -void sys_set_alarm(time_t time, func_t func) {} +uint64_t sys_new_thread(uint64_t func) { + return func; +} + +int sys_delete_thread(uint64_t thread_id) { + return thread_id; +} + +time_t sys_get_time( ) { + return (time_t){ .year = 2023, .month = 10, .day = 31, .second = 1 }; +} + +// void sys_set_alarm(time_t time, func_t func) {}