diff --git a/kernel/src/filesystem/vfs/syscall/sys_close.rs b/kernel/src/filesystem/vfs/syscall/sys_close.rs index 6c3fd164..d0a4d958 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_close.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_close.rs @@ -2,13 +2,13 @@ use alloc::string::ToString; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_CLOSE; use crate::process::ProcessManager; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; use alloc::vec::Vec; use system_error::SystemError; - /// Handler for the `close` system call. pub struct SysCloseHandle; @@ -19,7 +19,7 @@ impl Syscall for SysCloseHandle { } /// Handles the close syscall by extracting arguments and calling `do_close`. - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); do_close(fd) } diff --git a/kernel/src/filesystem/vfs/syscall/sys_epoll_create.rs b/kernel/src/filesystem/vfs/syscall/sys_epoll_create.rs index d56df4e7..798fae96 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_epoll_create.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_epoll_create.rs @@ -1,5 +1,6 @@ //! System call handler for epoll creation. +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_EPOLL_CREATE; use crate::filesystem::epoll::event_poll::EventPoll; use crate::filesystem::vfs::file::FileMode; @@ -15,7 +16,7 @@ impl Syscall for SysEpollCreateHandle { 1 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let max_size = Self::max_size(args); if max_size < 0 { return Err(SystemError::EINVAL); diff --git a/kernel/src/filesystem/vfs/syscall/sys_epoll_create1.rs b/kernel/src/filesystem/vfs/syscall/sys_epoll_create1.rs index 581edcb1..24f7398c 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_epoll_create1.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_epoll_create1.rs @@ -1,5 +1,6 @@ //! System call handler for epoll_create1. +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_EPOLL_CREATE1; use crate::filesystem::epoll::event_poll::EventPoll; use crate::filesystem::vfs::file::FileMode; @@ -7,7 +8,6 @@ use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; use alloc::vec::Vec; use system_error::SystemError; - pub struct SysEpollCreate1Handle; impl Syscall for SysEpollCreate1Handle { @@ -15,7 +15,7 @@ impl Syscall for SysEpollCreate1Handle { 1 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { return EventPoll::create_epoll(Self::flags(args)); } diff --git a/kernel/src/filesystem/vfs/syscall/sys_epoll_ctl.rs b/kernel/src/filesystem/vfs/syscall/sys_epoll_ctl.rs index f058d659..fe8c5220 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_epoll_ctl.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_epoll_ctl.rs @@ -1,5 +1,6 @@ //! System call handler for epoll_ctl. +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_EPOLL_CTL; use crate::filesystem::epoll::event_poll::EventPoll; use crate::filesystem::epoll::EPollCtlOption; @@ -18,7 +19,7 @@ impl Syscall for SysEpollCtlHandle { 4 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let op = EPollCtlOption::from_op_num(Self::op(args))?; let mut epds = EPollEvent::default(); let event = Self::event(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_epoll_pwait.rs b/kernel/src/filesystem/vfs/syscall/sys_epoll_pwait.rs index 1cc1e04c..79c4bb33 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_epoll_pwait.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_epoll_pwait.rs @@ -1,5 +1,7 @@ //! System call handler for epoll_pwait. +use super::epoll_utils::do_epoll_wait; +use crate::arch::interrupt::TrapFrame; use crate::arch::ipc::signal::SigSet; use crate::arch::syscall::nr::SYS_EPOLL_PWAIT; use crate::ipc::signal::restore_saved_sigmask; @@ -11,8 +13,6 @@ use crate::syscall::user_access::UserBufferReader; use alloc::vec::Vec; use system_error::SystemError; -use super::epoll_utils::do_epoll_wait; - pub struct SysEpollPwaitHandle; impl Syscall for SysEpollPwaitHandle { @@ -20,7 +20,7 @@ impl Syscall for SysEpollPwaitHandle { 5 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let epfd = Self::epfd(args); let epoll_event = Self::epoll_event(args); let max_events = Self::max_events(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_epoll_wait.rs b/kernel/src/filesystem/vfs/syscall/sys_epoll_wait.rs index d1964929..efd0c1a9 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_epoll_wait.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_epoll_wait.rs @@ -1,6 +1,7 @@ //! System call handler for epoll_wait. use super::epoll_utils::do_epoll_wait; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_EPOLL_WAIT; use crate::mm::VirtAddr; use crate::syscall::table::FormattedSyscallParam; @@ -15,7 +16,7 @@ impl Syscall for SysEpollWaitHandle { 4 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let epfd = Self::epfd(args); let max_events = Self::max_events(args); let timeout = Self::timeout(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_fstat.rs b/kernel/src/filesystem/vfs/syscall/sys_fstat.rs index b6cf6d9a..28bd572e 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_fstat.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_fstat.rs @@ -6,9 +6,9 @@ use crate::arch::syscall::nr::SYS_FSTAT; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; +use crate::arch::interrupt::TrapFrame; use alloc::string::ToString; use alloc::vec::Vec; - pub struct SysFstatHandle; impl Syscall for SysFstatHandle { @@ -17,7 +17,7 @@ impl Syscall for SysFstatHandle { 2 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let usr_kstat = Self::usr_kstat(args); crate::syscall::Syscall::newfstat(fd, usr_kstat) diff --git a/kernel/src/filesystem/vfs/syscall/sys_ioctl.rs b/kernel/src/filesystem/vfs/syscall/sys_ioctl.rs index c97de172..0efeaf08 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_ioctl.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_ioctl.rs @@ -1,5 +1,6 @@ //! System call handler for ioctls. +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_IOCTL; use crate::process::ProcessManager; use crate::syscall::table::FormattedSyscallParam; @@ -29,7 +30,7 @@ impl Syscall for SysIoctlHandle { /// /// * `Ok(usize)` - On success, returns 0 /// * `Err(SystemError)` - On failure, returns a POSIX error code - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let cmd = Self::cmd(args); let data = Self::data(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_lstat.rs b/kernel/src/filesystem/vfs/syscall/sys_lstat.rs index 2d345024..4e130312 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_lstat.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_lstat.rs @@ -4,13 +4,13 @@ use system_error::SystemError; use defer::defer; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_LSTAT; use crate::filesystem::vfs::file::FileMode; use crate::filesystem::vfs::syscall::sys_close::do_close; use crate::filesystem::vfs::ModeType; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; - use alloc::vec::Vec; pub struct SysLstatHandle; @@ -21,7 +21,7 @@ impl Syscall for SysLstatHandle { 2 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let path = Self::path(args); let usr_kstat = Self::usr_kstat(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_open.rs b/kernel/src/filesystem/vfs/syscall/sys_open.rs index 68f4ad92..3c5ec612 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_open.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_open.rs @@ -2,6 +2,7 @@ use system_error::SystemError; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_OPEN; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; @@ -19,7 +20,7 @@ impl Syscall for SysOpenHandle { } /// Handles the open syscall by extracting arguments and calling `do_open`. - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let path = Self::path(args); let flags = Self::flags(args); let mode = Self::mode(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_read.rs b/kernel/src/filesystem/vfs/syscall/sys_read.rs index be9f43d0..2d57c77c 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_read.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_read.rs @@ -1,11 +1,11 @@ use system_error::SystemError; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_READ; use crate::process::ProcessManager; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; use crate::syscall::user_access::UserBufferWriter; - use alloc::string::ToString; use alloc::vec::Vec; @@ -34,12 +34,12 @@ impl Syscall for SysReadHandle { /// # Returns /// * `Ok(usize)` - Number of bytes successfully read /// * `Err(SystemError)` - Error code if operation fails - fn handle(&self, args: &[usize], from_user: bool) -> Result { + fn handle(&self, args: &[usize], frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let buf_vaddr = Self::buf(args); let len = Self::len(args); - let mut user_buffer_writer = UserBufferWriter::new(buf_vaddr, len, from_user)?; + let mut user_buffer_writer = UserBufferWriter::new(buf_vaddr, len, frame.is_from_user())?; let user_buf = user_buffer_writer.buffer(0)?; do_read(fd, user_buf) diff --git a/kernel/src/filesystem/vfs/syscall/sys_readv.rs b/kernel/src/filesystem/vfs/syscall/sys_readv.rs index 70133d74..9a99d6f5 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_readv.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_readv.rs @@ -1,11 +1,11 @@ use system_error::SystemError; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_READV; use crate::filesystem::vfs::iov::IoVec; use crate::filesystem::vfs::iov::IoVecs; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; - use alloc::string::ToString; use alloc::vec::Vec; @@ -22,7 +22,7 @@ impl Syscall for SysReadVHandle { 3 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let iov = Self::iov(args); let count = Self::count(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_stat.rs b/kernel/src/filesystem/vfs/syscall/sys_stat.rs index 71005814..a812e4cd 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_stat.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_stat.rs @@ -2,14 +2,14 @@ use system_error::SystemError; -use defer::defer; - +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_STAT; use crate::filesystem::vfs::file::FileMode; use crate::filesystem::vfs::syscall::sys_close::do_close; use crate::filesystem::vfs::ModeType; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; +use defer::defer; use alloc::vec::Vec; @@ -21,7 +21,7 @@ impl Syscall for SysStatHandle { 2 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let path = Self::path(args); let usr_kstat = Self::usr_kstat(args); diff --git a/kernel/src/filesystem/vfs/syscall/sys_write.rs b/kernel/src/filesystem/vfs/syscall/sys_write.rs index 246bc41e..c0c47e71 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_write.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_write.rs @@ -1,11 +1,11 @@ use system_error::SystemError; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_WRITE; use crate::process::ProcessManager; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; use crate::syscall::user_access::UserBufferReader; - use alloc::string::ToString; use alloc::vec::Vec; @@ -34,12 +34,12 @@ impl Syscall for SysWriteHandle { /// # Returns /// * `Ok(usize)` - Number of bytes successfully written /// * `Err(SystemError)` - Error code if operation fails - fn handle(&self, args: &[usize], from_user: bool) -> Result { + fn handle(&self, args: &[usize], frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let buf_vaddr = Self::buf(args); let len = Self::len(args); - let user_buffer_reader = UserBufferReader::new(buf_vaddr, len, from_user)?; + let user_buffer_reader = UserBufferReader::new(buf_vaddr, len, frame.is_from_user())?; let user_buf = user_buffer_reader.read_from_user(0)?; diff --git a/kernel/src/filesystem/vfs/syscall/sys_writev.rs b/kernel/src/filesystem/vfs/syscall/sys_writev.rs index e3390604..beba0b32 100644 --- a/kernel/src/filesystem/vfs/syscall/sys_writev.rs +++ b/kernel/src/filesystem/vfs/syscall/sys_writev.rs @@ -10,7 +10,7 @@ use alloc::string::ToString; use alloc::vec::Vec; use super::sys_write::do_write; - +use crate::arch::interrupt::TrapFrame; /// System call handler for `writev` operation /// /// The `writev` system call writes data from multiple buffers to a file descriptor. @@ -38,7 +38,7 @@ impl Syscall for SysWriteVHandle { /// /// # Safety /// The caller must ensure the `iov` pointer is valid and points to properly initialized memory. - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd = Self::fd(args); let iov = Self::iov(args); let count = Self::count(args); diff --git a/kernel/src/ipc/syscall/sys_kill.rs b/kernel/src/ipc/syscall/sys_kill.rs index 4de97e6c..a71ae635 100644 --- a/kernel/src/ipc/syscall/sys_kill.rs +++ b/kernel/src/ipc/syscall/sys_kill.rs @@ -2,6 +2,7 @@ use alloc::string::ToString; use alloc::vec::Vec; use core::ffi::c_int; +use crate::arch::interrupt::TrapFrame; use crate::syscall::table::FormattedSyscallParam; use crate::syscall::table::Syscall; use crate::{ @@ -60,7 +61,7 @@ impl Syscall for SysKillHandle { fn num_args(&self) -> usize { 2 } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let id = Self::pid(args); let sig_c_int = Self::sig(args); diff --git a/kernel/src/ipc/syscall/sys_pipe.rs b/kernel/src/ipc/syscall/sys_pipe.rs index b7dd862b..edfde6bc 100644 --- a/kernel/src/ipc/syscall/sys_pipe.rs +++ b/kernel/src/ipc/syscall/sys_pipe.rs @@ -1,4 +1,5 @@ use super::sys_pipe2::do_kernel_pipe2; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_PIPE; use crate::{ filesystem::vfs::file::FileMode, @@ -23,7 +24,7 @@ impl Syscall for SysPipeHandle { 1 // pipefd } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let pipefd = Self::pipefd(args); if pipefd.is_null() { return Err(SystemError::EFAULT); diff --git a/kernel/src/ipc/syscall/sys_pipe2.rs b/kernel/src/ipc/syscall/sys_pipe2.rs index 2d918234..d195b457 100644 --- a/kernel/src/ipc/syscall/sys_pipe2.rs +++ b/kernel/src/ipc/syscall/sys_pipe2.rs @@ -1,3 +1,4 @@ +use crate::arch::interrupt::TrapFrame; use crate::{ arch::syscall::nr::SYS_PIPE2, filesystem::vfs::{ @@ -15,7 +16,6 @@ use crate::{ use alloc::vec::Vec; use core::ffi::c_int; use system_error::SystemError; - pub struct SysPipe2Handle; // Extracted core logic for pipe2 @@ -80,7 +80,7 @@ impl Syscall for SysPipe2Handle { 2 // fd_ptr, flags } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let fd_ptr = Self::pipefd(args); if fd_ptr.is_null() { return Err(SystemError::EFAULT); diff --git a/kernel/src/ipc/syscall/sys_restart.rs b/kernel/src/ipc/syscall/sys_restart.rs index c6dc46f1..c52c9d69 100644 --- a/kernel/src/ipc/syscall/sys_restart.rs +++ b/kernel/src/ipc/syscall/sys_restart.rs @@ -1,4 +1,5 @@ use super::super::signal_types::{SigInfo, SigType}; +use crate::arch::interrupt::TrapFrame; use crate::{ alloc::vec::Vec, arch::ipc::signal::{SigCode, Signal}, @@ -8,7 +9,6 @@ use crate::{ }; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysRestartHandle; /// # SYS_RESTART_SYSCALL 系统调用函数,用于重启被信号中断的系统调用 @@ -41,7 +41,7 @@ impl Syscall for SysRestartHandle { Vec::new() // 没有参数,返回空Vec } - fn handle(&self, _args: &[usize], _from_user: bool) -> Result { + fn handle(&self, _args: &[usize], _frame: &mut TrapFrame) -> Result { do_kernel_restart_syscall() } } diff --git a/kernel/src/ipc/syscall/sys_rt_sigprocmask.rs b/kernel/src/ipc/syscall/sys_rt_sigprocmask.rs index bf8ca46a..267206b1 100644 --- a/kernel/src/ipc/syscall/sys_rt_sigprocmask.rs +++ b/kernel/src/ipc/syscall/sys_rt_sigprocmask.rs @@ -1,4 +1,5 @@ use crate::alloc::vec::Vec; +use crate::arch::interrupt::TrapFrame; use crate::{ arch::ipc::signal::{SigSet, Signal}, arch::syscall::nr::SYS_RT_SIGPROCMASK, @@ -12,7 +13,6 @@ use crate::{ use core::mem::size_of; use syscall_table_macros::declare_syscall; use system_error::SystemError; // 添加 Vec - pub struct SysRtSigprocmaskHandle; /// # SYS_SIGPROCMASK系统调用函数,用于设置或查询当前进程的信号屏蔽字 @@ -122,7 +122,7 @@ impl Syscall for SysRtSigprocmaskHandle { ] } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let how = Self::how(args); let nset = Self::nset(args); let oset = Self::oset(args); diff --git a/kernel/src/ipc/syscall/sys_shmat.rs b/kernel/src/ipc/syscall/sys_shmat.rs index 526c385e..f8a6ccca 100644 --- a/kernel/src/ipc/syscall/sys_shmat.rs +++ b/kernel/src/ipc/syscall/sys_shmat.rs @@ -1,4 +1,5 @@ use crate::alloc::vec::Vec; +use crate::arch::interrupt::TrapFrame; use crate::syscall::table::FormattedSyscallParam; use crate::{ arch::syscall::nr::SYS_SHMAT, @@ -16,7 +17,6 @@ use crate::{ }; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysShmatHandle; /// # SYS_SHMAT系统调用函数,用于连接共享内存段 @@ -168,7 +168,7 @@ impl Syscall for SysShmatHandle { FormattedSyscallParam::new("shmflg", format!("{}", Self::shmflg(args).bits())), ] } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let id = Self::id(args); let vaddr = Self::vaddr(args); let shmflg = Self::shmflg(args); diff --git a/kernel/src/ipc/syscall/sys_shmctl.rs b/kernel/src/ipc/syscall/sys_shmctl.rs index 5b42d1b1..7ac5ea68 100644 --- a/kernel/src/ipc/syscall/sys_shmctl.rs +++ b/kernel/src/ipc/syscall/sys_shmctl.rs @@ -1,4 +1,5 @@ use crate::alloc::vec::Vec; +use crate::arch::interrupt::TrapFrame; use crate::{ arch::syscall::nr::SYS_SHMCTL, ipc::shm::{shm_manager_lock, ShmCtlCmd, ShmId}, @@ -6,7 +7,6 @@ use crate::{ }; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysShmctlHandle; /// # SYS_SHMCTL系统调用函数,用于管理共享内存段 @@ -81,11 +81,11 @@ impl Syscall for SysShmctlHandle { ] } - fn handle(&self, args: &[usize], from_user: bool) -> Result { + fn handle(&self, args: &[usize], frame: &mut TrapFrame) -> Result { let id = Self::id(args); let cmd = Self::cmd(args); let user_buf = Self::user_buf(args); - do_kernel_shmctl(id, cmd, user_buf, from_user) + do_kernel_shmctl(id, cmd, user_buf, frame.is_from_user()) } } diff --git a/kernel/src/ipc/syscall/sys_shmdt.rs b/kernel/src/ipc/syscall/sys_shmdt.rs index f4ac4202..f67b4983 100644 --- a/kernel/src/ipc/syscall/sys_shmdt.rs +++ b/kernel/src/ipc/syscall/sys_shmdt.rs @@ -1,3 +1,4 @@ +use crate::arch::interrupt::TrapFrame; use crate::mm::page::PageFlushAll; use crate::syscall::table::FormattedSyscallParam; use crate::{ @@ -9,7 +10,6 @@ use crate::{ use alloc::vec::Vec; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysShmdtHandle; impl SysShmdtHandle { @@ -40,7 +40,7 @@ impl Syscall for SysShmdtHandle { /// /// 成功:0 /// 失败:错误码 - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let vaddr = Self::vaddr(args); let current_address_space = AddressSpace::current()?; let mut address_write_guard = current_address_space.write(); diff --git a/kernel/src/ipc/syscall/sys_shmget.rs b/kernel/src/ipc/syscall/sys_shmget.rs index 1d0e9903..0e2675eb 100644 --- a/kernel/src/ipc/syscall/sys_shmget.rs +++ b/kernel/src/ipc/syscall/sys_shmget.rs @@ -1,4 +1,5 @@ use crate::alloc::vec::Vec; +use crate::arch::interrupt::TrapFrame; use crate::syscall::table::FormattedSyscallParam; use crate::{ arch::syscall::nr::SYS_SHMGET, @@ -8,7 +9,6 @@ use crate::{ use log::error; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysShmgetHandle; /// # SYS_SHMGET系统调用函数,用于获取共享内存 @@ -90,7 +90,7 @@ impl Syscall for SysShmgetHandle { 3 // key, size, shmflg } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let key = Self::key(args); let size = Self::size(args); let shmflg = Self::shmflg(args); diff --git a/kernel/src/ipc/syscall/sys_sigaction.rs b/kernel/src/ipc/syscall/sys_sigaction.rs index 9365dfdc..d67c2e4b 100644 --- a/kernel/src/ipc/syscall/sys_sigaction.rs +++ b/kernel/src/ipc/syscall/sys_sigaction.rs @@ -2,6 +2,7 @@ use super::super::signal_types::{ SaHandlerType, Sigaction, SigactionType, UserSigaction, USER_SIG_DFL, USER_SIG_ERR, USER_SIG_IGN, }; +use crate::arch::interrupt::TrapFrame; use crate::arch::syscall::nr::SYS_RT_SIGACTION; use crate::syscall::table::{FormattedSyscallParam, Syscall}; use crate::{ @@ -14,7 +15,6 @@ use alloc::vec::Vec; use core::ffi::{c_int, c_void}; use log::error; use system_error::SystemError; - pub struct SysSigactionHandle; /// 通用信号注册函数 @@ -172,12 +172,12 @@ impl Syscall for SysSigactionHandle { } #[no_mangle] - fn handle(&self, args: &[usize], from_user: bool) -> Result { + fn handle(&self, args: &[usize], frame: &mut TrapFrame) -> Result { let sig = Self::sig(args); let act = Self::act(args); let old_act = Self::old_act(args); - do_kernel_sigaction(sig, act, old_act, from_user) + do_kernel_sigaction(sig, act, old_act, frame.is_from_user()) } fn entry_format(&self, args: &[usize]) -> Vec { vec![ diff --git a/kernel/src/ipc/syscall/sys_sigpending.rs b/kernel/src/ipc/syscall/sys_sigpending.rs index 153cf8f6..8556786d 100644 --- a/kernel/src/ipc/syscall/sys_sigpending.rs +++ b/kernel/src/ipc/syscall/sys_sigpending.rs @@ -1,3 +1,4 @@ +use crate::arch::interrupt::TrapFrame; use crate::{ alloc::vec::Vec, arch::ipc::signal::SigSet, @@ -11,7 +12,6 @@ use crate::{ use core::mem::size_of; use syscall_table_macros::declare_syscall; use system_error::SystemError; - pub struct SysSigpendingHandle; #[inline(never)] @@ -51,7 +51,7 @@ impl Syscall for SysSigpendingHandle { FormattedSyscallParam::new("sigsetsize", format!("{}", args[1])), ] } - fn handle(&self, args: &[usize], _from_user: bool) -> Result { + fn handle(&self, args: &[usize], _frame: &mut TrapFrame) -> Result { let user_sigset = SysSigpendingHandle::user_sigset_ptr(args); let size = SysSigpendingHandle::sigsetsize(args); diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 50e68404..9ec8b3ee 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -106,7 +106,7 @@ impl Syscall { // handler.name, // handler.args_string(args) // ); - return handler.inner_handle.handle(args, frame.is_from_user()); + return handler.inner_handle.handle(args, frame); } // 如果找不到,fallback到原有逻辑 diff --git a/kernel/src/syscall/table.rs b/kernel/src/syscall/table.rs index 65d165cd..4c3b6891 100644 --- a/kernel/src/syscall/table.rs +++ b/kernel/src/syscall/table.rs @@ -6,6 +6,7 @@ use alloc::vec::Vec; use core::cell::OnceCell; use core::fmt::Display; +use crate::arch::interrupt::TrapFrame; use crate::libs::once::Once; use crate::syscall::SystemError; @@ -13,7 +14,7 @@ use crate::syscall::SystemError; pub trait Syscall: Send + Sync + 'static { /// 系统调用参数数量 fn num_args(&self) -> usize; - fn handle(&self, args: &[usize], from_user: bool) -> Result; + fn handle(&self, args: &[usize], frame: &mut TrapFrame) -> Result; /// Formats the system call parameters for display/debug purposes ///