From c6011b96501253a2391c13074ea355d128c6e4d1 Mon Sep 17 00:00:00 2001 From: Cautreoxit Date: Mon, 2 Jun 2025 16:49:46 +0800 Subject: [PATCH] Add fadvise64 syscall --- docs/src/kernel/linux-compatibility.md | 2 +- kernel/src/syscall/arch/riscv.rs | 2 + kernel/src/syscall/arch/x86.rs | 2 + kernel/src/syscall/fadvise64.rs | 57 ++++++++++++++++++++++++++ kernel/src/syscall/mod.rs | 1 + test/src/syscall/ltp/testcases/all.txt | 8 ++-- 6 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 kernel/src/syscall/fadvise64.rs diff --git a/docs/src/kernel/linux-compatibility.md b/docs/src/kernel/linux-compatibility.md index 026c92191..b668625c9 100644 --- a/docs/src/kernel/linux-compatibility.md +++ b/docs/src/kernel/linux-compatibility.md @@ -241,7 +241,7 @@ provided by Linux on x86-64 architecture. | 218 | set_tid_address | ✅ | | 219 | restart_syscall | ❌ | | 220 | semtimedop | ✅ | -| 221 | fadvise64 | ❌ | +| 221 | fadvise64 | ✅ | | 222 | timer_create | ✅ | | 223 | timer_settime | ✅ | | 224 | timer_gettime | ✅ | diff --git a/kernel/src/syscall/arch/riscv.rs b/kernel/src/syscall/arch/riscv.rs index 5c5b74e47..8e9bb4588 100644 --- a/kernel/src/syscall/arch/riscv.rs +++ b/kernel/src/syscall/arch/riscv.rs @@ -23,6 +23,7 @@ use super::{ execve::{sys_execve, sys_execveat}, exit::sys_exit, exit_group::sys_exit_group, + fadvise64::sys_fadvise64, fallocate::sys_fallocate, fcntl::sys_fcntl, flock::sys_flock, @@ -284,6 +285,7 @@ impl_syscall_nums_and_dispatch_fn! { SYS_CLONE = 220 => sys_clone(args[..5], &user_ctx); SYS_EXECVE = 221 => sys_execve(args[..3], &mut user_ctx); SYS_MMAP = 222 => sys_mmap(args[..6]); + SYS_FADVISE64 = 223 => sys_fadvise64(args[..4]); SYS_MPROTECT = 226 => sys_mprotect(args[..3]); SYS_MSYNC = 227 => sys_msync(args[..3]); SYS_MADVISE = 233 => sys_madvise(args[..3]); diff --git a/kernel/src/syscall/arch/x86.rs b/kernel/src/syscall/arch/x86.rs index 3a7117d65..b25a560e7 100644 --- a/kernel/src/syscall/arch/x86.rs +++ b/kernel/src/syscall/arch/x86.rs @@ -28,6 +28,7 @@ use super::{ execve::{sys_execve, sys_execveat}, exit::sys_exit, exit_group::sys_exit_group, + fadvise64::sys_fadvise64, fallocate::sys_fallocate, fcntl::sys_fcntl, flock::sys_flock, @@ -321,6 +322,7 @@ impl_syscall_nums_and_dispatch_fn! { SYS_GETDENTS64 = 217 => sys_getdents64(args[..3]); SYS_SET_TID_ADDRESS = 218 => sys_set_tid_address(args[..1]); SYS_SEMTIMEDOP = 220 => sys_semtimedop(args[..4]); + SYS_FADVISE64 = 221 => sys_fadvise64(args[..4]); SYS_TIMER_CREATE = 222 => sys_timer_create(args[..3]); SYS_TIMER_SETTIME = 223 => sys_timer_settime(args[..4]); SYS_TIMER_GETTIME = 224 => sys_timer_gettime(args[..2]); diff --git a/kernel/src/syscall/fadvise64.rs b/kernel/src/syscall/fadvise64.rs new file mode 100644 index 000000000..8f1886198 --- /dev/null +++ b/kernel/src/syscall/fadvise64.rs @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: MPL-2.0 + +use super::SyscallReturn; +use crate::{fs::file_table::get_file_fast, prelude::*}; + +#[repr(i32)] +#[derive(Debug, TryFromInt)] +enum FadviseBehavior { + Normal = 0, + Random = 1, + Sequential = 2, + Willneed = 3, + Dontneed = 4, + Noreuse = 5, +} + +pub fn sys_fadvise64( + fd: i32, + offset: usize, + len: usize, + advice: i32, + ctx: &Context, +) -> Result { + let behavior = FadviseBehavior::try_from(advice) + .map_err(|_| Error::with_message(Errno::EINVAL, "invalid fadvise behavior:"))?; + + debug!( + "fd={}, offset={}, len={}, behavior={:?}", + fd, offset, len, behavior + ); + + let mut file_table = ctx.thread_local.borrow_file_table_mut(); + let _file = get_file_fast!(&mut file_table, fd); + + match behavior { + FadviseBehavior::Normal => { + warn!("POSIX_FADV_NORMAL is ignored"); + } + FadviseBehavior::Random => { + warn!("POSIX_FADV_RANDOM is ignored"); + } + FadviseBehavior::Sequential => { + warn!("POSIX_FADV_SEQUENTIAL is ignored"); + } + FadviseBehavior::Willneed => { + warn!("POSIX_FADV_WILLNEED is ignored"); + } + FadviseBehavior::Dontneed => { + warn!("POSIX_FADV_DONTNEED is ignored"); + } + FadviseBehavior::Noreuse => { + warn!("POSIX_FADV_NOREUSE is ignored"); + } + } + + Ok(SyscallReturn::Return(0)) +} diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 8c7c5d021..cdb57f1a8 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -37,6 +37,7 @@ mod eventfd; mod execve; mod exit; mod exit_group; +mod fadvise64; mod fallocate; mod fcntl; mod flock; diff --git a/test/src/syscall/ltp/testcases/all.txt b/test/src/syscall/ltp/testcases/all.txt index 55700d318..e5328042c 100644 --- a/test/src/syscall/ltp/testcases/all.txt +++ b/test/src/syscall/ltp/testcases/all.txt @@ -249,10 +249,10 @@ fallocate03 #posix_fadvise test cases # posix_fadvise01 # posix_fadvise01_64 -# posix_fadvise02 -# posix_fadvise02_64 -# posix_fadvise03 -# posix_fadvise03_64 +posix_fadvise02 +posix_fadvise02_64 +posix_fadvise03 +posix_fadvise03_64 # posix_fadvise04 # posix_fadvise04_64