diff --git a/kernel/src/filesystem/procfs/mod.rs b/kernel/src/filesystem/procfs/mod.rs index f91f029c..6da055aa 100644 --- a/kernel/src/filesystem/procfs/mod.rs +++ b/kernel/src/filesystem/procfs/mod.rs @@ -257,10 +257,10 @@ impl ProcFSInode { offset: usize, len: usize, buf: &mut [u8], - _pdata: &mut ProcfsFilePrivateData, + pdata: &mut ProcfsFilePrivateData, ) -> Result { - let start = _pdata.data.len().min(offset); - let end = _pdata.data.len().min(offset + len); + let start = pdata.data.len().min(offset); + let end = pdata.data.len().min(offset + len); // buffer空间不足 if buf.len() < (end - start) { @@ -268,7 +268,7 @@ impl ProcFSInode { } // 拷贝数据 - let src = &_pdata.data[start..end]; + let src = &pdata.data[start..end]; buf[0..src.len()].copy_from_slice(src); return Ok(src.len()); } diff --git a/kernel/src/libs/cpumask.rs b/kernel/src/libs/cpumask.rs index 9e22dfd8..b75ca303 100644 --- a/kernel/src/libs/cpumask.rs +++ b/kernel/src/libs/cpumask.rs @@ -80,6 +80,10 @@ impl CpuMask { begin: true, } } + + pub fn inner(&self) -> &AllocBitmap { + &self.bmp + } } pub struct CpuMaskIter<'a> { diff --git a/kernel/src/smp/mod.rs b/kernel/src/smp/mod.rs index e563910e..8777f03c 100644 --- a/kernel/src/smp/mod.rs +++ b/kernel/src/smp/mod.rs @@ -13,6 +13,7 @@ use self::{ pub mod core; pub mod cpu; pub mod init; +mod syscall; pub fn kick_cpu(cpu_id: ProcessorId) -> Result<(), SystemError> { // todo: 增加对cpu_id的有效性检查 diff --git a/kernel/src/smp/syscall.rs b/kernel/src/smp/syscall.rs new file mode 100644 index 00000000..93567c71 --- /dev/null +++ b/kernel/src/smp/syscall.rs @@ -0,0 +1,15 @@ +use bitmap::traits::BitMapOps; +use system_error::SystemError; + +use crate::syscall::Syscall; + +use super::cpu::smp_cpu_manager; + +impl Syscall { + pub fn getaffinity(_pid: i32, set: &mut [u8]) -> Result { + let cpu_manager = smp_cpu_manager(); + let src = unsafe { cpu_manager.possible_cpus().inner().as_bytes() }; + set[0..src.len()].copy_from_slice(src); + Ok(0) + } +} diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 5062ef46..7465e52c 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -963,9 +963,15 @@ impl Syscall { } SYS_SCHED_GETAFFINITY => { - // todo: 这个系统调用还没有实现 + let pid = args[0] as i32; + let size = args[1]; + let set_vaddr = args[2]; - Err(SystemError::ENOSYS) + let mut user_buffer_writer = + UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?; + let set: &mut [u8] = user_buffer_writer.buffer(0)?; + + Self::getaffinity(pid, set) } #[cfg(target_arch = "x86_64")] diff --git a/user/Makefile b/user/Makefile index 5d3c8518..636d4a96 100644 --- a/user/Makefile +++ b/user/Makefile @@ -25,7 +25,7 @@ ifeq ("$(DADK_VERSION)", "") @echo "\n\tcargo install --git https://git.mirrors.dragonos.org.cn/DragonOS-Community/DADK.git --tag v$(MIN_DADK_VERSION)" @echo "\n" @echo "Auto installing dadk..." - CC=gcc AS=as AR=ar LD=ld OBJCOPY=objcopy NM=nm cargo install dadk + cargo install dadk else # 如果DADK版本过低,则自动更新 @echo "dadk version $(DADK_VERSION) installed" @@ -33,7 +33,7 @@ else ifneq ($(shell printf '%s\n%s' "$(DADK_VERSION)" "$(MIN_DADK_VERSION)" | sort -V | head -n1), $(MIN_DADK_VERSION)) @echo "dadk version is too low, please update to $(MIN_DADK_VERSION) or higher version" @echo "Updating dadk..." - CC=gcc AS=as AR=ar LD=ld OBJCOPY=objcopy NM=nm cargo install --git https://git.mirrors.dragonos.org.cn/DragonOS-Community/DADK.git --tag v$(MIN_DADK_VERSION) || (echo "dadk update failed" && exit 1) + cargo install --git https://git.mirrors.dragonos.org.cn/DragonOS-Community/DADK.git --tag v$(MIN_DADK_VERSION) || (echo "dadk update failed" && exit 1) @echo "dadk updated" endif endif @@ -55,11 +55,11 @@ all: mkdir -p $(ROOT_PATH)/bin/sysroot $(MAKE) dadk_run - $(MAKE) copy_services + $(MAKE) copy_sysconfig @echo 用户态程序编译完成 -copy_services: dadk_run +copy_sysconfig: dadk_run cp -r sysconfig/* $(ROOT_PATH)/bin/sysroot/