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