Skip to content

Commit

Permalink
Merge pull request #156 from VisorFolks/dev_akash_ecalls_update
Browse files Browse the repository at this point in the history
  • Loading branch information
akashkollipara committed Aug 22, 2022
2 parents ce90f1b + e2cc2a9 commit ba1250d
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 65 deletions.
24 changes: 2 additions & 22 deletions src/arch/avr/8/common_5x_6/terravisor/arch.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@
#include <stdint.h>
#include <status.h>
#include <syslog.h>
#include <machine_call.h>
#include <terravisor/workers.h>
#include <plat_arch.h>
#include <mmio.h>
#include <arch.h>
#include <terravisor/workers.h>

/**
* arch_early_setup - This function is called in the early stages of boot
*
* @brief This function is responsible to clean reset cpu status/control registers.
*
*/
void (* const p_mcall)(unsigned int, unsigned int, unsigned int, unsigned int, mret_t *) = &machine_call;
void arch_early_setup()
{
arch_di();
Expand Down Expand Up @@ -72,26 +72,6 @@ void arch_wfi()
asm volatile("sleep");
}

/**
* arch_machine_call - perform machine call
*
* @brief This function emulates the machine
* call to maintain consistency.
*
* @param[in] code: machine call code
* @param[in] a0: first argument
* @param[in] a1: second argument
* @param[in] a2: third argument
* @param[in] *ret: return value
*/
void arch_machine_call(unsigned int code, unsigned int a0, unsigned int a1, unsigned int a2, mret_t *ret)
{
if(ret == NULL)
return;
machine_call(code, a0, a1, a2, ret);
return;
}

void _NORETURN arch_panic_handler_callback()
{
context_frame_t *frame;
Expand Down
31 changes: 22 additions & 9 deletions src/arch/avr/8/common_5x_6/terravisor/include/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <plat_arch.h>
#include <avr.h>
#include <mmio.h>
#include <machine_call.h>

/**
* arch_early_setup - This needs to be called in early stages of boot
Expand All @@ -38,15 +39,6 @@ void arch_ei_restore_state(istate_t *);
*/
void arch_panic_handler();

#ifdef _MACHINE_CALL_H_
/**
* arch_machine_call - Performs machine call
*
* Refer arch.c for more details.
*/
void arch_machine_call(call_arg_t, call_arg_t, call_arg_t, call_arg_t, mret_t *);
#endif

/**
* arch_register_interrupt_handler - Registers interrtup handler
* for arch specific interrupt vectors
Expand All @@ -62,6 +54,27 @@ static inline unsigned int arch_core_index()
return 0;
}

/**
* arch_machine_call - perform machine call
*
* @brief This function emulates the machine
* call to maintain consistency.
*
* @param[in] code: machine call code
* @param[in] a0: first argument
* @param[in] a1: second argument
* @param[in] a2: third argument
* @param[in] *ret: return value
*/
static inline void arch_machine_call(unsigned int code, unsigned int a0, unsigned int a1, unsigned int a2, mret_t *ret)
{
extern void (*const p_mcall)(unsigned int, unsigned int, unsigned int, unsigned int, mret_t*);
if(ret == NULL)
return;
p_mcall(code, a0, a1, a2, ret);
return;
}

/**
* arch_ei - arch enable global interrupts
*/
Expand Down
27 changes: 0 additions & 27 deletions src/arch/riscv/32/i/terravisor/arch.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,33 +95,6 @@ void arch_ei_restore_state(istate_t *istate)
asm volatile("csrs mie, %0" : : "r" (*istate));
}

/**
* arch_machine_call - perform machine call
*
* @brief This function performs environment call
* in m mode
*
* @param[in] code: machine call code
* @param[in] a0: first argument
* @param[in] a1: second argument
* @param[in] a2: third argument
* @param[in] *ret: return struct
*/
void arch_machine_call(unsigned int code, unsigned int a0, unsigned int a1, unsigned int a2, mret_t *ret)
{
if(ret == NULL)
return;
asm volatile("mv a0, %0" : : "r" (code));
asm volatile("mv a1, %0" : : "r" (a0));
asm volatile("mv a2, %0" : : "r" (a1));
asm volatile("mv a3, %0" : : "r" (a2));
asm volatile("ecall");
asm volatile("mv %0, a0" : "=r" (ret->p));
asm volatile("mv %0, a1" : "=r" (ret->size));
asm volatile("mv %0, a2" : "=r" (ret->status));
return;
}

_WEAK void arch_panic_handler()
{
const context_frame_t *frame = get_context_frame();
Expand Down
37 changes: 30 additions & 7 deletions src/arch/riscv/32/i/terravisor/include/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,6 @@ void arch_early_signal_boot_start();
void arch_wait_till_boot_done();
void arch_signal_boot_done();

/**
* arch_machine_call - Performs machine call
*
* Refer arch.c for more details.
*/
void arch_machine_call(unsigned int, unsigned int, unsigned int, unsigned int, mret_t *);

/**
* arch_register_interrupt_handler - Registers interrtup handler
* for arch specific exception vectors
Expand All @@ -67,6 +60,36 @@ static inline unsigned int arch_core_index()
return id;
}

/**
* arch_machine_call - perform machine call
*
* @brief This function performs environment call
* in m mode
*
* @param[in] code: machine call code
* @param[in] a0: first argument
* @param[in] a1: second argument
* @param[in] a2: third argument
* @param[in] *ret: return struct
*/
static inline void arch_machine_call(unsigned int code, unsigned int arg0, unsigned int arg1, unsigned int arg2, mret_t *ret)
{
if(ret == NULL)
return;
register uint32_t a0 asm("a0") = code;
register uint32_t a1 asm("a1") = arg0;
register uint32_t a2 asm("a2") = arg1;
register uint32_t a3 asm("a3") = arg2;
asm volatile("ecall"
: "+r" (a0), "+r" (a1), "+r"(a2)
: "r" (a0), "r" (a1), "r" (a2), "r" (a3)
: "memory");
ret->p = a0;
ret->size = a1;
ret->status = a2;
return;
}

/**
* arch_ei - arch enable global interrupts
*/
Expand Down

0 comments on commit ba1250d

Please sign in to comment.