File Index
Files and directories
Sign in
FILE

sbi_ecall.c

File preview with syntax highlighting.

linux-6.19.14/arch/riscv/kernel/sbi_ecall.c C
 1// SPDX-License-Identifier: GPL-2.0
 2/* Copyright (c) 2024 Rivos Inc. */
 3
 4#include <asm/sbi.h>
 5#define CREATE_TRACE_POINTS
 6#include <asm/trace.h>
 7
 8long __sbi_base_ecall(int fid)
 9{
10	struct sbiret ret;
11
12	ret = sbi_ecall(SBI_EXT_BASE, fid, 0, 0, 0, 0, 0, 0);
13	if (!ret.error)
14		return ret.value;
15	else
16		return sbi_err_map_linux_errno(ret.error);
17}
18EXPORT_SYMBOL(__sbi_base_ecall);
19
20struct sbiret __sbi_ecall(unsigned long arg0, unsigned long arg1,
21			  unsigned long arg2, unsigned long arg3,
22			  unsigned long arg4, unsigned long arg5,
23			  int fid, int ext)
24{
25	struct sbiret ret;
26
27	trace_sbi_call(ext, fid);
28
29	register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0);
30	register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1);
31	register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2);
32	register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3);
33	register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4);
34	register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5);
35	register uintptr_t a6 asm ("a6") = (uintptr_t)(fid);
36	register uintptr_t a7 asm ("a7") = (uintptr_t)(ext);
37	asm volatile ("ecall"
38		       : "+r" (a0), "+r" (a1)
39		       : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7)
40		       : "memory");
41	ret.error = a0;
42	ret.value = a1;
43
44	trace_sbi_return(ext, ret.error, ret.value);
45
46	return ret;
47}
48EXPORT_SYMBOL(__sbi_ecall);
~/ Read-only file preview.