arm: rewrite shuffle_scno in a bit more readable way

* linux/arm/syscallent.h: Define ARM_FIRST_SHUFFLED_SYSCALL instead of
ARM_LAST_ORDINARY_SYSCALL.
* syscall.c [ARM || AARCH64] (shuffle_scno): Update.
This commit is contained in:
Дмитрий Левин 2015-01-11 17:26:29 +00:00
parent 12e2442784
commit cf7248d004
2 changed files with 20 additions and 19 deletions

View File

@ -412,7 +412,7 @@
{ 4, 0, sys_sched_getattr, "sched_getattr" }, /* 381 */
{ 5, TD|TF, sys_renameat2, "renameat2" }, /* 382 */
#ifdef __ARM_EABI__
# define ARM_LAST_ORDINARY_SYSCALL 382
# define ARM_FIRST_SHUFFLED_SYSCALL 383
#else
{ 5, 0, NULL, NULL }, /* 383 */
{ 5, 0, NULL, NULL }, /* 384 */
@ -433,8 +433,8 @@
{ 5, 0, NULL, NULL }, /* 399 */
# define SYS_socket_subcall 400
# include "subcall.h"
# define ARM_LAST_ORDINARY_SYSCALL (SYS_socket_subcall + SYS_socket_nsubcalls + SYS_ipc_nsubcalls - 1)
#endif /* !EABI */
# define ARM_FIRST_SHUFFLED_SYSCALL (SYS_socket_subcall + SYS_socket_nsubcalls + SYS_ipc_nsubcalls)
#endif /* !__ARM_EABI__ */
/* __ARM_NR_cmpxchg (0x000ffff0).
* Remapped by shuffle_scno() to be directly after ordinary syscalls

View File

@ -930,34 +930,35 @@ print_pc(struct tcb *tcp)
#endif /* architecture */
}
/* Shuffle syscall numbers so that we don't have huge gaps in syscall table.
* The shuffling should be reversible: shuffle_scno(shuffle_scno(n)) == n.
/*
* Shuffle syscall numbers so that we don't have huge gaps in syscall table.
* The shuffling should be an involution: shuffle_scno(shuffle_scno(n)) == n.
*/
#if defined(ARM) || defined(AARCH64) /* So far only 32-bit ARM needs this */
static long
shuffle_scno(unsigned long scno)
{
if (scno <= ARM_LAST_ORDINARY_SYSCALL)
if (scno < ARM_FIRST_SHUFFLED_SYSCALL)
return scno;
/* __ARM_NR_cmpxchg? Swap with LAST_ORDINARY+1 */
if (scno == 0x000ffff0)
return ARM_LAST_ORDINARY_SYSCALL+1;
if (scno == ARM_LAST_ORDINARY_SYSCALL+1)
if (scno == ARM_FIRST_SHUFFLED_SYSCALL)
return 0x000ffff0;
if (scno == 0x000ffff0)
return ARM_FIRST_SHUFFLED_SYSCALL;
/* Is it ARM specific syscall?
* Swap with [LAST_ORDINARY+2, LAST_ORDINARY+2 + LAST_SPECIAL] range.
#define ARM_SECOND_SHUFFLED_SYSCALL (ARM_FIRST_SHUFFLED_SYSCALL + 1)
/*
* Is it ARM specific syscall?
* Swap [0x000f0000, 0x000f0000 + LAST_SPECIAL] range
* with [SECOND_SHUFFLED, SECOND_SHUFFLED + LAST_SPECIAL] range.
*/
if (scno >= 0x000f0000
&& scno <= 0x000f0000 + ARM_LAST_SPECIAL_SYSCALL
) {
return scno - 0x000f0000 + (ARM_LAST_ORDINARY_SYSCALL+2);
if (scno >= 0x000f0000 &&
scno <= 0x000f0000 + ARM_LAST_SPECIAL_SYSCALL) {
return scno - 0x000f0000 + ARM_SECOND_SHUFFLED_SYSCALL;
}
if (/* scno >= ARM_LAST_ORDINARY_SYSCALL+2 - always true */ 1
&& scno <= (ARM_LAST_ORDINARY_SYSCALL+2) + ARM_LAST_SPECIAL_SYSCALL
) {
return scno + 0x000f0000 - (ARM_LAST_ORDINARY_SYSCALL+2);
if (scno <= ARM_SECOND_SHUFFLED_SYSCALL + ARM_LAST_SPECIAL_SYSCALL) {
return scno + 0x000f0000 - ARM_SECOND_SHUFFLED_SYSCALL;
}
return scno;