summaryrefslogtreecommitdiff
path: root/include/sbi/sbi_ecall_interface.h
blob: 2bf004d9119bf65e8a04ee76996196e6b71bff55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2019 Western Digital Corporation or its affiliates.
 *
 * Authors:
 *   Anup Patel <anup.patel@wdc.com>
 */

#ifndef __SBI_ECALL_INTERFACE_H__
#define __SBI_ECALL_INTERFACE_H__

#define SBI_ECALL_SET_TIMER			0
#define SBI_ECALL_CONSOLE_PUTCHAR		1
#define SBI_ECALL_CONSOLE_GETCHAR		2
#define SBI_ECALL_CLEAR_IPI			3
#define SBI_ECALL_SEND_IPI			4
#define SBI_ECALL_REMOTE_FENCE_I		5
#define SBI_ECALL_REMOTE_SFENCE_VMA		6
#define SBI_ECALL_REMOTE_SFENCE_VMA_ASID	7
#define SBI_ECALL_SHUTDOWN			8

#define SBI_ECALL(__num, __a0, __a1, __a2) ({				\
	register unsigned long a0 asm ("a0") = (unsigned long)(__a0);	\
	register unsigned long a1 asm ("a1") = (unsigned long)(__a1);	\
	register unsigned long a2 asm ("a2") = (unsigned long)(__a2);	\
	register unsigned long a7 asm ("a7") = (unsigned long)(__num);	\
	asm volatile ("ecall"						\
		      : "+r" (a0)					\
		      : "r" (a1), "r" (a2), "r" (a7)			\
		      : "memory");					\
	a0;								\
})

#define SBI_ECALL_0(__num)			SBI_ECALL(__num, 0, 0, 0)
#define SBI_ECALL_1(__num, __a0)		SBI_ECALL(__num, __a0, 0, 0)
#define SBI_ECALL_2(__num, __a0, __a1)		SBI_ECALL(__num, __a0, __a1, 0)

#define sbi_ecall_console_putc(c)		\
	SBI_ECALL_1(SBI_ECALL_CONSOLE_PUTCHAR, (c));

static inline void sbi_ecall_console_puts(const char *str)
{
	while (str && *str)
		sbi_ecall_console_putc(*str++);
}

#endif