From 4101d8328a1ada02ae0c950cb1bc007fa3a94565 Mon Sep 17 00:00:00 2001 From: skpupil Date: Wed, 29 May 2024 14:43:07 +0800 Subject: [PATCH] Add syscall creat --- docs/src/kernel/linux-compatibility.md | 20 ++++++++++---------- kernel/aster-nix/src/fs/fs_resolver.rs | 5 +++++ kernel/aster-nix/src/syscall/arch/x86.rs | 3 ++- kernel/aster-nix/src/syscall/open.rs | 8 +++++++- regression/syscall_test/Makefile | 1 + 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/src/kernel/linux-compatibility.md b/docs/src/kernel/linux-compatibility.md index 841e7f963..2defccf12 100644 --- a/docs/src/kernel/linux-compatibility.md +++ b/docs/src/kernel/linux-compatibility.md @@ -15,7 +15,7 @@ support the loading of Linux kernel modules. ## System Calls At the time of writing, -Asterinas implements 130 out of the 310+ system calls +Asterinas implements 138 out of the 310+ system calls provided by Linux on x86-64 architecture. | Numbers | Names | Is Implemented | @@ -49,15 +49,15 @@ provided by Linux on x86-64 architecture. | 26 | msync | ❌ | | 27 | mincore | ❌ | | 28 | madvise | ✅ | -| 29 | shmget | ✅ | -| 30 | shmat | ✅ | -| 31 | shmctl | ✅ | +| 29 | shmget | ❌ | +| 30 | shmat | ❌ | +| 31 | shmctl | ❌ | | 32 | dup | ✅ | | 33 | dup2 | ✅ | | 34 | pause | ✅ | | 35 | nanosleep | ✅ | | 36 | getitimer | ❌ | -| 37 | alarm | ❌ | +| 37 | alarm | ✅ | | 38 | setitimer | ❌ | | 39 | getpid | ✅ | | 40 | sendfile | ❌ | @@ -96,8 +96,8 @@ provided by Linux on x86-64 architecture. | 73 | flock | ❌ | | 74 | fsync | ✅ | | 75 | fdatasync | ❌ | -| 76 | truncate | ❌ | -| 77 | ftruncate | ❌ | +| 76 | truncate | ✅ | +| 77 | ftruncate | ✅ | | 78 | getdents | ❌ | | 79 | getcwd | ✅ | | 80 | chdir | ✅ | @@ -105,7 +105,7 @@ provided by Linux on x86-64 architecture. | 82 | rename | ✅ | | 83 | mkdir | ✅ | | 84 | rmdir | ✅ | -| 85 | creat | ❌ | +| 85 | creat | ✅ | | 86 | link | ✅ | | 87 | unlink | ✅ | | 88 | symlink | ✅ | @@ -160,8 +160,8 @@ provided by Linux on x86-64 architecture. | 137 | statfs | ✅ | | 138 | fstatfs | ✅ | | 139 | sysfs | ❌ | -| 140 | getpriority | ❌ | -| 141 | setpriority | ❌ | +| 140 | getpriority | ✅ | +| 141 | setpriority | ✅ | | 142 | sched_setparam | ❌ | | 143 | sched_getparam | ❌ | | 144 | sched_setscheduler | ❌ | diff --git a/kernel/aster-nix/src/fs/fs_resolver.rs b/kernel/aster-nix/src/fs/fs_resolver.rs index 6d7f72aa2..88db34265 100644 --- a/kernel/aster-nix/src/fs/fs_resolver.rs +++ b/kernel/aster-nix/src/fs/fs_resolver.rs @@ -114,7 +114,12 @@ impl FsResolver { Err(e) => return Err(e), }; + if creation_flags.contains(CreationFlags::O_TRUNC) { + dentry.resize(0)?; + } + let inode_handle = InodeHandle::new(dentry, access_mode, status_flags)?; + Ok(inode_handle) } diff --git a/kernel/aster-nix/src/syscall/arch/x86.rs b/kernel/aster-nix/src/syscall/arch/x86.rs index c830c3b83..d26ba7c3c 100644 --- a/kernel/aster-nix/src/syscall/arch/x86.rs +++ b/kernel/aster-nix/src/syscall/arch/x86.rs @@ -56,7 +56,7 @@ use crate::syscall::{ mprotect::sys_mprotect, munmap::sys_munmap, nanosleep::{sys_clock_nanosleep, sys_nanosleep}, - open::{sys_open, sys_openat}, + open::{sys_creat, sys_open, sys_openat}, pause::sys_pause, pipe::{sys_pipe, sys_pipe2}, poll::sys_poll, @@ -172,6 +172,7 @@ impl_syscall_nums_and_dispatch_fn! { SYS_RENAME = 82 => sys_rename(args[..2]); SYS_MKDIR = 83 => sys_mkdir(args[..2]); SYS_RMDIR = 84 => sys_rmdir(args[..1]); + SYS_CREAT = 85 => sys_creat(args[..2]); SYS_LINK = 86 => sys_link(args[..2]); SYS_UNLINK = 87 => sys_unlink(args[..1]); SYS_SYMLINK = 88 => sys_symlink(args[..2]); diff --git a/kernel/aster-nix/src/syscall/open.rs b/kernel/aster-nix/src/syscall/open.rs index 744fbcdc9..2e1ab598d 100644 --- a/kernel/aster-nix/src/syscall/open.rs +++ b/kernel/aster-nix/src/syscall/open.rs @@ -6,7 +6,7 @@ use crate::{ file_handle::FileLike, file_table::{FdFlags, FileDesc}, fs_resolver::{FsPath, AT_FDCWD}, - utils::CreationFlags, + utils::{AccessMode, CreationFlags}, }, prelude::*, syscall::constants::MAX_FILENAME_LEN, @@ -50,6 +50,12 @@ pub fn sys_open(path_addr: Vaddr, flags: u32, mode: u16) -> Result Result { + let flags = + AccessMode::O_WRONLY as u32 | CreationFlags::O_CREAT.bits() | CreationFlags::O_TRUNC.bits(); + self::sys_openat(AT_FDCWD, path_addr, flags, mode) +} + /// File for output busybox ash log. struct BusyBoxTraceFile; diff --git a/regression/syscall_test/Makefile b/regression/syscall_test/Makefile index f85bb10d7..27c441112 100644 --- a/regression/syscall_test/Makefile +++ b/regression/syscall_test/Makefile @@ -10,6 +10,7 @@ TESTS ?= \ chmod_test \ chown_test \ chroot_test \ + creat_test \ epoll_test \ eventfd_test \ fsync_test \