Skip to content

Commit ba9fa72

Browse files
committed
syscalls/fs: Wrap enough syscalls for aero_shell
Signed-off-by: Dennis Bonke <[email protected]>
1 parent ebabf9b commit ba9fa72

File tree

1 file changed

+10
-8
lines changed
  • src/aero_kernel/src/syscall

1 file changed

+10
-8
lines changed

src/aero_kernel/src/syscall/fs.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
use aero_syscall::prelude::FdFlags;
2121
use aero_syscall::{AeroSyscallError, OpenFlags};
2222

23+
use crate::arch::controlregs;
24+
2325
use crate::fs::inode::DirEntry;
2426
use crate::fs::pipe::Pipe;
2527
use crate::fs::{self, lookup_path, LookupMode};
@@ -39,8 +41,8 @@ pub fn write(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscall
3941
.flags
4042
.intersects(OpenFlags::O_WRONLY | OpenFlags::O_RDWR)
4143
{
42-
let buffer = validate_slice(buffer as *const u8, size).ok_or(AeroSyscallError::EINVAL)?;
43-
Ok(handle.write(buffer)?)
44+
let buffer = controlregs::with_userspace_access(||validate_slice(buffer as *const u8, size).ok_or(AeroSyscallError::EINVAL))?;
45+
Ok(controlregs::with_userspace_access(||handle.write(buffer))?)
4446
} else {
4547
Err(AeroSyscallError::EACCES)
4648
}
@@ -57,8 +59,8 @@ pub fn read(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSyscallE
5759
.flags
5860
.intersects(OpenFlags::O_RDONLY | OpenFlags::O_RDWR)
5961
{
60-
let buffer = validate_slice_mut(buffer as *mut u8, size).ok_or(AeroSyscallError::EINVAL)?;
61-
Ok(handle.read(buffer)?)
62+
let buffer = controlregs::with_userspace_access(||validate_slice_mut(buffer as *mut u8, size).ok_or(AeroSyscallError::EINVAL))?;
63+
Ok(controlregs::with_userspace_access(||handle.read(buffer))?)
6264
} else {
6365
Err(AeroSyscallError::EACCES)
6466
}
@@ -71,7 +73,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
7173
flags.insert(OpenFlags::O_RDONLY);
7274
}
7375

74-
let path = validate_str(path as *const u8, len).ok_or(AeroSyscallError::EINVAL)?;
76+
let path = controlregs::with_userspace_access(||validate_str(path as *const u8, len).ok_or(AeroSyscallError::EINVAL))?;
7577
let path = Path::new(path);
7678

7779
let mut lookup_mode = LookupMode::None;
@@ -80,7 +82,7 @@ pub fn open(_fd: usize, path: usize, len: usize, mode: usize) -> Result<usize, A
8082
lookup_mode = LookupMode::Create;
8183
}
8284

83-
let inode = fs::lookup_path_with_mode(path, lookup_mode)?;
85+
let inode = controlregs::with_userspace_access(||fs::lookup_path_with_mode(path, lookup_mode))?;
8486

8587
if flags.contains(OpenFlags::O_DIRECTORY) && !inode.inode().metadata()?.is_directory() {
8688
return Err(AeroSyscallError::ENOTDIR);
@@ -118,7 +120,7 @@ pub fn getdents(fd: usize, buffer: usize, size: usize) -> Result<usize, AeroSysc
118120
.ok_or(AeroSyscallError::EBADFD)?;
119121

120122
let buffer = validate_slice_mut(buffer as *mut u8, size).ok_or(AeroSyscallError::EINVAL)?;
121-
Ok(handle.get_dents(buffer)?)
123+
Ok(controlregs::with_userspace_access(||handle.get_dents(buffer))?)
122124
}
123125

124126
pub fn close(fd: usize) -> Result<usize, AeroSyscallError> {
@@ -224,7 +226,7 @@ pub fn getcwd(buffer: usize, size: usize) -> Result<usize, AeroSyscallError> {
224226
let buffer = validate_slice_mut(buffer as *mut u8, size).ok_or(AeroSyscallError::EINVAL)?;
225227
let cwd = scheduler::get_scheduler().current_task().get_cwd();
226228

227-
buffer[..cwd.len()].copy_from_slice(cwd.as_bytes());
229+
controlregs::with_userspace_access(||buffer[..cwd.len()].copy_from_slice(cwd.as_bytes()));
228230
Ok(cwd.len())
229231
}
230232

0 commit comments

Comments
 (0)