19b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney/*
29b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * Copyright 2012, The Android Open Source Project
39b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney *
49b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * Licensed under the Apache License, Version 2.0 (the "License");
59b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * you may not use this file except in compliance with the License.
69b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * You may obtain a copy of the License at
79b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney *
89b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney *     http://www.apache.org/licenses/LICENSE-2.0
99b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney *
109b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * Unless required by applicable law or agreed to in writing, software
119b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * distributed under the License is distributed on an "AS IS" BASIS,
129b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * See the License for the specific language governing permissions and
149b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * limitations under the License.
159b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney */
169b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
176433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh#include <portability.h>
189b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <unistd.h>
199b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <stdarg.h>
209b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <signal.h>
219b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <signal_portable.h>
229b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <time.h>
239b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <errno.h>
246732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney#include <errno_portable.h>
25c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney#include <eventfd_portable.h>
26c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney#include <filefd_portable.h>
27c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney#include <inotify_portable.h>
28c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney#include <timerfd_portable.h>
299b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <asm/unistd-portable.h>
309b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <asm/unistd.h>
319b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
329b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#define PORTABLE_TAG "syscall_portable"
339b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#include <log_portable.h>
349b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
359b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#if __NR_gettimeofday_portable == __NR_gettimeofday
369b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#error "Bad build environment"
379b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
389b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
399b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney/*
409b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * Minimal syscall support for LTP testing.
419b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * These are the system calls that LTP references explicitly.
429b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney * Not all of them are exported via bionic header so use #ifdef.
43c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney *
44c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney * TODO:
45c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney *    Add existing portable system calls currently redirected from
46c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney *    experimental Bionic linker code so that calls to them via
47c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney *    syscall() are also processed. For example, LTP only calls open()
48c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney *    directly and never does a syscall(__NR_open, ...).
499b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney */
509b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
519b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
526433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsiehextern int REAL(syscall)(int, ...);
539b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
54a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#define MAXARGS 8
559b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
566433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsiehint WRAP(syscall)(int portable_number, ...)
579b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney{
589b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    va_list ap;
599b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    int native_number, ret;
609b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    int i, nargs, args[MAXARGS];
619b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
62a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    ALOGV(" ");
63a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    ALOGV("%s(portable_number:%d, ...) {", __func__, portable_number);
64a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
659b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    switch (portable_number) {
669b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_add_key_portable
679b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_add_key_portable: native_number = __NR_add_key; break;
689b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
696732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
709b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_cacheflush_portable
718930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney    case __NR_cacheflush_portable: {
729b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        long start, end, flags;
738930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney
749b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_start(ap, portable_number);
759b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        start = va_arg(ap, long);
769b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        end = va_arg(ap, long);
779b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        flags = va_arg(ap, long);
789b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_end(ap);
798930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney
80a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        ret = cacheflush(start, end, flags);
81a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
829b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
839b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
846732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
859b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_capget_portable
869b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_capget_portable: native_number = __NR_capget; break;
879b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
88a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
899b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_capset_portable
909b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_capset_portable: native_number = __NR_capset; break;
919b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
92a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
939b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_clock_getres_portable
949b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_clock_getres_portable: native_number = __NR_clock_getres; break;
959b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
96a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
97a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_clock_nanosleep
98a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_clock_nanosleep_portable: native_number = __NR_clock_nanosleep; break;
99a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
100a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1019b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_dup3_portable
1029b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_dup3_portable: native_number = __NR_dup3; break;
1039b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
104a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
105a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_epoll_create_portable
106a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_epoll_create_portable: native_number = __NR_epoll_create; break;
107a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
108a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1099b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_epoll_create1_portable
1109b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_epoll_create1_portable: native_number = __NR_epoll_create1; break;
1119b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
112a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1139b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_eventfd_portable
114c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    /*
115c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * Prior to 2.6.27 we only had this system call,
116c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * which didn't have a flags argument. The kernel
117c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * just provides a zero for flags when this system
118c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * call number is used.
119c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     */
120c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_eventfd_portable: {
121c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        unsigned int initval;                        /* 64-bit counter initial value */
122c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int flags = 0;
123c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
124c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
125c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
126c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        initval  = va_arg(ap, int);
127c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
128c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
129c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
1306433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(eventfd)(initval, flags);      /* Android uses __NR_eventfd2 in eventfd() */
131c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
132c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
1339b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
134a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1359b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_eventfd2_portable
136c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    /*
137c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * Starting with Linux 2.6.27 a flags argument was added.
138c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * Both Bionic and glibc implement the eventfd() now with
139c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     * the additional flags argument.
140c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney     */
141c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_eventfd2_portable: {
142c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        unsigned int initval;                        /* 64-bit counter initial value */
143c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int flags;
144c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
145c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
146c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
147c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        initval  = va_arg(ap, int);
148c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        flags = va_arg(ap, int);
149c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
150c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
151c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
1526433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(eventfd)(initval, flags);      /* Android uses __NR_eventfd2 in eventfd() */
153c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
154c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
1559b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
156a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1579b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_exit_group_portable
1589b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_exit_group_portable: native_number = __NR_exit_group; break;
1599b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
160a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
161a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_faccessat_portable
162a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_faccessat_portable: native_number = __NR_faccessat; break;
163a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
164a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1659b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_fallocate_portable
1669b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_fallocate_portable: native_number = __NR_fallocate; break;
1679b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
168a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
169a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_fchmodat_portable
170a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_fchmodat_portable: native_number = __NR_fchmodat; break;
171a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
172a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
173a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_fchownat_portable
174a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_fchownat_portable: native_number = __NR_fchownat; break;
175a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
176a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
177a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_fstatat64_portable
178a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_fstatat64_portable: native_number = __NR_fstatat64; break;
179a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
180a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
181a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_futimesat_portable
182a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_futimesat_portable: native_number = __NR_futimesat; break;
183a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
184a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1859b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_getegid_portable
1869b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_getegid_portable: native_number = __NR_getegid; break;
1879b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
188a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1899b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_geteuid_portable
1909b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_geteuid_portable: native_number = __NR_geteuid; break;
1919b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
192a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
193a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_getgid_portable
194a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_getgid_portable: native_number = __NR_getgid; break;
195a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
196a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
1979b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_get_mempolicy_portable
1989b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_get_mempolicy_portable: native_number = __NR_get_mempolicy; break;
1999b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
200a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2019b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_get_robust_list_portable
2029b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_get_robust_list_portable: native_number = __NR_get_robust_list; break;
2039b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
204a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2059b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_gettid_portable
2069b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_gettid_portable: native_number = __NR_gettid; break;
2079b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
208a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2099b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_gettimeofday_portable
2109b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_gettimeofday_portable: native_number = __NR_gettimeofday; break;
2119b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
212a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
213a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_getuid_portable
214a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_getuid_portable: native_number = __NR_getuid; break;
215a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
216a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
217a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_inotify_init_portable
218a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_inotify_init_portable: native_number = __NR_inotify_init; break;
219a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
220a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
221a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_inotify_add_watch_portable
222a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_inotify_add_watch_portable: native_number = __NR_inotify_add_watch; break;
223a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
224a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2259b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_inotify_init1_portable
226c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_inotify_init1_portable: {
227c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int portable_flags;
228c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
229c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
230c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        portable_flags = va_arg(ap, int);
231c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
232c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
2336433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(inotify_init1)(portable_flags);
234c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
235c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
2369b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
237a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2389b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_keyctl_portable
2399b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_keyctl_portable: native_number = __NR_keyctl; break;
2409b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
241a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
242a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_linkat
243a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_linkat_portable: native_number = __NR_linkat; break;
244a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
245a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2469b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_mbind_portable
2479b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_mbind_portable: native_number = __NR_mbind; break;
2489b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
249a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
250a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_mkdirat_portable
251a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_mkdirat_portable: native_number = __NR_mkdirat; break;
252a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
253a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
254a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_mknodat_portable
255a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_mknodat_portable: native_number = __NR_mknodat; break;
256a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
257a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
258a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_openat_portable
259a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_openat_portable: native_number = __NR_openat; break;
260a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
261a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2629b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_pipe2_portable
263c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_pipe2_portable: {
264c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int *pipefd_ptr;
265c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int portable_flags;
266c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
267c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
268c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        pipefd_ptr = va_arg(ap, int *);
269c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        portable_flags = va_arg(ap, int);
270c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
271c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
2726433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(pipe2)(pipefd_ptr, portable_flags);
273c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
274c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
2759b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
2766732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
277a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_readahead_portable
278a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_readahead_portable: native_number = __NR_readahead; break;
279a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
280a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
281a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_readlinkat_portable
282a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_readlinkat_portable: native_number = __NR_readlinkat; break;
283a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
284a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
285a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_renameat_portable
286a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_renameat_portable: native_number = __NR_renameat; break;
287a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
288a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
2899b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_rt_sigaction_portable
2906732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    case __NR_rt_sigaction_portable: {
2916732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        int sig;
2926732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        struct sigaction_portable *act;
2936732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        struct sigaction_portable *oact;
2946732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        size_t sigsetsize;
2956732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
2966732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_start(ap, portable_number);
2976732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sig = va_arg(ap, int);
2986732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        act = va_arg(ap, struct sigaction_portable *);
2996732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        oact = va_arg(ap, struct sigaction_portable *);
3006732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sigsetsize = va_arg(ap, size_t);
3016732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_end(ap);
3026433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        return WRAP(__rt_sigaction)(sig, act, oact, sigsetsize);
3036732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    }
3049b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
3056732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3069b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_rt_sigprocmask_portable
3076732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    case __NR_rt_sigprocmask_portable: {
3086732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        int how;
3096732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        const sigset_portable_t *set;
3106732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sigset_portable_t *oset;
3116732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        size_t sigsetsize;
3126732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3136732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_start(ap, portable_number);
3146732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        how = va_arg(ap, int);
3156732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        set = va_arg(ap, sigset_portable_t *);
3166732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        oset = va_arg(ap, sigset_portable_t *);
3176732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sigsetsize = va_arg(ap, size_t);
3186732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_end(ap);
319a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3206433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(__rt_sigprocmask)(how, set, oset, sigsetsize);
321a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
3226732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    }
3239b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
3246732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3259b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_rt_sigtimedwait_portable
3266732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    case __NR_rt_sigtimedwait_portable: {
3276732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        const sigset_portable_t *set;
3286732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        siginfo_portable_t *info;
3296732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        const struct timespec *timeout;
3306732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        size_t sigsetsize;
3316732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3326732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_start(ap, portable_number);
3336732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        set = va_arg(ap, sigset_portable_t *);
3346732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        info = va_arg(ap, siginfo_portable_t *);
3356732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        timeout = va_arg(ap, struct timespec *);
3366732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sigsetsize = va_arg(ap, size_t);
3376732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_end(ap);
338a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3396433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(__rt_sigtimedwait)(set, info, timeout, sigsetsize);
340a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
341a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    }
342a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
343a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
344a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_rt_sigqueueinfo_portable
345a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_rt_sigqueueinfo_portable: {
346a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        pid_t pid;
347a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int sig;
348a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        siginfo_portable_t *uinfo;
349a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
350a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        va_start(ap, portable_number);
351a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        pid = va_arg(ap, pid_t);
352a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        sig = va_arg(ap, int);
353a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        uinfo = va_arg(ap, siginfo_portable_t *);
354a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        va_end(ap);
355a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3566433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(rt_sigqueueinfo)(pid, sig, uinfo);
357a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
3586732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    }
3596732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney#endif
3606732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3616732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney#ifdef __NR_setgid_portable
3626732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    case __NR_setgid_portable: native_number = __NR_setgid; break;
3639b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
3646732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
3659b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_set_mempolicy_portable
3669b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_set_mempolicy_portable: native_number = __NR_set_mempolicy; break;
3679b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
368a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3699b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_set_robust_list_portable
3709b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_set_robust_list_portable: native_number = __NR_set_robust_list; break;
3719b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
372a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3739b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_set_tid_address_portable
3749b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_set_tid_address_portable: native_number = __NR_set_tid_address; break;
3759b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
376a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3779b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_sgetmask_portable
3789b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_sgetmask_portable: native_number = __NR_sgetmask; break;
3799b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
380a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
3819b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_signalfd4_portable
382c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_signalfd4_portable: {
383c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int fd;
384c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        sigset_portable_t *portable_sigmask;
385c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int sigsetsize;
386c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int flags;
387c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
388c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
389c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
390c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        fd = va_arg(ap, int);
391c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        portable_sigmask = va_arg(ap, sigset_portable_t *);
392c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        sigsetsize = va_arg(ap, int);
393c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        flags = va_arg(ap, int);
394c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
395c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
396c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
397c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        ret = do_signalfd4_portable(fd, (const sigset_portable_t *) portable_sigmask, sigsetsize,
398c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney                                    flags);
399c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
400c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
4019b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
402a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4039b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_socketcall_portable
4049b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_socketcall_portable: native_number = __NR_socketcall; break;
4059b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
406a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4079b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_splice_portable
4089b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_splice_portable: native_number = __NR_splice; break;
4099b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
410a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
411a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney/* REMIND - DOUBLE CHECK THIS ONE */
4129b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_ssetmask_portable
4139b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_ssetmask_portable: native_number = __NR_ssetmask; break;
4149b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
415a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4169b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_swapoff_portable
4179b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_swapoff_portable: native_number = __NR_swapoff; break;
4189b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
419a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4209b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_swapon_portable
4219b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_swapon_portable: native_number = __NR_swapon; break;
4229b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
423a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4249b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_symlinkat_portable
4259b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_symlinkat_portable: native_number = __NR_symlinkat; break;
4269b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
427a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
428a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney/*
429a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * ARM uses the new, version 2, form of sync_file_range() which
430a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * doesn't waste 32 bits between the 32 bit arg and the 64 bit arg.
431a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * It does this by moving the last 32 bit arg and placing it with
432a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * the 1st 32 bit arg.
433a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *
434a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * Here's the trivial mapping function in the kernel ARM code:
435a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *
436a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *   sync_file_range2(int fd, unsigned int flags, loff_t offset, loff_t nbytes) {
437a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *       return sys_sync_file_range(fd, offset, nbytes, flags);
438a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *   }
439a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney *
440a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * For portability we have to do a similar mapping for the native/MIPS system
441a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * call but have to provide the alignment padding expected by the sync_file_range()
442a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * system call. We avoid alignment issues while using varargs by avoiding the use
443a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney * of 64 bit args.
444a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney */
445a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#if defined( __NR_arm_sync_file_range_portable)
446a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_arm_sync_file_range_portable: native_number = __NR_sync_file_range; {
447a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int fd;
448a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int flags;
449a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int offset_low, offset_high;
450a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int nbytes_low, nbytes_high;
451a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        int align_fill = 0;
452a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
453a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
454a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        va_start(ap, portable_number);
455a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        fd = va_arg(ap, int);
456a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        flags = va_arg(ap, int);
457a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        offset_low = va_arg(ap, int);
458a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        offset_high = va_arg(ap, int);
459a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        nbytes_low = va_arg(ap, int);
460a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        nbytes_high = va_arg(ap, int);
461a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        va_end(ap);
462a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
463a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        ALOGV("%s: Calling syscall(native_number:%d:'sync_file_range', fd:%d, "
464a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney              "align_fill:0x%x, offset_low:0x%x, offset_high:0x%x, "
465a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney              "nbytes_low:0x%x, nbytes_high:0x%x, flags:0x%x);", __func__,
466a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney              native_number, fd, align_fill, offset_low, offset_high,
467a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney              nbytes_low, nbytes_high, flags);
468a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4696433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = REAL(syscall)(native_number, fd, align_fill, offset_low, offset_high,
470a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney                      nbytes_low, nbytes_high, flags);
471a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
472a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
473a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    }
4749b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
475a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
476a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4779b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR__sysctl_portable
4789b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR__sysctl_portable: native_number = __NR__sysctl; break;
4799b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
480a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4819b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_sysfs_portable
4829b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_sysfs_portable: native_number = __NR_sysfs; break;
4839b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
484a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4859b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_syslog_portable
4869b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_syslog_portable: native_number = __NR_syslog; break;
4879b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
4886732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
489a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_tee_portable
490a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_tee_portable: native_number = __NR_tee; break;
491a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
492a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
4939b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_timer_create_portable
4948930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney    case __NR_timer_create_portable: {
4959b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        clockid_t clockid;
4969b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        struct sigevent *evp;
4979b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        timer_t *timerid;
4989b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
4999b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_start(ap, portable_number);
5009b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        clockid = va_arg(ap, clockid_t);
5019b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        evp = va_arg(ap, struct sigevent *);
5029b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        timerid = va_arg(ap, timer_t *);
5039b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_end(ap);
5049b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
5056433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(timer_create)(clockid, evp, timerid);
506a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
5079b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
5089b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
5096732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
5109b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_timerfd_create_portable
511c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    case __NR_timerfd_create_portable: {
512c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int clockid;
513c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        int flags;
514c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
515c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_start(ap, portable_number);
516c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        clockid = va_arg(ap, int);              /* clockid is portable */
517c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        flags = va_arg(ap, int);                /* flags need to be mapped */
518c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        va_end(ap);
519c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney
5206433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(timerfd_create)(clockid, flags);
521c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney        goto done;
522c684613e19bce87e5ee3cdee5fb1e7ed5be14229Pete Delaney    }
5239b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
524a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
525a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_timerfd_gettime_portable
526a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_timerfd_gettime_portable: native_number = __NR_timerfd_gettime; break;
527a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
528a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
529a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_timerfd_settime_portable
530a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_timerfd_settime_portable: native_number = __NR_timerfd_settime; break;
531a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
532a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
5339b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_timer_getoverrun_portable
5349b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_timer_getoverrun_portable: native_number = __NR_timer_getoverrun; break;
5359b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
536a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
5379b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_timer_gettime_portable
5389b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    case __NR_timer_gettime_portable: native_number = __NR_timer_gettime; break;
5399b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
5406732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
541a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_timer_settime_portable
542a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_timer_settime_portable: native_number = __NR_timer_settime; break;
543a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
544a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
5456732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney#ifdef __NR_rt_tgsigqueueinfo_portable
5466732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    case __NR_rt_tgsigqueueinfo_portable: {
5476732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        pid_t tgid;
5486732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        pid_t pid;
5496732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        int sig;
5506732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        siginfo_portable_t *uinfo;
5516732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
5526732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_start(ap, portable_number);
5536732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        tgid = va_arg(ap, pid_t);
5546732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        pid = va_arg(ap, pid_t);
5556732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        sig = va_arg(ap, int);
5566732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        uinfo = va_arg(ap, siginfo_portable_t *);
5576732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        va_end(ap);
5586732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
5596433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(rt_tgsigqueueinfo)(tgid, pid, sig, uinfo);
5606732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney        goto done;
5616732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney    }
5626732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney#endif
5636732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
5649b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#ifdef __NR_tkill_portable
5658930ac553438f5265d36ba048493d1bc4a89dde3Pete Delaney    case __NR_tkill_portable: {
5669b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        int tid, sig;
5679b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
5689b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_start(ap, portable_number);
5699b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        tid = va_arg(ap, int);
5709b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        sig = va_arg(ap, int);
5719b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        va_end(ap);
5729b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
5736433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh        ret = WRAP(tkill)(tid, sig);
574a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        goto done;
5759b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
5769b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney#endif
5776732a917fdb65b36bf0cbfc68529cf9b0450344bPete Delaney
578a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_uname_portable
579a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_uname_portable: native_number = __NR_uname; break;
580a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
581a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
582a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#ifdef __NR_vmsplice_portable
583a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    case __NR_vmsplice_portable: native_number = __NR_vmsplice; break;
584a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney#endif
585a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
5869b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    default:
587a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        ALOGV("%s(portable_number:%d,  ...): case default; native_number = -1; "
588a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney              "[ERROR: ADD MISSING SYSTEM CALL]", __func__, portable_number);
589a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
5909b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        native_number = -1;
5919b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        break;
5929b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
5939b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
594a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    ALOGV("%s: native_number = %d", __func__, native_number);
595a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
596a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    if (native_number <= 0) {
597a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney        ALOGV("%s: native_number:%d <= 0; ret = -1; [ERROR: FIX SYSTEM CALL]", __func__,
598a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney                   native_number);
5999b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
60078175cbcc57537b1642ff4b6f8fe1a87233ea71aAndrew Hsieh        *REAL(__errno)() = ENOSYS;
6019b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        ret = -1;
6029b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        goto done;
6039b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
6049b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
6059b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    /*
6069b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     * Get the argument list
6079b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     * This is pretty crappy:
6089b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *   It assumes that the portable and native arguments are compatible
6099b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *   It assumes that no more than MAXARGS arguments are passed
6109b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *
6119b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     * Possible changes:
6129b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *  o include the argument count for each mapped system call
6139b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *  o map the syscall into the equivalent library call:
6149b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *    eg syscall(__NR_gettimeofday_portable, struct timeval *tv, struct timezone *tz) =>
6159b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *       gettimeofday(struct timeval *tv, struct timezone *tz)
6169b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *
6179b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     * second option is probably best as it allows argument remapping to take place if needed
6189b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     *
6199b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney     */
6209b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    va_start(ap, portable_number);
6219b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    /* For now assume all syscalls take MAXARGS arguments. */
6229b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    nargs = MAXARGS;
6239b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    for (i = 0; i < nargs; i++)
6249b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney        args[i] = va_arg(ap, int);
6259b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    va_end(ap);
6269b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
627a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney    ALOGV("%s: Calling syscall(%d, %d, %d, %d, %d, %d, %d, %d, %d);", __func__,
628a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney          native_number, args[0], args[1], args[2], args[3], args[4],
629a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney          args[5], args[6], args[7]);
630a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney
6316433ec22b1e20af20b31671b2fd4d5d235a7de52Andrew Hsieh    ret = REAL(syscall)(native_number, args[0], args[1], args[2], args[3],
632a89a54998716253ec60bf5330304dd158f6fe8bdPete Delaney                  args[4], args[5], args[6], args[7]);
6339b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney
6349b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaneydone:
6359b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    if (ret == -1) {
63678175cbcc57537b1642ff4b6f8fe1a87233ea71aAndrew Hsieh        ALOGV("%s: ret == -1; errno:%d;", __func__, *REAL(__errno)());
6379b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    }
6389b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    ALOGV("%s: return(ret:%d); }", __func__, ret);
6399b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney    return ret;
6409b350a5d225f14658a3ee59b937fbc3538c7e3c2Pete Delaney}
641