mirror of https://github.com/0Nera/BMOSP.git
Парсер для адаптера данных
This commit is contained in:
parent
4338b6f75c
commit
beb3ab0eb6
|
@ -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)( );
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 1
|
||||
#define VERSION_BUILD 591
|
||||
#define VERSION_BUILD 665
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
131
modlib/modstd.h
131
modlib/modstd.h
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)( );
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue