ARC: Linux Syscall Interface

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Vineet Gupta 2018-10-23 14:44:30 -07:00
parent 3ab8611a22
commit add5071a5c
15 changed files with 941 additions and 0 deletions

View File

@ -0,0 +1,298 @@
/* AUTOGENERATED by update-syscall-lists.py. */
#define __NR_accept 202
#define __NR_accept4 242
#define __NR_acct 89
#define __NR_add_key 217
#define __NR_adjtimex 171
#define __NR_arc_gettls 246
#define __NR_arc_settls 245
#define __NR_arc_usr_cmpxchg 248
#define __NR_bind 200
#define __NR_bpf 280
#define __NR_brk 214
#define __NR_cacheflush 244
#define __NR_capget 90
#define __NR_capset 91
#define __NR_chdir 49
#define __NR_chroot 51
#define __NR_clock_adjtime64 405
#define __NR_clock_getres_time64 406
#define __NR_clock_gettime64 403
#define __NR_clock_nanosleep_time64 407
#define __NR_clock_settime64 404
#define __NR_clone 220
#define __NR_clone3 435
#define __NR_close 57
#define __NR_connect 203
#define __NR_copy_file_range 285
#define __NR_delete_module 106
#define __NR_dup 23
#define __NR_dup3 24
#define __NR_epoll_create1 20
#define __NR_epoll_ctl 21
#define __NR_epoll_pwait 22
#define __NR_eventfd2 19
#define __NR_execve 221
#define __NR_execveat 281
#define __NR_exit 93
#define __NR_exit_group 94
#define __NR_faccessat 48
#define __NR_fadvise64_64 223
#define __NR_fallocate 47
#define __NR_fanotify_init 262
#define __NR_fanotify_mark 263
#define __NR_fchdir 50
#define __NR_fchmod 52
#define __NR_fchmodat 53
#define __NR_fchown 55
#define __NR_fchownat 54
#define __NR_fcntl64 25
#define __NR_fdatasync 83
#define __NR_fgetxattr 10
#define __NR_finit_module 273
#define __NR_flistxattr 13
#define __NR_flock 32
#define __NR_fremovexattr 16
#define __NR_fsconfig 431
#define __NR_fsetxattr 7
#define __NR_fsmount 432
#define __NR_fsopen 430
#define __NR_fspick 433
#define __NR_fstatfs64 44
#define __NR_fsync 82
#define __NR_ftruncate64 46
#define __NR_futex_time64 422
#define __NR_get_mempolicy 236
#define __NR_get_robust_list 100
#define __NR_getcpu 168
#define __NR_getcwd 17
#define __NR_getdents64 61
#define __NR_getegid 177
#define __NR_geteuid 175
#define __NR_getgid 176
#define __NR_getgroups 158
#define __NR_getitimer 102
#define __NR_getpeername 205
#define __NR_getpgid 155
#define __NR_getpid 172
#define __NR_getppid 173
#define __NR_getpriority 141
#define __NR_getrandom 278
#define __NR_getresgid 150
#define __NR_getresuid 148
#define __NR_getrlimit 163
#define __NR_getrusage 165
#define __NR_getsid 156
#define __NR_getsockname 204
#define __NR_getsockopt 209
#define __NR_gettid 178
#define __NR_gettimeofday 169
#define __NR_getuid 174
#define __NR_getxattr 8
#define __NR_init_module 105
#define __NR_inotify_add_watch 27
#define __NR_inotify_init1 26
#define __NR_inotify_rm_watch 28
#define __NR_io_cancel 3
#define __NR_io_destroy 1
#define __NR_io_getevents 4
#define __NR_io_pgetevents 292
#define __NR_io_pgetevents_time64 416
#define __NR_io_setup 0
#define __NR_io_submit 2
#define __NR_io_uring_enter 426
#define __NR_io_uring_register 427
#define __NR_io_uring_setup 425
#define __NR_ioctl 29
#define __NR_ioprio_get 31
#define __NR_ioprio_set 30
#define __NR_kcmp 272
#define __NR_kexec_file_load 294
#define __NR_kexec_load 104
#define __NR_keyctl 219
#define __NR_kill 129
#define __NR_lgetxattr 9
#define __NR_linkat 37
#define __NR_listen 201
#define __NR_listxattr 11
#define __NR_llistxattr 12
#define __NR_llseek 62
#define __NR_lookup_dcookie 18
#define __NR_lremovexattr 15
#define __NR_lsetxattr 6
#define __NR_madvise 233
#define __NR_mbind 235
#define __NR_membarrier 283
#define __NR_memfd_create 279
#define __NR_migrate_pages 238
#define __NR_mincore 232
#define __NR_mkdirat 34
#define __NR_mknodat 33
#define __NR_mlock 228
#define __NR_mlock2 284
#define __NR_mlockall 230
#define __NR_mmap2 222
#define __NR_mount 40
#define __NR_move_mount 429
#define __NR_move_pages 239
#define __NR_mprotect 226
#define __NR_mq_getsetattr 185
#define __NR_mq_notify 184
#define __NR_mq_open 180
#define __NR_mq_timedreceive_time64 419
#define __NR_mq_timedsend_time64 418
#define __NR_mq_unlink 181
#define __NR_mremap 216
#define __NR_msgctl 187
#define __NR_msgget 186
#define __NR_msgrcv 188
#define __NR_msgsnd 189
#define __NR_msync 227
#define __NR_munlock 229
#define __NR_munlockall 231
#define __NR_munmap 215
#define __NR_name_to_handle_at 264
#define __NR_nanosleep 101
#define __NR_nfsservctl 42
#define __NR_open_by_handle_at 265
#define __NR_open_tree 428
#define __NR_openat 56
#define __NR_openat2 437
#define __NR_perf_event_open 241
#define __NR_personality 92
#define __NR_pidfd_getfd 438
#define __NR_pidfd_open 434
#define __NR_pidfd_send_signal 424
#define __NR_pipe2 59
#define __NR_pivot_root 41
#define __NR_pkey_alloc 289
#define __NR_pkey_free 290
#define __NR_pkey_mprotect 288
#define __NR_ppoll_time64 414
#define __NR_prctl 167
#define __NR_pread64 67
#define __NR_preadv 69
#define __NR_preadv2 286
#define __NR_prlimit64 261
#define __NR_process_vm_readv 270
#define __NR_process_vm_writev 271
#define __NR_pselect6_time64 413
#define __NR_ptrace 117
#define __NR_pwrite64 68
#define __NR_pwritev 70
#define __NR_pwritev2 287
#define __NR_quotactl 60
#define __NR_read 63
#define __NR_readahead 213
#define __NR_readlinkat 78
#define __NR_readv 65
#define __NR_reboot 142
#define __NR_recvfrom 207
#define __NR_recvmmsg_time64 417
#define __NR_recvmsg 212
#define __NR_remap_file_pages 234
#define __NR_removexattr 14
#define __NR_renameat 38
#define __NR_renameat2 276
#define __NR_request_key 218
#define __NR_restart_syscall 128
#define __NR_rseq 293
#define __NR_rt_sigaction 134
#define __NR_rt_sigpending 136
#define __NR_rt_sigprocmask 135
#define __NR_rt_sigqueueinfo 138
#define __NR_rt_sigreturn 139
#define __NR_rt_sigsuspend 133
#define __NR_rt_sigtimedwait_time64 421
#define __NR_rt_tgsigqueueinfo 240
#define __NR_sched_get_priority_max 125
#define __NR_sched_get_priority_min 126
#define __NR_sched_getaffinity 123
#define __NR_sched_getattr 275
#define __NR_sched_getparam 121
#define __NR_sched_getscheduler 120
#define __NR_sched_rr_get_interval_time64 423
#define __NR_sched_setaffinity 122
#define __NR_sched_setattr 274
#define __NR_sched_setparam 118
#define __NR_sched_setscheduler 119
#define __NR_sched_yield 124
#define __NR_seccomp 277
#define __NR_semctl 191
#define __NR_semget 190
#define __NR_semop 193
#define __NR_semtimedop_time64 420
#define __NR_sendfile64 71
#define __NR_sendmmsg 269
#define __NR_sendmsg 211
#define __NR_sendto 206
#define __NR_set_mempolicy 237
#define __NR_set_robust_list 99
#define __NR_set_tid_address 96
#define __NR_setdomainname 162
#define __NR_setfsgid 152
#define __NR_setfsuid 151
#define __NR_setgid 144
#define __NR_setgroups 159
#define __NR_sethostname 161
#define __NR_setitimer 103
#define __NR_setns 268
#define __NR_setpgid 154
#define __NR_setpriority 140
#define __NR_setregid 143
#define __NR_setresgid 149
#define __NR_setresuid 147
#define __NR_setreuid 145
#define __NR_setrlimit 164
#define __NR_setsid 157
#define __NR_setsockopt 208
#define __NR_settimeofday 170
#define __NR_setuid 146
#define __NR_setxattr 5
#define __NR_shmat 196
#define __NR_shmctl 195
#define __NR_shmdt 197
#define __NR_shmget 194
#define __NR_shutdown 210
#define __NR_sigaltstack 132
#define __NR_signalfd4 74
#define __NR_socket 198
#define __NR_socketpair 199
#define __NR_splice 76
#define __NR_statfs64 43
#define __NR_statx 291
#define __NR_swapoff 225
#define __NR_swapon 224
#define __NR_symlinkat 36
#define __NR_sync 81
#define __NR_sync_file_range 84
#define __NR_syncfs 267
#define __NR_sysfs 247
#define __NR_sysinfo 179
#define __NR_syslog 116
#define __NR_tee 77
#define __NR_tgkill 131
#define __NR_timer_create 107
#define __NR_timer_delete 111
#define __NR_timer_getoverrun 109
#define __NR_timer_gettime64 408
#define __NR_timer_settime64 409
#define __NR_timerfd_create 85
#define __NR_timerfd_gettime64 410
#define __NR_timerfd_settime64 411
#define __NR_times 153
#define __NR_tkill 130
#define __NR_truncate64 45
#define __NR_umask 166
#define __NR_umount2 39
#define __NR_uname 160
#define __NR_unlinkat 35
#define __NR_unshare 97
#define __NR_userfaultfd 282
#define __NR_utimensat_time64 412
#define __NR_vhangup 58
#define __NR_vmsplice 75
#define __NR_wait4 260
#define __NR_waitid 95
#define __NR_write 64
#define __NR_writev 66

