From 36d28d5f90f11253832e4a39def1d774afd27295 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Sun, 17 Dec 2023 15:21:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=88=D0=B8=D1=80=D0=B8=D0=BD=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/fb.h | 2 +- include/version.h | 2 +- kernel/tool.c | 56 +++++++++++++++++++++++++++++++++++----------- modules/pci/main.c | 17 +++++++------- scripts/pbuild.py | 2 +- 5 files changed, 55 insertions(+), 24 deletions(-) diff --git a/include/fb.h b/include/fb.h index 26ecc68..9ea19c2 100644 --- a/include/fb.h +++ b/include/fb.h @@ -35,7 +35,7 @@ enum colors { #ifndef NO_DEBUG #define LOG(...) \ - fb_printf("[%u]%s() (%s:%d) ", GET_TICK_BIG, __func__, __FILE__, __LINE__); \ + fb_printf("[%4u]%s() (%s:%d) ", GET_TICK_BIG, __func__, __FILE__, __LINE__); \ fb_printf(__VA_ARGS__) #else #define LOG(...) diff --git a/include/version.h b/include/version.h index dde21a4..15713d0 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 1 -#define VERSION_BUILD 896 +#define VERSION_BUILD 897 diff --git a/kernel/tool.c b/kernel/tool.c index 26848ea..33edf65 100644 --- a/kernel/tool.c +++ b/kernel/tool.c @@ -121,17 +121,56 @@ void tool_uint_to_str(uint64_t i, uint8_t base, char *buf) { tool_reverse_str(buf); } +void tool_uint_to_wstr(uint64_t i, uint8_t base, char *buf, uint64_t width) { + uint64_t index = 0; + // Деление с остатком для преобразования числа в нужную систему счисления + do { + uint64_t remainder = i % base; + // Преобразовываем остаток в символ и добавляем его в строку + buf[index++] = + (remainder > 9) ? (remainder - 10) + 'A' : remainder + '0'; // Если остаток > 9, добавляем заглавную букву А + i /= base; + } while (i > 0); + + while (index < width) { + buf[index++] = ' '; // Добавляем пробелы слева до заданной ширины + } + + // Добавляем нулевой символ в конец строки, чтобы завершить ее + buf[index] = '\0'; + + // Переворачиваем строку, чтобы цифры были в правильном порядке + tool_reverse_str(buf); +} + +int is_digit(char c) { + if (c >= '0' && c <= '9') { return 1; } + return 0; +} + +int char_to_digit(char c) { + if (is_digit(c)) { return (int)(c - '0'); } + return -1; +} + // Функция для форматированного вывода void tool_format(void (*putc)(char c), const char *format_string, va_list args) { while (*format_string != '\0') { if (*format_string == '%') { char buf[48]; uint64_t point = 0; - const char *arg_s; + char *arg_s; int64_t arg_d = 0; uint64_t arg_u = 0; + uint64_t width = 0; + format_string++; + if (is_digit(*format_string)) { + width = char_to_digit(*format_string); + format_string++; + } + if (*format_string == '\0') { break; // Неожиданный конец строки формата } @@ -140,7 +179,7 @@ void tool_format(void (*putc)(char c), const char *format_string, va_list args) case '%': putc('%'); break; case 'c': putc(va_arg(args, int)); break; case 's': - arg_s = va_arg(args, const char *); + arg_s = va_arg(args, char *); // Вывод каждого символа строки while (*arg_s != '\0') { putc(*arg_s); @@ -154,11 +193,10 @@ void tool_format(void (*putc)(char c), const char *format_string, va_list args) putc(buf[point]); point++; } - break; case 'u': arg_u = va_arg(args, uint64_t); - tool_uint_to_str(arg_u, 10, buf); + tool_uint_to_wstr(arg_u, 10, buf, width); while (buf[point] != '\0') { putc(buf[point]); point++; @@ -166,15 +204,7 @@ void tool_format(void (*putc)(char c), const char *format_string, va_list args) break; case 'x': arg_u = va_arg(args, uint64_t); - tool_uint_to_str(arg_u, 16, buf); - while (buf[point] != '\0') { - putc(buf[point]); - point++; - } - break; - case 'l': - arg_u = va_arg(args, uint64_t); - tool_uint_to_str(arg_u, 16, buf); + tool_uint_to_wstr(arg_u, 16, buf, width); while (buf[point] != '\0') { putc(buf[point]); point++; diff --git a/modules/pci/main.c b/modules/pci/main.c index 8595db0..7ca71a4 100644 --- a/modules/pci/main.c +++ b/modules/pci/main.c @@ -83,8 +83,8 @@ static inline void scan( ) { uint16_t device_id = get_device_id(bus, slot, function); uint16_t class_id = get_class_id(bus, slot, function); - /* uint16_t status = pci_read_word(bus, slot, function, 0x6); + /* uint32_t mem_addr_0 = pci_read_word(bus, slot, function, 0x1C); uint32_t mem_addr_1 = pci_read_word(bus, slot, function, 0x24); uint32_t mem_lim_0 = pci_read_word(bus, slot, function, 0x20); @@ -96,17 +96,18 @@ static inline void scan( ) { */ char *name = find_vendor(vendor); - fb_printf("[%u] %x [%s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot, + fb_printf("[%4u] %4x [%s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot, function); - fb_printf("%s\n", get_class_name(class_id)); + fb_printf("%s", get_class_name(class_id)); /* - fb_printf(" | 0x%x : 0x%x", mem_addr_0, mem_lim_0); - fb_printf(" | 0x%x : 0x%x", mem_addr_1, mem_lim_1); - fb_printf(" | 0x%x : 0x%x", io_addr_0, io_lim_0); - fb_printf(" | 0x%x : 0x%x", io_addr_1, io_lim_1); - fb_printf(" | 0x%x\n", status); + 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); */ + + fb_printf(" | %4x\n", status); devices++; } } diff --git a/scripts/pbuild.py b/scripts/pbuild.py index 1c054be..349c14f 100644 --- a/scripts/pbuild.py +++ b/scripts/pbuild.py @@ -13,7 +13,7 @@ if "^.M" in output: ARCH_FLAGS = "-m64 -march=x86-64 -mabi=sysv -mno-red-zone -mcmodel=kernel -MMD -MP" WARN_FLAGS = "-Wall -Wextra -nostdlib" -STANDART_FLAGS = f"-std=gnu11 -DKERNEL_GIT_TAG=\\\"{__VERSION}\\\" -DNO_DEBUG=1" # +STANDART_FLAGS = f"-std=gnu11 -DKERNEL_GIT_TAG=\\\"{__VERSION}\\\"" # -DNO_DEBUG=1 PROTECT_FLAGS = "-O0 -g -pipe -ffreestanding -fno-stack-protector -fno-lto -fno-stack-check -fno-PIC -fno-PIE" PROTECT_FLAGS += " -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx" CHARSET_FLAGS = "-finput-charset=UTF-8 -fexec-charset=cp1251"