fb_printf заменен на log_printf

Мы не можем гарантировать наличие фреймбуффера
This commit is contained in:
Aren Elchinyan 2024-03-03 14:43:11 +03:00
parent 00cbc46cb7
commit d6691de198
20 changed files with 81 additions and 81 deletions

View File

@ -1,6 +1,9 @@
#!/bin/sh #!/bin/sh
dos2unix *.sh
cd modlib/lib/ cd modlib/lib/
dos2unix build.sh
chmod +x build.sh chmod +x build.sh
./build.sh ./build.sh
cd ../.. cd ../..

View File

@ -28,9 +28,9 @@
- `-1 не удалось выделить память для буфера кадра`. - `-1 не удалось выделить память для буфера кадра`.
## fb_printf(char *str, ...) ## log_printf(char *str, ...)
Форматированный вывод строки на экран используя функцию ядра fb_printf. Форматированный вывод строки на экран используя функцию ядра log_printf.
### Будет удалено в ближайших обновлениях ### Будет удалено в ближайших обновлениях

View File

@ -105,16 +105,6 @@ static inline void io_wait( ) {
outb(0x80, 0); 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_BIG arch_get_tick_b( )
#define GET_TICK_lOW arch_get_tick_l( ) #define GET_TICK_lOW arch_get_tick_l( )

View File

@ -40,8 +40,8 @@ void fb_set_text_color(uint32_t color);
uint32_t fb_get_text_color( ); uint32_t fb_get_text_color( );
void fb_init( ); void fb_init( );
void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf); 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 log_printf(char *str, ...);
void fb_printf_at(size_t x, size_t y, 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); void fb_print_bits(size_t x, size_t y, uint8_t num);
#endif // fb.h #endif // fb.h

View File

