Merge pull request 'Слияние веток' (#2) from feature into master

Reviewed-on: #2
This commit is contained in:
Арен Елчинян 2024-03-04 16:20:34 +03:00
commit 82cec87a36
32 changed files with 201 additions and 93 deletions

View File

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

View File

@ -28,9 +28,9 @@
- `-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);
}
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( )

View File

@ -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

View File

@ -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);

View File

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

View File

@ -71,6 +71,7 @@ static struct gdt_desc gdt_descs[] = { { 0 },
.base_hi = 0x00 } };
extern void load_gdt(uint64_t gdtr);
void paging_init( );
uint64_t rdtsc( ) {
unsigned int lo, hi;
@ -111,4 +112,5 @@ void arch_init( ) {
pic_init( );
idt_init( );
cpu_init( );
paging_init( );
}

View File

@ -7,3 +7,52 @@
*/
#include <arch.h>
#include <log.h>
typedef struct {
uint64_t present : 1;
uint64_t rw : 1;
uint64_t user : 1;
uint64_t pwt : 1;
uint64_t pcd : 1;
uint64_t accessed : 1;
uint64_t dirty : 1;
uint64_t pat : 1;
uint64_t global : 1;
uint64_t ignored : 3;
uint64_t addr : 40;
uint64_t reserved : 11;
uint64_t no_execute : 1;
} page_table_entry_t;
// Получение адреса CR3
static inline uint64_t get_cr3( ) {
uint64_t cr3;
asm volatile("mov %%cr3, %0" : "=r"(cr3));
return cr3;
}
// Вывод флагов
void print_flags(page_table_entry_t entry) {
LOG("\tФлаги: [%c%c%c%c%c%c%c]\n", entry.present ? 'P' : '-', entry.rw ? 'W' : 'R', entry.user ? 'U' : '-',
entry.pwt ? 'T' : '-', entry.pcd ? 'D' : '-', entry.accessed ? 'A' : '-', entry.no_execute ? 'X' : 'E');
}
// Вывод структуры таблицы страниц, начиная с CR3
void print_page_structure(uint64_t cr3) {
page_table_entry_t* pml4 = (page_table_entry_t*)(cr3 & ~0xFFF); // Получаем адрес PML4
LOG("PML4 Address: 0x%x\n", pml4);
for (uint64_t i = 0; i < 512; i++) {
if (pml4[i].present) {
LOG("PML4[%d] - present\n", i);
print_flags(pml4[i]);
LOG("Адрес: 0x%x\n", pml4[i].addr);
}
}
}
void paging_init( ) {
LOG("Paging...\n");
print_page_structure(get_cr3( ));
}

View File

@ -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");

View File

@ -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;

View File

@ -1,6 +1,6 @@
#/bin/sh
CC="gcc"
AR="ar"
CC=${CC:-gcc}
AR=${AR:-ar}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
mkdir -p bin

View File

@ -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;

View File

@ -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)( );

View File

@ -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);

View File

@ -2,7 +2,7 @@
echo "Название: CPUBENCH"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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( );

View File

@ -2,7 +2,7 @@
echo "Название: Hello world"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -2,15 +2,70 @@
static const char name[] = "[APP]Привет мир!";
static const char message[] = "Привет из модуля!";
static const char logo[] = "\n\n"
"\t ,:;;;;:, \n"
"\t :++******++: \n"
"\t ;****+;;+****; \n"
"\t :****;, ,;****, \n"
"\t :****: :****: \n"
"\t ,;****+;;+****; \n"
"\t ,;+********+: \n"
"\t ,:;****;:, \n"
"\t :****, \n"
"\t :****, \n"
"\t :****, \n"
"\t :****, \n"
"\t ,:;****;:,, \n"
"\t :*********+;:, \n"
"\t :++;;+++****+;, \n"
"\t ,:;****+: \n"
"\t ,, ,,::,, :+****: \n"
"\t ,++;;, ,;+****+;, ,+***+, \n"
"\t ;****: ;********; :****: \n"
"\t ;****, ;********+ :****: \n"
"\t ,****; ,;+*****;, ,+***+, \n"
"\t ;****;, ,::::, ,+****; \n"
"\t ,:;+*****+;,, ,,;+*****+;:, \n"
"\t ,:;+****++*****+;;;;;++****+++****+;:, \n"
"\t ,,,::,,, ,:;+****+;:, :;+***********++;, ,:;+****+;:,,:;;;;;;:,, \n"
"\t ,:+++****++;:,,:;+****+;:, ,,:;;;;;;;::, ,:;+****++*********+:, \n"
"\t ,;+****++++****++****+;:, ,:;+****+;;;;+****+, \n"
"\t ,+***+;:,,,,:;+****+;:, :****;, :+***+,\n"
"\t ;***+: :+***; ;***+, :****:\n"
"\t,+***; ;***+, ;****: ,;***+,\n"
"\t +***+, ,+***+ ,+***+;:,,,:+****: \n"
"\t :+***+:, ,:+***+: ,;+***********+: \n"
"\t :+****++;;++****+, ,:;+++++++;:, \n"
"\t ,:++********++:, ,,,,, \n"
"\t ,::;;;;::, "
"\n\n";
static const char logo_synapseos[] = "\n\n"
"\t\t :::::::: ::: ::: :::: ::: ::: ::::::::: "
" :::::::: :::::::::: :::::::: ::::::::\n"
"\t\t :+: :+: :+: :+: :+:+: :+: :+: :+: :+: :+: "
" :+: :+: :+: :+: :+: :+: :+:\n"
"\t\t +:+ +:+ +:+ :+:+:+ +:+ +:+ +:+ +:+ +:+ "
" +:+ +:+ +:+ +:+ +:+\n"
"\t\t +#++:++#++ +#++: +#+ +:+ +#+ +#++:++#++: +#++:++#+ "
" +#++:++#++ +#++:++# +#+ +:+ +#++:++#++\n"
"\t\t +#+ +#+ +#+ +#+#+# +#+ +#+ +#+ "
" +#+ +#+ +#+ +#+ +#+\n"
"\t\t#+# #+# #+# #+# #+#+# #+# #+# #+# "
"#+# #+# #+# #+# #+# #+# #+#\n"
"\t\t######## ### ### #### ### ### ### "
"######## ########## ######## ########\n"
"\n\t\t\t\tМы вернулись!\n\n";
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);
log_printf("%s\n", logo);
log_printf("%s\n", logo_synapseos);
return (module_info_t){ .name = (char *)&name,
.message = (char *)&message,
.type = 0,

View File

@ -2,7 +2,7 @@
echo "Название: IMFS"
echo "Лицензия: CC BY-NC 4.0"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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;
}

View File

@ -2,7 +2,7 @@
echo "Название: IOS"
echo "Лицензия: CC BY-NC 4.0"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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 {

View File

@ -3,7 +3,7 @@ echo "Название: PCI"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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;
}

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) {
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);

View File

@ -3,7 +3,7 @@ echo "Название: PS/2"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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;
}

View File

@ -2,7 +2,7 @@
echo "Название: SIMD"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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 инструкции",

View File

@ -2,7 +2,7 @@
echo "Название: TGA"
echo "Лицензия: Публичное достояние"
CC="gcc"
CC=${CC:-gcc}
ARCH_FLAGS="-fno-stack-protector -ffreestanding -O0 -g -fPIC -static -nostdlib "
if [ -d "../../sdk" ]; then

View File

@ -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; // должно быть нулевым

View File

@ -117,12 +117,14 @@ def create_iso(IMAGE_NAME):
os.system(f"rm -f {IMAGE_NAME}.iso")
os.system(f"rm -rf iso_root")
os.system(f"mkdir -p iso_root")
os.system(f"cp -v kernel.elf configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/")
os.system(f"cp -v kernel.elf configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin" \
" limine/limine-uefi-cd.bin iso_root/")
os.system(f"mkdir -p iso_root/EFI/BOOT")
shutil.copytree("modules/bin", "iso_root/mod")
os.system(f"cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
os.system(f"cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
os.system(f"xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso")
os.system(f"xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table"\
f" --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {IMAGE_NAME}.iso")
os.system(f"./limine/limine bios-install {IMAGE_NAME}.iso")
if __name__ == "__main__":