boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

syscall.h (11481B)


      1 #ifndef _INTERNAL_SYSCALL_H
      2 #define _INTERNAL_SYSCALL_H
      3 
      4 #include <features.h>
      5 #include <errno.h>
      6 #include <sys/syscall.h>
      7 #include "syscall_arch.h"
      8 
      9 #ifndef SYSCALL_RLIM_INFINITY
     10 #define SYSCALL_RLIM_INFINITY (~0ULL)
     11 #endif
     12 
     13 #ifndef SYSCALL_MMAP2_UNIT
     14 #define SYSCALL_MMAP2_UNIT 4096ULL
     15 #endif
     16 
     17 #ifndef __SYSCALL_LL_PRW
     18 #define __SYSCALL_LL_PRW(x) __SYSCALL_LL_O(x)
     19 #endif
     20 
     21 #ifndef __scc
     22 #define __scc(X) ((long) (X))
     23 typedef long syscall_arg_t;
     24 #endif
     25 
     26 hidden long __syscall_ret(unsigned long),
     27 	__syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t,
     28 	             syscall_arg_t, syscall_arg_t, syscall_arg_t);
     29 
     30 #define __syscall1(n,a) __syscall1(n,__scc(a))
     31 #define __syscall2(n,a,b) __syscall2(n,__scc(a),__scc(b))
     32 #define __syscall3(n,a,b,c) __syscall3(n,__scc(a),__scc(b),__scc(c))
     33 #define __syscall4(n,a,b,c,d) __syscall4(n,__scc(a),__scc(b),__scc(c),__scc(d))
     34 #define __syscall5(n,a,b,c,d,e) __syscall5(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e))
     35 #define __syscall6(n,a,b,c,d,e,f) __syscall6(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f))
     36 #define __syscall7(n,a,b,c,d,e,f,g) __syscall7(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f),__scc(g))
     37 
     38 #define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n
     39 #define __SYSCALL_NARGS(...) __SYSCALL_NARGS_X(__VA_ARGS__,7,6,5,4,3,2,1,0,)
     40 #define __SYSCALL_CONCAT_X(a,b) a##b
     41 #define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X(a,b)
     42 #define __SYSCALL_DISP(b,...) __SYSCALL_CONCAT(b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
     43 
     44 #define __syscall(...) __SYSCALL_DISP(__syscall,__VA_ARGS__)
     45 #define syscall(...) __syscall_ret(__syscall(__VA_ARGS__))
     46 
     47 #define socketcall(nm,a,b,c,d,e,f) __syscall_ret(__socketcall(nm,a,b,c,d,e,f))
     48 #define socketcall_cp(nm,a,b,c,d,e,f) __syscall_ret(__socketcall_cp(nm,a,b,c,d,e,f))
     49 
     50 #define __syscall_cp0(n) (__syscall_cp)(n,0,0,0,0,0,0)
     51 #define __syscall_cp1(n,a) (__syscall_cp)(n,__scc(a),0,0,0,0,0)
     52 #define __syscall_cp2(n,a,b) (__syscall_cp)(n,__scc(a),__scc(b),0,0,0,0)
     53 #define __syscall_cp3(n,a,b,c) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),0,0,0)
     54 #define __syscall_cp4(n,a,b,c,d) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),0,0)
     55 #define __syscall_cp5(n,a,b,c,d,e) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),0)
     56 #define __syscall_cp6(n,a,b,c,d,e,f) (__syscall_cp)(n,__scc(a),__scc(b),__scc(c),__scc(d),__scc(e),__scc(f))
     57 
     58 #define __syscall_cp(...) __SYSCALL_DISP(__syscall_cp,__VA_ARGS__)
     59 #define syscall_cp(...) __syscall_ret(__syscall_cp(__VA_ARGS__))
     60 
     61 static inline long __alt_socketcall(int sys, int sock, int cp, syscall_arg_t a, syscall_arg_t b, syscall_arg_t c, syscall_arg_t d, syscall_arg_t e, syscall_arg_t f)
     62 {
     63 	long r;
     64 	if (cp) r = __syscall_cp(sys, a, b, c, d, e, f);
     65 	else r = __syscall(sys, a, b, c, d, e, f);
     66 	if (r != -ENOSYS) return r;
     67 #ifdef SYS_socketcall
     68 	if (cp) r = __syscall_cp(SYS_socketcall, sock, ((long[6]){a, b, c, d, e, f}));
     69 	else r = __syscall(SYS_socketcall, sock, ((long[6]){a, b, c, d, e, f}));
     70 #endif
     71 	return r;
     72 }
     73 #define __socketcall(nm, a, b, c, d, e, f) __alt_socketcall(SYS_##nm, __SC_##nm, 0, \
     74 	__scc(a), __scc(b), __scc(c), __scc(d), __scc(e), __scc(f))
     75 #define __socketcall_cp(nm, a, b, c, d, e, f) __alt_socketcall(SYS_##nm, __SC_##nm, 1, \
     76 	__scc(a), __scc(b), __scc(c), __scc(d), __scc(e), __scc(f))
     77 
     78 /* fixup legacy 16-bit junk */
     79 
     80 #ifdef SYS_getuid32
     81 #undef SYS_lchown
     82 #undef SYS_getuid
     83 #undef SYS_getgid
     84 #undef SYS_geteuid
     85 #undef SYS_getegid
     86 #undef SYS_setreuid
     87 #undef SYS_setregid
     88 #undef SYS_getgroups
     89 #undef SYS_setgroups
     90 #undef SYS_fchown
     91 #undef SYS_setresuid
     92 #undef SYS_getresuid
     93 #undef SYS_setresgid
     94 #undef SYS_getresgid
     95 #undef SYS_chown
     96 #undef SYS_setuid
     97 #undef SYS_setgid
     98 #undef SYS_setfsuid
     99 #undef SYS_setfsgid
    100 #define SYS_lchown SYS_lchown32
    101 #define SYS_getuid SYS_getuid32
    102 #define SYS_getgid SYS_getgid32
    103 #define SYS_geteuid SYS_geteuid32
    104 #define SYS_getegid SYS_getegid32
    105 #define SYS_setreuid SYS_setreuid32
    106 #define SYS_setregid SYS_setregid32
    107 #define SYS_getgroups SYS_getgroups32
    108 #define SYS_setgroups SYS_setgroups32
    109 #define SYS_fchown SYS_fchown32
    110 #define SYS_setresuid SYS_setresuid32
    111 #define SYS_getresuid SYS_getresuid32
    112 #define SYS_setresgid SYS_setresgid32
    113 #define SYS_getresgid SYS_getresgid32
    114 #define SYS_chown SYS_chown32
    115 #define SYS_setuid SYS_setuid32
    116 #define SYS_setgid SYS_setgid32
    117 #define SYS_setfsuid SYS_setfsuid32
    118 #define SYS_setfsgid SYS_setfsgid32
    119 #endif
    120 
    121 
    122 /* fixup legacy 32-bit-vs-lfs64 junk */
    123 
    124 #ifdef SYS_fcntl64
    125 #undef SYS_fcntl
    126 #define SYS_fcntl SYS_fcntl64
    127 #endif
    128 
    129 #ifdef SYS_getdents64
    130 #undef SYS_getdents
    131 #define SYS_getdents SYS_getdents64
    132 #endif
    133 
    134 #ifdef SYS_ftruncate64
    135 #undef SYS_ftruncate
    136 #undef SYS_truncate
    137 #define SYS_ftruncate SYS_ftruncate64
    138 #define SYS_truncate SYS_truncate64
    139 #endif
    140 
    141 #ifdef SYS_stat64
    142 #undef SYS_stat
    143 #define SYS_stat SYS_stat64
    144 #endif
    145 
    146 #ifdef SYS_fstat64
    147 #undef SYS_fstat
    148 #define SYS_fstat SYS_fstat64
    149 #endif
    150 
    151 #ifdef SYS_lstat64
    152 #undef SYS_lstat
    153 #define SYS_lstat SYS_lstat64
    154 #endif
    155 
    156 #ifdef SYS_statfs64
    157 #undef SYS_statfs
    158 #define SYS_statfs SYS_statfs64
    159 #endif
    160 
    161 #ifdef SYS_fstatfs64
    162 #undef SYS_fstatfs
    163 #define SYS_fstatfs SYS_fstatfs64
    164 #endif
    165 
    166 #if defined(SYS_newfstatat)
    167 #undef SYS_fstatat
    168 #define SYS_fstatat SYS_newfstatat
    169 #elif defined(SYS_fstatat64)
    170 #undef SYS_fstatat
    171 #define SYS_fstatat SYS_fstatat64
    172 #endif
    173 
    174 #ifdef SYS_ugetrlimit
    175 #undef SYS_getrlimit
    176 #define SYS_getrlimit SYS_ugetrlimit
    177 #endif
    178 
    179 #ifdef SYS__newselect
    180 #undef SYS_select
    181 #define SYS_select SYS__newselect
    182 #endif
    183 
    184 #ifdef SYS_pread64
    185 #undef SYS_pread
    186 #undef SYS_pwrite
    187 #define SYS_pread SYS_pread64
    188 #define SYS_pwrite SYS_pwrite64
    189 #endif
    190 
    191 #ifdef SYS_fadvise64_64
    192 #undef SYS_fadvise
    193 #define SYS_fadvise SYS_fadvise64_64
    194 #elif defined(SYS_fadvise64)
    195 #undef SYS_fadvise
    196 #define SYS_fadvise SYS_fadvise64
    197 #endif
    198 
    199 #ifdef SYS_sendfile64
    200 #undef SYS_sendfile
    201 #define SYS_sendfile SYS_sendfile64
    202 #endif
    203 
    204 #ifdef SYS_timer_settime32
    205 #define SYS_timer_settime SYS_timer_settime32
    206 #endif
    207 
    208 #ifdef SYS_timer_gettime32
    209 #define SYS_timer_gettime SYS_timer_gettime32
    210 #endif
    211 
    212 #ifdef SYS_timerfd_settime32
    213 #define SYS_timerfd_settime SYS_timerfd_settime32
    214 #endif
    215 
    216 #ifdef SYS_timerfd_gettime32
    217 #define SYS_timerfd_gettime SYS_timerfd_gettime32
    218 #endif
    219 
    220 #ifdef SYS_clock_settime32
    221 #define SYS_clock_settime SYS_clock_settime32
    222 #endif
    223 
    224 #ifdef SYS_clock_gettime32
    225 #define SYS_clock_gettime SYS_clock_gettime32
    226 #endif
    227 
    228 #ifdef SYS_clock_getres_time32
    229 #define SYS_clock_getres SYS_clock_getres_time32
    230 #endif
    231 
    232 #ifdef SYS_clock_nanosleep_time32
    233 #define SYS_clock_nanosleep SYS_clock_nanosleep_time32
    234 #endif
    235 
    236 #ifdef SYS_gettimeofday_time32
    237 #define SYS_gettimeofday SYS_gettimeofday_time32
    238 #endif
    239 
    240 #ifdef SYS_settimeofday_time32
    241 #define SYS_settimeofday SYS_settimeofday_time32
    242 #endif
    243 
    244 /* Ensure that the plain syscall names are defined even for "time64-only"
    245  * archs. These facilitate callers passing null time arguments, and make
    246  * tests for establishing which to use/fallback-to more consistent when
    247  * they do need to be called with time arguments. */
    248 
    249 #ifndef SYS_clock_gettime
    250 #define SYS_clock_gettime SYS_clock_gettime64
    251 #endif
    252 
    253 #ifndef SYS_clock_settime
    254 #define SYS_clock_settime SYS_clock_settime64
    255 #endif
    256 
    257 #ifndef SYS_clock_adjtime
    258 #define SYS_clock_adjtime SYS_clock_adjtime64
    259 #endif
    260 
    261 #ifndef SYS_clock_getres
    262 #define SYS_clock_getres SYS_clock_getres_time64
    263 #endif
    264 
    265 #ifndef SYS_clock_nanosleep
    266 #define SYS_clock_nanosleep SYS_clock_nanosleep_time64
    267 #endif
    268 
    269 #ifndef SYS_timer_gettime
    270 #define SYS_timer_gettime SYS_timer_gettime64
    271 #endif
    272 
    273 #ifndef SYS_timer_settime
    274 #define SYS_timer_settime SYS_timer_settime64
    275 #endif
    276 
    277 #ifndef SYS_timerfd_gettime
    278 #define SYS_timerfd_gettime SYS_timerfd_gettime64
    279 #endif
    280 
    281 #ifndef SYS_timerfd_settime
    282 #define SYS_timerfd_settime SYS_timerfd_settime64
    283 #endif
    284 
    285 #ifndef SYS_utimensat
    286 #define SYS_utimensat SYS_utimensat_time64
    287 #endif
    288 
    289 #ifndef SYS_pselect6
    290 #define SYS_pselect6 SYS_pselect6_time64
    291 #endif
    292 
    293 #ifndef SYS_ppoll
    294 #define SYS_ppoll SYS_ppoll_time64
    295 #endif
    296 
    297 #ifndef SYS_recvmmsg
    298 #define SYS_recvmmsg SYS_recvmmsg_time64
    299 #endif
    300 
    301 #ifndef SYS_mq_timedsend
    302 #define SYS_mq_timedsend SYS_mq_timedsend_time64
    303 #endif
    304 
    305 #ifndef SYS_mq_timedreceive
    306 #define SYS_mq_timedreceive SYS_mq_timedreceive_time64
    307 #endif
    308 
    309 /* SYS_semtimedop omitted because SYS_ipc may provide it */
    310 
    311 #ifndef SYS_rt_sigtimedwait
    312 #define SYS_rt_sigtimedwait SYS_rt_sigtimedwait_time64
    313 #endif
    314 
    315 #ifndef SYS_futex
    316 #define SYS_futex SYS_futex_time64
    317 #endif
    318 
    319 #ifndef SYS_sched_rr_get_interval
    320 #define SYS_sched_rr_get_interval SYS_sched_rr_get_interval_time64
    321 #endif
    322 
    323 
    324 
    325 
    326 /* socketcall calls */
    327 
    328 #define __SC_socket      1
    329 #define __SC_bind        2
    330 #define __SC_connect     3
    331 #define __SC_listen      4
    332 #define __SC_accept      5
    333 #define __SC_getsockname 6
    334 #define __SC_getpeername 7
    335 #define __SC_socketpair  8
    336 #define __SC_send        9
    337 #define __SC_recv        10
    338 #define __SC_sendto      11
    339 #define __SC_recvfrom    12
    340 #define __SC_shutdown    13
    341 #define __SC_setsockopt  14
    342 #define __SC_getsockopt  15
    343 #define __SC_sendmsg     16
    344 #define __SC_recvmsg     17
    345 #define __SC_accept4     18
    346 #define __SC_recvmmsg    19
    347 #define __SC_sendmmsg    20
    348 
    349 /* This is valid only because all socket syscalls are made via
    350  * socketcall, which always fills unused argument slots with zeros. */
    351 #ifndef SYS_accept
    352 #define SYS_accept SYS_accept4
    353 #endif
    354 
    355 #ifndef SO_RCVTIMEO_OLD
    356 #define SO_RCVTIMEO_OLD  20
    357 #endif
    358 #ifndef SO_SNDTIMEO_OLD
    359 #define SO_SNDTIMEO_OLD  21
    360 #endif
    361 
    362 #define SO_TIMESTAMP_OLD    29
    363 #define SO_TIMESTAMPNS_OLD  35
    364 #define SO_TIMESTAMPING_OLD 37
    365 #define SCM_TIMESTAMP_OLD    SO_TIMESTAMP_OLD
    366 #define SCM_TIMESTAMPNS_OLD  SO_TIMESTAMPNS_OLD
    367 #define SCM_TIMESTAMPING_OLD SO_TIMESTAMPING_OLD
    368 
    369 #ifndef SIOCGSTAMP_OLD
    370 #define SIOCGSTAMP_OLD 0x8906
    371 #endif
    372 #ifndef SIOCGSTAMPNS_OLD
    373 #define SIOCGSTAMPNS_OLD 0x8907
    374 #endif
    375 
    376 #ifdef SYS_open
    377 #define __sys_open2(x,pn,fl) __syscall2(SYS_open, pn, (fl)|O_LARGEFILE)
    378 #define __sys_open3(x,pn,fl,mo) __syscall3(SYS_open, pn, (fl)|O_LARGEFILE, mo)
    379 #define __sys_open_cp2(x,pn,fl) __syscall_cp2(SYS_open, pn, (fl)|O_LARGEFILE)
    380 #define __sys_open_cp3(x,pn,fl,mo) __syscall_cp3(SYS_open, pn, (fl)|O_LARGEFILE, mo)
    381 #else
    382 #define __sys_open2(x,pn,fl) __syscall3(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE)
    383 #define __sys_open3(x,pn,fl,mo) __syscall4(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE, mo)
    384 #define __sys_open_cp2(x,pn,fl) __syscall_cp3(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE)
    385 #define __sys_open_cp3(x,pn,fl,mo) __syscall_cp4(SYS_openat, AT_FDCWD, pn, (fl)|O_LARGEFILE, mo)
    386 #endif
    387 
    388 #define __sys_open(...) __SYSCALL_DISP(__sys_open,,__VA_ARGS__)
    389 #define sys_open(...) __syscall_ret(__sys_open(__VA_ARGS__))
    390 
    391 #define __sys_open_cp(...) __SYSCALL_DISP(__sys_open_cp,,__VA_ARGS__)
    392 #define sys_open_cp(...) __syscall_ret(__sys_open_cp(__VA_ARGS__))
    393 
    394 #ifdef SYS_wait4
    395 #define __sys_wait4(a,b,c,d) __syscall(SYS_wait4,a,b,c,d)
    396 #define __sys_wait4_cp(a,b,c,d) __syscall_cp(SYS_wait4,a,b,c,d)
    397 #else
    398 hidden long __emulate_wait4(int, int *, int, void *, int);
    399 #define __sys_wait4(a,b,c,d) __emulate_wait4(a,b,c,d,0)
    400 #define __sys_wait4_cp(a,b,c,d) __emulate_wait4(a,b,c,d,1)
    401 #endif
    402 
    403 #define sys_wait4(a,b,c,d) __syscall_ret(__sys_wait4(a,b,c,d))
    404 #define sys_wait4_cp(a,b,c,d) __syscall_ret(__sys_wait4_cp(a,b,c,d))
    405 
    406 /* tcc-build: stock tcc 0.9.27 does not parse C99 [static N] array
    407    parameter syntax. The static qualifier here is a hint to the compiler
    408    only; dropping it preserves identical semantics. */
    409 hidden void __procfdname(char __buf[15+3*sizeof(int)], unsigned);
    410 
    411 hidden void *__vdsosym(const char *, const char *);
    412 
    413 #endif