fxBoot/src/hypervisor/loader.c

71 lines
1.7 KiB
C

//---
// fxBoot:hypervisor:loader - ELF loader interface
//---
#include "fxBoot/hypervisor.h"
#include "fxBoot/fs/smemfs.h"
#include "fxBoot/terminal.h"
#include "./src/hypervisor/internal/elf.h"
#include <gint/std/stdlib.h>
#include <gint/bfile.h>
//---
// Internal helpers
//---
/* hypervisor_get_image_list(): Dump all ELF file stored into the SMEM */
static int hypervisor_get_img_list(struct himage ***image,
struct smemfs_inode *inode)
{
if (inode == NULL)
return (0);
int counter = 0;
if (inode->type != BFile_Type_Archived) {
counter += hypervisor_get_img_list(image, inode->child);
goto anchor;
}
if (hypervisor_elf_loader_header_check(inode) == hel_header_valid) {
(**image) = calloc(sizeof(struct himage), 1);
if ((**image) == NULL) {
terminal_write("hypervisor: out of memory :(\n");
goto anchor;
}
(**image)->name = inode->name;
(**image)->private = inode;
*image = &((**image)->next);
}
anchor:
return (hypervisor_get_img_list(image, inode->sibling) + counter);
}
//---
// User API
//---
/* hypervisor_loader(): Load a ELF (must be PIE) and start it */
int hypervisor_loader(struct himage *image)
{
(void)image;
//TODO: create a new world context
//TODO: try to load the image
//TODO: link the new world context
//TODO: perform a world switch.
return (0);
}
/* hypervisor_loader_list(): Return a list of all supported file on SMEM */
int hypervisor_loader_list(struct himage **list)
{
return (hypervisor_get_img_list(&list, smemfs_superblock.root_inode));
}
/* hypervisor_loader_list_destroy(): Destroy the image image list */
void hypervisor_loader_list_destroy(struct himage **list)
{
if (list == NULL || *list == NULL)
return;
hypervisor_loader_list_destroy(&(*list)->next);
free(*list);
*list = NULL;
}