View File

@ -0,0 +1,21 @@
/* Bit size of the time_t type at glibc build time, general case.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <bits/wordsize.h>
#define __TIMESIZE 64

View File

@ -0,0 +1,93 @@
/* clone() implementation for ARC.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andrew Jenner <andrew@codesourcery.com>, 2008.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
#include <tcb-offsets.h>
#define CLONE_SETTLS 0x00080000
/* int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
< pid_t *ptid, struct user_desc *tls, pid_t *ctid > );
NOTE: I'm assuming that the last 3 args are NOT var-args and in case all
3 are not relevant, caller will nevertheless pass those as NULL.
clone syscall in kernel (ABI: CONFIG_CLONE_BACKWARDS)
int sys_clone(unsigned long int clone_flags,
unsigned long int newsp,
int __user *parent_tidptr,
void *tls,
int __user *child_tidptr). */
ENTRY (__clone)
cmp r0, 0 /* @fn can't be NULL. */
cmp.ne r1, 0 /* @child_stack can't be NULL. */
bz L (__sys_err)
/* save some of the orig args
r0 containg @fn will be clobbered AFTER syscall (with ret val)
rest are clobbered BEFORE syscall due to different arg ordering. */
mov r10, r0 /* @fn. */
mov r11, r3 /* @args. */
mov r12, r2 /* @clone_flags. */
mov r9, r5 /* @tls. */
/* adjust libc args for syscall. */
mov r0, r2 /* libc @flags is 1st syscall arg. */
mov r2, r4 /* libc @ptid. */
mov r3, r5 /* libc @tls. */
mov r4, r6 /* libc @ctid. */
mov r8, __NR_clone
ARC_TRAP_INSN
cmp r0, 0 /* return code : 0 new process, !0 parent. */
blt L (__sys_err2) /* < 0 (signed) error. */
jnz [blink] /* Parent returns. */
/* child jumps off to @fn with @arg as argument
TP register already set by kernel. */
jl.d [r10]
mov r0, r11
/* exit() with result from @fn (already in r0). */
mov r8, __NR_exit
ARC_TRAP_INSN
/* In case it ever came back. */
flag 1
L (__sys_err):
mov r0, -EINVAL
L (__sys_err2):
/* (1) No need to make -ve kernel error code as positive errno
__syscall_error expects the -ve error code returned by kernel
(2) r0 still had orig -ve kernel error code
(3) Tail call to __syscall_error so we dont have to come back
here hence instead of jmp-n-link (reg push/pop) we do jmp
(4) No need to route __syscall_error via PLT, B is inherently
position independent. */
b __syscall_error
PSEUDO_END (__clone)
libc_hidden_def (__clone)
weak_alias (__clone, clone)

