bdk: ianos: restructure for future expansion

This commit is contained in:
CTCaer
2026-01-29 08:58:19 +02:00
parent 1edb18a217
commit 2014a72774
6 changed files with 131 additions and 80 deletions

View File

@@ -21,7 +21,7 @@
el_status el_pread(el_ctx *ctx, void *def, size_t nb, size_t offset) el_status el_pread(el_ctx *ctx, void *def, size_t nb, size_t offset)
{ {
return ctx->pread(ctx, def, nb, offset) ? EL_OK : EL_EIO; return ctx->pread(ctx, def, nb, offset);
} }
#define EL_PHOFF(ctx, num) (((ctx)->ehdr.e_phoff + (num) *(ctx)->ehdr.e_phentsize)) #define EL_PHOFF(ctx, num) (((ctx)->ehdr.e_phoff + (num) *(ctx)->ehdr.e_phentsize))

View File

@@ -53,7 +53,7 @@ typedef enum
typedef struct el_ctx typedef struct el_ctx
{ {
bool (*pread)(struct el_ctx *ctx, void *dest, size_t nb, size_t offset); el_status (*pread)(struct el_ctx *ctx, void *dest, size_t nb, size_t offset);
/* base_load_* -> address we are actually going to load at /* base_load_* -> address we are actually going to load at
*/ */
@@ -61,6 +61,9 @@ typedef struct el_ctx
base_load_paddr, base_load_paddr,
base_load_vaddr; base_load_vaddr;
/* original memory of binary */
Elf_Addr eaddr;
/* size in memory of binary */ /* size in memory of binary */
Elf_Addr memsz; Elf_Addr memsz;

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2018 M4xw * Copyright (c) 2018 M4xw
* Copyright (c) 2018-2019 CTCaer * Copyright (c) 2018-2026 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@@ -27,97 +27,136 @@
#include <gfx_utils.h> #include <gfx_utils.h>
#define IRAM_LIB_ADDR 0x4002B000
#define DRAM_LIB_ADDR 0xE0000000
extern heap_t _heap; extern heap_t _heap;
void *elfBuf = NULL; static bdk_params_t _bdk_params = {
void *fileBuf = NULL; .gfx_con = (void *)&gfx_con,
.gfx_ctx = (void *)&gfx_ctxt,
.heap = &_heap,
.memcpy = (memcpy_t)&memcpy,
.memset = (memset_t)&memset,
static void _ianos_call_ep(moduleEntrypoint_t entrypoint, void *moduleConfig) .extension_magic = 0
{ };
bdkParams_t bdkParameters = (bdkParams_t)malloc(sizeof(struct _bdkParams_t));
bdkParameters->gfxCon = (void *)&gfx_con;
bdkParameters->gfxCtx = (void *)&gfx_ctxt;
bdkParameters->memcpy = (memcpy_t)&memcpy;
bdkParameters->memset = (memset_t)&memset;
bdkParameters->sharedHeap = &_heap;
// Extra functions.
bdkParameters->extension_magic = IANOS_EXT0;
bdkParameters->reg_voltage_set = (reg_voltage_set_t)&max7762x_regulator_set_voltage;
entrypoint(moduleConfig, bdkParameters);
}
static void *_ianos_alloc_cb(el_ctx *ctx, Elf_Addr phys, Elf_Addr virt, Elf_Addr size) static void *_ianos_alloc_cb(el_ctx *ctx, Elf_Addr phys, Elf_Addr virt, Elf_Addr size)
{ {
(void)ctx;
(void)phys;
(void)size;
return (void *)virt; return (void *)virt;
} }
static bool _ianos_read_cb(el_ctx *ctx, void *dest, size_t numberBytes, size_t offset) static el_status _ianos_read_cb(el_ctx *ctx, void *dest, size_t nb, size_t offset)
{ {
(void)ctx; memcpy(dest, (void *)(ctx->eaddr + offset), nb);
memcpy(dest, fileBuf + offset, numberBytes); return EL_OK;
return true;
} }
//TODO: Support shared libraries. //TODO: Support shared libraries.
uintptr_t ianos_loader(char *path, elfType_t type, void *moduleConfig) int ianos_loader(ianos_lib_t *lib, char *path)
{ {
el_ctx ctx; el_ctx ctx;
uintptr_t epaddr = 0; lib->buf = NULL;
if (!lib->bdk)
lib->bdk = &_bdk_params;
// Read library. // Read library.
fileBuf = sd_file_read(path, NULL); ctx.eaddr = (Elf_Addr)sd_file_read(path, NULL);
if (!ctx.eaddr)
if (!fileBuf) goto error;
goto out;
ctx.pread = _ianos_read_cb; ctx.pread = _ianos_read_cb;
if (el_init(&ctx)) if (el_init(&ctx))
goto out; goto error;
if (lib->type & IA_SHARED_LIB)
goto error; // No support for shared libs now.
// Set our relocated library's buffer. // Set our relocated library's buffer.
switch (type & 0xFFFF) switch (lib->type & ~IA_SHARED_LIB)
{ {
case EXEC_ELF: case IA_DRAM_LIB:
case AR64_ELF: lib->buf = malloc(ctx.memsz); // Aligned to 0x10 by default.
elfBuf = (void *)DRAM_LIB_ADDR;
break; break;
case IA_IRAM_LIB:
break;
case IA_AUTO_LIB: // Default to DRAM for now.
default: default:
elfBuf = malloc(ctx.memsz); // Aligned to 0x10 by default. lib->buf = malloc(ctx.memsz); // Aligned to 0x10 by default.
break;
} }
if (!elfBuf) if (!lib->buf)
goto out; goto error;
// Load and relocate library. // Load and relocate library.
ctx.base_load_vaddr = ctx.base_load_paddr = (uintptr_t)elfBuf; ctx.base_load_vaddr = ctx.base_load_paddr = (Elf_Addr)lib->buf;
if (el_load(&ctx, _ianos_alloc_cb)) if (el_load(&ctx, _ianos_alloc_cb))
goto out_free; goto error;
if (el_relocate(&ctx)) if (el_relocate(&ctx))
goto out_free; goto error;
free((void *)ctx.eaddr);
// Launch. // Launch.
epaddr = ctx.ehdr.e_entry + (uintptr_t)elfBuf; Elf_Addr epaddr = ctx.ehdr.e_entry + (Elf_Addr)lib->buf;
moduleEntrypoint_t ep = (moduleEntrypoint_t)epaddr; moduleEntrypoint ep = (moduleEntrypoint)epaddr;
ep(lib->private, lib->bdk);
_ianos_call_ep(ep, moduleConfig); return 0;
out_free: error:
free(fileBuf); free((void *)ctx.eaddr);
elfBuf = NULL; free(lib->buf);
fileBuf = NULL;
out: return 1;
return epaddr; }
}
uintptr_t ianos_static_module(char *path, void *private)
{
el_ctx ctx;
Elf_Addr buf = 0;
Elf_Addr epaddr = 0;
// Read library.
ctx.eaddr = (Elf_Addr)sd_file_read(path, NULL);
if (!ctx.eaddr)
goto error;
ctx.pread = _ianos_read_cb;
// Initialize elfload context.
if (el_init(&ctx))
goto error;
// Set our relocated library's buffer.
buf = (Elf_Addr)malloc(ctx.memsz); // Aligned to 0x10 by default.
if (!buf)
goto error;
// Load and relocate library.
ctx.base_load_vaddr = ctx.base_load_paddr = buf;
if (el_load(&ctx, _ianos_alloc_cb))
goto error;
if (el_relocate(&ctx))
goto error;
free((void *)ctx.eaddr);
// Launch.
epaddr = ctx.ehdr.e_entry + buf;
moduleEntrypoint ep = (moduleEntrypoint)epaddr;
ep(private, &_bdk_params);
return (uintptr_t)epaddr;
error:
free((void *)ctx.eaddr);
free((void *)buf);
return 0;
}

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2018 M4xw * Copyright (c) 2018 M4xw
* Copyright (c) 2018 CTCaer * Copyright (c) 2018-2026 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@@ -19,16 +19,26 @@
#define IANOS_H #define IANOS_H
#include <utils/types.h> #include <utils/types.h>
#include <module.h>
typedef enum typedef enum
{ {
DRAM_LIB = 0, // DRAM library. IA_DRAM_LIB = 0, // DRAM library.
EXEC_ELF = 1, // Executable elf that does not return. IA_IRAM_LIB = 1, // IRAM library. No support for now.
DR64_LIB = 2, // AARCH64 DRAM library. IA_AUTO_LIB = 2, // AUTO library. Defaults to DRAM for now.
AR64_ELF = 3, // Executable elf that does not return. IA_SHARED_LIB = BIT(7) // Shared library mask. No support for now.
KEEP_IN_RAM = (1 << 31) // Shared library mask. } ianos_type_t;
} elfType_t;
uintptr_t ianos_loader(char *path, elfType_t type, void* config); typedef struct _ianos_lib_t
{
uintptr_t epaddr;
void *buf;
void *private;
ianos_type_t type;
bdk_params_t *bdk;
} ianos_lib_t;
#endif int ianos_loader(ianos_lib_t *lib, char *path);
uintptr_t ianos_static_module(char *path, void *private); // Session-lived DRAM lib.
#endif

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2019-2025 CTCaer * Copyright (c) 2019-2026 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@@ -52,8 +52,7 @@ u32 minerva_init(minerva_str_t *mtc_str)
{ {
// Load library and do a periodic training if needed. // Load library and do a periodic training if needed.
mtc_cfg->train_mode = OP_PERIODIC_TRAIN; mtc_cfg->train_mode = OP_PERIODIC_TRAIN;
u32 ep_addr = ianos_loader("bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)mtc_cfg); mtc_call = (void *)ianos_static_module("bootloader/sys/libsys_minerva.bso", (void *)mtc_cfg);
mtc_call = (void *)ep_addr;
return !mtc_call ? 1 : 0; return !mtc_call ? 1 : 0;
} }
@@ -67,7 +66,7 @@ u32 minerva_init(minerva_str_t *mtc_str)
mtc_tmp.init_done = !no_table ? MTC_NEW_MAGIC : MTC_IRB_MAGIC; mtc_tmp.init_done = !no_table ? MTC_NEW_MAGIC : MTC_IRB_MAGIC;
// Load library and get table. // Load library and get table.
u32 ep_addr = ianos_loader("bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)&mtc_tmp); u32 ep_addr = ianos_static_module("bootloader/sys/libsys_minerva.bso", (void *)&mtc_tmp);
// Ensure that Minerva is initialized. // Ensure that Minerva is initialized.
if (mtc_tmp.init_done == MTC_INIT_MAGIC) if (mtc_tmp.init_done == MTC_INIT_MAGIC)
@@ -88,7 +87,7 @@ u32 minerva_init(minerva_str_t *mtc_str)
mtc_cfg->sdram_id = fuse_read_dramid(false); mtc_cfg->sdram_id = fuse_read_dramid(false);
mtc_cfg->init_done = !no_table ? MTC_NEW_MAGIC : MTC_IRB_MAGIC; mtc_cfg->init_done = !no_table ? MTC_NEW_MAGIC : MTC_IRB_MAGIC;
u32 ep_addr = ianos_loader("bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)mtc_cfg); u32 ep_addr = ianos_static_module("bootloader/sys/libsys_minerva.bso", (void *)mtc_cfg);
// Ensure that Minerva is initialized. // Ensure that Minerva is initialized.
if (mtc_cfg->init_done == MTC_INIT_MAGIC) if (mtc_cfg->init_done == MTC_INIT_MAGIC)

View File

@@ -1,6 +1,7 @@
/* /*
* Common Module Header * Common Module Header
* Copyright (c) 2018 M4xw * Copyright (c) 2018 M4xw
* Copyright (c) 2018-2026 CTCaer
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@@ -21,7 +22,7 @@
#include <stddef.h> #include <stddef.h>
#include <mem/heap.h> #include <mem/heap.h>
#define IANOS_EXT0 0x304E4149 #define IANOS_EXT1 0x314E4149
// Module Callback // Module Callback
typedef void (*cbMainModule_t)(const char *s); typedef void (*cbMainModule_t)(const char *s);
@@ -31,16 +32,15 @@ typedef int (*reg_voltage_set_t)(u32, u32);
typedef struct _bdkParams_t typedef struct _bdkParams_t
{ {
void *gfxCon; void *gfx_con;
void *gfxCtx; void *gfx_ctx;
heap_t *sharedHeap; heap_t *heap;
memcpy_t memcpy; memcpy_t memcpy;
memset_t memset; memset_t memset;
u32 extension_magic; u32 extension_magic;
reg_voltage_set_t reg_voltage_set; } bdk_params_t;
} *bdkParams_t;
// Module Entrypoint // Module Caller.
typedef void (*moduleEntrypoint_t)(void *, bdkParams_t); typedef void (*moduleEntrypoint)(void *, bdk_params_t *);
#endif #endif