1 /*
2 * Raw syscalls.
3 *
4 * Copyright (c) 2018-2023 The strace developers.
5 * All rights reserved.
6 *
7 * SPDX-License-Identifier: LGPL-2.1-or-later
8 */
9
10 #ifndef STRACE_RAW_SYSCALL_H
11 # define STRACE_RAW_SYSCALL_H
12
13 # include "kernel_types.h"
14
15 # if __mips_isa_rev >= 6
16 # define SYSCALL_CLOBBERLIST \
17 "memory", "$1", "$3", "$8", "$9", \
18 "$10", "$11", "$12", "$13", "$14", "$15", \
19 "$24", "$25"
20 # else
21 # define SYSCALL_CLOBBERLIST \
22 "memory", "hi", "lo", "$1", "$3", "$8", "$9", \
23 "$10", "$11", "$12", "$13", "$14", "$15", \
24 "$24", "$25"
25 # endif
26
27 static inline kernel_ulong_t
28 raw_syscall_0(const kernel_ulong_t nr, kernel_ulong_t *err)
29 {
30 register kernel_ulong_t s0 __asm__("$16") = nr;
31 register kernel_ulong_t v0 __asm__("$2");
32 register kernel_ulong_t a3 __asm__("$7");
33 __asm__ __volatile__(".set noreorder\n\t"
34 "move %0, %2\n\t"
35 "syscall\n\t"
36 ".set reorder"
37 : "=r"(v0), "=r"(a3)
38 : "r"(s0)
39 : SYSCALL_CLOBBERLIST);
40 *err = a3;
41 return v0;
42 }
43 # define raw_syscall_0 raw_syscall_0
44
45 #endif /* !STRACE_RAW_SYSCALL_H */