mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 12:16:31 +00:00
实现SystemV共享内存 (#690)
* 实现SystemV共享内存 * 测试shm * 添加测试程序 * 完善细节 * 修正shm的时间数据错误的问题 * fix: devfs的metadata权限为0x777的错误 --------- Co-authored-by: longjin <longjin@DragonOS.org>
This commit is contained in:
@ -8,6 +8,7 @@ use crate::{
|
||||
arch::{ipc::signal::SigSet, syscall::nr::*},
|
||||
driver::base::device::device_number::DeviceNumber,
|
||||
filesystem::vfs::syscall::{PosixStatfs, PosixStatx},
|
||||
ipc::shm::{ShmCtlCmd, ShmFlags, ShmId, ShmKey},
|
||||
libs::{futex::constant::FutexFlag, rand::GRandFlags},
|
||||
mm::syscall::MremapFlags,
|
||||
net::syscall::MsgHdr,
|
||||
@ -39,7 +40,7 @@ use crate::{
|
||||
process::{fork::CloneFlags, syscall::PosixOldUtsName, Pid},
|
||||
time::{
|
||||
syscall::{PosixTimeZone, PosixTimeval},
|
||||
TimeSpec,
|
||||
PosixTimeSpec,
|
||||
},
|
||||
};
|
||||
|
||||
@ -297,13 +298,13 @@ impl Syscall {
|
||||
}
|
||||
|
||||
SYS_NANOSLEEP => {
|
||||
let req = args[0] as *const TimeSpec;
|
||||
let rem = args[1] as *mut TimeSpec;
|
||||
let req = args[0] as *const PosixTimeSpec;
|
||||
let rem = args[1] as *mut PosixTimeSpec;
|
||||
let virt_req = VirtAddr::new(req as usize);
|
||||
let virt_rem = VirtAddr::new(rem as usize);
|
||||
if frame.is_from_user()
|
||||
&& (verify_area(virt_req, core::mem::size_of::<TimeSpec>()).is_err()
|
||||
|| verify_area(virt_rem, core::mem::size_of::<TimeSpec>()).is_err())
|
||||
&& (verify_area(virt_req, core::mem::size_of::<PosixTimeSpec>()).is_err()
|
||||
|| verify_area(virt_rem, core::mem::size_of::<PosixTimeSpec>()).is_err())
|
||||
{
|
||||
Err(SystemError::EFAULT)
|
||||
} else {
|
||||
@ -693,12 +694,12 @@ impl Syscall {
|
||||
let mut timespec = None;
|
||||
if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
|
||||
let reader = UserBufferReader::new(
|
||||
utime as *const TimeSpec,
|
||||
core::mem::size_of::<TimeSpec>(),
|
||||
utime as *const PosixTimeSpec,
|
||||
core::mem::size_of::<PosixTimeSpec>(),
|
||||
true,
|
||||
)?;
|
||||
|
||||
timespec = Some(*reader.read_one_from_user::<TimeSpec>(0)?);
|
||||
timespec = Some(*reader.read_one_from_user::<PosixTimeSpec>(0)?);
|
||||
}
|
||||
|
||||
Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
|
||||
@ -945,7 +946,7 @@ impl Syscall {
|
||||
|
||||
SYS_CLOCK_GETTIME => {
|
||||
let clockid = args[0] as i32;
|
||||
let timespec = args[1] as *mut TimeSpec;
|
||||
let timespec = args[1] as *mut PosixTimeSpec;
|
||||
Self::clock_gettime(clockid, timespec)
|
||||
}
|
||||
|
||||
@ -1041,6 +1042,33 @@ impl Syscall {
|
||||
Self::uname(name)
|
||||
}
|
||||
|
||||
SYS_SHMGET => {
|
||||
let key = ShmKey::new(args[0]);
|
||||
let size = args[1];
|
||||
let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
|
||||
|
||||
Self::shmget(key, size, shmflg)
|
||||
}
|
||||
SYS_SHMAT => {
|
||||
let id = ShmId::new(args[0]);
|
||||
let vaddr = VirtAddr::new(args[1]);
|
||||
let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
|
||||
|
||||
Self::shmat(id, vaddr, shmflg)
|
||||
}
|
||||
SYS_SHMDT => {
|
||||
let vaddr = VirtAddr::new(args[0]);
|
||||
Self::shmdt(vaddr)
|
||||
}
|
||||
SYS_SHMCTL => {
|
||||
let id = ShmId::new(args[0]);
|
||||
let cmd = ShmCtlCmd::from(args[1]);
|
||||
let user_buf = args[2] as *const u8;
|
||||
let from_user = frame.is_from_user();
|
||||
|
||||
Self::shmctl(id, cmd, user_buf, from_user)
|
||||
}
|
||||
|
||||
_ => panic!("Unsupported syscall ID: {}", syscall_num),
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user