Muteki
EABI code execution on Besta® RTOS devices.
Toggle main menu visibility
Loading...
Searching...
No Matches
abi.h
Go to the documentation of this file.
1
/*
2
* Copyright 2025 dogtopus
3
* SPDX-License-Identifier: MIT
4
*/
5
10
11
#ifndef __OSDEP_ABI_H__
12
#define __OSDEP_ABI_H__
13
14
#if defined(__clang__)
15
16
// clang: Ignore unused parameter warning and clangd's warning on asm().
17
#define NO_EXPECTED_WARNINGS_BEGIN \
18
_Pragma("clang diagnostic push") \
19
_Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \
20
_Pragma("clang diagnostic ignored \"-Wlanguage-extension-token\"")
21
#define NO_EXPECTED_WARNINGS_END \
22
_Pragma("clang diagnostic pop")
23
24
#elif defined(__GNUC__)
// !defined(__clang__)
25
26
// gcc: Ignore unused parameter warning.
27
#define NO_EXPECTED_WARNINGS_BEGIN \
28
_Pragma("GCC diagnostic push") \
29
_Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")
30
#define NO_EXPECTED_WARNINGS_END \
31
_Pragma("GCC diagnostic pop")
32
33
#else
// !defined(__GNUC__)
34
35
// No-op
36
#define NO_EXPECTED_WARNINGS_BEGIN
37
#define NO_EXPECTED_WARNINGS_END
38
39
#endif
// defined(__clang__) || defined(__GNUC__)
40
41
#define __APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, STATIC, RETTYPE, ...) \
42
NO_EXPECTED_WARNINGS_BEGIN \
43
__attribute__((naked)) STATIC RETTYPE NAME(__VA_ARGS__) { \
44
asm ( \
45
/* x x x x | a0 a1 a2 a3 ... */
\
46
"push {r0-r3}\n\t" \
47
/* x x x x | <lr> a0 a1 a2 a3 ... */
\
48
"push {lr}\n\t" \
49
/* &a0 x x x | <lr> a0 a1 a2 a3 ... */
\
50
"add r0, sp, #4\n\t" \
51
/* &a0 x &<lr> x | <lr> a0 a1 a2 a3 ... */
\
52
"mov r2, sp\n\t" \
53
"tst r2, #7\n\t" \
54
/* &a0 x flag x | [padding] <lr> a0 a1 a2 a3 ... */
\
55
"mov r2, #0\n\t" \
56
"subeq sp, sp, #4\n\t" \
57
"moveq r2, #1\n\t" \
58
/* &a0 x x x | flag [padding] <lr> a0 a1 a2 a3 ... */
\
59
"push {r2}\n\t" \
60
"bl __osdep_apcs_thunk_"#NAME "\n\t" \
61
/* ret ret_hi flag x | [padding] <lr> a0 a1 a2 a3 ... */
\
62
"pop {r2}\n\t" \
63
"cmp r2, #0\n\t" \
64
/* ret ret_hi flag x | <lr> a0 a1 a2 a3 ... */
\
65
"addne sp, sp, #4\n\t" \
66
/* ret ret_hi <lr> x | a0 a1 a2 a3 ... */
\
67
"pop {r2}\n\t" \
68
/* ret ret_hi <lr> x | ... */
\
69
"add sp, sp, #16\n\t" \
70
"bx r2" \
71
); \
72
} \
73
NO_EXPECTED_WARNINGS_END \
74
__attribute__((used)) static RETTYPE __osdep_apcs_thunk_##NAME(va_list VA_LIST_NAME)
75
111
#define APCS_WRAPPER(NAME, VA_LIST_NAME, RETTYPE, ...) \
112
__APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, , RETTYPE, __VA_ARGS__)
113
124
#define APCS_WRAPPER_STATIC(NAME, VA_LIST_NAME, RETTYPE, ...) \
125
__APCS_WRAPPER_BASE(NAME, VA_LIST_NAME, static, RETTYPE, __VA_ARGS__)
126
127
#endif
// __OSDEP_ABI_H__
include
osdep
abi.h
Generated by
1.18.0