@ -66,7 +66,7 @@ typedef struct {
typedef struct { typedef struct {
uint64_t offset; uint64_t offset;
void (*fb_printf)(char *str, ...); // Временная функция void (*log_printf)(char *str, ...); // Временная функция
framebuffer_t (*alloc_framebuffer)( ); framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame); void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size); void *(*alloc)(uint64_t size);

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_BUILD 52 #define VERSION_BUILD 57

View File

@ -29,6 +29,7 @@ static env_t main_env;
void *bootpng_ptr; void *bootpng_ptr;
uint64_t bootpng_size; uint64_t bootpng_size;
// Получение адреса точки входа
static void *elf_entry(elf64_header_t *module_bin) { static void *elf_entry(elf64_header_t *module_bin) {
// Приводим заголовок ELF файла к типу elf64_header_t // Приводим заголовок ELF файла к типу elf64_header_t
elf64_header_t *elf_header = (elf64_header_t *)module_bin; 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); return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin);
} }
// Вывод списка модулей в отладчик
void mod_list_show( ) { void mod_list_show( ) {
for (uint64_t i = 0; i < modules_count; i++) { for (uint64_t i = 0; i < modules_count; i++) {
LOG("Имя: %s\n", module_list[i].name); LOG("Имя: %s\n", module_list[i].name);
@ -58,6 +60,7 @@ void mod_list_show( ) {
} }
} }
// Запуск модулей имеющих дополнительную точку входа
void mod_after_init( ) { void mod_after_init( ) {
for (uint64_t i = 0; i < modules_count; i++) { for (uint64_t i = 0; i < modules_count; i++) {
if (module_list[i].after_init != 0) { if (module_list[i].after_init != 0) {
@ -67,11 +70,13 @@ void mod_after_init( ) {
} }
} }
// Запуск модулей имеющих дополнительную точку входа
module_info_t *mod_list_get(uint64_t *count) { module_info_t *mod_list_get(uint64_t *count) {
*count = modules_count; *count = modules_count;
return module_list; return module_list;
} }
// Поиск модуля по тегу
module_info_t *mod_find(char *tag) { module_info_t *mod_find(char *tag) {
for (uint64_t i = 0; i < modules_count; i++) { for (uint64_t i = 0; i < modules_count; i++) {
if (tool_str_contains(module_list[i].name, tag)) { return &module_list[i]; } if (tool_str_contains(module_list[i].name, tag)) { return &module_list[i]; }
@ -128,7 +133,7 @@ void mod_init( ) {
continue; 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); (module_info_t(*)(env_t * env)) elf_entry((elf64_header_t *)module_ptr->address);
// LOG("\t->Точка входа: 0x%x\n", module_init); // LOG("\t->Точка входа: 0x%x\n", module_init);
@ -168,6 +173,7 @@ void mod_init( ) {
LOG("Модулей обработано: %u\n", modules_count); LOG("Модулей обработано: %u\n", modules_count);
} }
// Добавление модуля
void mod_add(module_info_t module) { void mod_add(module_info_t module) {
if (modules_count == 0) { if (modules_count == 0) {
module_list = (module_info_t *)mem_alloc(sizeof(module_info_t)); module_list = (module_info_t *)mem_alloc(sizeof(module_info_t));
@ -192,6 +198,7 @@ void mod_add(module_info_t module) {
modules_count++; modules_count++;
} }
// Удаление модуля
void mod_del(module_info_t *module) { void mod_del(module_info_t *module) {
if (modules_count == 0) { if (modules_count == 0) {
LOG("Модуль не найден\n"); LOG("Модуль не найден\n");

View File

@ -50,7 +50,7 @@ static module_info_t *sys_get_module(char *module_id) {
} }
env_t *sys_install(env_t *module) { env_t *sys_install(env_t *module) {
module->fb_printf = &log_printf; module->log_printf = &log_printf;
module->alloc_framebuffer = &sys_alloc_framebuffer; module->alloc_framebuffer = &sys_alloc_framebuffer;
module->free_framebuffer = &sys_free_framebuffer; module->free_framebuffer = &sys_free_framebuffer;
module->alloc = &mem_alloc; module->alloc = &mem_alloc;

View File

@ -11,7 +11,7 @@
void *(*alloc)(uint64_t size); void *(*alloc)(uint64_t size);
void (*free)(void *ptr); 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 *(*get_module)(char *module_id);
module_info_t *(*mod_list_get)(uint64_t *count); module_info_t *(*mod_list_get)(uint64_t *count);
framebuffer_t (*alloc_framebuffer)( ); framebuffer_t (*alloc_framebuffer)( );
@ -26,7 +26,7 @@ uint64_t offset;
void init_env(env_t *loader_env) { void init_env(env_t *loader_env) {
offset = loader_env->offset; offset = loader_env->offset;
fb_printf = loader_env->fb_printf; log_printf = loader_env->log_printf;
alloc = loader_env->alloc; alloc = loader_env->alloc;
free = loader_env->free; free = loader_env->free;
get_module = loader_env->get_module; get_module = loader_env->get_module;

View File

@ -14,7 +14,7 @@
extern void *(*alloc)(uint64_t size); extern void *(*alloc)(uint64_t size);
extern void (*free)(void *ptr); 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 *(*get_module)(char *module_id);
extern module_info_t *(*mod_list_get)(uint64_t *count); extern module_info_t *(*mod_list_get)(uint64_t *count);
extern framebuffer_t (*alloc_framebuffer)( ); extern framebuffer_t (*alloc_framebuffer)( );

View File

@ -107,7 +107,7 @@ typedef struct {
typedef struct { typedef struct {
uint64_t offset; uint64_t offset;
void (*fb_printf)(char *str, ...); // Временная функция void (*log_printf)(char *str, ...); // Временная функция
framebuffer_t (*alloc_framebuffer)( ); framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame); void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size); void *(*alloc)(uint64_t size);

View File

@ -10,33 +10,33 @@ static inline void L1_cache_size( ) {
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx); cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) { if ((edx & 0xFF) == 0) {
fb_printf("L1 кэш недоступен\n"); log_printf("L1 кэш недоступен\n");
return; return;
} }
fb_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07, log_printf("L1: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x07,
(ecx >> 16) & 0xFFff); (ecx >> 16) & 0xFFff);
} }
static inline void L2_cache_size( ) { static inline void L2_cache_size( ) {
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx); cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) { if ((edx & 0xFF) == 0) {
fb_printf("L2 кэш недоступен\n"); log_printf("L2 кэш недоступен\n");
return; return;
} }
fb_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F, log_printf("L2: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", ecx & 0xFF, (ecx >> 12) & 0x0F,
(ecx >> 16) & 0xFFFF); (ecx >> 16) & 0xFFFF);
} }
static inline void L3_cache_size( ) { static inline void L3_cache_size( ) {
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
cpuid(0x80000006, &eax, &ebx, &ecx, &edx); cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
if ((edx & 0xFF) == 0) { if ((edx & 0xFF) == 0) {
fb_printf("L3 кэш недоступен\n"); log_printf("L3 кэш недоступен\n");
return; return;
} }
fb_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F, log_printf("L3: Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", edx & 0xFF, (edx >> 12) & 0x0F,
(edx >> 16) & 0xFFFF); (edx >> 16) & 0xFFFF);
} }
static void cpu_info( ) { static void cpu_info( ) {
@ -49,12 +49,12 @@ static void cpu_info( ) {
uint8_t node_id = ecx & 0xFF; uint8_t node_id = ecx & 0xFF;
uint8_t nodes_per_processor = ((ecx >> 8) & 3) + 1; uint8_t nodes_per_processor = ((ecx >> 8) & 3) + 1;
fb_printf("Топология процессора:\n"); log_printf("Топология процессора:\n");
fb_printf(" Идентификатор APIC: %u\n", apic_id); log_printf(" Идентификатор APIC: %u\n", apic_id);
fb_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id); log_printf(" Идентификатор вычислительной единицы: %u\n", compute_unit_id);
fb_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit); log_printf(" Ядра на вычислительную единицу: %u\n", cores_per_compute_unit);
fb_printf(" Идентификатор узла: %u\n", node_id); log_printf(" Идентификатор узла: %u\n", node_id);
fb_printf(" Узлы на процессор: %u\n", nodes_per_processor); log_printf(" Узлы на процессор: %u\n", nodes_per_processor);
} }
module_info_t __attribute__((section(".minit"))) init(env_t *env) { 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); cpuid(1, &eax, &ebx, &ecx, &edx);
if (ecx & (1 << 31)) { if (ecx & (1 << 31)) {
fb_printf("Запуск на эмуляторе\n"); log_printf("Запуск на эмуляторе\n");
} else { } else {
fb_printf("Запуск на физическом процессоре\n"); log_printf("Запуск на физическом процессоре\n");
} }
L1_cache_size( ); L1_cache_size( );

View File

@ -4,13 +4,13 @@ static const char name[] = "[APP]Привет мир!";
static const char message[] = "Привет из модуля!"; static const char message[] = "Привет из модуля!";
static int app_main( ) { static int app_main( ) {
fb_printf("[%s]\n", message); log_printf("[%s]\n", message);
return 2 + 2; return 2 + 2;
} }
module_info_t __attribute__((section(".minit"))) init(env_t *env) { module_info_t __attribute__((section(".minit"))) init(env_t *env) {
init_env(env); init_env(env);
fb_printf("[%s]\n", message); log_printf("[%s]\n", message);
return (module_info_t){ .name = (char *)&name, return (module_info_t){ .name = (char *)&name,
.message = (char *)&message, .message = (char *)&message,
.type = 0, .type = 0,

View File

@ -123,14 +123,14 @@ void delete_folder(folder_t *folder) {
} }
void print_folder_contents(folder_t *folder, size_t depth) { void print_folder_contents(folder_t *folder, size_t depth) {
for (size_t i = 0; i < depth; i++) { fb_printf("\t"); } for (size_t i = 0; i < depth; i++) { log_printf("\t"); }
fb_printf("- %s/\n", folder->name); log_printf("- %s/\n", folder->name);
file_t *file = folder->files; file_t *file = folder->files;
while (file != NULL) { while (file != NULL) {
for (size_t i = 0; i < depth + 1; i++) { fb_printf("\t"); } for (size_t i = 0; i < depth + 1; i++) { log_printf("\t"); }
fb_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024); log_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024);
file = file->next; file = file->next;
} }

View File

@ -20,7 +20,7 @@ void ios_main( ) {
module_info_t *kbd_mod = get_module("[KEYBOARD]"); module_info_t *kbd_mod = get_module("[KEYBOARD]");
if (kbd_mod == NULL) { if (kbd_mod == NULL) {
fb_printf("Клавиатура не найдена!\n"); log_printf("Клавиатура не найдена!\n");
delete_thread( ); delete_thread( );
for (;;) { asm volatile("hlt"); } for (;;) { asm volatile("hlt"); }
} }
@ -28,47 +28,47 @@ void ios_main( ) {
getc = kbd_mod->get_func(2); getc = kbd_mod->get_func(2);
while (1) { while (1) {
fb_printf("Доступные программы:\n"); log_printf("Доступные программы:\n");
for (uint64_t i = 0; i < app_count; i++) { fb_printf(" %2u. %s\n", i, app_list[i].name); } for (uint64_t i = 0; i < app_count; i++) { log_printf(" %2u. %s\n", i, app_list[i].name); }
fb_printf(" %2u. Выход\n", app_count + 1); log_printf(" %2u. Выход\n", app_count + 1);
fb_printf("[IOS]>"); log_printf("[IOS]>");
char c = '\0'; char c = '\0';
do { c = getc( ); } while (!is_digit(c)); do { c = getc( ); } while (!is_digit(c));
fb_printf(" %c\n", c); log_printf(" %c\n", c);
int select = char_to_digit(c); int select = char_to_digit(c);
if (select == app_count + 1) { if (select == app_count + 1) {
fb_printf("Выход\n"); log_printf("Выход\n");
delete_thread( ); delete_thread( );
for (;;) { asm volatile("hlt"); } for (;;) { asm volatile("hlt"); }
} }
if (select > app_count - 1) { if (select > app_count - 1) {
fb_printf("Ошибка! %u не входит в список\n"); log_printf("Ошибка! %u не входит в список\n");
continue; 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 (*app)( ) = (int (*)( ))app_list[select].data;
int ret = (*app)( ); 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( ) { static void main( ) {
fb_printf("IOS (input-output shell) - оболочка ввода-вывода\n"); log_printf("IOS (input-output shell) - оболочка ввода-вывода\n");
mod_count = alloc(sizeof(uint64_t)); mod_count = alloc(sizeof(uint64_t));
mod_list = mod_list_get(mod_count); mod_list = mod_list_get(mod_count);
app_list = alloc((*mod_count) * sizeof(module_info_t)); app_list = alloc((*mod_count) * sizeof(module_info_t));
if (app_list == NULL) { if (app_list == NULL) {
fb_printf("Ошибка выделения памяти для app_list!\n"); log_printf("Ошибка выделения памяти для app_list!\n");
delete_thread( ); delete_thread( );
for (;;) { asm volatile("hlt"); } for (;;) { asm volatile("hlt"); }
} }
@ -77,7 +77,7 @@ static void main( ) {
for (uint64_t i = 0; i < *mod_count; i++) { for (uint64_t i = 0; i < *mod_count; i++) {
if (str_contains(mod_list[i].name, "[APP]")) { 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_list[app_count] = mod_list[i];
app_count++; app_count++;
} }
@ -86,7 +86,7 @@ static void main( ) {
free(mod_count); free(mod_count);
if (app_count < 1) { if (app_count < 1) {
fb_printf("Модулей-программ не обнаружено!\n"); log_printf("Модулей-программ не обнаружено!\n");
free(app_list); free(app_list);
delete_thread( ); delete_thread( );
} else { } else {

View File

@ -96,18 +96,18 @@ static inline void scan( ) {
*/ */
char *name = find_vendor(vendor); char *name = find_vendor(vendor);
fb_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot, log_printf("[%4u] %4x [%10s], устройство: %x, %u.%u.%u | ", devices, vendor, name, device_id, bus, slot,
function); function);
fb_printf("%32s", get_class_name(class_id)); log_printf("%32s", get_class_name(class_id));
/* /*
fb_printf(" | %8x : %8x", mem_addr_0, mem_lim_0); log_printf(" | %8x : %8x", mem_addr_0, mem_lim_0);
fb_printf(" | %8x : %8x", mem_addr_1, mem_lim_1); log_printf(" | %8x : %8x", mem_addr_1, mem_lim_1);
fb_printf(" | %8x : %8x", io_addr_0, io_lim_0); log_printf(" | %8x : %8x", io_addr_0, io_lim_0);
fb_printf(" | %8x : %8x", io_addr_1, io_lim_1); log_printf(" | %8x : %8x", io_addr_1, io_lim_1);
*/ */
fb_printf(" | %4x\n", status); log_printf(" | %4x\n", status);
devices++; devices++;
} }
} }
@ -120,11 +120,11 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
module_info_t *pci_data = get_module("[PCI][ADAPTER]"); module_info_t *pci_data = get_module("[PCI][ADAPTER]");
if (pci_data == NULL) { if (pci_data == NULL) {
fb_printf("Адаптер PCI данных не найден!\n"); log_printf("Адаптер PCI данных не найден!\n");
num_vendors = 0; num_vendors = 0;
} else { } else {
num_vendors = pci_data->data_size - 1; 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; vendor_list = (vendor_t **)pci_data->data;
} }

View File

@ -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) { static void print_vendors(uint64_t num_vendors, vendor_t **vendor_list) {
for (uint64_t i = 0; i < num_vendors; i++) { for (uint64_t i = 0; i < num_vendors; i++) {
vendor_t *vendor = vendor_list[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]"); 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, ';'); 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); vendor_t **vendor_list = parse_file(pci_data->data, num_vendors, pci_data->data_size);
// print_vendors(num_vendors, vendor_list); // print_vendors(num_vendors, vendor_list);

View File

@ -80,11 +80,11 @@ static void handler( ) {
switch (scancode) { switch (scancode) {
case 0x01: case 0x01:
fb_printf("ВЫХОД\n"); log_printf("ВЫХОД\n");
virt_exit( ); virt_exit( );
break; // Клавиша "ESCAPE" break; // Клавиша "ESCAPE"
case 0x4F: // Клавиша "END" case 0x4F: // Клавиша "END"
fb_printf("END?\n"); log_printf("END?\n");
break; break;
default: break; default: break;
} }

View File

@ -14,20 +14,20 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
if ((edx >> 0) & 1) { if ((edx >> 0) & 1) {
asm volatile("finit"); 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) { if ((edx >> 25) & 1) {
fb_printf("SSE2 поддерживается!\n"); log_printf("SSE2 поддерживается!\n");
fb_printf("Адрес региона fxsave 0x%x\n", &fxsave_region); log_printf("Адрес региона fxsave 0x%x\n", &fxsave_region);
asm volatile(" fxsave %0 " ::"m"(fxsave_region)); asm volatile(" fxsave %0 " ::"m"(fxsave_region));
uint32_t sse_version = (ecx >> 25) & 0x7; 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", return (module_info_t){ .name = (char *)"SIMD",
.message = (char *)"SIMD инструкции", .message = (char *)"SIMD инструкции",

View File

@ -1,6 +1,6 @@
#include <system.h> #include <system.h>
#define TGA_ERR( ) fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__); #define TGA_ERR( ) log_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
typedef struct { typedef struct {
unsigned char magic1; // должно быть нулевым unsigned char magic1; // должно быть нулевым