| //------------------------------------------------------------------------------ | |
| // | |
| // Make ECALL to SBI | |
| // | |
| // Copyright (c) 2023, Ventana Micro Systems Inc. All rights reserved.<BR> | |
| // | |
| // SPDX-License-Identifier: BSD-2-Clause-Patent | |
| // | |
| //------------------------------------------------------------------------------ | |
| #include <Register/RiscV64/RiscVImpl.h> | |
| .data | |
| .align 3 | |
| .section .text | |
| // | |
| // Make ECALL to SBI | |
| // ecall updates the same a0 and a1 registers with | |
| // return values. Hence, the C function which calls | |
| // this should pass the address of Arg0 and Arg1. | |
| // This routine saves the address and updates it | |
| // with a0 and a1 once ecall returns. | |
| // | |
| // @param a0 : Pointer to Arg0 | |
| // @param a1 : Pointer to Arg1 | |
| // @param a2 : Arg2 | |
| // @param a3 : Arg3 | |
| // @param a4 : Arg4 | |
| // @param a5 : Arg5 | |
| // @param a6 : FunctionID | |
| // @param a7 : ExtensionId | |
| // | |
| ASM_FUNC (RiscVSbiEcall) | |
| mv t0, a0 | |
| mv t1, a1 | |
| ld a0, 0(a0) | |
| ld a1, 0(a1) | |
| ecall | |
| sd a0, 0(t0) | |
| sd a1, 0(t1) | |
| ret |