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