newlib-cygwin/libgloss/arc/nsim-syscall.h

458 lines
12 KiB
C

/*
Copyright (c) 2015, Synopsys, Inc. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1) Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2) Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3) Neither the name of the Synopsys, Inc., nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _NSIM_SYSCALL_H
#define _NSIM_SYSCALL_H
#include <stdint.h>
#ifndef __ASSEMBLY__
/* This file contains the system call numbers. Not all are implemented in nSIM
hostlink. Numbers correspond to the old ARCLinux syscalls, but during
upstreaming of ARC Linux, those numbers has been changed, hence today ARC
Linux and nSIM hostlink use different system call numbers. */
#define SYS_exit 1
#define SYS__exit SYS_exit
#define SYS_fork 2
#define SYS_read 3
#define SYS_write 4
#define SYS_open 5
#define SYS_close 6
#define SYS_waitpid 7
#define SYS_creat 8
#define SYS_link 9
#define SYS_unlink 10
#define SYS_execve 11
#define SYS_chdir 12
#define SYS_time 13
#define SYS_mknod 14
#define SYS_chmod 15
#define SYS_chown 16
#define SYS_break 17
#define SYS_oldstat 18
#define SYS_lseek 19
#define SYS_getpid 20
#define SYS_mount 21
#define SYS_umount 22
#define SYS_setuid 23
#define SYS_getuid 24
#define SYS_stime 25
#define SYS_ptrace 26
#define SYS_alarm 27
#define SYS_oldfstat 28
#define SYS_pause 29
#define SYS_utime 30
#define SYS_stty 31
#define SYS_gtty 32
#define SYS_access 33
#define SYS_nice 34
#define SYS_ftime 35
#define SYS_sync 36
#define SYS_kill 37
#define SYS_rename 38
#define SYS_mkdir 39
#define SYS_rmdir 40
#define SYS_dup 41
#define SYS_pipe 42
#define SYS_times 43
#define SYS_prof 44
#define SYS_brk 45
#define SYS_setgid 46
#define SYS_getgid 47
#define SYS_signal 48
#define SYS_geteuid 49
#define SYS_getegid 50
#define SYS_acct 51
#define SYS_umount2 52
#define SYS_lock 53
#define SYS_ioctl 54
#define SYS_fcntl 55
#define SYS_mpx 56
#define SYS_setpgid 57
#define SYS_ulimit 58
#define SYS_oldolduname 59
#define SYS_umask 60
#define SYS_chroot 61
#define SYS_ustat 62
#define SYS_dup2 63
#define SYS_getppid 64
#define SYS_getpgrp 65
#define SYS_setsid 66
#define SYS_sigaction 67
#define SYS_sgetmask 68
#define SYS_ssetmask 69
#define SYS_setreuid 70
#define SYS_setregid 71
#define SYS_sigsuspend 72
#define SYS_sigpending 73
#define SYS_sethostname 74
#define SYS_setrlimit 75
#define SYS_old_getrlimit 76
#define SYS_getrusage 77
#define SYS_gettimeofday 78
#define SYS_settimeofday 79
#define SYS_getgroups 80
#define SYS_setgroups 81
#define SYS_select 82
#define SYS_symlink 83
#define SYS_oldlstat 84
#define SYS_readlink 85
#define SYS_uselib 86
#define SYS_swapon 87
#define SYS_reboot 88
#define SYS_readdir 89
#define SYS_mmap 90
#define SYS_munmap 91
#define SYS_truncate 92
#define SYS_ftruncate 93
#define SYS_fchmod 94
#define SYS_fchown 95
#define SYS_getpriority 96
#define SYS_setpriority 97
#define SYS_profil 98
#define SYS_statfs 99
#define SYS_fstatfs 100
#define SYS_ioperm 101
#define SYS_socketcall 102
#define SYS_syslog 103
#define SYS_setitimer 104
#define SYS_getitimer 105
#define SYS_stat 106
#define SYS_lstat 107
#define SYS_fstat 108
#define SYS_olduname 109
#define SYS_iopl 110 /* not supported */
#define SYS_vhangup 111
#define SYS_idle 112 /* Obsolete */
#define SYS_vm86 113 /* not supported */
#define SYS_wait4 114
#define SYS_swapoff 115
#define SYS_sysinfo 116
#define SYS_ipc 117
#define SYS_fsync 118
#define SYS_sigreturn 119
#define SYS_clone 120
#define SYS_setdomainname 121
#define SYS_uname 122
#define SYS_cacheflush 123
#define SYS_adjtimex 124
#define SYS_mprotect 125
#define SYS_sigprocmask 126
#define SYS_create_module 127
#define SYS_init_module 128
#define SYS_delete_module 129
#define SYS_get_kernel_syms 130
#define SYS_quotactl 131
#define SYS_getpgid 132
#define SYS_fchdir 133
#define SYS_bdflush 134
#define SYS_sysfs 135
#define SYS_personality 136
#define SYS_afs_syscall 137 /* Syscall for Andrew File System */
#define SYS_setfsuid 138
#define SYS_setfsgid 139
#define SYS__llseek 140
#define SYS_getdents 141
#define SYS__newselect 142
#define SYS_flock 143
#define SYS_msync 144
#define SYS_readv 145
#define SYS_writev 146
#define SYS_getsid 147
#define SYS_fdatasync 148
#define SYS__sysctl 149
#define SYS_mlock 150
#define SYS_munlock 151
#define SYS_mlockall 152
#define SYS_munlockall 153
#define SYS_sched_setparam 154
#define SYS_sched_getparam 155
#define SYS_sched_setscheduler 156
#define SYS_sched_getscheduler 157
#define SYS_sched_yield 158
#define SYS_sched_get_priority_max 159
#define SYS_sched_get_priority_min 160
#define SYS_sched_rr_get_interval 161
#define SYS_nanosleep 162
#define SYS_mremap 163
#define SYS_setresuid 164
#define SYS_getresuid 165
#define SYS_query_module 167
#define SYS_poll 168
#define SYS_nfsservctl 169
#define SYS_setresgid 170
#define SYS_getresgid 171
#define SYS_prctl 172
#define SYS_rt_sigreturn 173
#define SYS_rt_sigaction 174
#define SYS_rt_sigprocmask 175
#define SYS_rt_sigpending 176
#define SYS_rt_sigtimedwait 177
#define SYS_rt_sigqueueinfo 178
#define SYS_rt_sigsuspend 179
#define SYS_pread 180
#define SYS_pwrite 181
#define SYS_lchown 182
#define SYS_getcwd 183
#define SYS_capget 184
#define SYS_capset 185
#define SYS_sigaltstack 186
#define SYS_sendfile 187
#define SYS_getpmsg 188 /* some people actually want streams */
#define SYS_putpmsg 189 /* some people actually want streams */
#define SYS_vfork 190
#define SYS_getrlimit 191
#define SYS_mmap2 192
#define SYS_truncate64 193
#define SYS_ftruncate64 194
#define SYS_stat64 195
#define SYS_lstat64 196
#define SYS_fstat64 197
#define SYS_chown32 198
#define SYS_getuid32 199
#define SYS_getgid32 200
#define SYS_geteuid32 201
#define SYS_getegid32 202
#define SYS_setreuid32 203
#define SYS_setregid32 204
#define SYS_getgroups32 205
#define SYS_setgroups32 206
#define SYS_fchown32 207
#define SYS_setresuid32 208
#define SYS_getresuid32 209
#define SYS_setresgid32 210
#define SYS_getresgid32 211
#define SYS_lchown32 212
#define SYS_setuid32 213
#define SYS_setgid32 214
#define SYS_setfsuid32 215
#define SYS_setfsgid32 216
#define SYS_pivot_root 217
#define SYS_getdents64 220
#define SYS_fcntl64 221
#define SYS_gettid 224
#endif /* ! __ASSEMBLY__ */
#ifdef __ARC700__
#define SYSCALL \
"trap0 \n\t"
#else
#define SYSCALL \
"swi \n\t"\
"nop \n\t"\
"nop \n\t"
#endif /* __ARC700__ */
/* There are two variants of macroses here:
- _syscall is a complete function definition of system call
- _naked_syscall only invokes system call and can be inserted into other
functions. This macro is defined only for those syscall<N>, where it is
actually used. */
#define _syscall0(type, name) \
type _##name () \
{ \
long __res; \
__asm__ __volatile__ ("mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name) \
: "cc", "r0", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
} \
return (type)__res; \
}
#define _syscall1(type, name, atype, a) \
type _##name (atype a) \
{ \
long __res; \
__asm__ __volatile__ ("mov r0, %2\n\t" \
"mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name), \
"r" ((long)a) \
: "cc", "r0", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
} \
return (type)__res; \
}
#define _naked_syscall2(__res, name, a, b) \
__asm__ __volatile__ ("mov r1, %3\n\t" \
"mov r0, %2\n\t" \
"mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name), \
"r" ((long)a), \
"r" ((long)b) \
: "cc", "r0", "r1", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
}
#define _syscall2(type, name, atype, a, btype, b) \
type _##name (atype a, btype b) \
{ \
long __res; \
_naked_syscall2 (__res, name, a, b) \
return (type)__res; \
}
#define _naked_syscall3(__res, name, a, b, c) \
__asm__ __volatile__ ( \
"mov r2, %4\n\t" \
"mov r1, %3\n\t" \
"mov r0, %2\n\t" \
"mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name), \
"r" ((long)a), \
"r" ((long)b), \
"r" ((long)c) \
: "cc", "r0", "r1", "r2", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
}
#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
type _##name (atype a, btype b, ctype c) \
{ \
long __res; \
_naked_syscall3 (__res, name, a, b, c) \
return (type)__res; \
}
#define _syscall4(type, name, atype, a, btype, b, ctype, c, dtype, d) \
type _##name (atype a, btype b, ctype c, dtype d) \
{ \
long __res; \
__asm__ __volatile__ ( \
"mov r3, %5\n\t" \
"mov r2, %4\n\t" \
"mov r1, %3\n\t" \
"mov r0, %2\n\t" \
"mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name), \
"r" ((long)a), \
"r" ((long)b), \
"r" ((long)c), \
"r" ((long)d) \
: "cc", "r0", "r1", "r2", "r3", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
} \
return (type)__res; \
}
#define _syscall5(type, name, atype, a, btype, b, ctype, c, dtype, d, \
etype, e) \
type _##name (atype a, btype b, ctype c, dtype d, etype e) \
{ \
long __res; \
__asm__ __volatile__ ( \
"mov r4, %6\n\t" \
"mov r3, %5\n\t" \
"mov r2, %4\n\t" \
"mov r1, %3\n\t" \
"mov r0, %2\n\t" \
"mov r8, %1\n\t" \
SYSCALL \
"mov %0, r0" \
: "=r" (__res) \
: "i" (SYS_##name), \
"r" ((long)a), \
"r" ((long)b), \
"r" ((long)c), \
"r" ((long)d), \
"r" ((long)e) \
: "cc", "r0", "r1", "r2", "r3", "r4", "r8"); \
if ((unsigned long)(__res) >= (unsigned long)(-125)) { \
errno = -__res; \
__res = -1; \
} \
return (type)__res; \
}
/* open() flags that are used by nSIM hostlink. See comment for _open()
implementation in nsim-syscalls.c. */
#define ARC_LINUX_RDONLY 0
#define ARC_LINUX_WRONLY 1
#define ARC_LINUX_RDWR 2
#define ARC_LINUX_CREAT 0x0040
#define ARC_LINUX_APPEND 0x0400
#define ARC_LINUX_TRUNC 0x0200
#define ARC_LINUX_EXCL 0x0080
/* stat structure as defined in nSIM hostlink. */
struct nsim_stat {
uint16_t dev;
uint16_t __pad1;
uint32_t ino;
uint16_t mode;
uint16_t nlink;
uint16_t uid;
uint16_t gid;
uint16_t rdev;
uint16_t __pad2;
uint32_t size;
uint32_t blksize;
uint32_t blocks;
uint32_t atime;
uint32_t __unused1;
uint32_t mtime;
uint32_t __unused2;
uint32_t ctime;
uint32_t __unused3;
uint32_t __unused4;
uint32_t __unused5;
};
#endif /* _NSIM_SYSCALL_H */