Skip to content

Commit 58c5e94

Browse files
kxxtalindima
authored andcommitted
Introduce riscv64 support
Signed-off-by: Levi Zim <[email protected]>
1 parent 9d0b55c commit 58c5e94

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ supported only on Linux systems.
2020
Supported host architectures:
2121
- Little-endian x86_64
2222
- Little-endian aarch64
23+
- Little-endian riscv64
2324

2425
## Short seccomp tutorial
2526

src/backend/bpf.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ pub const AUDIT_ARCH_X86_64: u32 = 62 | 0x8000_0000 | 0x4000_0000;
123123
// `#define AUDIT_ARCH_AARCH64 (EM_AARCH64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)`
124124
pub const AUDIT_ARCH_AARCH64: u32 = 183 | 0x8000_0000 | 0x4000_0000;
125125

126+
// Architecture identifier for riscv64 LE.
127+
// Defined as:
128+
// `#define AUDIT_ARCH_RISCV64 (EM_RISCV|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)`
129+
pub const AUDIT_ARCH_RISCV64: u32 = 243 | 0x8000_0000 | 0x4000_0000;
130+
126131
/// BPF instruction structure definition.
127132
// See /usr/include/linux/filter.h .
128133
// We cannot use the `libc::sock_filter` definition since it doesn't implement `Debug` and

src/backend/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use libc::{
2525
SECCOMP_RET_KILL_THREAD, SECCOMP_RET_LOG, SECCOMP_RET_TRACE, SECCOMP_RET_TRAP,
2626
};
2727

28-
use bpf::{ARG_NUMBER_MAX, AUDIT_ARCH_AARCH64, AUDIT_ARCH_X86_64, BPF_MAX_LEN};
28+
use bpf::{ARG_NUMBER_MAX, AUDIT_ARCH_AARCH64, AUDIT_ARCH_RISCV64, AUDIT_ARCH_X86_64, BPF_MAX_LEN};
2929

3030
pub use bpf::{sock_filter, BpfProgram, BpfProgramRef};
3131

@@ -83,6 +83,8 @@ pub enum TargetArch {
8383
x86_64,
8484
/// aarch64 arch
8585
aarch64,
86+
/// riscv64 arch
87+
riscv64,
8688
}
8789

8890
impl TargetArch {
@@ -91,6 +93,7 @@ impl TargetArch {
9193
match self {
9294
TargetArch::x86_64 => AUDIT_ARCH_X86_64,
9395
TargetArch::aarch64 => AUDIT_ARCH_AARCH64,
96+
TargetArch::riscv64 => AUDIT_ARCH_RISCV64,
9497
}
9598
}
9699
}
@@ -101,6 +104,7 @@ impl TryFrom<&str> for TargetArch {
101104
match input.to_lowercase().as_str() {
102105
"x86_64" => Ok(TargetArch::x86_64),
103106
"aarch64" => Ok(TargetArch::aarch64),
107+
"riscv64" => Ok(TargetArch::riscv64),
104108
_ => Err(Error::InvalidTargetArch(input.to_string())),
105109
}
106110
}
@@ -205,5 +209,14 @@ mod tests {
205209
TargetArch::try_from("aARch64").unwrap(),
206210
TargetArch::aarch64
207211
);
212+
213+
assert_eq!(
214+
TargetArch::try_from("riscv64").unwrap(),
215+
TargetArch::riscv64
216+
);
217+
assert_eq!(
218+
TargetArch::try_from("RiScV64").unwrap(),
219+
TargetArch::riscv64
220+
);
208221
}
209222
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
//! Supported host architectures:
3535
//! - Little-endian x86_64
3636
//! - Little-endian aarch64
37+
//! - Little-endian riscv64
3738
//!
3839
//! # Terminology
3940
//!

tools/generate_syscall_tables.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ test_mode=0
1919

2020
PATH_TO_X86_TABLE="$ROOT_DIR/src/syscall_table/x86_64.rs"
2121
PATH_TO_AARCH64_TABLE="$ROOT_DIR/src/syscall_table/aarch64.rs"
22+
PATH_TO_RISCV64_TABLE="$ROOT_DIR/src/syscall_table/riscv64.rs"
2223

2324
PATH_TO_X86_TEST_TABLE="$ROOT_DIR/src/syscall_table/test_x86_64.rs"
2425
PATH_TO_AARCH64_TEST_TABLE="$ROOT_DIR/src/syscall_table/test_aarch64.rs"
26+
PATH_TO_RISCV64_TEST_TABLE="$ROOT_DIR/src/syscall_table/test_riscv64.rs"
2527

