/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <sel4/types.h>
#include <sel4utils/thread.h>
#include <stdbool.h>
#include <vka/vka.h>
#include <vspace/vspace.h>

#if CONFIG_WORD_SIZE == 64
#define Elf_auxv_t Elf64_auxv_t
#elif CONFIG_WORD_SIZE == 32
#define Elf_auxv_t Elf32_auxv_t
#else
#error "Word size unsupported"
#endif /* CONFIG_WORD_SIZE */

/* write to a remote stack */
int sel4utils_stack_write(vspace_t *current_vspace, vspace_t *target_vspace,
                      vka_t *vka, void *buf, size_t len, uintptr_t *stack_top);

/*
 * Initialize a threads user context for a specific architecture
 *
 * Unlike sel4utils_arch_init_context_with_args, the specified entry_point
 * does not need to be a function.
 *
 * @return 0 on success.
 */
int sel4utils_arch_init_context(void *entry_point, void *stack_top, seL4_UserContext *context);

/*
 * Legacy function to initialise a threads user context for a specific architecture, and put
 * some arguments into registers/stack.
 *
 * stack_top must be aligned to STACK_CALL_ALIGNMENT
 *
 * On x86, entry_point must be the address of a function without the NORETURN attribute.
 * Specifically, the function must be compiled under the assumption that the return
 * address was pushed onto the stack when the function is called. We aren't going to call
 * the function, but we will align the stack pointer as if it was called. This is
 * important, since the compiler emits instructions that assume alignment of the stack
 * pointer, under the assumption that functions will be called (as opposed to jumped to).
 *
 * On arm, the restriction is relaxed, as the return address is not pushed onto the stack
 * when a function is called.
 *
 * @param local_stack true of the stack is mapped in the current address space. If local stack is
 *        false and we are running on x86 (32-bit) this function will not copy arg* unless vka,
 *        local_vspace and remote_vspace are provided.
 *
 * @return 0 on success.
 */
int sel4utils_arch_init_context_with_args(sel4utils_thread_entry_fn entry_point,
                                          void *arg0, void *arg1, void *arg2,
                                          bool local_stack, void *stack_top, seL4_UserContext *context,
                                          vka_t *vka, vspace_t *local_vspace, vspace_t *remote_vspace);

/* convenient wrappers */
static inline int
sel4utils_arch_init_local_context(sel4utils_thread_entry_fn entry_point,
                                  void *arg0, void *arg1, void *arg2,
                                  void *stack_top, seL4_UserContext *context)
{
    return sel4utils_arch_init_context_with_args(entry_point, arg0, arg1, arg2, true, stack_top, context, NULL, NULL, NULL);
}

