/* * Copyright (c) 2018 Western Digital Corporation or its affiliates. * * Authors: * Anup Patel * * SPDX-License-Identifier: BSD-2-Clause */ #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