am 13b81329: Merge "[MIPS] Tighten up code to fit within 100 characters lines."
* commit '13b81329385e1e8ec3ff55737f98bd1a9ededd74': [MIPS] Tighten up code to fit within 100 characters lines.
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <sched.h>
|
||||
#include <stdarg.h>
|
||||
@@ -83,7 +84,7 @@ int clone_portable(int (*fn)(void *), void *child_stack, int port_flags, void *a
|
||||
mips_flags = port_flags;
|
||||
} else {
|
||||
portable_term_signame = map_portable_signum_to_name(portable_term_signum);
|
||||
mips_term_signum = map_portable_signum_to_mips(portable_term_signum);
|
||||
mips_term_signum = signum_pton(portable_term_signum);
|
||||
mips_term_signame = map_mips_signum_to_name(mips_term_signum);
|
||||
mips_flags = (port_flags & ~0xFF) | (mips_term_signum & 0xFF);
|
||||
}
|
||||
|
||||
@@ -217,7 +217,6 @@ extern int __fcntl64(int, int, void *);
|
||||
* pid_t l_pid; pid_t l_pid;
|
||||
* } }
|
||||
*/
|
||||
|
||||
int fcntl_portable(int fd, int portable_cmd, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -334,7 +333,10 @@ int fcntl_portable(int fd, int portable_cmd, ...)
|
||||
/*
|
||||
* This is likely a rare situation, abort() would hang fcntl13 LTP test.
|
||||
*/
|
||||
ALOGE("%s: mips_cmd:%d Doesn't appear to be supported; assume it doesn't need to be mapped!", __func__, mips_cmd);
|
||||
ALOGE("%s: mips_cmd:%d doesn't appear to be supported;", __func__,
|
||||
mips_cmd);
|
||||
|
||||
ALOGV("%s: Assume it doesn't need to be mapped!", __func__);
|
||||
|
||||
result = __fcntl64(fd, mips_cmd, arg);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,59 @@
|
||||
#include <poll.h>
|
||||
#include <poll_portable.h>
|
||||
|
||||
/*
|
||||
*_XOPEN_SOURCE added the ability to not only poll for data coming in or out
|
||||
* but now also the ability to poll for high priority input and output. Though
|
||||
* the normal priority is equivalent to the original I/O it was assigned new bits:
|
||||
* POLLIN Equivalent to POLLRDNORM
|
||||
* POLLOUT Equivalent to POLLWRNORM
|
||||
*
|
||||
* The Linux kernel sets both POLLIN and POLLRDNORM when data is available and sets
|
||||
* both POLLOUT and POLLWRNORM when data can be written; so the new priority BAND bits
|
||||
* just supplement the meaning of the prior POLLIN and POLLOUT bits as well as the
|
||||
* new POLLRDNORM and POLLWRNORM bits.
|
||||
*
|
||||
* The DECNet Protocol can set the poll in priority flag, POLLRDBAND.
|
||||
* ATM as well as a whole bunch of other protocols can set the poll out priority flag,
|
||||
* POLLWRBAND.
|
||||
*
|
||||
* MIPS and SPARC likely assigned the new XOPEN poll out event flags in UNIX well before
|
||||
* UNIX was ported to X86. It appears that Intel chose different bits and that was
|
||||
* established by Linus as the the generic case and later also chosen by ARM.
|
||||
*
|
||||
* POLLWRNORM:0x100 - MIPS used POLLOUT:0x0004, which is equivalent in meaning.
|
||||
*
|
||||
* POLLWRBAND:0x200 - MIPS used 0x0100. which is POLLWRNORM:0x100.
|
||||
*
|
||||
* Summary:
|
||||
* ========
|
||||
* Both Normal and Priority flags can be mapped to MIPS flags (left to right below).
|
||||
* Only the Priority poll out flag can be mapped back to portable because MIPS
|
||||
* is using the same number as POLLOUT for POLLWRNORM (right to left below).
|
||||
*
|
||||
* ARM/GENERIC/PORTABLE MIPS
|
||||
* ==================== ======
|
||||
* POLLIN 0x0001 0x0001
|
||||
* POLLPRI 0x0002 0x0002
|
||||
* POLLOUT 0x0004 <-----+ 0x0004
|
||||
* POLLERR 0x0008 \ 0x0008
|
||||
* POLLHUP 0x0010 \ 0x0010
|
||||
* POLLNVAL 0x0020 \ 0x0020
|
||||
* POLLRDNORM 0x0040 \ 0x0040
|
||||
* POLLRDBAND 0x0080 \ 0x0080
|
||||
* POLLWRNORM 0x0100 -----------+<----> 0x0004
|
||||
* POLLWRBAND 0x0200 <-----------------> 0x0100
|
||||
* POLLMSG 0x0400 0x0400
|
||||
* POLLREMOVE 0x1000 0x1000
|
||||
* POLLRDHUP 0x2000 0x2000
|
||||
*
|
||||
* The loss of the high priority notice for the polling
|
||||
* of output data is likely minor as it was only being used
|
||||
* in DECNet. Also, the poll system call and device poll
|
||||
* implementations processes POLLOUT and POLLWRNORM event
|
||||
* flags the same.
|
||||
*/
|
||||
|
||||
#if POLLWRNORM_PORTABLE==POLLWRNORM
|
||||
#error Bad build environment
|
||||
#endif
|
||||
@@ -38,7 +91,10 @@ static inline short mips_change_portable_events(short portable_events)
|
||||
|
||||
static inline short change_mips_events(short mips_events)
|
||||
{
|
||||
/* MIPS POLLWRNORM equals POLLOUT that is the same as POLLOUT_PORTABLE, so we just update POLLWRBNAD_PORTABLE. */
|
||||
/*
|
||||
* MIPS POLLWRNORM equals MIPS POLLOUT, which is the same as POLLOUT_PORTABLE;
|
||||
* so we just map POLLWRBAND to POLLWRBAND_PORTABLE.
|
||||
*/
|
||||
if (mips_events & POLLWRBAND) {
|
||||
mips_events &= ~POLLWRBAND;
|
||||
mips_events |= POLLWRBAND_PORTABLE;
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
{ \
|
||||
int rv, portable_rv; \
|
||||
\
|
||||
ALOGV(" "); \
|
||||
ALOGV("%s" fmt, __func__, STRIP_PARENS(CALLARGS)); \
|
||||
rv = fn CALLARGS; \
|
||||
portable_rv = ntop_errno(rv); \
|
||||
@@ -67,99 +68,194 @@
|
||||
}
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_init, (pthread_attr_t *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_destroy, (pthread_attr_t *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setdetachstate, (pthread_attr_t *attr, int state), (attr, state), "(attr:%p, state:%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getdetachstate, (pthread_attr_t const *attr, int *state), (attr, state), "(attr:%p, state:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_setdetachstate, (pthread_attr_t *attr, int state), (attr, state),
|
||||
"(attr:%p, state:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setschedpolicy, (pthread_attr_t *attr, int policy), (attr, policy), "(attr:%p, policy:%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getschedpolicy, (pthread_attr_t const *attr, int *policy), (attr, policy), "(attr:%p, policy:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getdetachstate, (pthread_attr_t const *attr, int *state),
|
||||
(attr, state), "(attr:%p, state:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setschedparam, (pthread_attr_t *attr, struct sched_param const *param), (attr, param), "(attr:%p, param:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getschedparam, (pthread_attr_t const *attr, struct sched_param *param), (attr, param), "(attr:%p, param:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_setschedpolicy, (pthread_attr_t *attr, int policy), (attr, policy),
|
||||
"(attr:%p, policy:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setstacksize, (pthread_attr_t *attr, size_t stack_size), (attr, stack_size), "(attr:%p, stack_size=%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getstacksize, (pthread_attr_t const *attr, size_t *stack_size), (attr, stack_size), "(attr:%p, stach_size=%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getschedpolicy, (pthread_attr_t const *attr, int *policy),
|
||||
(attr, policy), "(attr:%p, policy:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setstack, (pthread_attr_t *attr, void *stackaddr, size_t stack_size), (attr, stackaddr, stack_size), "(attr:%p, stackaddr:%p stack_size:%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getstack, (pthread_attr_t const *attr, void **stackaddr, size_t *stack_size), (attr, stackaddr, stack_size), "(attr:%p, stackaddr:%p stack_size:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_setschedparam,
|
||||
(pthread_attr_t *attr, struct sched_param const *param), (attr, param),
|
||||
"(attr:%p, param:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setguardsize, (pthread_attr_t *attr, size_t guard_size), (attr, guard_size), "(attr:%p, guard_size:%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getguardsize, (pthread_attr_t const *attr, size_t *guard_size), (attr, guard_size), "(attr:%p, guard_size:%p)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getschedparam,
|
||||
(pthread_attr_t const *attr, struct sched_param *param), (attr, param),
|
||||
"(attr:%p, param:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setstacksize, (pthread_attr_t *attr, size_t stack_size),
|
||||
(attr, stack_size), "(attr:%p, stack_size:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_getstacksize, (pthread_attr_t const *attr, size_t *stack_size),
|
||||
(attr, stack_size), "(attr:%p, stack_size:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setstack, (pthread_attr_t *attr, void *stackaddr, size_t stack_size),
|
||||
(attr, stackaddr, stack_size), "(attr:%p, stackaddr:%p, stack_size:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_getstack, (pthread_attr_t const *attr, void **stackaddr,
|
||||
size_t *stack_size), (attr, stackaddr, stack_size),
|
||||
"(attr:%p, stackaddr:%p stack_size:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setguardsize, (pthread_attr_t *attr, size_t guard_size),
|
||||
(attr, guard_size), "(attr:%p, guard_size:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_getguardsize, (pthread_attr_t const *attr, size_t *guard_size),
|
||||
(attr, guard_size), "(attr:%p, guard_size:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setscope, (pthread_attr_t *attr, int scope), (attr, scope),
|
||||
"(attr:%p, scope:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_attr_setscope, (pthread_attr_t *attr, int scope), (attr, scope), "(attr:%p, scope:%d)");
|
||||
PTHREAD_WRAPPER(pthread_attr_getscope, (pthread_attr_t const *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_getattr_np, (pthread_t thid, pthread_attr_t *attr), (thid, attr), "(thid:%lx, attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_getattr_np, (pthread_t thid, pthread_attr_t *attr), (thid, attr),
|
||||
"(thid:%lx, attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_create, (pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg),
|
||||
(thread, attr, start_routine, arg),
|
||||
"(thread:%p attr:%p, start_routine:%p, arg:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_create, (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg), (thread, attr, start_routine, arg), "(thread:%p attr:%p, start_routine:%p, arg:%p)");
|
||||
// void pthread_exit(void * retval);
|
||||
PTHREAD_WRAPPER(pthread_join, (pthread_t thid, void **ret_val), (thid, ret_val), "(thid:%lx, ret_val:%p)");
|
||||
PTHREAD_WRAPPER(pthread_join, (pthread_t thid, void **ret_val), (thid, ret_val),
|
||||
"(thid:%lx, ret_val:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_detach, (pthread_t thid), (thid), "(thid:%lx)");
|
||||
|
||||
// pthread_t pthread_self(void);
|
||||
// int pthread_equal(pthread_t one, pthread_t two);
|
||||
|
||||
PTHREAD_WRAPPER(pthread_getschedparam, (pthread_t thid, int *policy, struct sched_param *param), (thid, policy, param), "(thid:%lx, policy:%p, param:%p)");
|
||||
PTHREAD_WRAPPER(pthread_setschedparam, (pthread_t thid, int policy, struct sched_param const *param), (thid, policy, param), "(thid:%lx, policy:%d, param:%p)");
|
||||
PTHREAD_WRAPPER(pthread_getschedparam, (pthread_t thid, int *policy, struct sched_param *param),
|
||||
(thid, policy, param), "(thid:%lx, policy:%p, param:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_setschedparam, (pthread_t thid, int policy,
|
||||
struct sched_param const *param), (thid, policy, param),
|
||||
"(thid:%lx, policy:%d, param:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_init, (pthread_mutexattr_t *attr), (attr), "(attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_destroy, (pthread_mutexattr_t *attr), (attr), "(attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_gettype, (const pthread_mutexattr_t *attr, int *type), (attr, type), "(attr:%p, type:%p)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_settype, (pthread_mutexattr_t *attr, int type), (attr, type), "(attr:%p, type:%d)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_setpshared, (pthread_mutexattr_t *attr, int pshared), (attr, pshared), "(attr:%p, pshared:%d)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_getpshared, (pthread_mutexattr_t *attr, int *pshared), (attr, pshared), "(attr:%p, pshared:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_init, (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr), (mutex, attr), "(mutex:%p, attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_destroy, (pthread_mutexattr_t *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_gettype, (const pthread_mutexattr_t *attr, int *type),
|
||||
(attr, type), "(attr:%p, type:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_settype, (pthread_mutexattr_t *attr, int type), (attr, type),
|
||||
"(attr:%p, type:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_setpshared, (pthread_mutexattr_t *attr, int pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutexattr_getpshared, (pthread_mutexattr_t *attr, int *pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_init, (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr),
|
||||
(mutex, attr), "(mutex:%p, attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_destroy, (pthread_mutex_t *mutex), (mutex), "(mutex:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_lock, (pthread_mutex_t *mutex), (mutex), "(mutex:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_unlock, (pthread_mutex_t *mutex), (mutex), "(mutex:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_trylock, (pthread_mutex_t *mutex), (mutex), "(mutex:%p)");
|
||||
|
||||
#if 0 /* MISSING FROM BIONIC */
|
||||
PTHREAD_WRAPPER(pthread_mutex_timedlock, (pthread_mutex_t *mutex, struct timespec *ts), (mutex, ts), "(mutex:%p, ts:%p)");
|
||||
PTHREAD_WRAPPER(pthread_mutex_timedlock, (pthread_mutex_t *mutex, struct timespec *ts),
|
||||
(mutex, ts), "(mutex:%p, ts:%p)");
|
||||
#endif /* MISSING */
|
||||
|
||||
PTHREAD_WRAPPER(pthread_condattr_init, (pthread_condattr_t *attr), (attr), "(attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_condattr_getpshared, (pthread_condattr_t *attr, int *pshared), (attr, pshared), "(attr:%p, pshared:%p)");
|
||||
PTHREAD_WRAPPER(pthread_condattr_setpshared, (pthread_condattr_t* attr, int pshared), (attr, pshared), "(attr:%p, pshared:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_condattr_getpshared, (pthread_condattr_t *attr, int *pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_condattr_setpshared, (pthread_condattr_t* attr, int pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_condattr_destroy, (pthread_condattr_t *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_init, (pthread_cond_t *cond, const pthread_condattr_t *attr), (cond, attr), "(cond:%p, attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_init, (pthread_cond_t *cond, const pthread_condattr_t *attr),
|
||||
(cond, attr), "(cond:%p, attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_destroy, (pthread_cond_t *cond), (cond), "(cond:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_broadcast, (pthread_cond_t *cond), (cond), "(cond:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_signal, (pthread_cond_t *cond), (cond), "(cond:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex), (cond, mutex), "(cond:%p, mutex:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait, (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime), (cond, mutex, abstime), "(cond:%p, mutex:%p, abstime:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_monotonic_np, (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime), (cond, mutex, abstime), "(cond:%p, mutex:%p, abstime:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_monotonic, (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime), (cond, mutex, abstime), "(cond:%p, mutex:%p, abstime:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_relative_np, (pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *reltime), (cond, mutex, reltime), "(cond:%p, mutex:%p, reltime:%p)");
|
||||
PTHREAD_WRAPPER(pthread_cond_wait, (pthread_cond_t *cond, pthread_mutex_t *mutex),
|
||||
(cond, mutex), "(cond:%p, mutex:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_timeout_np, (pthread_cond_t *cond, pthread_mutex_t *mutex, unsigned msecs), (cond, mutex, msecs), "(cond:%p, mutex:%p, msecs:%u)");
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait, (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
const struct timespec *abstime), (cond, mutex, abstime),
|
||||
"(cond:%p, mutex:%p, abstime:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_lock_timeout_np, (pthread_mutex_t *mutex, unsigned msecs), (mutex, msecs), "(mutex:%p, msecs:%u)");
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_monotonic_np, (pthread_cond_t *cond,
|
||||
pthread_mutex_t *mutex, const struct timespec *abstime),
|
||||
(cond, mutex, abstime), "(cond:%p, mutex:%p, abstime:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_monotonic, (pthread_cond_t *cond, pthread_mutex_t
|
||||
*mutex, const struct timespec *abstime),
|
||||
(cond, mutex, abstime), "(cond:%p, mutex:%p, abstime:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_timedwait_relative_np, (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
const struct timespec *reltime), (cond, mutex, reltime),
|
||||
"(cond:%p, mutex:%p, reltime:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_cond_timeout_np, (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
unsigned msecs), (cond, mutex, msecs), "(cond:%p, mutex:%p, msecs:%u)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_mutex_lock_timeout_np, (pthread_mutex_t *mutex, unsigned msecs),
|
||||
(mutex, msecs), "(mutex:%p, msecs:%u)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_init, (pthread_rwlockattr_t *attr), (attr), "(attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_destroy, (pthread_rwlockattr_t *attr), (attr), "(attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_setpshared, (pthread_rwlockattr_t *attr, int pshared), (attr, pshared), "(attr:%p, pshared:%d)");
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_getpshared, (pthread_rwlockattr_t *attr, int *pshared), (attr, pshared), "(attr:%p, pshared:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_init, (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr), (rwlock, attr), "(rwlock:%p, attr:%p)");
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_destroy, (pthread_rwlockattr_t *attr), (attr), "(attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_setpshared, (pthread_rwlockattr_t *attr, int pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%d)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlockattr_getpshared, (pthread_rwlockattr_t *attr, int *pshared),
|
||||
(attr, pshared), "(attr:%p, pshared:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_init, (pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr),
|
||||
(rwlock, attr), "(rwlock:%p, attr:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_destroy, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_rdlock, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_tryrdlock, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
PTHREAD_WRAPPER(pthread_rwlock_timedrdlock, (pthread_rwlock_t *rwlock, const struct timespec *abs_timeout), (rwlock, abs_timeout), "(rwlock:%p, abs_timeout:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_timedrdlock, (pthread_rwlock_t *rwlock,
|
||||
const struct timespec *abs_timeout),
|
||||
(rwlock, abs_timeout), "(rwlock:%p, abs_timeout:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_wrlock, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_trywrlock, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
PTHREAD_WRAPPER(pthread_rwlock_timedwrlock, (pthread_rwlock_t *rwlock, const struct timespec *abs_timeout), (rwlock, abs_timeout), "(rwlock:%p, abs_timeout:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_timedwrlock, (pthread_rwlock_t *rwlock,
|
||||
const struct timespec *abs_timeout), (rwlock, abs_timeout),
|
||||
"(rwlock:%p, abs_timeout:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_rwlock_unlock, (pthread_rwlock_t *rwlock), (rwlock), "(rwlock:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_key_create, (pthread_key_t *key, void (*destructor_function)(void *)), (key, destructor_function), "(key:%p, destructor_function:%p)");
|
||||
PTHREAD_WRAPPER(pthread_key_create, (pthread_key_t *key, void (*destructor_function)(void *)),
|
||||
(key, destructor_function), "(key:%p, destructor_function:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_key_delete , (pthread_key_t key), (key), "(key:%x)");
|
||||
PTHREAD_WRAPPER(pthread_setspecific, (pthread_key_t key, const void *value), (key, value), "(key:%x, value:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_setspecific, (pthread_key_t key, const void *value), (key, value),
|
||||
"(key:%x, value:%p)");
|
||||
|
||||
// void *pthread_getspecific(pthread_key_t key);
|
||||
|
||||
int pthread_kill_portable(pthread_t thread, int portable_signum)
|
||||
@@ -170,12 +266,14 @@ int pthread_kill_portable(pthread_t thread, int portable_signum)
|
||||
|
||||
ALOGV("%s(thread:%lx, portable_signum:%d)", __func__, thread, portable_signum);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
|
||||
if ((portable_signum != 0) && (mips_signum == 0)) {
|
||||
/* A signal MIPS doesn't support; all we can do is ignore it. */
|
||||
ret = 0;
|
||||
} else {
|
||||
ALOGV("%s: calling pthread_kill(thread:%lx, mips_signum:%d);", __func__,
|
||||
thread, mips_signum);
|
||||
ret = pthread_kill(thread, mips_signum);
|
||||
}
|
||||
portable_ret = ntop_errno(ret);
|
||||
@@ -186,16 +284,17 @@ int pthread_kill_portable(pthread_t thread, int portable_signum)
|
||||
return portable_ret;
|
||||
}
|
||||
|
||||
int pthread_sigmask_portable(int portable_how,
|
||||
const sigset_portable_t *portable_sigset,
|
||||
sigset_portable_t *portable_oldset)
|
||||
int pthread_sigmask_portable(int portable_how, const sigset_portable_t *portable_sigset,
|
||||
sigset_portable_t *portable_oldset)
|
||||
{
|
||||
int portable_ret, ret;
|
||||
|
||||
ALOGV("%s(portable_how:%d, portable_sigset:%p, portable_oldset:%p)", __func__,
|
||||
portable_how, portable_sigset, portable_oldset);
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_how:%d portable_sigset:%p, portable_oldset:%p)", __func__,
|
||||
portable_how, portable_sigset, portable_oldset);
|
||||
|
||||
ret = do_sigmask(portable_how, portable_sigset, portable_oldset, pthread_sigmask);
|
||||
|
||||
ret = sigmask_helper(portable_how, portable_sigset, portable_oldset, pthread_sigmask, "pthread_sigmask");
|
||||
portable_ret = ntop_errno(ret);
|
||||
|
||||
ALOGV("%s: return portable_ret:%d; ret:%d;", __func__,
|
||||
@@ -204,8 +303,12 @@ int pthread_sigmask_portable(int portable_how,
|
||||
return portable_ret;
|
||||
}
|
||||
|
||||
PTHREAD_WRAPPER(pthread_getcpuclockid, (pthread_t tid, clockid_t *clockid), (tid, clockid), "(tid:%lx, clockid:%p)");
|
||||
PTHREAD_WRAPPER(pthread_getcpuclockid, (pthread_t tid, clockid_t *clockid), (tid, clockid),
|
||||
"(tid:%lx, clockid:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_once, (pthread_once_t *once_control, void (*init_routine)(void)), (once_control, init_routine), "(once_control:%p, init_routine:%p)");
|
||||
PTHREAD_WRAPPER(pthread_once, (pthread_once_t *once_control, void (*init_routine)(void)),
|
||||
(once_control, init_routine), "(once_control:%p, init_routine:%p)");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_setname_np, (pthread_t thid, const char *thname), (thid, thname),
|
||||
"(thid:%lx, thname:\"%s\")");
|
||||
|
||||
PTHREAD_WRAPPER(pthread_setname_np, (pthread_t thid, const char *thname), (thid, thname), "(thid:%lx, thname:\"%s\")");
|
||||
|
||||
@@ -78,6 +78,7 @@ __hidden char *map_portable_signum_to_name(int portable_signum)
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
__hidden char *map_mips_signum_to_name(int mips_signum)
|
||||
{
|
||||
char *name;
|
||||
@@ -121,7 +122,11 @@ __hidden char *map_mips_signum_to_name(int mips_signum)
|
||||
return name;
|
||||
}
|
||||
|
||||
__hidden int map_portable_signum_to_mips(int portable_signum)
|
||||
|
||||
/*
|
||||
* Maps a signal number from portable to native.
|
||||
*/
|
||||
__hidden int signum_pton(int portable_signum)
|
||||
{
|
||||
int mips_signum = -1;
|
||||
|
||||
@@ -171,9 +176,9 @@ __hidden int map_portable_signum_to_mips(int portable_signum)
|
||||
case SIGTERM_PORTABLE: /* 15 */
|
||||
return SIGTERM;
|
||||
|
||||
case SIGSTKFLT_PORTABLE: /* 16 --> VOID:0 */
|
||||
/* No MIPS SIGSTKFLT Exits; try mapping it to zero */
|
||||
return 0;
|
||||
case SIGSTKFLT_PORTABLE: /* 16 --> 7 */
|
||||
return SIGEMT; /* No native SIGSTKFLT exist ...
|
||||
... mapping it to SIGEMT. */
|
||||
|
||||
case SIGCHLD_PORTABLE: /* 17 --> 18 */
|
||||
return SIGCHLD;
|
||||
@@ -224,8 +229,8 @@ __hidden int map_portable_signum_to_mips(int portable_signum)
|
||||
return SIGRTMIN;
|
||||
|
||||
default:
|
||||
ALOGE("%s: switch default: NOTE portable_signum:%d not supported.", __func__,
|
||||
portable_signum);
|
||||
ALOGE("%s: switch default: NOTE portable_signum:%d Not supported. Just a Test?",
|
||||
__func__, portable_signum);
|
||||
/*
|
||||
* User could be LTP testing with bogus signal numbers,
|
||||
* if so we mimic the test.
|
||||
@@ -234,13 +239,14 @@ __hidden int map_portable_signum_to_mips(int portable_signum)
|
||||
* we use a signal just outside the MIPS range.
|
||||
*/
|
||||
if (portable_signum < 0) {
|
||||
mips_signum = portable_signum;
|
||||
mips_signum = portable_signum;
|
||||
} else if (portable_signum > NSIG_PORTABLE) {
|
||||
mips_signum = (portable_signum - NSIG_PORTABLE) + NSIG;
|
||||
mips_signum = (portable_signum - NSIG_PORTABLE) + NSIG;
|
||||
} else {
|
||||
ALOGE("%s: 0 <= portable_signum:%d <= NSIG_PORTABLE:%d; not supported, Return(0);", __func__,
|
||||
portable_signum, NSIG_PORTABLE);
|
||||
mips_signum = 0;
|
||||
ALOGE("%s: 0 <= portable_signum:%d <= NSIG_PORTABLE:%d; Not supported, return(0);",
|
||||
__func__, portable_signum, NSIG_PORTABLE);
|
||||
|
||||
mips_signum = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -251,7 +257,10 @@ __hidden int map_portable_signum_to_mips(int portable_signum)
|
||||
}
|
||||
|
||||
|
||||
__hidden int map_mips_signum_to_portable(int mips_signum)
|
||||
/*
|
||||
* Maps a signal number from native to portable.
|
||||
*/
|
||||
__hidden int signum_ntop(int mips_signum)
|
||||
{
|
||||
int portable_ssignum = -1;
|
||||
|
||||
@@ -301,11 +310,10 @@ __hidden int map_mips_signum_to_portable(int mips_signum)
|
||||
case SIGTERM_PORTABLE: /* 15 */
|
||||
return SIGTERM;
|
||||
|
||||
#if defined(SIGSTKFLT)
|
||||
case SIGSTKFLT: /* 16 <--- VOID; NOT SUPPORTED */
|
||||
ASSERT(mips_signum != SIGSTKFLT_PORTABLE);
|
||||
return -1;
|
||||
#endif
|
||||
case SIGEMT: /* 16 <--- 7 */
|
||||
return SIGSTKFLT_PORTABLE; /* No native SIGSTKFLT exist ...
|
||||
... reverse mapping SIGEMT ...
|
||||
... back to SIGSTKFLT. */
|
||||
|
||||
case SIGCHLD: /* 17 <-- 18 */
|
||||
return SIGCHLD_PORTABLE;
|
||||
@@ -356,7 +364,8 @@ __hidden int map_mips_signum_to_portable(int mips_signum)
|
||||
return SIGRTMIN;
|
||||
|
||||
default:
|
||||
ALOGE("%s: switch default: mips_signum:%d not supported! return(0);", __func__, mips_signum);
|
||||
ALOGE("%s: switch default: mips_signum:%d Not supported! return(0);", __func__,
|
||||
mips_signum);
|
||||
#if 0
|
||||
LOG_FATAL("%s: mips_signum:%d is not portable;", __func__, mips_signum);
|
||||
#endif
|
||||
@@ -365,6 +374,7 @@ __hidden int map_mips_signum_to_portable(int mips_signum)
|
||||
return portable_ssignum;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Array of signal handlers as the portable users expects they
|
||||
* they have been registered in the kernel. Problem is we need
|
||||
@@ -382,11 +392,12 @@ static void mips_sigaction_handler(int mips_signum, siginfo_t *sip, void *ucp)
|
||||
siginfo_portable_t portable_si;
|
||||
siginfo_portable_t *portable_sip;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(mips_signum:%d:'%s', sip:%p, ucp:%p) {", __func__,
|
||||
mips_signum,
|
||||
mips_signame, sip, ucp);
|
||||
|
||||
portable_signum = map_mips_signum_to_portable(mips_signum);
|
||||
portable_signum = signum_ntop(mips_signum);
|
||||
portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
portable_sighandler = mips_portable_sighandler[portable_signum];
|
||||
|
||||
@@ -406,7 +417,7 @@ static void mips_sigaction_handler(int mips_signum, siginfo_t *sip, void *ucp)
|
||||
/*
|
||||
* Map Structure members from MIPS to Portable.
|
||||
*/
|
||||
portable_si_signo = map_mips_signum_to_portable(sip->si_signo);
|
||||
portable_si_signo = signum_ntop(sip->si_signo);
|
||||
portable_si_signame = map_portable_signum_to_name(portable_si_signo);
|
||||
portable_si_errno = ntop_errno(sip->si_errno);
|
||||
|
||||
@@ -414,12 +425,13 @@ static void mips_sigaction_handler(int mips_signum, siginfo_t *sip, void *ucp)
|
||||
|
||||
/*
|
||||
* Deal with siginfo structure being a bit different.
|
||||
* Default to the same structure members.
|
||||
*/
|
||||
ASSERT(sizeof(siginfo_portable_t) == sizeof(siginfo_t));
|
||||
memcpy(&portable_si, sip, sizeof(portable_si)); /* Default to the same structure members */
|
||||
memcpy(&portable_si, sip, sizeof(portable_si));
|
||||
portable_si.si_signo = portable_si_signo;
|
||||
portable_si.si_code = sip->si_code; /* code and errno are swapped between ARM and MIPS ... */
|
||||
portable_si.si_errno = portable_si_errno; /* ... and errno needs to be translated. */
|
||||
portable_si.si_code = sip->si_code; /* code and errno are swapped and ... */
|
||||
portable_si.si_errno = portable_si_errno; /* ... errno needs to be translated. */
|
||||
|
||||
portable_sip = &portable_si;
|
||||
} /* if sip */
|
||||
@@ -429,6 +441,7 @@ static void mips_sigaction_handler(int mips_signum, siginfo_t *sip, void *ucp)
|
||||
ALOGV("%s: return; }", __func__);
|
||||
}
|
||||
|
||||
|
||||
static void mips_sighandler(int mips_signum)
|
||||
{
|
||||
int portable_signum;
|
||||
@@ -436,6 +449,7 @@ static void mips_sighandler(int mips_signum)
|
||||
char *mips_signame = map_mips_signum_to_name(mips_signum);
|
||||
sig3handler_portable_t portable_sighandler;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(mips_signum:%d:'%s') {", __func__, mips_signum, mips_signame);
|
||||
|
||||
mips_sigaction_handler(mips_signum, NULL, NULL);
|
||||
@@ -443,7 +457,8 @@ static void mips_sighandler(int mips_signum)
|
||||
ALOGV("%s: return; }", __func__);
|
||||
}
|
||||
|
||||
static sighandler_t map_portable_sighandler_to_mips(sighandler_portable_t portable_handler, int sigaction)
|
||||
|
||||
static sighandler_t sighandler_pton(sighandler_portable_t portable_handler, int sigaction)
|
||||
{
|
||||
sighandler_t mips_handler;
|
||||
|
||||
@@ -472,38 +487,39 @@ static sighandler_t map_portable_sighandler_to_mips(sighandler_portable_t portab
|
||||
|
||||
/*
|
||||
* This function maps the signal number and calls one of the low level mips signal()
|
||||
* functions implemented in portable-jb/bionic/libc/unistd/signal.c:
|
||||
* functions implemented in libc/unistd/signal.c:
|
||||
* sysv_signal()
|
||||
* bsd_signal()
|
||||
*
|
||||
* The last 2 parameters to this static function, mips_signal_fn*, specify which of these functions to call.
|
||||
* We intercept the above to functions, as well as signal(), and call the associated *_portable()
|
||||
* The last 2 parameters to this static function, mips_signal_fn*, specify which of
|
||||
* these functions to call. We intercept the above to functions, as well as signal(),
|
||||
* functions below.
|
||||
*
|
||||
* In addition, we intercept the signal_handler with our own handlers that map the signal number from
|
||||
* the MIPS convention to the PORTABLE/ARM convention.
|
||||
* In addition, we intercept the signal_handler with our own handlers that map the
|
||||
* signal number from the MIPS convention to the PORTABLE/ARM convention.
|
||||
*/
|
||||
static sighandler_portable_t _signal_portable(int portable_signum, sighandler_portable_t portable_handler,
|
||||
__sighandler_t (mips_signal_fn)(int, __sighandler_t), char *mips_signal_fn_name)
|
||||
static sighandler_portable_t
|
||||
do_signal_portable(int portable_signum, sighandler_portable_t portable_handler,
|
||||
__sighandler_t (mips_signal_fn)(int, __sighandler_t))
|
||||
{
|
||||
char *portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
int mips_signum;
|
||||
sighandler_t mips_handler;
|
||||
sighandler_portable_t ret;
|
||||
sighandler_portable_t rv;
|
||||
sighandler_portable_t prev_portable_handler;
|
||||
|
||||
ALOGV("%s(portable_signum:%d:%s, portable_handler:%p, mips_signal_fn:%p, mips_signal_fn_name:'%s') {", __func__,
|
||||
portable_signum, portable_signame,
|
||||
portable_handler, mips_signal_fn, mips_signal_fn_name);
|
||||
ALOGV("%s(portable_signum:%d:%s, portable_handler:%p, mips_signal_fn:%p) {", __func__,
|
||||
portable_signum,
|
||||
portable_signame, portable_handler, mips_signal_fn);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
|
||||
if ((portable_signum != 0) && ((mips_signum <= 0) || (mips_signum > NSIG))) {
|
||||
/*
|
||||
* Invalid request; Let the kernel generate the proper return value and set errno.
|
||||
*/
|
||||
mips_handler = map_portable_sighandler_to_mips(portable_handler, 0);
|
||||
ret = mips_signal_fn(mips_signum, mips_handler);
|
||||
mips_handler = sighandler_pton(portable_handler, 0);
|
||||
rv = mips_signal_fn(mips_signum, mips_handler);
|
||||
} else {
|
||||
/*
|
||||
* We have a usable signal number, redirect it to our signal handler
|
||||
@@ -512,21 +528,24 @@ static sighandler_portable_t _signal_portable(int portable_signum, sighandler_po
|
||||
*/
|
||||
prev_portable_handler = (sighandler_portable_t) mips_portable_sighandler[portable_signum];
|
||||
|
||||
mips_handler = map_portable_sighandler_to_mips(portable_handler, 0);
|
||||
mips_handler = sighandler_pton(portable_handler, 0);
|
||||
if (mips_handler != portable_handler) {
|
||||
mips_portable_sighandler[portable_signum] = (sig3handler_portable_t) portable_handler;
|
||||
}
|
||||
ret = mips_signal_fn(mips_signum, mips_handler);
|
||||
rv = mips_signal_fn(mips_signum, mips_handler);
|
||||
|
||||
if ((ret == (sighandler_portable_t) mips_sighandler) ||
|
||||
(ret == (sighandler_portable_t) mips_sigaction_handler)) {
|
||||
ret = (sighandler_t) prev_portable_handler;
|
||||
if ((rv == (sighandler_portable_t) mips_sighandler) ||
|
||||
(rv == (sighandler_portable_t) mips_sigaction_handler)) {
|
||||
|
||||
rv = (sighandler_t) prev_portable_handler;
|
||||
}
|
||||
}
|
||||
ALOGV("%s: return(ret:%p); }", __func__, ret);
|
||||
return ret;
|
||||
|
||||
ALOGV("%s: return(rv:%p); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* signal() can't be called directly, due to an in-line function in signal.h which
|
||||
* redirects the call to bsd_signal(). _signal() is a static function; not to be called
|
||||
@@ -534,81 +553,124 @@ static sighandler_portable_t _signal_portable(int portable_signum, sighandler_po
|
||||
*/
|
||||
sighandler_portable_t signal_portable(int portable_signum, sighandler_portable_t handler)
|
||||
{
|
||||
sighandler_portable_t ret;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, handler:%p);", __func__,
|
||||
portable_signum, handler);
|
||||
|
||||
/* bsd does a SA_RESTART */
|
||||
ret = _signal_portable(portable_signum, handler, bsd_signal, "bsd_signal");
|
||||
|
||||
ALOGV("%s: return(ret:%p); }", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
sighandler_portable_t sysv_signal_portable(int portable_signum, sighandler_portable_t handler)
|
||||
{
|
||||
sighandler_portable_t ret;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, handler:%p);", __func__,
|
||||
portable_signum, handler);
|
||||
|
||||
/* sysv does a SA_RESETHAND */
|
||||
ret = _signal_portable(portable_signum, handler, sysv_signal, "sysv_signal");
|
||||
|
||||
ALOGV("%s: return(ret:%p); }", __func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
sighandler_portable_t bsd_signal_portable(int portable_signum, sighandler_portable_t handler)
|
||||
{
|
||||
sighandler_portable_t ret;
|
||||
sighandler_portable_t rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, handler:%p) {", __func__,
|
||||
portable_signum, handler);
|
||||
|
||||
/* bsd does a SA_RESTART */
|
||||
ret = _signal_portable(portable_signum, handler, bsd_signal, "bsd_signal");
|
||||
rv = do_signal_portable(portable_signum, handler, bsd_signal);
|
||||
|
||||
ALOGV("%s: return(ret:%p); }", __func__, ret);
|
||||
return ret;
|
||||
ALOGV("%s: return(ret:%p); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int kill_helper(int id, int portable_signum, int (*fn)(int, int), const char *name)
|
||||
|
||||
sighandler_portable_t sysv_signal_portable(int portable_signum, sighandler_portable_t handler)
|
||||
{
|
||||
sighandler_portable_t rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, handler:%p) {", __func__,
|
||||
portable_signum, handler);
|
||||
|
||||
/* sysv does a SA_RESETHAND */
|
||||
rv = do_signal_portable(portable_signum, handler, sysv_signal);
|
||||
|
||||
ALOGV("%s: return(ret:%p); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* handler is either the Bionic
|
||||
* bsd_signal() signal handler
|
||||
* or
|
||||
* the sysv_signal() signal handler.
|
||||
*/
|
||||
sighandler_portable_t bsd_signal_portable(int portable_signum, sighandler_portable_t handler)
|
||||
{
|
||||
sighandler_portable_t rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, handler:%p) {", __func__,
|
||||
portable_signum, handler);
|
||||
|
||||
/* bsd does a SA_RESTART */
|
||||
rv = do_signal_portable(portable_signum, handler, bsd_signal);
|
||||
|
||||
ALOGV("%s: return(ret:%p); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static int do_kill(int id, int portable_signum, int (*fn)(int, int))
|
||||
{
|
||||
char *portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
int mips_signum;
|
||||
int ret;
|
||||
int rv;
|
||||
|
||||
ALOGV("%s(id:%d, portable_signum:%d:'%s');", name,
|
||||
id, portable_signum, portable_signame);
|
||||
ALOGV("%s(id:%d, portable_signum:%d:'%s', fn:%p) {", __func__,
|
||||
id, portable_signum,
|
||||
portable_signame, fn);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
|
||||
if ((portable_signum != 0) && (mips_signum == 0))
|
||||
return 0;
|
||||
return fn(id, mips_signum);
|
||||
rv = fn(id, mips_signum);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
int killpg_portable(int pgrp, int portable_signum)
|
||||
{
|
||||
return kill_helper(pgrp, portable_signum, killpg, __func__);
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(pgrp:%d, portable_signum:%d) {", __func__,
|
||||
pgrp, portable_signum);
|
||||
|
||||
rv = do_kill(pgrp, portable_signum, killpg);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
int kill_portable(pid_t pid, int portable_signum)
|
||||
{
|
||||
return kill_helper(pid, portable_signum, kill, __func__);
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(pid:%d, portable_signum:%d) {", __func__,
|
||||
pid, portable_signum);
|
||||
|
||||
rv = do_kill(pid, portable_signum, kill);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
int tkill_portable(int tid, int portable_signum)
|
||||
{
|
||||
extern int tkill(int, int);
|
||||
return kill_helper(tid, portable_signum, tkill, __func__);
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(tid:%d, portable_signum:%d) {", __func__,
|
||||
tid, portable_signum);
|
||||
|
||||
rv = do_kill(tid, portable_signum, tkill);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/* tgkill is not exported from android-14 libc.so */
|
||||
#if 0
|
||||
int tgkill_portable(int tgid, int tid, int portable_signum)
|
||||
@@ -618,25 +680,26 @@ int tgkill_portable(int tgid, int tid, int portable_signum)
|
||||
int mips_signum;
|
||||
int rv;
|
||||
|
||||
ALOGV("%s(tgid:%d, tid:%d, portable_signum:%d:'%s');", __func__,
|
||||
ALOGV("%s(tgid:%d, tid:%d, portable_signum:%d:'%s') {", __func__,
|
||||
tgid, tid, portable_signum, portable_signame);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
|
||||
if ((portable_signum != 0) && (mips_signum == 0))
|
||||
rv = 0;
|
||||
else
|
||||
rv = tgkill(tgid, tid, mips_signum);
|
||||
|
||||
ALOGV("%s: return rv:%d;", __func__, rv);
|
||||
ALOGV("%s: return rv:%d; }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int raise_portable(int portable_signum)
|
||||
{
|
||||
char *portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
int mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
int mips_signum = signum_pton(portable_signum);
|
||||
int rv;
|
||||
|
||||
ALOGV("%s(portable_signum:%d:'%s') {", __func__, portable_signum, portable_signame);
|
||||
@@ -651,7 +714,7 @@ int raise_portable(int portable_signum)
|
||||
}
|
||||
|
||||
|
||||
void map_portable_sigset_to_mips(sigset_portable_t *portable_sigset, sigset_t *mips_sigset)
|
||||
void sigset_pton(sigset_portable_t *portable_sigset, sigset_t *mips_sigset)
|
||||
{
|
||||
int portable_signum;
|
||||
|
||||
@@ -671,17 +734,16 @@ void map_portable_sigset_to_mips(sigset_portable_t *portable_sigset, sigset_t *m
|
||||
|
||||
if (sigismember_portable(portable_sigset, portable_signum)) {
|
||||
char *portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
int mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
int mips_signum = signum_pton(portable_signum);
|
||||
char *mips_signame;
|
||||
|
||||
if (mips_signum != 0) {
|
||||
int err;
|
||||
|
||||
mips_signame = map_mips_signum_to_name(mips_signum);
|
||||
ALOGV("%s: sigaddset(mips_sigset:%p, mips_signum:%d:'%s'); [portable_signum:%d:'%s']", __func__,
|
||||
ALOGV("%s: sigaddset(mips_sigset:%p, mips_signum:%d:'%s');", __func__,
|
||||
mips_sigset, mips_signum,
|
||||
mips_signame, portable_signum,
|
||||
portable_signame);
|
||||
mips_signame);
|
||||
|
||||
err = sigaddset(mips_sigset, mips_signum);
|
||||
if (err == -1) {
|
||||
@@ -697,7 +759,8 @@ done:
|
||||
}
|
||||
|
||||
|
||||
void map_mips_sigset_to_portable(const sigset_t *const_mips_sigset, sigset_portable_t *portable_sigset)
|
||||
void
|
||||
sigset_ntop(const sigset_t *const_mips_sigset, sigset_portable_t *portable_sigset)
|
||||
{
|
||||
int mips_signum;
|
||||
sigset_t *mips_sigset = (sigset_t *) const_mips_sigset;
|
||||
@@ -716,7 +779,7 @@ void map_mips_sigset_to_portable(const sigset_t *const_mips_sigset, sigset_porta
|
||||
|
||||
for(mips_signum = 1; mips_signum <= NSIG; mips_signum++) {
|
||||
if (sigismember(mips_sigset, mips_signum)) {
|
||||
int portable_signum = map_mips_signum_to_portable(mips_signum);
|
||||
int portable_signum = signum_ntop(mips_signum);
|
||||
|
||||
if (portable_signum != 0)
|
||||
sigaddset_portable(portable_sigset, portable_signum);
|
||||
@@ -729,36 +792,37 @@ done:
|
||||
}
|
||||
|
||||
|
||||
static int map_portable_sigaction_flags_to_mips(int portable_flags)
|
||||
static int sigaction_flags_pton(int portable_flags)
|
||||
{
|
||||
int mips_flags = 0;
|
||||
|
||||
if (portable_flags & SA_NOCLDSTOP_PORTABLE)
|
||||
if (portable_flags & SA_NOCLDSTOP_PORTABLE) {
|
||||
mips_flags |= SA_NOCLDSTOP;
|
||||
|
||||
if (portable_flags & SA_NOCLDWAIT_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_NOCLDWAIT_PORTABLE) {
|
||||
mips_flags |= SA_NOCLDWAIT;
|
||||
|
||||
if (portable_flags & SA_SIGINFO_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_SIGINFO_PORTABLE) {
|
||||
mips_flags |= SA_SIGINFO;
|
||||
|
||||
}
|
||||
if (portable_flags & SA_THIRTYTWO_PORTABLE) {
|
||||
ALOGV("%s: SA_THIRTYTWO_PORTABLE isn't SUPPORTED.", __func__);
|
||||
}
|
||||
if (portable_flags & SA_RESTORER_PORTABLE)
|
||||
if (portable_flags & SA_RESTORER_PORTABLE) {
|
||||
mips_flags |= SA_RESTORER;
|
||||
|
||||
if (portable_flags & SA_ONSTACK_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_ONSTACK_PORTABLE) {
|
||||
mips_flags |= SA_ONSTACK;
|
||||
|
||||
if (portable_flags & SA_RESTART_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_RESTART_PORTABLE) {
|
||||
mips_flags |= SA_RESTART;
|
||||
|
||||
if (portable_flags & SA_NODEFER_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_NODEFER_PORTABLE) {
|
||||
mips_flags |= SA_NODEFER;
|
||||
|
||||
if (portable_flags & SA_RESETHAND_PORTABLE)
|
||||
}
|
||||
if (portable_flags & SA_RESETHAND_PORTABLE) {
|
||||
mips_flags |= SA_RESETHAND;
|
||||
}
|
||||
|
||||
ALOGV("%s(portable_flags:0x%x) return(mips_flags:0x%x);", __func__,
|
||||
portable_flags, mips_flags);
|
||||
@@ -766,7 +830,8 @@ static int map_portable_sigaction_flags_to_mips(int portable_flags)
|
||||
return mips_flags;
|
||||
}
|
||||
|
||||
int map_mips_sigaction_flags_to_portable(int mips_flags)
|
||||
|
||||
int sigaction_flags_ntop(int mips_flags)
|
||||
{
|
||||
int portable_flags = 0;
|
||||
|
||||
@@ -788,6 +853,7 @@ int map_mips_sigaction_flags_to_portable(int mips_flags)
|
||||
return portable_flags;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Called by portable/ARM code, which we map and do MIPS system calls.
|
||||
*
|
||||
@@ -819,7 +885,8 @@ int map_mips_sigaction_flags_to_portable(int mips_flags)
|
||||
* a table of signal handlers that our intercepting handler can call after it converts the signal
|
||||
* numbers.
|
||||
*/
|
||||
int sigaction_portable(int portable_signum, const struct sigaction_portable *act, struct sigaction_portable *oldact)
|
||||
static int do_sigaction_portable(int portable_signum, const struct sigaction_portable *act,
|
||||
struct sigaction_portable *oldact)
|
||||
{
|
||||
int mips_signum;
|
||||
char *mips_signame;
|
||||
@@ -831,13 +898,13 @@ int sigaction_portable(int portable_signum, const struct sigaction_portable *act
|
||||
char *portable_signame = map_portable_signum_to_name(portable_signum);
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d:'%s', act:%p, oldact:%p) {", __func__,
|
||||
portable_signum,
|
||||
portable_signame, act, oldact);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
mips_signame = map_mips_signum_to_name(mips_signum);
|
||||
|
||||
if ((portable_signum != 0) && (mips_signum == 0)) {
|
||||
/* We got a portable signum that we can't map; Ignore the request */
|
||||
rv = 0;
|
||||
@@ -854,19 +921,22 @@ int sigaction_portable(int portable_signum, const struct sigaction_portable *act
|
||||
rv = sigaction(mips_signum, (struct sigaction *)act, &mips_oldact);
|
||||
} else {
|
||||
/*
|
||||
* Make the MIPS version of sigaction, which has no sa_restorer function pointer. Also the handler
|
||||
* will be called with a pointer to a to a sigcontext structure which is totally non-portable.
|
||||
* Make the MIPS version of sigaction, which has no sa_restorer function pointer.
|
||||
* Also the handler will be called with a pointer to a to a sigcontext structure
|
||||
* which is totally non-portable.
|
||||
*/
|
||||
map_portable_sigset_to_mips(((sigset_portable_t *)&act->sa_mask), ((sigset_t *) &mips_act.sa_mask));
|
||||
sigset_pton(((sigset_portable_t *)&act->sa_mask),
|
||||
((sigset_t *) &mips_act.sa_mask));
|
||||
|
||||
mips_act.sa_flags = map_portable_sigaction_flags_to_mips(act->sa_flags);
|
||||
mips_act.sa_flags = sigaction_flags_pton(act->sa_flags);
|
||||
|
||||
if (mips_act.sa_flags & SA_SIGINFO) {
|
||||
/*
|
||||
* Providing the three argument version of a signal handler.
|
||||
*/
|
||||
if (portable_signum >= 0 && portable_signum < NSIG_PORTABLE) {
|
||||
mips_portable_sighandler[portable_signum] = (sig3handler_portable_t) act->sa_sigaction_portable;
|
||||
mips_portable_sighandler[portable_signum] =
|
||||
(sig3handler_portable_t) act->sa_sigaction_portable;
|
||||
|
||||
mips_act.sa_sigaction = mips_sigaction_handler;
|
||||
}
|
||||
@@ -884,9 +954,10 @@ int sigaction_portable(int portable_signum, const struct sigaction_portable *act
|
||||
*/
|
||||
mips_act.sa_handler = (sighandler_t) portable_handler;
|
||||
} else {
|
||||
mips_handler = map_portable_sighandler_to_mips(portable_handler, 1);
|
||||
mips_handler = sighandler_pton(portable_handler, 1);
|
||||
if (mips_handler != portable_handler) {
|
||||
mips_portable_sighandler[portable_signum] = (sig3handler_portable_t) portable_handler;
|
||||
mips_portable_sighandler[portable_signum] =
|
||||
(sig3handler_portable_t) portable_handler;
|
||||
}
|
||||
mips_act.sa_handler = mips_handler;
|
||||
}
|
||||
@@ -895,15 +966,19 @@ int sigaction_portable(int portable_signum, const struct sigaction_portable *act
|
||||
}
|
||||
|
||||
if (oldact) {
|
||||
if ((mips_oldact.sa_sigaction == (__sigaction_handler_portable_t) mips_sighandler) ||
|
||||
(mips_oldact.sa_sigaction == (__sigaction_handler_portable_t) mips_sigaction_handler)) {
|
||||
oldact->sa_sigaction_portable = (__sigaction_handler_portable_t) prev_portable_handler;
|
||||
} else {
|
||||
oldact->sa_sigaction_portable = (__sigaction_handler_portable_t) mips_oldact.sa_sigaction;
|
||||
}
|
||||
map_mips_sigset_to_portable((sigset_t *) &(mips_oldact.sa_mask), (sigset_portable_t *) &(oldact->sa_mask));
|
||||
if (mips_oldact.sa_sigaction == (__sigaction_handler_portable_t) mips_sigaction_handler ||
|
||||
mips_oldact.sa_sigaction == (__sigaction_handler_portable_t) mips_sighandler) {
|
||||
|
||||
oldact->sa_flags = map_mips_sigaction_flags_to_portable(mips_oldact.sa_flags);
|
||||
oldact->sa_sigaction_portable =
|
||||
(__sigaction_handler_portable_t) prev_portable_handler;
|
||||
} else {
|
||||
oldact->sa_sigaction_portable =
|
||||
(__sigaction_handler_portable_t) mips_oldact.sa_sigaction;
|
||||
}
|
||||
sigset_ntop((sigset_t *) &(mips_oldact.sa_mask),
|
||||
(sigset_portable_t *) &(oldact->sa_mask));
|
||||
|
||||
oldact->sa_flags = sigaction_flags_ntop(mips_oldact.sa_flags);
|
||||
oldact->sa_restorer = NULL;
|
||||
}
|
||||
|
||||
@@ -913,6 +988,22 @@ done:
|
||||
}
|
||||
|
||||
|
||||
int sigaction_portable(int portable_signum, const struct sigaction_portable *act,
|
||||
struct sigaction_portable *oldact)
|
||||
{
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_signum:%d, act:%p, oldact:%p) {", __func__,
|
||||
portable_signum, act, oldact);
|
||||
|
||||
rv = do_sigaction_portable(portable_signum, act, oldact);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* So far it appears that signalfd() isn't supported by bionic
|
||||
@@ -922,7 +1013,7 @@ int signalfd_portable(int fd, const sigset_t *portable_sigmask, int flags)
|
||||
{
|
||||
sigset_t mips_sigmask;
|
||||
|
||||
map_portable_sigset_to_mips(portable_sigmask, &mips_sigmask);
|
||||
sigset_pton(portable_sigmask, &mips_sigmask);
|
||||
|
||||
return signalfd(fd, &mips_sigmask, flags);
|
||||
}
|
||||
@@ -940,11 +1031,11 @@ int sigsuspend_portable(const sigset_portable_t *portable_sigmask)
|
||||
errno = EFAULT;
|
||||
rv = -1;
|
||||
} else {
|
||||
map_portable_sigset_to_mips((sigset_portable_t *)portable_sigmask, &mips_sigmask);
|
||||
sigset_pton((sigset_portable_t *)portable_sigmask, &mips_sigmask);
|
||||
rv = sigsuspend(&mips_sigmask);
|
||||
}
|
||||
|
||||
ALOGV("%s: return(rv:%d);", __func__, rv);
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -962,10 +1053,10 @@ int sigpending_portable(sigset_portable_t *portable_sigset)
|
||||
rv = -1;
|
||||
} else {
|
||||
rv = sigpending(&mips_sigset);
|
||||
map_mips_sigset_to_portable(&mips_sigset, portable_sigset);
|
||||
sigset_ntop(&mips_sigset, portable_sigset);
|
||||
}
|
||||
|
||||
ALOGV("%s: return(rv:%d);", __func__, rv);
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -984,14 +1075,14 @@ int sigwait_portable(const sigset_portable_t *portable_sigset, int *ptr_to_porta
|
||||
errno = EFAULT;
|
||||
rv = -1;
|
||||
} else {
|
||||
map_portable_sigset_to_mips((sigset_portable_t *)portable_sigset, &mips_sigset);
|
||||
sigset_pton((sigset_portable_t *)portable_sigset, &mips_sigset);
|
||||
|
||||
rv = sigwait(&mips_sigset, &mips_sig);
|
||||
|
||||
portable_sig = map_mips_signum_to_portable(mips_sig);
|
||||
portable_sig = signum_ntop(mips_sig);
|
||||
*ptr_to_portable_sig = portable_sig;
|
||||
}
|
||||
ALOGV("%s: return(rv:%d);", __func__, rv);
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -1005,7 +1096,7 @@ int siginterrupt_portable(int portable_signum, int flag)
|
||||
ALOGV("%s(portable_signum:%d, flag:0x%x) {", __func__,
|
||||
portable_signum, flag);
|
||||
|
||||
mips_signum = map_portable_signum_to_mips(portable_signum);
|
||||
mips_signum = signum_pton(portable_signum);
|
||||
|
||||
if ((portable_signum != 0) && (mips_signum == 0)) {
|
||||
ALOGE("%s: Unsupported portable_signum:%d; Ignoring.", __func__,
|
||||
@@ -1014,11 +1105,13 @@ int siginterrupt_portable(int portable_signum, int flag)
|
||||
} else {
|
||||
rv = siginterrupt(mips_signum, flag);
|
||||
}
|
||||
ALOGV("%s: return(rv:%d);", __func__, rv);
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
__hidden int sigmask_helper(int portable_how, const sigset_portable_t *portable_sigset, sigset_portable_t *portable_oldset, sigmask_fn fn, char *fname)
|
||||
|
||||
__hidden int do_sigmask(int portable_how, const sigset_portable_t *portable_sigset,
|
||||
sigset_portable_t *portable_oldset, sigmask_fn fn)
|
||||
{
|
||||
int rv;
|
||||
int how;
|
||||
@@ -1026,16 +1119,15 @@ __hidden int sigmask_helper(int portable_how, const sigset_portable_t *portable_
|
||||
sigset_t mips_sigset, *mips_sigset_p;
|
||||
sigset_t mips_oldset, *mips_oldset_p;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_how:%d, portable_sigset:%p, portable_oldset:%p) {", __func__,
|
||||
portable_how, portable_sigset, portable_oldset);
|
||||
ALOGV("%s(portable_how:%d, portable_sigset:%p, portable_oldset:%p, fn:%p) {", __func__,
|
||||
portable_how, portable_sigset, portable_oldset, fn);
|
||||
|
||||
switch(portable_how) {
|
||||
case SIG_BLOCK_PORTABLE: how = SIG_BLOCK; how_name = "SIG_BLOCK"; break;
|
||||
case SIG_UNBLOCK_PORTABLE: how = SIG_UNBLOCK; how_name = "SIG_UNBLOCK"; break;
|
||||
case SIG_SETMASK_PORTABLE: how = SIG_SETMASK; how_name = "SIG_SETMASK"; break;
|
||||
switch(portable_how) {
|
||||
case SIG_BLOCK_PORTABLE: how = SIG_BLOCK; how_name = "SIG_BLOCK"; break;
|
||||
case SIG_UNBLOCK_PORTABLE: how = SIG_UNBLOCK; how_name = "SIG_UNBLOCK"; break;
|
||||
case SIG_SETMASK_PORTABLE: how = SIG_SETMASK; how_name = "SIG_SETMASK"; break;
|
||||
|
||||
default:
|
||||
default:
|
||||
ALOGE("%s: portable_how:%d NOT SUPPORTED!", __func__, portable_how);
|
||||
how = -1;
|
||||
break;
|
||||
@@ -1047,7 +1139,7 @@ __hidden int sigmask_helper(int portable_how, const sigset_portable_t *portable_
|
||||
mips_sigset_p = &mips_sigset;
|
||||
memset(mips_sigset_p, 0, sizeof(mips_sigset));
|
||||
sigemptyset(mips_sigset_p);
|
||||
map_portable_sigset_to_mips((sigset_portable_t *)portable_sigset, &mips_sigset);
|
||||
sigset_pton((sigset_portable_t *)portable_sigset, &mips_sigset);
|
||||
}
|
||||
|
||||
if (invalid_pointer((void *)portable_oldset)) {
|
||||
@@ -1062,20 +1154,32 @@ __hidden int sigmask_helper(int portable_how, const sigset_portable_t *portable_
|
||||
|
||||
if (rv == 0 && !invalid_pointer(portable_oldset)) {
|
||||
/* Map returned mips_oldset to portable_oldset for return to caller */
|
||||
map_mips_sigset_to_portable(mips_oldset_p, portable_oldset);
|
||||
sigset_ntop(mips_oldset_p, portable_oldset);
|
||||
}
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
int sigprocmask_portable(int portable_how,
|
||||
const sigset_portable_t *portable_sigset,
|
||||
|
||||
int sigprocmask_portable(int portable_how, const sigset_portable_t *portable_sigset,
|
||||
sigset_portable_t *portable_oldset)
|
||||
{
|
||||
return sigmask_helper(portable_how, portable_sigset, portable_oldset, sigprocmask, "sigprocmask");
|
||||
int rv;
|
||||
|
||||
ALOGV(" ");
|
||||
ALOGV("%s(portable_how:%d, portable_sigset:%p, portable_oldset:%p) {", __func__,
|
||||
portable_how, portable_sigset, portable_oldset);
|
||||
|
||||
rv = do_sigmask(portable_how, portable_sigset, portable_oldset, sigprocmask);
|
||||
|
||||
ALOGV("%s: return(rv:%d); }", __func__, rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ss_flags and ss_size are located in different locations in stack_t structure:
|
||||
*
|
||||
@@ -1101,8 +1205,9 @@ int sigaltstack_portable(const portable_stack_t *ss, portable_stack_t *oss)
|
||||
mips_ss = NULL;
|
||||
} else {
|
||||
if (invalid_pointer((void *)ss)) {
|
||||
ALOGE("%s: invalid_pointer(ss:%p): Let kernel set proper errno and set return value.", __func__,
|
||||
ss);
|
||||
ALOGE("%s: invalid_pointer(ss:%p): Let kernel set proper errno and set return value.",
|
||||
__func__, ss);
|
||||
|
||||
mips_ss = (stack_t *) ss;
|
||||
} else {
|
||||
memset(&new_stack, 0, sizeof(stack_t));
|
||||
@@ -1116,8 +1221,9 @@ int sigaltstack_portable(const portable_stack_t *ss, portable_stack_t *oss)
|
||||
mips_oss = NULL;
|
||||
} else {
|
||||
if (invalid_pointer((void *)oss)) {
|
||||
ALOGE("%s: invalid_pointer(oss:%p): Let kernel set proper errno and set return value.", __func__,
|
||||
oss);
|
||||
ALOGE("%s: invalid_pointer(oss:%p): Let kernel set proper errno and return value.",
|
||||
__func__, oss);
|
||||
|
||||
mips_oss = (stack_t *)oss;
|
||||
} else {
|
||||
memset(&old_stack, 0, sizeof(stack_t));
|
||||
|
||||
@@ -28,9 +28,10 @@ int timer_create_portable(clockid_t clockid, struct sigevent *portable_evp,
|
||||
if (!invalid_pointer(portable_evp) &&
|
||||
(evp->sigev_notify == SIGEV_SIGNAL ||
|
||||
evp->sigev_notify == SIGEV_THREAD_ID)) {
|
||||
|
||||
native_sigevent = *portable_evp;
|
||||
evp = &native_sigevent;
|
||||
evp->sigev_signo = map_portable_signum_to_mips(evp->sigev_signo);
|
||||
evp->sigev_signo = signum_pton(evp->sigev_signo);
|
||||
}
|
||||
return timer_create(clockid, evp, timerid);
|
||||
}
|
||||
|
||||
@@ -31,13 +31,13 @@ pid_t waitpid_portable(pid_t pid, int *status, int options)
|
||||
ret = waitpid(pid, status, options);
|
||||
if (status && ret > 0) {
|
||||
/*
|
||||
* Status layout is identical so just the signal
|
||||
* Status layout is identical, so just the signal
|
||||
* number needs to be changed.
|
||||
*/
|
||||
if (WIFSIGNALED(*status))
|
||||
*status = (*status & ~0x7f) | map_mips_signum_to_portable(WTERMSIG(*status));
|
||||
*status = (*status & ~0x7f) | signum_ntop(WTERMSIG(*status));
|
||||
else if (WIFSTOPPED(*status))
|
||||
*status = (*status & ~0xff00) | (map_mips_signum_to_portable(WSTOPSIG(*status)) << 8);
|
||||
*status = (*status & ~0xff00) | (signum_ntop(WSTOPSIG(*status)) << 8);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -17,8 +17,9 @@
|
||||
#ifndef _IOCTLS_PORTABLE_H_
|
||||
#define _IOCTLS_PORTABLE_H_
|
||||
|
||||
/* Derived from development/ndk/platforms/android-3/include/asm-generic/ioctl.h */
|
||||
|
||||
/*
|
||||
* Derived from development/ndk/platforms/android-3/include/asm-generic/ioctl.h
|
||||
*/
|
||||
#define _IOC_NRBITS_PORTABLE 8
|
||||
#define _IOC_TYPEBITS_PORTABLE 8
|
||||
#define _IOC_SIZEBITS_PORTABLE 14
|
||||
@@ -38,18 +39,37 @@
|
||||
#define _IOC_WRITE_PORTABLE 1U
|
||||
#define _IOC_READ_PORTABLE 2U
|
||||
|
||||
#define _IOC_PORTABLE(dir,type,nr,size) (((dir) << _IOC_DIRSHIFT_PORTABLE) | ((type) << _IOC_TYPESHIFT_PORTABLE) | ((nr) << _IOC_NRSHIFT_PORTABLE) | ((size) << _IOC_SIZESHIFT_PORTABLE))
|
||||
#define _IOC_PORTABLE(dir, type, nr, size) ( \
|
||||
((dir) << _IOC_DIRSHIFT_PORTABLE) | \
|
||||
((type) << _IOC_TYPESHIFT_PORTABLE) | \
|
||||
((nr) << _IOC_NRSHIFT_PORTABLE) | \
|
||||
((size) << _IOC_SIZESHIFT_PORTABLE) \
|
||||
)
|
||||
|
||||
extern unsigned int __invalid_size_argument_for_IOC;
|
||||
#define _IOC_TYPECHECK_PORTABLE(t) ((sizeof(t) == sizeof(t[1]) && sizeof(t) < (1 << _IOC_SIZEBITS_PORTABLE)) ? sizeof(t) : __invalid_size_argument_for_IOC)
|
||||
|
||||
#define _IO_PORTABLE(type,nr) _IOC_PORTABLE(_IOC_NONE_PORTABLE,(type),(nr),0)
|
||||
#define _IOR_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_READ_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))
|
||||
#define _IOW_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_WRITE_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))
|
||||
#define _IOWR_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_READ_PORTABLE|_IOC_WRITE_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))
|
||||
#define _IOC_TYPECHECK_PORTABLE(t) ( \
|
||||
(sizeof(t) == sizeof(t[1]) && sizeof(t) < (1 << _IOC_SIZEBITS_PORTABLE)) ? \
|
||||
sizeof(t) : \
|
||||
__invalid_size_argument_for_IOC \
|
||||
)
|
||||
|
||||
/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/ioctls.h */
|
||||
#define _IO_PORTABLE(type, nr) _IOC_PORTABLE(_IOC_NONE_PORTABLE, (type), (nr), 0)
|
||||
|
||||
#define _IOR_PORTABLE(type, nr, size) \
|
||||
_IOC_PORTABLE(_IOC_READ_PORTABLE, (type), (nr), (_IOC_TYPECHECK_PORTABLE(size)))
|
||||
|
||||
#define _IOW_PORTABLE(type, nr, size) \
|
||||
_IOC_PORTABLE(_IOC_WRITE_PORTABLE, (type), (nr), (_IOC_TYPECHECK_PORTABLE(size)))
|
||||
|
||||
#define _IOWR_PORTABLE(type, nr, size) \
|
||||
IOC_PORTABLE(_IOC_READ_PORTABLE | \
|
||||
_IOC_WRITE_PORTABLE, (type), (nr), (IOC_TYPECHECK_PORTABLE(size)) )
|
||||
|
||||
|
||||
/*
|
||||
* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/ioctls.h
|
||||
*/
|
||||
#define TCGETS_PORTABLE 0x5401
|
||||
#define TCSETS_PORTABLE 0x5402
|
||||
#define TCSETSW_PORTABLE 0x5403
|
||||
@@ -121,8 +141,9 @@ extern unsigned int __invalid_size_argument_for_IOC;
|
||||
|
||||
#define TIOCSER_TEMT_PORTABLE 0x01
|
||||
|
||||
/* Derived from development/ndk/platforms/android-3/include/sys/ioctl_compat.h */
|
||||
|
||||
/*
|
||||
* Derived from development/ndk/platforms/android-3/include/sys/ioctl_compat.h
|
||||
*/
|
||||
struct tchars_portable {
|
||||
char t_intrc; /* interrupt */
|
||||
char t_quitc; /* quit */
|
||||
@@ -142,11 +163,11 @@ struct ltchars_portable {
|
||||
};
|
||||
|
||||
struct sgttyb_portable {
|
||||
char sg_ispeed; /* input speed */
|
||||
char sg_ospeed; /* output speed */
|
||||
char sg_erase; /* erase character */
|
||||
char sg_kill; /* kill character */
|
||||
short sg_flags; /* mode flags */
|
||||
char sg_ispeed; /* input speed */
|
||||
char sg_ospeed; /* output speed */
|
||||
char sg_erase; /* erase character */
|
||||
char sg_kill; /* kill character */
|
||||
short sg_flags; /* mode flags */
|
||||
};
|
||||
|
||||
#ifdef USE_OLD_TTY
|
||||
@@ -156,23 +177,49 @@ struct sgttyb_portable {
|
||||
# define OTIOCGETD_PORTABLE _IOR_PORTABLE('t', 0, int) /* get line discipline */
|
||||
# define OTIOCSETD_PORTABLE _IOW_PORTABLE('t', 1, int) /* set line discipline */
|
||||
#endif
|
||||
#define TIOCHPCL_PORTABLE _IO_PORTABLE('t', 2) /* hang up on last close */
|
||||
#define TIOCGETP_PORTABLE _IOR_PORTABLE('t', 8,struct sgttyb_portable)/* get parameters -- gtty */
|
||||
#define TIOCSETP_PORTABLE _IOW_PORTABLE('t', 9,struct sgttyb_portable)/* set parameters -- stty */
|
||||
#define TIOCSETN_PORTABLE _IOW_PORTABLE('t',10,struct sgttyb_portable)/* as above, but no flushtty*/
|
||||
#define TIOCSETC_PORTABLE _IOW_PORTABLE('t',17,struct tchars_portable)/* set special characters */
|
||||
#define TIOCGETC_PORTABLE _IOR_PORTABLE('t',18,struct tchars_portable)/* get special characters */
|
||||
|
||||
#define TIOCLBIS_PORTABLE _IOW_PORTABLE('t', 127, int) /* bis local mode bits */
|
||||
#define TIOCLBIC_PORTABLE _IOW_PORTABLE('t', 126, int) /* bic local mode bits */
|
||||
#define TIOCLSET_PORTABLE _IOW_PORTABLE('t', 125, int) /* set entire local mode word */
|
||||
#define TIOCLGET_PORTABLE _IOR_PORTABLE('t', 124, int) /* get local modes */
|
||||
#define TIOCSLTC_PORTABLE _IOW_PORTABLE('t',117,struct ltchars_portable)/* set local special chars*/
|
||||
#define TIOCGLTC_PORTABLE _IOR_PORTABLE('t',116,struct ltchars_portable)/* get local special chars*/
|
||||
#define OTIOCCONS_PORTABLE _IO_PORTABLE('t', 98) /* for hp300 -- sans int arg */
|
||||
/* hang up on last close */
|
||||
#define TIOCHPCL_PORTABLE _IO_PORTABLE('t', 2)
|
||||
|
||||
/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/sockios.h */
|
||||
/* get parameters -- gtty */
|
||||
#define TIOCGETP_PORTABLE _IOR_PORTABLE('t', 8,struct sgttyb_portable)
|
||||
|
||||
/* set parameters -- stty */
|
||||
#define TIOCSETP_PORTABLE _IOW_PORTABLE('t', 9,struct sgttyb_portable)
|
||||
|
||||
/* as above, but no flushtty*/
|
||||
#define TIOCSETN_PORTABLE _IOW_PORTABLE('t',10,struct sgttyb_portable)
|
||||
|
||||
/* set special characters */
|
||||
#define TIOCSETC_PORTABLE _IOW_PORTABLE('t',17,struct tchars_portable)
|
||||
|
||||
/* get special characters */
|
||||
#define TIOCGETC_PORTABLE _IOR_PORTABLE('t',18,struct tchars_portable)
|
||||
|
||||
/* bis local mode bits */
|
||||
#define TIOCLBIS_PORTABLE _IOW_PORTABLE('t', 127, int)
|
||||
|
||||
/* bic local mode bits */
|
||||
#define TIOCLBIC_PORTABLE _IOW_PORTABLE('t', 126, int)
|
||||
|
||||
/* set entire local mode word */
|
||||
#define TIOCLSET_PORTABLE _IOW_PORTABLE('t', 125, int)
|
||||
|
||||
/* get local modes */
|
||||
#define TIOCLGET_PORTABLE _IOR_PORTABLE('t', 124, int)
|
||||
|
||||
/* set local special chars*/
|
||||
#define TIOCSLTC_PORTABLE _IOW_PORTABLE('t',117,struct ltchars_portable)
|
||||
|
||||
/* get local special chars*/
|
||||
#define TIOCGLTC_PORTABLE _IOR_PORTABLE('t',116,struct ltchars_portable)
|
||||
|
||||
/* for hp300 -- sans int arg */
|
||||
#define OTIOCCONS_PORTABLE _IO_PORTABLE('t', 98)
|
||||
|
||||
/*
|
||||
* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/sockios.h
|
||||
*/
|
||||
#define FIOSETOWN_PORTABLE 0x8901
|
||||
#define SIOCSPGRP_PORTABLE 0x8902
|
||||
#define FIOGETOWN_PORTABLE 0x8903
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
* % logcat '*:v' [To display Verbose Logging]
|
||||
* % logcat 'fcntl_portable:v' [To display just this fcntl logging]
|
||||
*
|
||||
* NOTE: This assumes you only use the portable TAG; which is the default.
|
||||
* For debugging LTP it's been helpful to include the LTP program being tested.
|
||||
* NOTE: This assumes you only use the 'PORTABLE_TAG'; which is the default.
|
||||
* For debugging LTP it's been helpful to include the LTP program being tested;
|
||||
* which is enabled below with #define EXTENDED_LOGGING.
|
||||
*
|
||||
* Logging routines also support ALOG*_IF() and ASSERT(); For details See:
|
||||
*
|
||||
@@ -17,35 +18,39 @@
|
||||
*
|
||||
* ALOGV is turned off by release builds: Use the #define below with LOG_NDEBUG=0 to enable.
|
||||
*
|
||||
* Strace works fine with ALOG out if a large max string size is used via the -s option; Ex:
|
||||
* Strace works fine with ALOG out if a large max string size is used via the -s option;
|
||||
* Example:
|
||||
*
|
||||
* strace -s 132 ./sigaction01
|
||||
* strace -s 132 ./sigaction01
|
||||
*
|
||||
* writev(3, [{"\2", 1},
|
||||
* {"./sigaction01`signal_portable\0", 30},
|
||||
* {"sigaction_portable(portable_signum:10:'SIGUSR1_PORTABLE:10', act:0x7fe47a08, oldact:0x0) {\0", 91}], 3) = 122
|
||||
* {"map_portable_sigset_to_mips(portable_sigset:0x7fe47a0c, mips_sigset:0x7fe479b8) {\0", 82}], 3) = 113
|
||||
* ...
|
||||
* writev(3, [{"\2", 1},
|
||||
* {"./sigaction01`signal_portable\0", 30},
|
||||
* {"sigaction_portable(portable_signum:10:'SIGUSR1_PORTABLE:10', ...
|
||||
* {"map_portable_sigset_to_mips(portable_sigset:0x7fe47a0c, ...
|
||||
* ...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Remove the // below to have debug code visible in logcat output by default.
|
||||
* It's Also possible via libportable/Android.mk:
|
||||
* LOCAL_CFLAGS += -DLOG_NDEBUG=0
|
||||
*/
|
||||
/*
|
||||
* Enable LOG_NDEBUG to have debug code visible in logcat output by default.
|
||||
* Also possible via the Lib-Portable Android.mk file. Example:
|
||||
*
|
||||
* # Have logging permanently enable during development.
|
||||
* LOCAL_CFLAGS += -DLOG_NDEBUG=0
|
||||
*/
|
||||
// # define LOG_NDEBUG 0
|
||||
|
||||
|
||||
|
||||
// #define EXTENDED_LOGGING
|
||||
// #define EXTENDED_LOGGING /* Include the current program name in the LOG_TAG */
|
||||
#ifdef EXTENDED_LOGGING
|
||||
/*
|
||||
* Inline function to put the current LTP program and this library into the logcat prefix; Ex:
|
||||
* Inline function to put the current program name
|
||||
* and this library into the logcat prefix. Example:
|
||||
*
|
||||
* V/./sigaction01`signal_portable(605): sigaction_portable(portable_signum:10:'SIGUSR1_PORTABLE:10', act:0x7fe47a08, oldact:0x0) {
|
||||
* V/./sigaction01`signal_portable(605): sigaction_portable(... ) {
|
||||
* -----------------------------
|
||||
*
|
||||
* Disabled by default, enable by removing the // above. Useful when debugging more than one program; Ex: LTP has thousands.
|
||||
* Disabled by default in AOSP, enable by removing the // above.
|
||||
* Useful when debugging more than one program; For example LTP has thousands.
|
||||
*/
|
||||
#define MAX_TAG_LEN 128
|
||||
static char my_portable_tag[MAX_TAG_LEN + 1];
|
||||
@@ -54,7 +59,6 @@ static inline char *portable_tag() {
|
||||
extern char *__progname;
|
||||
|
||||
if (my_portable_tag[0] == '\000') {
|
||||
|
||||
strncat(&my_portable_tag[0], __progname, MAX_TAG_LEN);
|
||||
strncat(&my_portable_tag[0], ".", MAX_TAG_LEN - strlen(my_portable_tag));
|
||||
strncat(&my_portable_tag[0], PORTABLE_TAG, MAX_TAG_LEN - strlen(my_portable_tag));
|
||||
@@ -68,7 +72,9 @@ static inline char *portable_tag() {
|
||||
|
||||
# include <cutils/log.h>
|
||||
|
||||
# define PERROR(str) { ALOGE("%s: PERROR('%s'): errno:%d:'%s'", __func__, str, errno, strerror(errno)); }
|
||||
# define PERROR(str) { \
|
||||
ALOGE("%s: PERROR('%s'): errno:%d:'%s'", __func__, str, errno, strerror(errno)); \
|
||||
}
|
||||
|
||||
# define ASSERT(cond) ALOG_ASSERT(cond, "assertion failed:(%s), file: %s, line: %d:%s", \
|
||||
#cond, __FILE__, __LINE__, __func__);
|
||||
|
||||
@@ -124,7 +124,9 @@ static __inline__ __sighandler_portable_t signal_portable(int s, sighandler_port
|
||||
extern __sighandler_portable_t __signal_portable(int, __sighandler_portable_t);
|
||||
|
||||
extern int sigprocmask_portable(int, const sigset_portable_t *, sigset_portable_t *);
|
||||
extern int sigaction_portable(int, const struct sigaction_portable *, struct sigaction_portable *);
|
||||
|
||||
extern int sigaction_portable(int, const struct sigaction_portable *,
|
||||
struct sigaction_portable *);
|
||||
|
||||
extern int sigpending_portable(sigset_portable_t *);
|
||||
extern int sigsuspend_portable(const sigset_portable_t *);
|
||||
@@ -136,12 +138,16 @@ extern int kill_portable(pid_t, int);
|
||||
extern int killpg_portable(int pgrp, int sig);
|
||||
extern int sigaltstack_portable(const portable_stack_t *ss, portable_stack_t *oss);
|
||||
|
||||
|
||||
extern __hidden char *map_portable_signum_to_name(int portable_signum);
|
||||
extern __hidden char *map_mips_signum_to_name(int mips_signum);
|
||||
extern __hidden int map_portable_signum_to_mips(int portable_signum);
|
||||
extern __hidden int map_mips_signum_to_portable(int mips_signum);
|
||||
extern __hidden int signum_pton(int portable_signum);
|
||||
extern __hidden int signum_ntop(int mips_signum);
|
||||
|
||||
typedef int (*sigmask_fn)(int, const sigset_t *, sigset_t *);
|
||||
extern __hidden int sigmask_helper(int portable_how, const sigset_portable_t *portable_sigset, sigset_portable_t *portable_oldset, sigmask_fn fn, char *fname);
|
||||
|
||||
extern __hidden int do_sigmask(int portable_how, const sigset_portable_t *portable_sigset,
|
||||
sigset_portable_t *portable_oldset, sigmask_fn fn);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
||||
Reference in New Issue
Block a user