arch-m68k.h 7.2 KB

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