From d68977acd4903a081e2f8a5ee924fddb588827e5 Mon Sep 17 00:00:00 2001 From: Akash Kollipara Date: Mon, 15 Aug 2022 18:47:24 +0530 Subject: [PATCH] Updated machine call structure - Moved machine call to header files to accomodate library creation for apps (future plans) Issue: #155 --- src/arch/avr/8/common_5x_6/terravisor/arch.c | 24 +----------- .../8/common_5x_6/terravisor/include/arch.h | 31 +++++++++++----- src/arch/riscv/32/i/terravisor/arch.c | 27 -------------- src/arch/riscv/32/i/terravisor/include/arch.h | 37 +++++++++++++++---- 4 files changed, 54 insertions(+), 65 deletions(-) diff --git a/src/arch/avr/8/common_5x_6/terravisor/arch.c b/src/arch/avr/8/common_5x_6/terravisor/arch.c index 1530bf8c..f11ee6ae 100644 --- a/src/arch/avr/8/common_5x_6/terravisor/arch.c +++ b/src/arch/avr/8/common_5x_6/terravisor/arch.c @@ -12,11 +12,10 @@ #include #include #include -#include -#include #include #include #include +#include /** * arch_early_setup - This function is called in the early stages of boot @@ -24,6 +23,7 @@ * @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(); @@ -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; diff --git a/src/arch/avr/8/common_5x_6/terravisor/include/arch.h b/src/arch/avr/8/common_5x_6/terravisor/include/arch.h index 56bb5275..8a6b9704 100644 --- a/src/arch/avr/8/common_5x_6/terravisor/include/arch.h +++ b/src/arch/avr/8/common_5x_6/terravisor/include/arch.h @@ -15,6 +15,7 @@ #include #include #include +#include /** * arch_early_setup - This needs to be called in early stages of boot @@ -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 @@ -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 */ diff --git a/src/arch/riscv/32/i/terravisor/arch.c b/src/arch/riscv/32/i/terravisor/arch.c index 0221f4f3..068e43cc 100644 --- a/src/arch/riscv/32/i/terravisor/arch.c +++ b/src/arch/riscv/32/i/terravisor/arch.c @@ -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(); diff --git a/src/arch/riscv/32/i/terravisor/include/arch.h b/src/arch/riscv/32/i/terravisor/include/arch.h index bc926aab..cae3b34c 100644 --- a/src/arch/riscv/32/i/terravisor/include/arch.h +++ b/src/arch/riscv/32/i/terravisor/include/arch.h @@ -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 @@ -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 */