View File

@ -0,0 +1,46 @@
/* Regularize <asm/unistd.h> definitions. ARC version.
Copyright (C) 2020 Free Software Foundation, Inc.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
/* Adjustments to ARC asm-generic syscall ABI (3.9 kernel) for 64-bit time_t
support. */
/* fstat64 and fstatat64 need to be replaced with statx. */
#undef __NR_fstat64
#undef __NR_fstatat64
/* Elide all other 32-bit time_t syscalls. */
# undef __NR_clock_adjtime
# undef __NR_clock_getres
# undef __NR_clock_gettime
# undef __NR_clock_nanosleep
# undef __NR_clock_settime
# undef __NR_futex
# undef __NR_mq_timedreceive
# undef __NR_mq_timedsend
# undef __NR_ppoll
# undef __NR_pselect6
# undef __NR_recvmmsg
# undef __NR_rt_sigtimedwait
# undef __NR_sched_rr_get_interval
# undef __NR_semtimedop
# undef __NR_timer_gettime
# undef __NR_timer_settime
# undef __NR_timerfd_gettime
# undef __NR_timerfd_settime
# undef __NR_utimensat

View File

@ -0,0 +1,6 @@
#define JMP_BUF_SIZE (32 + 1 + 64 / (8 * sizeof (unsigned long int))) * sizeof (unsigned long int)
#define SIGJMP_BUF_SIZE (32 + 1 + 64 / (8 * sizeof (unsigned long int))) * sizeof (unsigned long int)
#define JMP_BUF_ALIGN __alignof__ (unsigned long int)
#define SIGJMP_BUF_ALIGN __alignof__ (unsigned long int)
#define MASK_WAS_SAVED_OFFSET (32 * sizeof (unsigned long int))
#define SAVED_MASK_OFFSET (33 * sizeof (unsigned long int))

