Парсер для адаптера данных

This commit is contained in:
Aren Elchinyan 2023-11-26 13:12:57 +03:00
parent 4338b6f75c
commit beb3ab0eb6
15 changed files with 198 additions and 53 deletions

View File

@ -63,6 +63,8 @@ typedef struct {
void (*fb_printf)(char *str, ...); // Временная функция
framebuffer_t *(*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size);
void (*free)(void *ptr);
void (*exit)(int code);
int (*get_error)( );
sys_info_t *(*get_info)( );

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
#define VERSION_BUILD 591
#define VERSION_BUILD 665

View File

@ -90,6 +90,8 @@ void mod_init( ) {
}
if (!tool_starts_with(module_ptr->cmdline, "[MOD]")) {
module_list[modules_count].data_size = module_ptr->size;
module_list[modules_count].data = module_ptr->address;
module_list[modules_count].type = 255; // Неизвестный тип модуля
modules_count++;
continue;

View File

@ -6,6 +6,7 @@
*/
#include <fb.h>
#include <mem.h>
#include <mod.h>
#include <stdint.h>
#include <sys.h>
@ -54,6 +55,8 @@ env_t *sys_install(env_t *module) {
module->fb_printf = &fb_printf;
module->alloc_framebuffer = &sys_alloc_framebuffer;
module->free_framebuffer = &sys_free_framebuffer;
module->alloc = &mem_alloc;
module->free = &mem_free;
module->exit = &sys_exit;
module->get_error = &sys_get_error;
module->get_info = &sys_get_info;

View File

@ -11,7 +11,7 @@
#ifndef MODSTD_H
#define MODSTD_H
static uint64_t strlen(const char *str) {
static uint64_t strlen(char *str) {
uint64_t length = 0;
while (*str) {
length++;
@ -22,7 +22,7 @@ static uint64_t strlen(const char *str) {
static void memcpy(void *dest, void *src, uint64_t n) {
char *d = (char *)dest;
const char *s = (const char *)src;
char *s = (char *)src;
for (uint64_t i = 0; i < n; i++) { d[i] = s[i]; }
}
@ -33,10 +33,10 @@ static void *memset(void *ptr, uint8_t n, uint64_t size) {
return ptr;
}
static size_t strspn(const char *str, const char *accept) {
static size_t strspn(char *str, char *accept) {
size_t count = 0;
const char *ptr = str;
const char *acc;
char *ptr = str;
char *acc;
while (*ptr) {
acc = accept;
@ -54,10 +54,10 @@ static size_t strspn(const char *str, const char *accept) {
return count;
}
static size_t strcspn(const char *str, const char *reject) {
static size_t strcspn(char *str, char *reject) {
size_t count = 0;
const char *ptr = str;
const char *r;
char *ptr = str;
char *r;
while (*ptr) {
r = reject;
@ -72,7 +72,7 @@ static size_t strcspn(const char *str, const char *reject) {
return count;
}
static char *strtok(char *str, const char *delim) {
static char *strtok(char *str, char *delim) {
static char *token = NULL;
static char *next_token = NULL;
@ -103,7 +103,110 @@ static char *strtok(char *str, const char *delim) {
return token;
}
static char *strdup(const char *str) {
static long int strtol(char *str, char **endptr, int base) {
long int num = 0;
int sign = 1;
// Пропускаем пробелы в начале строки
while (*str == ' ') { str++; }
// Проверяем знак числа
if (*str == '-') {
sign = -1;
str++;
} else if (*str == '+') {
str++;
}
// Проверяем основание системы счисления
if (base == 0) {
// Автоопределение основания
if (*str == '0') {
str++;
if (*str == 'x' || *str == 'X') {
base = 16; // Шестнадцатеричная система счисления
str++;
} else {
base = 8; // Восьмеричная система счисления
}
} else {
base = 10; // Десятичная система счисления
}
}
// Преобразование строки в число
while (*str != '\0') {
int digit;
if (*str >= '0' && *str <= '9') {
digit = *str - '0';
} else if (*str >= 'A' && *str <= 'Z') {
digit = *str - 'A' + 10;
} else if (*str >= 'a' && *str <= 'z') {
digit = *str - 'a' + 10;
} else {
break; // Некорректный символ - прерываем преобразование
}
if (digit >= base) {
break; // Некорректная цифра - прерываем преобразование
}
num = num * base + digit;
str++;
}
if (endptr != NULL) {
*endptr = (char *)str; // Указатель на символ, следующий за числом
}
return num * sign;
}
static char *strchr(char *str, char c) {
// пройти по каждому символу строки
while (*str != '\0') {
// если символ найден, вернуть указатель на него
if (*str == c) { return (char *)str; }
str++; // переход к следующему символу
}
// символ не найден, вернуть NULL
return NULL;
}
static void *memmove(void *dest, void *src, size_t n) {
char *d = (char *)dest;
const char *s = (const char *)src;
if (d > s) {
// копирование с конца массива, чтобы предотвратить перекрытие
for (size_t i = n; i > 0; --i) { d[i - 1] = s[i - 1]; }
} else if (d < s) {
// копирование с начала массива
for (size_t i = 0; i < n; ++i) { d[i] = s[i]; }
}
return dest;
}
static char *trstr(char *str, char sym) {
size_t left, size = strlen(str);
for (left = 0x00U; left < size; left++)
if (str[left] == sym) break;
size++;
left++;
if (left < size)
size -= left;
else
left = 0x00U;
char *res = alloc(size);
memcpy(res, str + left, size);
return res;
}
static char *strdup(char *str) {
size_t len = strlen(str) + 1;
char *dup = alloc(len);
@ -112,12 +215,12 @@ static char *strdup(const char *str) {
return dup;
}
static size_t count_chars(const char *str, char c) {
static size_t count_chars(char *str, char c) {
size_t count = 0;
size_t len = strlen(str);
while (*str) {
if (*str == c) { count++; }
str++;
for (size_t i = 0; i < len; i++) {
if (str[i] == c) { count++; }
}
return count;

View File

@ -6,19 +6,24 @@
*
*/
#include <modstd.h>
#include <types.h>
#ifndef SYSTEM_H
#define SYSTEM_H
#include <types.h>
static void *(*alloc)(uint64_t size);
static void (*free)(void *ptr);
static void (*fb_printf)(char *str, ...);
static module_info_t *(*get_module)(char *module_id);
static uint64_t offset;
#include <modstd.h>
static inline void init_env(env_t *loader_env) {
offset = loader_env->offset;
fb_printf = loader_env->fb_printf;
alloc = loader_env->alloc;
free = loader_env->free;
get_module = loader_env->get_module;
}

View File

@ -69,6 +69,8 @@ typedef struct {
void (*fb_printf)(char *str, ...); // Временная функция
framebuffer_t *(*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size);
void (*free)(void *ptr);
void (*exit)(int code);
int (*get_error)( );
sys_info_t *(*get_info)( );

View File

@ -3,7 +3,7 @@ echo "Название: CPUBENCH"
echo "Лицензия: Публичное достояние"
CC="gcc"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib "
if [ -d "../../sdk" ]; then
CC="../../sdk/bin/x86_64-elf-gcc"
@ -11,6 +11,6 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o cpubench.o
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init cpubench.o -o cpubench.ko
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none cpubench.o -o cpubench.ko
cp cpubench.ko ../bin/
echo "Сборка завершена, файл: cpubench.ko"

View File

@ -3,7 +3,7 @@ echo "Название: Hello world"
echo "Лицензия: Публичное достояние"
CC="gcc"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib "
if [ -d "../../sdk" ]; then
CC="../../sdk/bin/x86_64-elf-gcc"
@ -11,7 +11,7 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o hello.o
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init hello.o -o hello.ko
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none hello.o -o hello.ko
cp hello.ko ../bin/
echo "Сборка завершена, файл: hello.ko"

View File

@ -3,7 +3,7 @@ echo "Название: Мелодия из тетриса"
echo "Лицензия: Публичное достояние"
CC="gcc"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib "
if [ -d "../../sdk" ]; then
CC="../../sdk/bin/x86_64-elf-gcc"
@ -11,7 +11,7 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o music.o
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init music.o -o music.ko
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none music.o -o music.ko
cp music.ko ../bin/
echo "Сборка завершена, файл: music.ko"

View File

@ -4,7 +4,7 @@ echo "Лицензия: Публичное достояние"
CC="gcc"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib "
if [ -d "../../sdk" ]; then
CC="../../sdk/bin/x86_64-elf-gcc"
@ -12,7 +12,7 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o pci.o
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init pci.o -o pci.ko
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none pci.o -o pci.ko
cp pci.ko ../bin/
echo "Сборка завершена, файл: pci.ko"

View File

@ -79,7 +79,7 @@ static inline void scan( ) {
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
init_env(env);
module_info_t *pci_data = get_module("[PCI][DATA]");
module_info_t *pci_data = get_module("[PCI][ADAPTER]");
if (pci_data == NULL) {
fb_printf("Модуль PCI данных не найден!\n");

View File

@ -1,8 +1,8 @@
#/bin/sh
echo "Название: список устройств и производителей для PCI"
echo "Лицензия: Публичное достояние"
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o pci_data.o
gcc -Wl,--entry=init -fPIC -shared -nostdlib pci_data.o -o pci_data.ko
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib -Wno-builtin-declaration-mismatch main.c -o pci_data.o
gcc -Wl,--entry=init,--build-id=none -fPIC -shared -nostdlib pci_data.o -o pci_data.ko
cp pci_data.ko ../bin/
cp pci_vendors.txt ../bin/
echo "Сборка завершена, файл: pci_data.ko"

View File

@ -3,27 +3,45 @@ typedef struct {
char *name;
uint16_t id;
} vendor_t;
/*
vendor_t *parse_file(char *str, int *num_vendors) {
vendor_t *vendor_list = NULL;
int size = 0;
char *token;
char *line = strtok(str, "\n");
static vendor_t *parse_file(char *str, uint64_t num_vendors, uint64_t size) {
vendor_t *vendor_list = alloc(num_vendors * sizeof(vendor_t));
if (vendor_list == NULL) { return NULL; }
while (line != NULL) {
vendor_list = realloc(vendor_list, (size + 1) * sizeof(vendor_t));
token = strtok(line, ";");
vendor_list[size].id = (uint16_t)strtol(token, NULL, 16);
token = strtok(NULL, ";");
vendor_list[size].name = strdup(token);
size++;
line = strtok(NULL, "\n");
}
char *line = str;
uint64_t i = 0;
while (line != NULL && i < num_vendors) {
char *name = trstr(line, ';');
char *id_str = strtok(line, ";");
name = strtok(name, "\n");
fb_printf("\t%s, %s\n", id_str, name);
*num_vendors = size;
return vendor_list;
}*/
if (id_str != NULL && name != NULL) {
fb_printf("\tID: 0x%x, Name: %s\n", strtol(id_str, NULL, 16), name);
vendor_list[i].id = strtol(id_str, NULL, 16);
vendor_list[i].name = name;
i++;
}
line = trstr(line, '\n');
fb_printf(line);
}
if (i != num_vendors) {
// Ошибка в парсинге данных
for (uint64_t j = 0; j < i; j++) { free(vendor_list[j].name); }
free(vendor_list);
return NULL;
}
return vendor_list;
}
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);
}
}
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
init_env(env);
@ -33,12 +51,22 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
if (pci_data == NULL) { fb_printf("Модуль PCI данных не найден!\n"); }
char *str = pci_data->data;
int num_vendors = count_chars(str, ';');
// vendor_t *vendor_list = parse_file(str, &num_vendors);
vendor_t *vendor_list;
uint64_t num_vendors = count_chars(str, ';');
uint64_t i = 1;
char *line = str;
while (line != NULL && i < num_vendors) {
i++;
line = trstr(line, '\n');
fb_printf("\t\t%u\n%s\n", i, line);
}
fb_printf("Количество вендоров: %u\n", num_vendors);
for (;;) {}
vendor_t *vendor_list = parse_file(str, num_vendors, pci_data->data_size);
// print_vendors(num_vendors, vendor_list);
return (module_info_t){
.name = (char *)"[PCI][DATA]",
.name = (char *)"[PCI][ADAPTER]",
.message = (char *)"PCI данные",
.type = 0,
.data_size = num_vendors,

View File

@ -3,7 +3,7 @@ echo "Название: SIMD"
echo "Лицензия: Публичное достояние"
CC="gcc"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib"
ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -shared -nostdlib "
if [ -d "../../sdk" ]; then
CC="../../sdk/bin/x86_64-elf-gcc"
@ -11,7 +11,7 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o simd.o
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init simd.o -o simd.ko
$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none simd.o -o simd.ko
cp simd.ko ../bin/
echo "Сборка завершена, файл: simd.ko"