diff options
Diffstat (limited to 'src/core/syscall-list.h')
-rw-r--r-- | src/core/syscall-list.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/core/syscall-list.h b/src/core/syscall-list.h index 0fc6859605..503838b7fb 100644 --- a/src/core/syscall-list.h +++ b/src/core/syscall-list.h @@ -22,6 +22,20 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ +#if defined __x86_64__ && defined __ILP32__ +/* The x32 ABI defines all of its syscalls with bit 30 set, which causes + issues when attempting to use syscalls as simple indicies into an array. + Instead, use the syscall id & ~SYSCALL_MASK as the index, and | the + internal id with the syscall mask as needed. +*/ +#include <asm/unistd.h> +#define SYSCALL_TO_INDEX(x) ((x) & ~__X32_SYSCALL_BIT) +#define INDEX_TO_SYSCALL(x) ((x) | __X32_SYSCALL_BIT) +#else +#define SYSCALL_TO_INDEX(x) (x) +#define INDEX_TO_SYSCALL(x) (x) +#endif + const char *syscall_to_name(int id); int syscall_from_name(const char *name); |