#endif /* AUDIT_ARCH_AARCH64 */
#define SCMP_ARCH_AARCH64 AUDIT_ARCH_AARCH64
+/**
+ * The LoongArch architecture tokens
+ */
+/* 64-bit LoongArch audit support is upstream as of 5.19-rc1 */
+#ifndef AUDIT_ARCH_LOONGARCH64
+#ifndef EM_LOONGARCH
+#define EM_LOONGARCH 258
+#endif /* EM_LOONGARCH */
+#define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
+#endif /* AUDIT_ARCH_LOONGARCH64 */
+#define SCMP_ARCH_LOONGARCH64 AUDIT_ARCH_LOONGARCH64
+
/**
* The MIPS architecture tokens
*/
arch-x32.h arch-x32.c \
arch-arm.h arch-arm.c \
arch-aarch64.h arch-aarch64.c \
+ arch-loongarch64.h arch-loongarch64.c \
arch-mips.h arch-mips.c \
arch-mips64.h arch-mips64.c \
arch-mips64n32.h arch-mips64n32.c \
--- /dev/null
+/**
+ * Enhanced Seccomp 64-bit LoongArch Syscall Table
+ *
+ * Copyright (c) 2021 Xiaotian Wu <wuxiaotian@loongson.cn>
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include <stdlib.h>
+#include <errno.h>
+#include <linux/audit.h>
+
+#include "arch.h"
+#include "arch-loongarch64.h"
+#include "syscalls.h"
+
+ARCH_DEF(loongarch64)
+
+const struct arch_def arch_def_loongarch64 = {
+ .token = SCMP_ARCH_LOONGARCH64,
+ .token_bpf = AUDIT_ARCH_LOONGARCH64,
+ .size = ARCH_SIZE_64,
+ .endian = ARCH_ENDIAN_LITTLE,
+ .syscall_resolve_name_raw = loongarch64_syscall_resolve_name,
+ .syscall_resolve_num_raw = loongarch64_syscall_resolve_num,
+ .syscall_rewrite = NULL,
+ .rule_add = NULL,
+};
--- /dev/null
+/**
+ * Enhanced Seccomp 64-bit LoongArch Syscall Table
+ *
+ * Copyright (c) 2021 Xiaotian Wu <wuxiaotian@loongson.cn>
+ */
+
+/*
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#ifndef _ARCH_LOONGARCH64_H
+#define _ARCH_LOONGARCH64_H
+
+#include "arch.h"
+
+ARCH_DECL(loongarch64)
+
+#endif
#include "arch-x86_64.h"
#include "arch-x32.h"
#include "arch-arm.h"
+#include "arch-loongarch64.h"
#include "arch-mips.h"
#include "arch-mips64.h"
#include "arch-mips64n32.h"
case SCMP_ARCH_AARCH64:
sys = aarch64_syscall_iterate(iter);
break;
+ case SCMP_ARCH_LOONGARCH64:
+ sys = loongarch64_syscall_iterate(iter);
+ break;
case SCMP_ARCH_MIPS:
case SCMP_ARCH_MIPSEL:
sys = mips_syscall_iterate(iter);
dump_lib_arch aarch64 | mangle_lib_syscall aarch64
}
+#
+# Dump the loongarch64 syscall table
+#
+# Arguments:
+# 1 path to the kernel source
+#
+# Dump the architecture's syscall table to stdout.
+#
+function dump_sys_loongarch64() {
+ local sed_filter=""
+
+ sed_filter+='s/__NR3264_fadvise64/223/;'
+ sed_filter+='s/__NR3264_fcntl/25/;'
+ sed_filter+='s/__NR3264_fstatfs/44/;'
+ sed_filter+='s/__NR3264_ftruncate/46/;'
+ sed_filter+='s/__NR3264_lseek/62/;'
+ sed_filter+='s/__NR3264_mmap/222/;'
+ sed_filter+='s/__NR3264_sendfile/71/;'
+ sed_filter+='s/__NR3264_statfs/43/;'
+ sed_filter+='s/__NR3264_truncate/45/;'
+
+ gcc -E -dM -I$1/include/uapi \
+ -D__BITS_PER_LONG=64 \
+ -D__ARCH_WANT_SYS_CLONE \
+ -D__ARCH_WANT_SYS_CLONE3 \
+ $1/arch/loongarch/include/uapi/asm/unistd.h | \
+ grep "^#define __NR_" | \
+ sed '/__NR_syscalls/d' | \
+ sed '/__NR_arch_specific_syscall/d' | \
+ sed 's/#define[ \t]\+__NR_\([^ \t]\+\)[ \t]\+\(.*\)/\1,\2/' | \
+ sed $sed_filter | sort
+}
+
+#
+# Dump the loongarch64 library syscall table
+#
+# Dump the library's syscall table to stdout.
+#
+function dump_lib_loongarch64() {
+ dump_lib_arch loongarch64 | mangle_lib_syscall loongarch64
+}
+
#
# Dump the mips system syscall table
#
aarch64)
dump_sys_aarch64 "$2"
;;
+ loongarch64)
+ dump_sys_loongarch64 "$2"
+ ;;
mips)
dump_sys_mips "$2"
;;
aarch64)
dump_lib_aarch64
;;
+ loongarch64)
+ dump_lib_loongarch64
+ ;;
mips)
dump_lib_mips
;;
abi_list=""
abi_list+=" x86 x86_64 x32"
abi_list+=" arm aarch64"
+ abi_list+=" loongarch64"
abi_list+=" mips mips64 mips64n32"
abi_list+=" parisc parisc64"
abi_list+=" ppc ppc64"
opt_arches=" \
x86 x86_64 x32 \
arm aarch64 \
+ loongarch64 \
mips mips64 mips64n32 \
parisc parisc64 \
ppc ppc64 \
#include "arch-x32.h"
#include "arch-arm.h"
#include "arch-aarch64.h"
+#include "arch-loongarch64.h"
#include "arch-mips.h"
#include "arch-mips64.h"
#include "arch-mips64n32.h"
const struct arch_def *arch_def_native = &arch_def_arm;
#elif __aarch64__
const struct arch_def *arch_def_native = &arch_def_aarch64;
+#elif __loongarch64
+const struct arch_def *arch_def_native = &arch_def_loongarch64;
#elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI32
#if __MIPSEB__
const struct arch_def *arch_def_native = &arch_def_mips;
return &arch_def_arm;
case SCMP_ARCH_AARCH64:
return &arch_def_aarch64;
+ case SCMP_ARCH_LOONGARCH64:
+ return &arch_def_loongarch64;
case SCMP_ARCH_MIPS:
return &arch_def_mips;
case SCMP_ARCH_MIPSEL:
return &arch_def_arm;
else if (strcmp(arch_name, "aarch64") == 0)
return &arch_def_aarch64;
+ else if (strcmp(arch_name, "loongarch64") == 0)
+ return &arch_def_loongarch64;
else if (strcmp(arch_name, "mips") == 0)
return &arch_def_mips;
else if (strcmp(arch_name, "mipsel") == 0)
return "arm";
case SCMP_ARCH_AARCH64:
return "aarch64";
+ case SCMP_ARCH_LOONGARCH64:
+ return "loongarch64";
case SCMP_ARCH_MIPS:
return "mips";
case SCMP_ARCH_MIPSEL:
SCMP_ARCH_X32
SCMP_ARCH_ARM
SCMP_ARCH_AARCH64
+ SCMP_ARCH_LOONGARCH64
SCMP_ARCH_MIPS
SCMP_ARCH_MIPS64
SCMP_ARCH_MIPS64N32
X32 - 64-bit x86 using the x32 ABI
ARM - ARM
AARCH64 - 64-bit ARM
+ LOONGARCH64 - 64-bit LoongArch
MIPS - MIPS O32 ABI
MIPS64 - MIPS 64-bit ABI
MIPS64N32 - MIPS N32 ABI
X32 = libseccomp.SCMP_ARCH_X32
ARM = libseccomp.SCMP_ARCH_ARM
AARCH64 = libseccomp.SCMP_ARCH_AARCH64
+ LOONGARCH64 = libseccomp.SCMP_ARCH_LOONGARCH64
MIPS = libseccomp.SCMP_ARCH_MIPS
MIPS64 = libseccomp.SCMP_ARCH_MIPS64
MIPS64N32 = libseccomp.SCMP_ARCH_MIPS64N32
self._token = libseccomp.SCMP_ARCH_ARM
elif arch == libseccomp.SCMP_ARCH_AARCH64:
self._token = libseccomp.SCMP_ARCH_AARCH64
+ elif arch == libseccomp.SCMP_ARCH_LOONGARCH64:
+ self._token = libseccomp.SCMP_ARCH_LOONGARCH64
elif arch == libseccomp.SCMP_ARCH_MIPS:
self._token = libseccomp.SCMP_ARCH_MIPS
elif arch == libseccomp.SCMP_ARCH_MIPS64:
#include "arch-aarch64.h"
#include "arch-arm.h"
#include "arch.h"
+#include "arch-loongarch64.h"
#include "arch-mips64.h"
#include "arch-mips64n32.h"
#include "arch-mips.h"
int x32;
int arm;
int aarch64;
+ int loongarch64;
int mips;
int mips64;
int mips64n32;
case SCMP_ARCH_X86_64:
case SCMP_ARCH_ARM:
case SCMP_ARCH_AARCH64:
+ case SCMP_ARCH_LOONGARCH64:
case SCMP_ARCH_PPC64:
case SCMP_ARCH_PPC64LE:
case SCMP_ARCH_S390:
case SCMP_ARCH_AARCH64:
printf("aarch64\n");
break;
+ case SCMP_ARCH_LOONGARCH64:
+ printf("loongarch64\n");
+ break;
case SCMP_ARCH_MIPS:
printf("mips\n");
break;
arch = AUDIT_ARCH_ARM;
else if (strcmp(optarg, "aarch64") == 0)
arch = AUDIT_ARCH_AARCH64;
+ else if (strcmp(optarg, "loongarch64") == 0)
+ arch = AUDIT_ARCH_LOONGARCH64;
else if (strcmp(optarg, "mips") == 0)
arch = AUDIT_ARCH_MIPS;
else if (strcmp(optarg, "mipsel") == 0)
arch = AUDIT_ARCH_ARM;
else if (strcmp(optarg, "aarch64") == 0)
arch = AUDIT_ARCH_AARCH64;
+ else if (strcmp(optarg, "loongarch64") == 0)
+ arch = AUDIT_ARCH_LOONGARCH64;
else if (strcmp(optarg, "mips") == 0)
arch = AUDIT_ARCH_MIPS;
else if (strcmp(optarg, "mipsel") == 0)
#define ARCH_NATIVE AUDIT_ARCH_ARM
#elif __aarch64__
#define ARCH_NATIVE AUDIT_ARCH_AARCH64
+#elif __loongarch64
+#define ARCH_NATIVE AUDIT_ARCH_LOONGARCH64
#elif __mips__ && _MIPS_SIM == _MIPS_SIM_ABI32
#if __MIPSEB__
#define ARCH_NATIVE AUDIT_ARCH_MIPS
#define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
#endif /* AUDIT_ARCH_AARCH64 */
+/**
+ * The 64-bit LoongArch architecture tokens
+ */
+/* 64-bit LoongArch audit support is upstream as of 5.19-rc1 */
+#ifndef AUDIT_ARCH_LOONGARCH64
+#ifndef EM_LOONGARCH
+#define EM_LOONGARCH 258
+#endif /* EM_LOONGARCH */
+#define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
+#endif /* AUDIT_ARCH_LOONGARCH64 */
+
/**
* The MIPS architecture tokens
*/