aos/lib/spawn/spawn.c
Daniel Schwyn a7a01f8ea1 Bug fixes
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-04-04 15:16:17 +02:00

116 lines
3.5 KiB
C

#include <ctype.h>
#include <string.h>
#include <aos/aos.h>
#include <spawn/spawn.h>
#include <elf/elf.h>
#include <aos/dispatcher_arch.h>
#include <aos/lmp_chan.h>
#include <aos/aos_rpc.h>
#include <barrelfish_kpi/paging_arm_v8.h>
#include <barrelfish_kpi/domain_params.h>
#include <spawn/multiboot.h>
#include <spawn/argv.h>
extern struct bootinfo *bi;
extern coreid_t my_core_id;
/**
* \brief Set the base address of the .got (Global Offset Table) section of the ELF binary
*
* \param arch_load_info This must be the base address of the .got section (local to the
* child's VSpace). Must not be NULL.
* \param handle The handle for the new dispatcher that is to be spawned. Must not be NULL.
* \param enabled_area The "resume enabled" register set. Must not be NULL.
* \param disabled_area The "resume disabled" register set. Must not be NULL.
*/
__attribute__((__used__))
static void armv8_set_registers(void *arch_load_info,
dispatcher_handle_t handle,
arch_registers_state_t *enabled_area,
arch_registers_state_t *disabled_area)
{
assert(arch_load_info != NULL);
uintptr_t got_base = (uintptr_t) arch_load_info;
struct dispatcher_shared_aarch64 * disp_arm = get_dispatcher_shared_aarch64(handle);
disp_arm->got_base = got_base;
enabled_area->regs[REG_OFFSET(PIC_REGISTER)] = got_base;
disabled_area->regs[REG_OFFSET(PIC_REGISTER)] = got_base;
}
/**
* TODO(M2): Implement this function.
* \brief Spawn a new dispatcher called 'argv[0]' with 'argc' arguments.
*
* This function spawns a new dispatcher running the ELF binary called
* 'argv[0]' with 'argc' - 1 additional arguments. It fills out 'si'
* and 'pid'.
*
* \param argc The number of command line arguments. Must be > 0.
* \param argv An array storing 'argc' command line arguments.
* \param si A pointer to the spawninfo struct representing
* the child. It will be filled out by this function. Must not be NULL.
* \param pid A pointer to a domainid_t variable that will be
* assigned to by this function. Must not be NULL.
* \return Either SYS_ERR_OK if no error occured or an error
* indicating what went wrong otherwise.
*/
errval_t spawn_load_argv(int argc, char *argv[], struct spawninfo *si,
domainid_t *pid) {
// TODO: Implement me
// - Initialize the spawn_info struct
// - Get the module from the multiboot image
// and map it (take a look at multiboot.c)
// - Setup the child's cspace
// - Setup the child's vspace
// - Load the ELF binary
// - Setup the dispatcher
// - Setup the environment
// - Make the new dispatcher runnable
return LIB_ERR_NOT_IMPLEMENTED;
}
/**
* TODO(M2): Implement this function.
* \brief Spawn a new dispatcher executing 'binary_name'
*
* \param binary_name The name of the binary.
* \param si A pointer to a spawninfo struct that will be
* filled out by spawn_load_by_name. Must not be NULL.
* \param pid A pointer to a domainid_t that will be
* filled out by spawn_load_by_name. Must not be NULL.
*
* \return Either SYS_ERR_OK if no error occured or an error
* indicating what went wrong otherwise.
*/
errval_t spawn_load_by_name(char *binary_name, struct spawninfo * si,
domainid_t *pid) {
// TODO: Implement me
// - Get the mem_region from the multiboot image
// - Fill in argc/argv from the multiboot command line
// - Call spawn_load_argv
return LIB_ERR_NOT_IMPLEMENTED;
}