From d6691de1985eaa60c741e0a4eb91a41bbc307ec3 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Sun, 3 Mar 2024 14:43:11 +0300 Subject: [PATCH] =?UTF-8?q?fb=5Fprintf=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BD=D0=B0=20log=5Fprintf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Мы не можем гарантировать наличие фреймбуффера --- build.sh | 3 +++ docs/API.md | 4 ++-- include/arch.h | 10 ---------- include/fb.h | 4 ++-- include/sys.h | 2 +- include/version.h | 2 +- kernel/mod.c | 9 ++++++++- kernel/sys.c | 2 +- modlib/lib/system.c | 4 ++-- modlib/system.h | 2 +- modlib/types.h | 2 +- modules/cpubench/main.c | 34 +++++++++++++++++----------------- modules/helloworld/main.c | 4 ++-- modules/imfs/main.c | 8 ++++---- modules/ios/main.c | 28 ++++++++++++++-------------- modules/pci/main.c | 20 ++++++++++---------- modules/pci/pci_data.c | 6 +++--- modules/ps2/main.c | 4 ++-- modules/simd/main.c | 12 ++++++------ modules/tga/main.c | 2 +- 20 files changed, 81 insertions(+), 81 deletions(-) diff --git a/build.sh b/build.sh index 6994db8..cf81a5f 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,9 @@ #!/bin/sh +dos2unix *.sh + cd modlib/lib/ +dos2unix build.sh chmod +x build.sh ./build.sh cd ../.. diff --git a/docs/API.md b/docs/API.md index 35a6015..2d81a1a 100644 --- a/docs/API.md +++ b/docs/API.md @@ -28,9 +28,9 @@ - `-1 не удалось выделить память для буфера кадра`. -## fb_printf(char *str, ...) +## log_printf(char *str, ...) -Форматированный вывод строки на экран используя функцию ядра fb_printf. +Форматированный вывод строки на экран используя функцию ядра log_printf. ### Будет удалено в ближайших обновлениях diff --git a/include/arch.h b/include/arch.h index d704f85..c7fd047 100644 --- a/include/arch.h +++ b/include/arch.h @@ -105,16 +105,6 @@ static inline void io_wait( ) { outb(0x80, 0); } -static inline void print_stack_trace( ) { - uint64_t *rsp; - asm volatile("movq %%rsp, %0" : "=g"(rsp)); - - while (rsp) { - // fb_printf("%x\n", *rsp); - rsp = (uint64_t *)(*rsp); - } -} - #define GET_TICK_BIG arch_get_tick_b( ) #define GET_TICK_lOW arch_get_tick_l( ) diff --git a/include/fb.h b/include/fb.h index fbd2fac..8603194 100644 --- a/include/fb.h +++ b/include/fb.h @@ -40,8 +40,8 @@ void fb_set_text_color(uint32_t color); uint32_t fb_get_text_color( ); void fb_init( ); void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf); -void fb_printf(char *str, ...); -void fb_printf_at(size_t x, size_t y, char *str, ...); +void log_printf(char *str, ...); +void log_printf_at(size_t x, size_t y, char *str, ...); void fb_print_bits(size_t x, size_t y, uint8_t num); #endif // fb.h \ No newline at end of file diff --git a/include/sys.h b/include/sys.h index a83d629..e9c38b5 100644 --- a/include/sys.h +++ b/include/sys.h @@ -66,7 +66,7 @@ typedef struct { typedef struct { uint64_t offset; - void (*fb_printf)(char *str, ...); // Временная функция + void (*log_printf)(char *str, ...); // Временная функция framebuffer_t (*alloc_framebuffer)( ); void (*free_framebuffer)(framebuffer_t *frame); void *(*alloc)(uint64_t size); diff --git a/include/version.h b/include/version.h index a8c27e1..b843d1c 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 2 -#define VERSION_BUILD 52 +#define VERSION_BUILD 57 diff --git a/kernel/mod.c b/kernel/mod.c index c17e3f8..631c049 100644 --- a/kernel/mod.c +++ b/kernel/mod.c @@ -29,6 +29,7 @@ static env_t main_env; void *bootpng_ptr; uint64_t bootpng_size; +// Получение адреса точки входа static void *elf_entry(elf64_header_t *module_bin) { // Приводим заголовок ELF файла к типу elf64_header_t elf64_header_t *elf_header = (elf64_header_t *)module_bin; @@ -44,6 +45,7 @@ static void *elf_entry(elf64_header_t *module_bin) { return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin); } +// Вывод списка модулей в отладчик void mod_list_show( ) { for (uint64_t i = 0; i < modules_count; i++) { LOG("Имя: %s\n", module_list[i].name); @@ -58,6 +60,7 @@ void mod_list_show( ) { } } +// Запуск модулей имеющих дополнительную точку входа void mod_after_init( ) { for (uint64_t i = 0; i < modules_count; i++) { if (module_list[i].after_init != 0) { @@ -67,11 +70,13 @@ void mod_after_init( ) { } } +// Запуск модулей имеющих дополнительную точку входа module_info_t *mod_list_get(uint64_t *count) { *count = modules_count; return module_list; } +// Поиск модуля по тегу module_info_t *mod_find(char *tag) { for (uint64_t i = 0; i < modules_count; i++) { if (tool_str_contains(module_list[i].name, tag)) { return &module_list[i]; } @@ -128,7 +133,7 @@ void mod_init( ) { continue; } - module_info_t (*module_init)(env_t *env) = + module_info_t (*module_init)(env_t * env) = (module_info_t(*)(env_t * env)) elf_entry((elf64_header_t *)module_ptr->address); // LOG("\t->Точка входа: 0x%x\n", module_init); @@ -168,6 +173,7 @@ void mod_init( ) { LOG("Модулей обработано: %u\n", modules_count); } +// Добавление модуля void mod_add(module_info_t module) { if (modules_count == 0) { module_list = (module_info_t *)mem_alloc(sizeof(module_info_t)); @@ -192,6 +198,7 @@ void mod_add(module_info_t module) { modules_count++; } +// Удаление модуля void mod_del(module_info_t *module) { if (modules_count == 0) { LOG("Модуль не найден\n"); diff --git a/kernel/sys.c b/kernel/sys.c index 0aff84c..c3d563f 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -50,7 +50,7 @@ static module_info_t *sys_get_module(char *module_id) { } env_t *sys_install(env_t *module) { - module->fb_printf = &log_printf; + module->log_printf = &log_printf; module->alloc_framebuffer = &sys_alloc_framebuffer; module->free_framebuffer = &sys_free_framebuffer; module->alloc = &mem_alloc; diff --git a/modlib/lib/system.c b/modlib/lib/system.c index 8323b0c..69a8372 100644 --- a/modlib/lib/system.c +++ b/modlib/lib/system.c @@ -11,7 +11,7 @@ void *(*alloc)(uint64_t size); void (*free)(void *ptr); -void (*fb_printf)(char *str, ...); +void (*log_printf)(char *str, ...); module_info_t *(*get_module)(char *module_id); module_info_t *(*mod_list_get)(uint64_t *count); framebuffer_t (*alloc_framebuffer)( ); @@ -26,7 +26,7 @@ uint64_t offset; void init_env(env_t *loader_env) { offset = loader_env->offset; - fb_printf = loader_env->fb_printf; + log_printf = loader_env->log_printf; alloc = loader_env->alloc; free = loader_env->free; get_module = loader_env->get_module; diff --git a/modlib/system.h b/modlib/system.h index 27de1aa..598b9c3 100644 --- a/modlib/system.h +++ b/modlib/system.h @@ -14,7 +14,7 @@ extern void *(*alloc)(uint64_t size); extern void (*free)(void *ptr); -extern void (*fb_printf)(char *str, ...); +extern void (*log_printf)(char *str, ...); extern module_info_t *(*get_module)(char *module_id); extern module_info_t *(*mod_list_get)(uint64_t *count); extern framebuffer_t (*alloc_framebuffer)( ); diff --git a/modlib/types.h b/modlib/types.h index e45770f..842dcd1 100644 --- a/modlib/types.h +++ b/modlib/types.h @@ -107,7 +107,7 @@ typedef struct { typedef struct { uint64_t offset; - void (*fb_printf)(char *str, ...); // Временная функция + void (*log_printf)(char *str, ...); // Временная функция framebuffer_t (*alloc_framebuffer)( ); void (*free_framebuffer)(framebuffer_t *frame); void *(*alloc)(uint64_t size); diff --git a/modules/cpubench/main.c b/modules/cpubench/main.c index 762dae6..4a314b1 100644 --- a/modules/cpubench/main.c +++ b/modules/cpubench/main.c @@ -10,33 +10,33 @@ static inline void L1_cache_size( ) { uint32_t eax, ebx, ecx, edx; cpuid(0x80000006, &eax, &ebx, &ecx, &edx); if ((edx & 0xFF) == 0) { - fb_printf("L1 кэш недоступен\n"); + log_printf("L1 кэш недоступен\n"); return; } - fb_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07, - (ecx >> 16) & 0xFFff); + log_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07, + (ecx >> 16) & 0xFFff); } static inline void L2_cache_size( ) { uint32_t eax, ebx, ecx, edx; cpuid(0x80000006, &eax, &ebx, &ecx, &edx); if ((edx & 0xFF) == 0) { - fb_printf("L2 кэш недоступен\n"); + log_printf("L2 кэш недоступен\n"); return; } - fb_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F, - (ecx >> 16) & 0xFFFF); + log_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F, + (ecx >> 16) & 0xFFFF); } static inline void L3_cache_size( ) { uint32_t eax, ebx, ecx, edx; cpuid(0x80000006, &eax, &ebx, &ecx, &edx); if ((edx & 0xFF) == 0) { - fb_printf("L3 кэш недоступен\n"); + log_printf("L3 кэш недоступен\n"); return; } - fb_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F, - (edx >> 16) & 0xFFFF); + log_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F, + (edx >> 16) & 0xFFFF); } static void cpu_info( ) { @@ -49,12 +49,12 @@ static void cpu_info( ) { uint8_t node_id = ecx & 0xFF; uint8_t nodes_per_processor = ((ecx >> 8) & 3) + 1; - fb_printf("Топология процессора:\n"); - fb_printf(" Идентификатор APIC: %u\n", apic_id); - fb_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id); - fb_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit); - fb_printf(" Идентификатор узла: %u\n", node_id); - fb_printf(" Узлы на процессор: %u\n", nodes_per_processor); + log_printf("Топология процессора:\n"); + log_printf(" Идентификатор APIC: %u\n", apic_id); + log_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id); + log_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit); + log_printf(" Идентификатор узла: %u\n", node_id); + log_printf(" Узлы на процессор: %u\n", nodes_per_processor); } module_info_t __attribute__((section(".minit"))) init(env_t *env) { @@ -65,9 +65,9 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { cpuid(1, &eax, &ebx, &ecx, &edx); if (ecx & (1 << 31)) { - fb_printf("Запуск на эмуляторе\n"); + log_printf("Запуск на эмуляторе\n"); } else { - fb_printf("Запуск на физическом процессоре\n"); + log_printf("Запуск на физическом процессоре\n"); } L1_cache_size( ); diff --git a/modules/helloworld/main.c b/modules/helloworld/main.c index d824469..af1b474 100644 --- a/modules/helloworld/main.c +++ b/modules/helloworld/main.c @@ -4,13 +4,13 @@ static const char name[] = "[APP]Привет мир!"; static const char message[] = "Привет из модуля!"; static int app_main( ) { - fb_printf("[%s]\n", message); + log_printf("[%s]\n", message); return 2 + 2; } module_info_t __attribute__((section(".minit"))) init(env_t *env) { init_env(env); - fb_printf("[%s]\n", message); + log_printf("[%s]\n", message); return (module_info_t){ .name = (char *)&name, .message = (char *)&message, .type = 0, diff --git a/modules/imfs/main.c b/modules/imfs/main.c index bb732fb..e43434c 100644 --- a/modules/imfs/main.c +++ b/modules/imfs/main.c @@ -123,14 +123,14 @@ void delete_folder(folder_t *folder) { } void print_folder_contents(folder_t *folder, size_t depth) { - for (size_t i = 0; i < depth; i++) { fb_printf("\t"); } - fb_printf("- %s/\n", folder->name); + for (size_t i = 0; i < depth; i++) { log_printf("\t"); } + log_printf("- %s/\n", folder->name); file_t *file = folder->files; while (file != NULL) { - for (size_t i = 0; i < depth + 1; i++) { fb_printf("\t"); } - fb_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024); + for (size_t i = 0; i < depth + 1; i++) { log_printf("\t"); } + log_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024); file = file->next; } diff --git a/modules/ios/main.c b/modules/ios/main.c index cfe23f2..c6b4de1 100644 --- a/modules/ios/main.c +++ b/modules/ios/main.c @@ -20,7 +20,7 @@ void ios_main( ) { module_info_t *kbd_mod = get_module("[KEYBOARD]"); if (kbd_mod == NULL) { - fb_printf("Клавиатура не найдена!\n"); + log_printf("Клавиатура не найдена!\n"); delete_thread( ); for (;;) { asm volatile("hlt"); } } @@ -28,47 +28,47 @@ void ios_main( ) { getc = kbd_mod->get_func(2); while (1) { - fb_printf("Доступные программы:\n"); - for (uint64_t i = 0; i < app_count; i++) { fb_printf(" %2u. %s\n", i, app_list[i].name); } - fb_printf(" %2u. Выход\n", app_count + 1); + log_printf("Доступные программы:\n"); + for (uint64_t i = 0; i < app_count; i++) { log_printf(" %2u. %s\n", i, app_list[i].name); } + log_printf(" %2u. Выход\n", app_count + 1); - fb_printf("[IOS]>"); + log_printf("[IOS]>"); char c = '\0'; do { c = getc( ); } while (!is_digit(c)); - fb_printf(" %c\n", c); + log_printf(" %c\n", c); int select = char_to_digit(c); if (select == app_count + 1) { - fb_printf("Выход\n"); + log_printf("Выход\n"); delete_thread( ); for (;;) { asm volatile("hlt"); } } if (select > app_count - 1) { - fb_printf("Ошибка! %u не входит в список\n"); + log_printf("Ошибка! %u не входит в список\n"); continue; } - fb_printf("Запуск %s...\n", app_list[select].name); + log_printf("Запуск %s...\n", app_list[select].name); int (*app)( ) = (int (*)( ))app_list[select].data; int ret = (*app)( ); - fb_printf("\nПриложение %s завершилось с кодом: %d\n", app_list[select].name, ret); + log_printf("\nПриложение %s завершилось с кодом: %d\n", app_list[select].name, ret); } } static void main( ) { - fb_printf("IOS (input-output shell) - оболочка ввода-вывода\n"); + log_printf("IOS (input-output shell) - оболочка ввода-вывода\n"); mod_count = alloc(sizeof(uint64_t)); mod_list = mod_list_get(mod_count); app_list = alloc((*mod_count) * sizeof(module_info_t)); if (app_list == NULL) { - fb_printf("Ошибка выделения памяти для app_list!\n"); + log_printf("Ошибка выделения памяти для app_list!\n"); delete_thread( ); for (;;) { asm volatile("hlt"); } } @@ -77,7 +77,7 @@ static void main( ) { for (uint64_t i = 0; i < *mod_count; i++) { if (str_contains(mod_list[i].name, "[APP]")) { - // fb_printf("%u. %s\n", app_count, mod_list[i].name); + // log_printf("%u. %s\n", app_count, mod_list[i].name); app_list[app_count] = mod_list[i]; app_count++; } @@ -86,7 +86,7 @@ static void main( ) { free(mod_count); if (app_count < 1) { - fb_printf("Модулей-программ не обнаружено!\n"); + log_printf("Модулей-программ не обнаружено!\n"); free(app_list); delete_thread( ); } else { diff --git a/modules/pci/main.c b/modules/pci/main.c index d627b60..c349ead 100644 --- a/modules/pci/main.c +++ b/modules/pci/main.c @@ -96,18 +96,18 @@ static inline void scan( ) { */ char *name = find_vendor(vendor); - fb_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot, - function); - fb_printf("%32s", get_class_name(class_id)); + log_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot, + function); + log_printf("%32s", get_class_name(class_id)); /* - fb_printf(" | %8x : %8x", mem_addr_0, mem_lim_0); - fb_printf(" | %8x : %8x", mem_addr_1, mem_lim_1); - fb_printf(" | %8x : %8x", io_addr_0, io_lim_0); - fb_printf(" | %8x : %8x", io_addr_1, io_lim_1); + log_printf(" | %8x : %8x", mem_addr_0, mem_lim_0); + log_printf(" | %8x : %8x", mem_addr_1, mem_lim_1); + log_printf(" | %8x : %8x", io_addr_0, io_lim_0); + log_printf(" | %8x : %8x", io_addr_1, io_lim_1); */ - fb_printf(" | %4x\n", status); + log_printf(" | %4x\n", status); devices++; } } @@ -120,11 +120,11 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { module_info_t *pci_data = get_module("[PCI][ADAPTER]"); if (pci_data == NULL) { - fb_printf("Адаптер PCI данных не найден!\n"); + log_printf("Адаптер PCI данных не найден!\n"); num_vendors = 0; } else { num_vendors = pci_data->data_size - 1; - fb_printf("Записей в базе PCI: %u\n", pci_data->data_size); + log_printf("Записей в базе PCI: %u\n", pci_data->data_size); vendor_list = (vendor_t **)pci_data->data; } diff --git a/modules/pci/pci_data.c b/modules/pci/pci_data.c index 1311ee2..e679a4a 100644 --- a/modules/pci/pci_data.c +++ b/modules/pci/pci_data.c @@ -55,7 +55,7 @@ static vendor_t **parse_file(char *str, uint64_t num_vendors, uint64_t size) { static void print_vendors(uint64_t num_vendors, vendor_t **vendor_list) { for (uint64_t i = 0; i < num_vendors; i++) { vendor_t *vendor = vendor_list[i]; - fb_printf("ID: 0x%x, Name: %s\n", vendor->id, vendor->name); + log_printf("ID: 0x%x, Name: %s\n", vendor->id, vendor->name); } } @@ -64,10 +64,10 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { module_info_t *pci_data = get_module("[PCI][DATA][VENDORS]"); - if (pci_data == NULL) { fb_printf("База PCI не найдена!\n"); } + if (pci_data == NULL) { log_printf("База PCI не найдена!\n"); } uint64_t num_vendors = count_chars(pci_data->data, ';'); - fb_printf("Количество вендоров: %u\n", num_vendors); + log_printf("Количество вендоров: %u\n", num_vendors); vendor_t **vendor_list = parse_file(pci_data->data, num_vendors, pci_data->data_size); // print_vendors(num_vendors, vendor_list); diff --git a/modules/ps2/main.c b/modules/ps2/main.c index a07eab8..8b02107 100644 --- a/modules/ps2/main.c +++ b/modules/ps2/main.c @@ -80,11 +80,11 @@ static void handler( ) { switch (scancode) { case 0x01: - fb_printf("ВЫХОД\n"); + log_printf("ВЫХОД\n"); virt_exit( ); break; // Клавиша "ESCAPE" case 0x4F: // Клавиша "END" - fb_printf("END?\n"); + log_printf("END?\n"); break; default: break; } diff --git a/modules/simd/main.c b/modules/simd/main.c index 9cf308e..c27f665 100644 --- a/modules/simd/main.c +++ b/modules/simd/main.c @@ -14,20 +14,20 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { if ((edx >> 0) & 1) { asm volatile("finit"); - fb_printf("FPU(x87) поддерживается!\n"); + log_printf("FPU(x87) поддерживается!\n"); } - if ((edx >> 23) & 1) { fb_printf("MMX поддерживается!\n"); } + if ((edx >> 23) & 1) { log_printf("MMX поддерживается!\n"); } if ((edx >> 25) & 1) { - fb_printf("SSE2 поддерживается!\n"); - fb_printf("Адрес региона fxsave 0x%x\n", &fxsave_region); + log_printf("SSE2 поддерживается!\n"); + log_printf("Адрес региона fxsave 0x%x\n", &fxsave_region); asm volatile(" fxsave %0 " ::"m"(fxsave_region)); uint32_t sse_version = (ecx >> 25) & 0x7; - fb_printf("SSE%u включен\n", sse_version); + log_printf("SSE%u включен\n", sse_version); } - if ((ecx >> 28) & 1) { fb_printf("AVX поддерживается!\n"); } + if ((ecx >> 28) & 1) { log_printf("AVX поддерживается!\n"); } return (module_info_t){ .name = (char *)"SIMD", .message = (char *)"SIMD инструкции", diff --git a/modules/tga/main.c b/modules/tga/main.c index a94aba8..4661396 100644 --- a/modules/tga/main.c +++ b/modules/tga/main.c @@ -1,6 +1,6 @@ #include -#define TGA_ERR( ) fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__); +#define TGA_ERR( ) log_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__); typedef struct { unsigned char magic1; // должно быть нулевым