View File

@ -0,0 +1,27 @@
/* Set flags signalling availability of kernel features based on given
kernel version number.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
/* The minimum supported kernel version for ARC is 5.1 (64-bit time, offsets),
although the asm-generic ABI is from 3.9 (when Linux port was merged). */
#include_next <kernel-features.h>
#undef __ASSUME_CLONE_DEFAULT
#define __ASSUME_CLONE_BACKWARDS 1

View File

@ -0,0 +1,26 @@
/* Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#include <bits/wordsize.h>
/* Needed to elide the itemized copy code in common xstatconv.c. */
#define STAT_IS_KERNEL_STAT 1
/* Nice side-effect of 64-bit time_t switch is these are same. */
#define XSTAT_IS_XSTAT64 1
#define STATFS_IS_STATFS64 0

View File

@ -0,0 +1,27 @@
/* mmap - map files or devices into memory. Linux/ARC version.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef MMAP_ARC_INTERNAL_H
#define MMAP_ARC_INTERNAL_H
/* 8K is default but determine the shift dynamically with getpagesize. */
#define MMAP2_PAGE_UNIT -1
#include_next <mmap_internal.h>
#endif

View File

@ -0,0 +1,31 @@
/* ARC specific sigaction.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
#define SA_RESTORER 0x04000000
extern void __default_rt_sa_restorer (void);
#define SET_SA_RESTORER(kact, act) \
({ \
(kact)->sa_restorer = __default_rt_sa_restorer; \
(kact)->sa_flags |= SA_RESTORER; \
})
#define RESET_SA_RESTORER(act, kact)
#include <sysdeps/unix/sysv/linux/sigaction.c>

View File

@ -0,0 +1,29 @@
/* Default sigreturn stub for ARC Linux.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sys/syscall.h>
#include <sysdep.h>
#include <tcb-offsets.h>
/* Note the NOP has to be outside body. */
nop
ENTRY (__default_rt_sa_restorer)
mov r8, __NR_rt_sigreturn
ARC_TRAP_INSN
j_s [blink]
PSEUDO_END_NOERRNO (__default_rt_sa_restorer)

