Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFE: add 64-bit LoongArch support #356

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -33,6 +33,7 @@ The libseccomp library currently supports the architectures listed below:
* 64-bit x86 x32 ABI (x32)
* 32-bit ARM EABI (arm)
* 64-bit ARM (aarch64)
* 64-bit LoongArch (loongarch64)
* 32-bit MIPS (mips)
* 32-bit MIPS little endian (mipsel)
* 64-bit MIPS (mips64)
Expand Down
6 changes: 3 additions & 3 deletions doc/man/man1/scmp_sys_resolver.1
Expand Up @@ -34,9 +34,9 @@ special manner by libseccomp depending on the operation.
.B \-a \fIARCH
The architecture to use for resolving the system call. Valid
.I ARCH
values are "x86", "x86_64", "x32", "arm", "aarch64", "mips", "mipsel", "mips64",
"mipsel64", "mips64n32", "mipsel64n32", "parisc", "parisc64", "ppc", "ppc64",
"ppc64le", "s390", "s390x", "sheb" and "sh".
values are "x86", "x86_64", "x32", "arm", "aarch64", "loongarch64", "mips",
"mipsel", "mips64", "mipsel64", "mips64n32", "mipsel64n32", "parisc",
"parisc64", "ppc", "ppc64", "ppc64le", "s390", "s390x", "sheb" and "sh".
.TP
.B \-t
If necessary, translate the system call name to the proper system call number,
Expand Down
1 change: 1 addition & 0 deletions include/seccomp-syscalls.h
Expand Up @@ -276,6 +276,7 @@
#define __PNR_renameat -10242
#define __PNR_riscv_flush_icache -10243
#define __PNR_memfd_secret -10244
#define __PNR_fstat -10245

/*
* libseccomp syscall definitions
Expand Down
12 changes: 12 additions & 0 deletions include/seccomp.h.in
Expand Up @@ -152,6 +152,18 @@ struct scmp_arg_cmp {
#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
*/
Expand Down
1 change: 1 addition & 0 deletions src/Makefile.am
Expand Up @@ -32,6 +32,7 @@ SOURCES_ALL = \
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 \
Expand Down
42 changes: 42 additions & 0 deletions src/arch-loongarch64.c
@@ -0,0 +1,42 @@
/**
* 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,
.syscall_name_kver = loongarch64_syscall_name_kver,
.syscall_num_kver = loongarch64_syscall_num_kver,
};
28 changes: 28 additions & 0 deletions src/arch-loongarch64.h
@@ -0,0 +1,28 @@
/**
* 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
4 changes: 4 additions & 0 deletions src/arch-syscall-dump.c
Expand Up @@ -34,6 +34,7 @@
#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"
Expand Down Expand Up @@ -107,6 +108,9 @@ int main(int argc, char *argv[])
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);
Expand Down
50 changes: 50 additions & 0 deletions src/arch-syscall-validate
Expand Up @@ -306,6 +306,48 @@ function dump_lib_aarch64() {
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
#
Expand Down Expand Up @@ -619,6 +661,9 @@ function dump_sys() {
aarch64)
dump_sys_aarch64 "$2"
;;
loongarch64)
dump_sys_loongarch64 "$2"
;;
mips)
dump_sys_mips "$2"
;;
Expand Down Expand Up @@ -686,6 +731,9 @@ function dump_lib() {
aarch64)
dump_lib_aarch64
;;
loongarch64)
dump_lib_loongarch64
;;
mips)
dump_lib_mips
;;
Expand Down Expand Up @@ -750,6 +798,7 @@ function gen_csv() {
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"
Expand Down Expand Up @@ -861,6 +910,7 @@ if [[ $opt_arches == "" ]]; then
opt_arches=" \
x86 x86_64 x32 \
arm aarch64 \
loongarch64 \
mips mips64 mips64n32 \
parisc parisc64 \
ppc ppc64 \
Expand Down
7 changes: 7 additions & 0 deletions src/arch.c
Expand Up @@ -35,6 +35,7 @@
#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"
Expand Down Expand Up @@ -63,6 +64,8 @@ const struct arch_def *arch_def_native = &arch_def_x86_64;
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;
Expand Down Expand Up @@ -141,6 +144,8 @@ const struct arch_def *arch_def_lookup(uint32_t token)
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:
Expand Down Expand Up @@ -197,6 +202,8 @@ const struct arch_def *arch_def_lookup_name(const char *arch_name)
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)
Expand Down
2 changes: 2 additions & 0 deletions src/gen_pfc.c
Expand Up @@ -61,6 +61,8 @@ static const char *_pfc_arch(const struct arch_def *arch)
return "arm";
case SCMP_ARCH_AARCH64:
return "aarch64";
case SCMP_ARCH_LOONGARCH64:
return "loongarch64";
case SCMP_ARCH_MIPS:
return "mips";
case SCMP_ARCH_MIPSEL:
Expand Down
1 change: 1 addition & 0 deletions src/python/libseccomp.pxd
Expand Up @@ -38,6 +38,7 @@ cdef extern from "seccomp.h":
SCMP_ARCH_X32
SCMP_ARCH_ARM
SCMP_ARCH_AARCH64
SCMP_ARCH_LOONGARCH64
SCMP_ARCH_MIPS
SCMP_ARCH_MIPS64
SCMP_ARCH_MIPS64N32
Expand Down
4 changes: 4 additions & 0 deletions src/python/seccomp.pyx
Expand Up @@ -206,6 +206,7 @@ cdef class Arch:
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
Expand All @@ -227,6 +228,7 @@ cdef class Arch:
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
Expand Down Expand Up @@ -264,6 +266,8 @@ cdef class Arch:
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:
Expand Down