/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2019 Western Digital Corporation or its affiliates. * * Authors: * Anup Patel */ #ifndef __SBI_ECALL_INTERFACE_H__ #define __SBI_ECALL_INTERFACE_H__ /* clang-format off */ #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 /* clang-format on */ #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