bdk: ianos: restructure for future expansion
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
16
bdk/module.h
16
bdk/module.h
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user