Files
espLinuxESPIDF/src/boot/apios.c
T
2026-05-06 19:51:30 +07:00

111 lines
4.2 KiB
C
Executable File

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "boot/apios.h"
#include "boot/typedef.h"
#include "boot/answer_code.h"
#include "boot/entry.h"
apios_main_table_t *apios_table = NULL;
int apios_dump() {
if (apios_table == NULL) {
printf("\033[31mError: APIOS table is NULL (not initialized)\033[0m\n");
return APIOS_ERR_NOT_INITIALIZED;
}
printf("\n--- \033[34mAPIOS System Dump\033[0m ---\n");
printf("Main Table Address: %p\n", (void*)apios_table);
printf("Magic: 0x%04X\n", apios_table->magic);
printf("Total Drivers: %d\n", apios_table->drivers_count);
printf("---------------------------\n");
for (int i = 0; i < apios_table->drivers_count; i++) {
driver_header_t *header = apios_table->drivers[i];
if (header == NULL) {
printf(" [%d] Header is NULL!\n", i);
continue;
}
printf(" [%d] Driver Name: \033[32m%s\033[0m\n", i, header->driver_name);
printf(" Header Addr: %p\n", (void*)header);
driver_api_t *api = header->api;
if (api == NULL) {
printf(" \033[31m! API Table is NULL\033[0m\n");
continue;
}
printf(" API Addr: %p (v%d)\n", (void*)api, api->driver_version);
printf(" Functions Count: %d\n", api->fn_count);
if (api->functions != NULL) {
printf(" Functions List:\n");
for (int f = 0; f < api->fn_count; f++) {
printf(" - [%d] %-15s -> Addr: %p\n",
f,
api->functions[f].name,
(void*)api->functions[f].driver_fn);
}
} else {
printf(" \033[31m! No functions array found\033[0m\n");
}
printf("---------------------------\n");
}
return OS_OK;
}
int hendle_func(int_fn_t *func, char driver_name[16], char func_name[16]) {
if (apios_table == NULL) return APIOS_ERR_NOT_INITIALIZED;
bool drv_found = false;
for (int i = 0; i < apios_table->drivers_count; i++) {
if (strcmp(apios_table->drivers[i]->driver_name, driver_name) == 0) {
drv_found = true;
driver_api_t *api = apios_table->drivers[i]->api;
bool fn_found = false;
for (int f = 0; f < api->fn_count; f++) {
if (strcmp(api->functions[f].name, func_name) == 0) {
*func = api->functions[f].driver_fn;
fn_found = true;
return OS_OK;
}
}
if (!fn_found) return APIOS_ERR_DRIVER_CRASH;
}
}
if (!drv_found) return APIOS_ERR_DRIVER_NOT_FOUND;
return OS_ERR_NOT_FOUND;
}
int init_apios(apios_main_table_t *apios_table_) {
if (apios_table == NULL) {
if (load_log) printf("APIOS initings...\n");
apios_table = (apios_main_table_t *)malloc(sizeof(apios_main_table_t));
if (apios_table == NULL){
if (load_log) printf("Failed to initialize table\n");
return OS_ERR_NO_MEMORY;
}
static driver_fn_t fs_function[] = {
{
.name = "dump",
.driver_fn = apios_dump,
}
};
driver_api_t *fs_api = (driver_api_t *)malloc(sizeof(driver_api_t));
fs_api->driver_version = 1;
fs_api->fn_count = (int)(sizeof(fs_function)/sizeof(fs_function[0]));
fs_api->functions = fs_function;
driver_header_t *driver_header = (driver_header_t *)malloc(sizeof(driver_header_t));
strcpy(driver_header->driver_name, "apios");
driver_header->api = fs_api;
apios_table->magic = 0xfa0c;
apios_table->drivers = (driver_header_t **)malloc(sizeof(driver_header_t *) * 100);
apios_table->drivers_count = 0;
apios_table->drivers[apios_table->drivers_count] = driver_header;
apios_table->drivers_count++;
}
else {
if (load_log) printf("The table does not require initialization\n");
return OS_WRN_NOT_NEED_INIT;
}
return OS_OK;
}