diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 5f5abded..2f049bf6 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dragonos_kernel" -version = "0.1.0" +version = "0.1.9" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/kernel/src/process/syscall.rs b/kernel/src/process/syscall.rs index 4ad8d745..61dfea10 100644 --- a/kernel/src/process/syscall.rs +++ b/kernel/src/process/syscall.rs @@ -29,6 +29,51 @@ use crate::{ }, }; +//参考资料:https://code.dragonos.org.cn/xref/linux-6.1.9/include/uapi/linux/utsname.h#17 +#[repr(C)] +#[derive(Debug, Clone, Copy)] +pub struct PosixOldUtsName { + pub sysname: [u8; 65], + pub nodename: [u8; 65], + pub release: [u8; 65], + pub version: [u8; 65], + pub machine: [u8; 65], +} + +impl PosixOldUtsName { + pub fn new() -> Self { + const SYS_NAME: &[u8] = b"DragonOS"; + const NODENAME: &[u8] = b"DragonOS"; + const RELEASE: &[u8] = env!("CARGO_PKG_VERSION").as_bytes(); + const VERSION: &[u8] = env!("CARGO_PKG_VERSION").as_bytes(); + + #[cfg(target_arch = "x86_64")] + const MACHINE: &[u8] = b"x86_64"; + + #[cfg(target_arch = "aarch64")] + const MACHINE: &[u8] = b"aarch64"; + + #[cfg(target_arch = "riscv64")] + const MACHINE: &[u8] = b"riscv64"; + + let mut r = Self { + sysname: [0; 65], + nodename: [0; 65], + release: [0; 65], + version: [0; 65], + machine: [0; 65], + }; + + r.sysname[0..SYS_NAME.len()].copy_from_slice(SYS_NAME); + r.nodename[0..NODENAME.len()].copy_from_slice(NODENAME); + r.release[0..RELEASE.len()].copy_from_slice(RELEASE); + r.version[0..VERSION.len()].copy_from_slice(VERSION); + r.machine[0..MACHINE.len()].copy_from_slice(MACHINE); + + return r; + } +} + impl Syscall { pub fn fork(frame: &TrapFrame) -> Result { ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into()) @@ -341,4 +386,12 @@ impl Syscall { } } } + + pub fn uname(name: *mut PosixOldUtsName) -> Result { + let mut writer = + UserBufferWriter::new(name, core::mem::size_of::(), true)?; + writer.copy_one_to_user(&PosixOldUtsName::new(), 0)?; + + return Ok(0); + } } diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 2e896472..f62678bf 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -33,7 +33,7 @@ use crate::{ libs::align::page_align_up, mm::{verify_area, MemoryManagementArch, VirtAddr}, net::syscall::SockAddr, - process::{fork::CloneFlags, Pid}, + process::{fork::CloneFlags, syscall::PosixOldUtsName, Pid}, time::{ syscall::{PosixTimeZone, PosixTimeval}, TimeSpec, @@ -949,7 +949,10 @@ impl Syscall { } SYS_SCHED_YIELD => Self::sched_yield(), - + SYS_UNAME => { + let name = args[0] as *mut PosixOldUtsName; + Self::uname(name) + } _ => panic!("Unsupported syscall ID: {}", syscall_num), }; diff --git a/kernel/src/syscall/syscall_num.h b/kernel/src/syscall/syscall_num.h index 9b546243..6babe955 100644 --- a/kernel/src/syscall/syscall_num.h +++ b/kernel/src/syscall/syscall_num.h @@ -53,6 +53,7 @@ #define SYS_EXIT 60 #define SYS_WAIT4 61 #define SYS_KILL 62 +#define SYS_UNAME 63 #define SYS_FCNTL 72