2628
generate_syscall_list_x86_64() {
2729
# the table for x86_64 is nicely formatted here:
@@ -59,6 +61,33 @@ generate_syscall_list_aarch64() {
5961
sed $replace | awk '{ print "(\""$1"\", "$2")," }' | sort -d)
6062
}
6163

64+
generate_syscall_list_riscv64() {
65+
# filter for substituting `#define`s that point to other macros;
66+
# values taken from linux/include/uapi/asm-generic/unistd.h
67+
replace+='s/__NR3264_fadvise64/223/;'
68+
replace+='s/__NR3264_fcntl/25/;'
69+
replace+='s/__NR3264_fstatat/79/;'
70+
replace+='s/__NR3264_fstatfs/44/;'
71+
replace+='s/__NR3264_fstat/80/;'
72+
replace+='s/__NR3264_ftruncate/46/;'
73+
replace+='s/__NR3264_lseek/62/;'
74+
replace+='s/__NR3264_sendfile/71/;'
75+
replace+='s/__NR3264_statfs/43/;'
76+
replace+='s/__NR3264_truncate/45/;'
77+
replace+='s/__NR3264_mmap/222/;'
78+
79+
echo "$1" > $path_to_rust_file
80+
81+
# the riscv64 syscall table is not located in a .tbl file, like x86;
82+
# we run gcc's pre-processor to extract the numeric constants from header
83+
# files.
84+
echo $(gcc -Ilinux/include/uapi -E -dM \
85+
-D__BITS_PER_LONG=64 linux/arch/riscv/include/uapi/asm/unistd.h |\
86+
grep "#define __NR_" | grep -v "__NR_syscalls" |\
87+
grep -v "__NR_arch_specific_syscall" | awk -F '__NR_' '{print $2}' |\
88+
sed $replace | awk '{ print "(\""$1"\", "$2")," }' | sort -d)
89+
}
90+
6291
write_rust_syscall_table() {
6392
kernel_version=$1
6493
platform=$2
@@ -68,6 +97,8 @@ write_rust_syscall_table() {
6897
syscall_list=$(generate_syscall_list_x86_64)
6998
elif [ "$platform" == "aarch64" ]; then
7099
syscall_list=$(generate_syscall_list_aarch64)
100+
elif [ "$platform" == "riscv64" ]; then
101+
syscall_list=$(generate_syscall_list_riscv64)
71102
else
72103
die "Invalid platform"
73104
fi
@@ -145,6 +176,9 @@ run_validation() {
145176
elif [[ $arch == "aarch64" ]]; then
146177
path_to_table=$PATH_TO_AARCH64_TABLE
147178
path_to_test_table=$PATH_TO_AARCH64_TEST_TABLE
179+
elif [[ $arch == "riscv64" ]]; then
180+
path_to_table=$PATH_TO_RISCV64_TABLE
181+
path_to_test_table=$PATH_TO_RISCV64_TEST_TABLE
148182
else
149183
die "Invalid platform"
150184
fi
@@ -206,6 +240,7 @@ cleanup () {
206240
if [[ $test_mode -eq 1 ]]; then
207241
rm -rf $PATH_TO_X86_TEST_TABLE
208242
rm -rf $PATH_TO_AARCH64_TEST_TABLE
243+
rm -rf $PATH_TO_RISCV64_TEST_TABLE
209244
fi
210245
}
211246

@@ -241,6 +276,16 @@ test() {
241276
validate_kernel_version "$kernel_version_aarch64"
242277

243278
run_validation "aarch64" "$kernel_version_aarch64"
279+
280+
# Run the validation for riscv64.
281+
echo "Validating table for riscv64..."
282+
283+
kernel_version_riscv64=$(cat $PATH_TO_RISCV64_TABLE | \
284+
awk -F '// Kernel version:' '{print $2}' | xargs)
285+
286+
validate_kernel_version "$kernel_version_riscv64"
287+
288+
run_validation "riscv64" "$kernel_version_riscv64"
244289
}
245290

246291
main() {
@@ -263,6 +308,11 @@ main() {
263308
echo "Generating table for aarch64..."
264309
write_rust_syscall_table \
265310
"$kernel_version" "aarch64" "$PATH_TO_AARCH64_TABLE"
311+
312+
# generate syscall table for riscv64
313+
echo "Generating table for riscv64..."
314+
write_rust_syscall_table \
315+
"$kernel_version" "riscv64" "$PATH_TO_RISCV64_TABLE"
266316
fi
267317
}
268318

0 commit comments

Comments
 (0)