View File

@ -0,0 +1,33 @@
/* syscall - indirect system call.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY (syscall)
mov_s r8, r0
mov_s r0, r1
mov_s r1, r2
mov_s r2, r3
mov_s r3, r4
mov_s r4, r5
mov_s r5, r6
ARC_TRAP_INSN
brhi r0, -4096, L (call_syscall_err)
j [blink]
PSEUDO_END (syscall)

View File

@ -0,0 +1,3 @@
# File name Caller Syscall name Args Strong name Weak names
cacheflush - cacheflush i:pii _flush_cache cacheflush

View File

@ -0,0 +1,33 @@
/* ARC wrapper for setting errno.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <errno.h>
/* All syscall handlers land here to avoid generated code bloat due to
GOT reference to errno_location or it's equivalent. */
long int
__syscall_error (long int err_no)
{
__set_errno (-err_no);
return -1;
}
#if IS_IN (libc)
hidden_def (__syscall_error)
#endif

View File

@ -0,0 +1,226 @@
/* Assembler macros for ARC.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _LINUX_ARC_SYSDEP_H
#define _LINUX_ARC_SYSDEP_H 1
#include <sysdeps/arc/sysdep.h>
#include <sysdeps/unix/sysv/linux/generic/sysdep.h>
/* "workarounds" for generic code needing to handle 64-bit time_t. */
/* Fix sysdeps/unix/sysv/linux/clock_getcpuclockid.c. */
#define __NR_clock_getres __NR_clock_getres_time64
/* Fix sysdeps/nptl/lowlevellock-futex.h. */
#define __NR_futex __NR_futex_time64
/* Fix sysdeps/unix/sysv/linux/pause.c. */
#define __NR_ppoll __NR_ppoll_time64
/* Fix sysdeps/unix/sysv/linux/select.c. */
#define __NR_pselect6 __NR_pselect6_time64
/* Fix sysdeps/unix/sysv/linux/recvmmsg.c. */
#define __NR_recvmmsg __NR_recvmmsg_time64
/* Fix sysdeps/unix/sysv/linux/sigtimedwait.c. */
#define __NR_rt_sigtimedwait __NR_rt_sigtimedwait_time64
/* Fix sysdeps/unix/sysv/linux/semtimedop.c. */
#define __NR_semtimedop __NR_semtimedop_time64
/* Hack sysdeps/unix/sysv/linux/generic/utimes.c. */
#define __NR_utimensat __NR_utimensat_time64
/* For RTLD_PRIVATE_ERRNO. */
#include <dl-sysdep.h>
#include <tls.h>
#undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name
#ifdef __ASSEMBLER__
/* This is a "normal" system call stub: if there is an error,
it returns -1 and sets errno. */
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
PSEUDO_NOERRNO(name, syscall_name, args) ASM_LINE_SEP \
brhi r0, -4096, L (call_syscall_err) ASM_LINE_SEP
# define ret j_s [blink]
# undef PSEUDO_END
# define PSEUDO_END(name) \
SYSCALL_ERROR_HANDLER ASM_LINE_SEP \
END (name)
/* --------- Helper for SYSCALL_NOERRNO -----------
This kind of system call stub never returns an error.
We return the return value register to the caller unexamined. */
# undef PSEUDO_NOERRNO
# define PSEUDO_NOERRNO(name, syscall_name, args) \
.text ASM_LINE_SEP \
ENTRY (name) ASM_LINE_SEP \
DO_CALL (syscall_name, args) ASM_LINE_SEP \
/* Return the return value register unexamined. Since r0 is both
syscall return reg and function return reg, no work needed. */
# define ret_NOERRNO \
j_s [blink] ASM_LINE_SEP
# undef PSEUDO_END_NOERRNO
# define PSEUDO_END_NOERRNO(name) \
END (name)
/* --------- Helper for SYSCALL_ERRVAL -----------
This kind of system call stub returns the errno code as its return
value, or zero for success. We may massage the kernel's return value
to meet that ABI, but we never set errno here. */
# undef PSEUDO_ERRVAL
# define PSEUDO_ERRVAL(name, syscall_name, args) \
PSEUDO_NOERRNO(name, syscall_name, args) ASM_LINE_SEP
/* Don't set errno, return kernel error (in errno form) or zero. */
# define ret_ERRVAL \
rsub r0, r0, 0 ASM_LINE_SEP \
ret_NOERRNO
# undef PSEUDO_END_ERRVAL
# define PSEUDO_END_ERRVAL(name) \
END (name)
/* To reduce the code footprint, we confine the actual errno access
to single place in __syscall_error().
This takes raw kernel error value, sets errno and returns -1. */
# if IS_IN (libc)
# define CALL_ERRNO_SETTER_C bl PLTJMP(HIDDEN_JUMPTARGET(__syscall_error))
# else
# define CALL_ERRNO_SETTER_C bl PLTJMP(__syscall_error)
# endif
# define SYSCALL_ERROR_HANDLER \
L (call_syscall_err): ASM_LINE_SEP \
push_s blink ASM_LINE_SEP \
cfi_adjust_cfa_offset (4) ASM_LINE_SEP \
cfi_rel_offset (blink, 0) ASM_LINE_SEP \
CALL_ERRNO_SETTER_C ASM_LINE_SEP \
pop_s blink ASM_LINE_SEP \
cfi_adjust_cfa_offset (-4) ASM_LINE_SEP \
cfi_restore (blink) ASM_LINE_SEP \
j_s [blink]
# define DO_CALL(syscall_name, args) \
mov r8, __NR_##syscall_name ASM_LINE_SEP \
ARC_TRAP_INSN ASM_LINE_SEP
# define ARC_TRAP_INSN trap_s 0
#else /* !__ASSEMBLER__ */
# define SINGLE_THREAD_BY_GLOBAL 1
# if IS_IN (libc)
extern long int __syscall_error (long int);
hidden_proto (__syscall_error)
# endif
# define ARC_TRAP_INSN "trap_s 0 \n\t"
# undef INTERNAL_SYSCALL_NCS
# define INTERNAL_SYSCALL_NCS(number, nr_args, args...) \
({ \
/* Per ABI, r0 is 1st arg and return reg. */ \
register long int __ret __asm__("r0"); \
register long int _sys_num __asm__("r8"); \
\
LOAD_ARGS_##nr_args (number, args) \
\
__asm__ volatile ( \
ARC_TRAP_INSN \
: "+r" (__ret) \
: "r"(_sys_num) ASM_ARGS_##nr_args \
: "memory"); \
\
__ret; })
# undef INTERNAL_SYSCALL
# define INTERNAL_SYSCALL(name, nr, args...) \
INTERNAL_SYSCALL_NCS(__NR_##name, nr, args)
/* Macros for setting up inline __asm__ input regs. */
# define ASM_ARGS_0
# define ASM_ARGS_1 ASM_ARGS_0, "r" (__ret)
# define ASM_ARGS_2 ASM_ARGS_1, "r" (_arg2)
# define ASM_ARGS_3 ASM_ARGS_2, "r" (_arg3)
# define ASM_ARGS_4 ASM_ARGS_3, "r" (_arg4)
# define ASM_ARGS_5 ASM_ARGS_4, "r" (_arg5)
# define ASM_ARGS_6 ASM_ARGS_5, "r" (_arg6)
# define ASM_ARGS_7 ASM_ARGS_6, "r" (_arg7)
/* Macros for converting sys-call wrapper args into sys call args. */
# define LOAD_ARGS_0(nm, arg) \
_sys_num = (long int) (nm);
# define LOAD_ARGS_1(nm, arg1) \
__ret = (long int) (arg1); \
LOAD_ARGS_0 (nm, arg1)
/* Note that the use of _tmpX might look superflous, however it is needed
to ensure that register variables are not clobbered if arg happens to be
a function call itself. e.g. sched_setaffinity() calling getpid() for arg2
Also this specific order of recursive calling is important to segregate
the tmp args evaluation (function call case described above) and assigment
of register variables. */
# define LOAD_ARGS_2(nm, arg1, arg2) \
long int _tmp2 = (long int) (arg2); \
LOAD_ARGS_1 (nm, arg1) \
register long int _arg2 __asm__ ("r1") = _tmp2;
# define LOAD_ARGS_3(nm, arg1, arg2, arg3) \
long int _tmp3 = (long int) (arg3); \
LOAD_ARGS_2 (nm, arg1, arg2) \
register long int _arg3 __asm__ ("r2") = _tmp3;
#define LOAD_ARGS_4(nm, arg1, arg2, arg3, arg4) \
long int _tmp4 = (long int) (arg4); \
LOAD_ARGS_3 (nm, arg1, arg2, arg3) \
register long int _arg4 __asm__ ("r3") = _tmp4;
# define LOAD_ARGS_5(nm, arg1, arg2, arg3, arg4, arg5) \
long int _tmp5 = (long int) (arg5); \
LOAD_ARGS_4 (nm, arg1, arg2, arg3, arg4) \
register long int _arg5 __asm__ ("r4") = _tmp5;
# define LOAD_ARGS_6(nm, arg1, arg2, arg3, arg4, arg5, arg6)\
long int _tmp6 = (long int) (arg6); \
LOAD_ARGS_5 (nm, arg1, arg2, arg3, arg4, arg5) \
register long int _arg6 __asm__ ("r5") = _tmp6;
# define LOAD_ARGS_7(nm, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
long int _tmp7 = (int) (arg7); \
LOAD_ARGS_6 (nm, arg1, arg2, arg3, arg4, arg5, arg6) \
register long int _arg7 __asm__ ("r6") = _tmp7;
/* Pointer mangling not yet supported. */
# define PTR_MANGLE(var) (void) (var)
# define PTR_DEMANGLE(var) (void) (var)
#endif /* !__ASSEMBLER__ */
#endif /* linux/arc/sysdep.h */

View File

@ -0,0 +1,42 @@
/* vfork for ARC Linux.
Copyright (C) 2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <sys/syscall.h>
#include <sysdep.h>
#include <tcb-offsets.h>
#define _SIGNAL_H
#include <bits/signum-arch.h> /* For SIGCHLD */
#define CLONE_VM 0x00000100
#define CLONE_VFORK 0x00004000
#define CLONE_FLAGS_FOR_VFORK (CLONE_VM|CLONE_VFORK|SIGCHLD)
ENTRY (__vfork)
mov r0, CLONE_FLAGS_FOR_VFORK
mov_s r1, sp
mov r8, __NR_clone
ARC_TRAP_INSN
cmp r0, 0
jge [blink] ; child continues
b __syscall_error
PSEUDO_END (__vfork)
libc_hidden_def (__vfork)
weak_alias (__vfork, vfork)