From cf7248d004153194ce15a215afc0803e9798ecb7 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Sun, 11 Jan 2015 17:26:29 +0000 Subject: [PATCH] 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. --- linux/arm/syscallent.h | 6 +++--- syscall.c | 33 +++++++++++++++++---------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/linux/arm/syscallent.h b/linux/arm/syscallent.h index 5bde8bd9..c93eaa4c 100644 --- a/linux/arm/syscallent.h +++ b/linux/arm/syscallent.h @@ -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 diff --git a/syscall.c b/syscall.c index 091626ce..343fa308 100644 --- a/syscall.c +++ b/syscall.c @@ -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; -- 2.40.0