mirror of
https://github.com/0Nera/BMOSP.git
synced 2024-12-22 14:02:34 +03:00
fb_printf заменен на log_printf
Мы не можем гарантировать наличие фреймбуффера
This commit is contained in:
parent
00cbc46cb7
commit
d6691de198
3
build.sh
3
build.sh
@ -1,6 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
dos2unix *.sh
|
||||
|
||||
cd modlib/lib/
|
||||
dos2unix build.sh
|
||||
chmod +x build.sh
|
||||
./build.sh
|
||||
cd ../..
|
||||
|
@ -28,9 +28,9 @@
|
||||
|
||||
- `-1 не удалось выделить память для буфера кадра`.
|
||||
|
||||
## fb_printf(char *str, ...)
|
||||
## log_printf(char *str, ...)
|
||||
|
||||
Форматированный вывод строки на экран используя функцию ядра fb_printf.
|
||||
Форматированный вывод строки на экран используя функцию ядра log_printf.
|
||||
|
||||
### Будет удалено в ближайших обновлениях
|
||||
|
||||
|
@ -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( )
|
||||
|
||||
|
@ -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
|
@ -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);
|
||||
|
@ -1,3 +1,3 @@
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_BUILD 52
|
||||
#define VERSION_BUILD 57
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)( );
|
||||
|
@ -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);
|
||||
|
@ -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( );
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 инструкции",
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include <system.h>
|
||||
|
||||
#define TGA_ERR( ) fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||
#define TGA_ERR( ) log_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||
|
||||
typedef struct {
|
||||
unsigned char magic1; // должно быть нулевым
|
||||
|
Loading…
Reference in New Issue
Block a user