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:
parent
12e2442784
commit
cf7248d004
@ -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
|
||||
|
33
syscall.c
33
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;
|
||||
|
Loading…
Reference in New Issue
Block a user