@@ -19,9 +19,11 @@ test_mode=0
19
19
20
20
PATH_TO_X86_TABLE=" $ROOT_DIR /src/syscall_table/x86_64.rs"
21
21
PATH_TO_AARCH64_TABLE=" $ROOT_DIR /src/syscall_table/aarch64.rs"
22
+ PATH_TO_RISCV64_TABLE=" $ROOT_DIR /src/syscall_table/riscv64.rs"
22
23
23
24
PATH_TO_X86_TEST_TABLE=" $ROOT_DIR /src/syscall_table/test_x86_64.rs"
24
25
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"
25
27
26
28
generate_syscall_list_x86_64 () {
27
29
# the table for x86_64 is nicely formatted here:
@@ -59,6 +61,33 @@ generate_syscall_list_aarch64() {
59
61
sed $replace | awk ' { print "(\""$1"\", "$2")," }' | sort -d)
60
62
}
61
63
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
+
62
91
write_rust_syscall_table () {
63
92
kernel_version=$1
64
93
platform=$2
@@ -68,6 +97,8 @@ write_rust_syscall_table() {
68
97
syscall_list=$( generate_syscall_list_x86_64)
69
98
elif [ " $platform " == " aarch64" ]; then
70
99
syscall_list=$( generate_syscall_list_aarch64)
100
+ elif [ " $platform " == " riscv64" ]; then
101
+ syscall_list=$( generate_syscall_list_riscv64)
71
102
else
72
103
die " Invalid platform"
73
104
fi
@@ -145,6 +176,9 @@ run_validation() {
145
176
elif [[ $arch == " aarch64" ]]; then
146
177
path_to_table=$PATH_TO_AARCH64_TABLE
147
178
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
148
182
else
149
183
die " Invalid platform"
150
184
fi
@@ -206,6 +240,7 @@ cleanup () {
206
240
if [[ $test_mode -eq 1 ]]; then
207
241
rm -rf $PATH_TO_X86_TEST_TABLE
208
242
rm -rf $PATH_TO_AARCH64_TEST_TABLE
243
+ rm -rf $PATH_TO_RISCV64_TEST_TABLE
209
244
fi
210
245
}
211
246
@@ -241,6 +276,16 @@ test() {
241
276
validate_kernel_version " $kernel_version_aarch64 "
242
277
243
278
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 "
244
289
}
245
290
246
291
main () {
@@ -263,6 +308,11 @@ main() {
263
308
echo " Generating table for aarch64..."
264
309
write_rust_syscall_table \
265
310
" $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 "
266
316
fi
267
317
}
268
318
0 commit comments