1 /*
2 * Copyright (c) 2015-2021 The strace developers.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 #ifdef shuffle_scno_pers_is_static
9 static
10 #endif
11 kernel_ulong_t
12 shuffle_scno_pers(kernel_ulong_t scno, int pers)
13 {
14 if (scno < ARM_FIRST_SHUFFLED_SYSCALL)
15 return scno;
16
17 /* __ARM_NR_cmpxchg? Swap with LAST_ORDINARY+1 */
18 if (scno == ARM_FIRST_SHUFFLED_SYSCALL)
19 return 0x000ffff0;
20 if (scno == 0x000ffff0)
21 return ARM_FIRST_SHUFFLED_SYSCALL;
22
23 #define ARM_SECOND_SHUFFLED_SYSCALL (ARM_FIRST_SHUFFLED_SYSCALL + 1)
24 /*
25 * Is it ARM specific syscall?
26 * Swap [0x000f0000, 0x000f0000 + LAST_SPECIAL] range
27 * with [SECOND_SHUFFLED, SECOND_SHUFFLED + LAST_SPECIAL] range.
28 */
29 if (scno >= 0x000f0000 &&
30 scno <= 0x000f0000 + ARM_LAST_SPECIAL_SYSCALL) {
31 return scno - 0x000f0000 + ARM_SECOND_SHUFFLED_SYSCALL;
32 }
33 if (scno <= ARM_SECOND_SHUFFLED_SYSCALL + ARM_LAST_SPECIAL_SYSCALL) {
34 return scno + 0x000f0000 - ARM_SECOND_SHUFFLED_SYSCALL;
35 }
36
37 return scno;
38 }