Add fadvise64 syscall

This commit is contained in:
Cautreoxit 2025-06-02 16:49:46 +08:00 committed by Tate, Hongliang Tian
parent 9570f14d80
commit c6011b9650
6 changed files with 67 additions and 5 deletions

View File

@ -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 | ✅ |

View File

@ -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]);

View File

@ -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]);

View File

@ -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<SyscallReturn> {
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))
}

View File

@ -37,6 +37,7 @@ mod eventfd;
mod execve;
mod exit;
mod exit_group;
mod fadvise64;
mod fallocate;
mod fcntl;
mod flock;

View File

@ -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