xref: /linux/tools/include/nolibc/arch-m68k.h (revision 015a99fa76650e7d6efa3e36f20c0f5b346fe9ce)
1*66a4f9bbSDaniel Palmer /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2*66a4f9bbSDaniel Palmer /*
3*66a4f9bbSDaniel Palmer  * m68k specific definitions for NOLIBC
4*66a4f9bbSDaniel Palmer  * Copyright (C) 2025 Daniel Palmer<daniel@thingy.jp>
5*66a4f9bbSDaniel Palmer  *
6*66a4f9bbSDaniel Palmer  * Roughly based on one or more of the other arch files.
7*66a4f9bbSDaniel Palmer  *
8*66a4f9bbSDaniel Palmer  */
9*66a4f9bbSDaniel Palmer 
10*66a4f9bbSDaniel Palmer #ifndef _NOLIBC_ARCH_M68K_H
11*66a4f9bbSDaniel Palmer #define _NOLIBC_ARCH_M68K_H
12*66a4f9bbSDaniel Palmer 
13*66a4f9bbSDaniel Palmer #include "compiler.h"
14*66a4f9bbSDaniel Palmer #include "crt.h"
15*66a4f9bbSDaniel Palmer 
16*66a4f9bbSDaniel Palmer #define _NOLIBC_SYSCALL_CLOBBERLIST "memory"
17*66a4f9bbSDaniel Palmer 
18*66a4f9bbSDaniel Palmer #define my_syscall0(num)                                                      \
19*66a4f9bbSDaniel Palmer ({                                                                            \
20*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0") = (num);                            \
21*66a4f9bbSDaniel Palmer 									      \
22*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
23*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
24*66a4f9bbSDaniel Palmer 		: "+r"(_num)                                                  \
25*66a4f9bbSDaniel Palmer 		: "r"(_num)                                                   \
26*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
27*66a4f9bbSDaniel Palmer 	);                                                                    \
28*66a4f9bbSDaniel Palmer 	_num;                                                                 \
29*66a4f9bbSDaniel Palmer })
30*66a4f9bbSDaniel Palmer 
31*66a4f9bbSDaniel Palmer #define my_syscall1(num, arg1)                                                \
32*66a4f9bbSDaniel Palmer ({                                                                            \
33*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0") = (num);                            \
34*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
35*66a4f9bbSDaniel Palmer 									      \
36*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
37*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
38*66a4f9bbSDaniel Palmer 		: "+r"(_num)                                                  \
39*66a4f9bbSDaniel Palmer 		: "r"(_arg1)                                                  \
40*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
41*66a4f9bbSDaniel Palmer 	);                                                                    \
42*66a4f9bbSDaniel Palmer 	_num;                                                                 \
43*66a4f9bbSDaniel Palmer })
44*66a4f9bbSDaniel Palmer 
45*66a4f9bbSDaniel Palmer #define my_syscall2(num, arg1, arg2)                                          \
46*66a4f9bbSDaniel Palmer ({                                                                            \
47*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0") = (num);                            \
48*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
49*66a4f9bbSDaniel Palmer 	register long _arg2 __asm__ ("d2") = (long)(arg2);                    \
50*66a4f9bbSDaniel Palmer 									      \
51*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
52*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
53*66a4f9bbSDaniel Palmer 		: "+r"(_num)                                                  \
54*66a4f9bbSDaniel Palmer 		: "r"(_arg1), "r"(_arg2)                                      \
55*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
56*66a4f9bbSDaniel Palmer 	);                                                                    \
57*66a4f9bbSDaniel Palmer 	_num;                                                                 \
58*66a4f9bbSDaniel Palmer })
59*66a4f9bbSDaniel Palmer 
60*66a4f9bbSDaniel Palmer #define my_syscall3(num, arg1, arg2, arg3)                                    \
61*66a4f9bbSDaniel Palmer ({                                                                            \
62*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0")  = (num);                           \
63*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
64*66a4f9bbSDaniel Palmer 	register long _arg2 __asm__ ("d2") = (long)(arg2);                    \
65*66a4f9bbSDaniel Palmer 	register long _arg3 __asm__ ("d3") = (long)(arg3);                    \
66*66a4f9bbSDaniel Palmer 									      \
67*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
68*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
69*66a4f9bbSDaniel Palmer 		: "+r"(_num)                                                  \
70*66a4f9bbSDaniel Palmer 		: "r"(_arg1), "r"(_arg2), "r"(_arg3)                          \
71*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
72*66a4f9bbSDaniel Palmer 	);                                                                    \
73*66a4f9bbSDaniel Palmer 	_num;                                                                 \
74*66a4f9bbSDaniel Palmer })
75*66a4f9bbSDaniel Palmer 
76*66a4f9bbSDaniel Palmer #define my_syscall4(num, arg1, arg2, arg3, arg4)                              \
77*66a4f9bbSDaniel Palmer ({                                                                            \
78*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0") = (num);                            \
79*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
80*66a4f9bbSDaniel Palmer 	register long _arg2 __asm__ ("d2") = (long)(arg2);                    \
81*66a4f9bbSDaniel Palmer 	register long _arg3 __asm__ ("d3") = (long)(arg3);                    \
82*66a4f9bbSDaniel Palmer 	register long _arg4 __asm__ ("d4") = (long)(arg4);                    \
83*66a4f9bbSDaniel Palmer 									      \
84*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
85*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
86*66a4f9bbSDaniel Palmer 		: "+r" (_num)                                                 \
87*66a4f9bbSDaniel Palmer 		: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4)              \
88*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
89*66a4f9bbSDaniel Palmer 	);                                                                    \
90*66a4f9bbSDaniel Palmer 	_num;                                                                 \
91*66a4f9bbSDaniel Palmer })
92*66a4f9bbSDaniel Palmer 
93*66a4f9bbSDaniel Palmer #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5)                        \
94*66a4f9bbSDaniel Palmer ({                                                                            \
95*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0") = (num);                            \
96*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
97*66a4f9bbSDaniel Palmer 	register long _arg2 __asm__ ("d2") = (long)(arg2);                    \
98*66a4f9bbSDaniel Palmer 	register long _arg3 __asm__ ("d3") = (long)(arg3);                    \
99*66a4f9bbSDaniel Palmer 	register long _arg4 __asm__ ("d4") = (long)(arg4);                    \
100*66a4f9bbSDaniel Palmer 	register long _arg5 __asm__ ("d5") = (long)(arg5);                    \
101*66a4f9bbSDaniel Palmer 									      \
102*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
103*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
104*66a4f9bbSDaniel Palmer 		: "+r" (_num)                                                 \
105*66a4f9bbSDaniel Palmer 		: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5)  \
106*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
107*66a4f9bbSDaniel Palmer 	);                                                                    \
108*66a4f9bbSDaniel Palmer 	_num;                                                                 \
109*66a4f9bbSDaniel Palmer })
110*66a4f9bbSDaniel Palmer 
111*66a4f9bbSDaniel Palmer #define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6)                  \
112*66a4f9bbSDaniel Palmer ({                                                                            \
113*66a4f9bbSDaniel Palmer 	register long _num __asm__ ("d0")  = (num);                           \
114*66a4f9bbSDaniel Palmer 	register long _arg1 __asm__ ("d1") = (long)(arg1);                    \
115*66a4f9bbSDaniel Palmer 	register long _arg2 __asm__ ("d2") = (long)(arg2);                    \
116*66a4f9bbSDaniel Palmer 	register long _arg3 __asm__ ("d3") = (long)(arg3);                    \
117*66a4f9bbSDaniel Palmer 	register long _arg4 __asm__ ("d4") = (long)(arg4);                    \
118*66a4f9bbSDaniel Palmer 	register long _arg5 __asm__ ("d5") = (long)(arg5);                    \
119*66a4f9bbSDaniel Palmer 	register long _arg6 __asm__ ("a0") = (long)(arg6);                    \
120*66a4f9bbSDaniel Palmer 									      \
121*66a4f9bbSDaniel Palmer 	__asm__ volatile (                                                    \
122*66a4f9bbSDaniel Palmer 		"trap #0\n"                                                   \
123*66a4f9bbSDaniel Palmer 		: "+r" (_num)                                                 \
124*66a4f9bbSDaniel Palmer 		: "r"(_arg1), "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \
125*66a4f9bbSDaniel Palmer 		  "r"(_arg6)                                                  \
126*66a4f9bbSDaniel Palmer 		: _NOLIBC_SYSCALL_CLOBBERLIST                                 \
127*66a4f9bbSDaniel Palmer 	);                                                                    \
128*66a4f9bbSDaniel Palmer 	_num;                                                                 \
129*66a4f9bbSDaniel Palmer })
130*66a4f9bbSDaniel Palmer 
131*66a4f9bbSDaniel Palmer void _start(void);
_start(void)132*66a4f9bbSDaniel Palmer void __attribute__((weak, noreturn)) __nolibc_entrypoint __no_stack_protector _start(void)
133*66a4f9bbSDaniel Palmer {
134*66a4f9bbSDaniel Palmer 	__asm__ volatile (
135*66a4f9bbSDaniel Palmer 		"movel %sp, %sp@-\n"
136*66a4f9bbSDaniel Palmer 		"jsr _start_c\n"
137*66a4f9bbSDaniel Palmer 	);
138*66a4f9bbSDaniel Palmer 	__nolibc_entrypoint_epilogue();
139*66a4f9bbSDaniel Palmer }
140*66a4f9bbSDaniel Palmer 
141*66a4f9bbSDaniel Palmer #endif /* _NOLIBC_ARCH_M68K_H */
142