diff --git a/kernel/crates/bitmap/src/bitmap_core.rs b/kernel/crates/bitmap/src/bitmap_core.rs index da80adf8..20babb27 100644 --- a/kernel/crates/bitmap/src/bitmap_core.rs +++ b/kernel/crates/bitmap/src/bitmap_core.rs @@ -61,8 +61,8 @@ impl BitMapCore { pub(crate) fn first_index(&self, data: &[T]) -> Option { for (i, element) in data.iter().enumerate() { let bit = ::first_index(element); - if bit.is_some() { - return Some(i * T::bit_size() + bit.unwrap()); + if let Some(b) = bit { + return Some(i * T::bit_size() + b); } } @@ -237,10 +237,8 @@ impl BitMapCore { if element == mask { return true; } - } else { - if element != &T::make_mask(T::bit_size()) { - return false; - } + } else if element != &T::make_mask(T::bit_size()) { + return false; } } diff --git a/kernel/crates/bitmap/src/traits.rs b/kernel/crates/bitmap/src/traits.rs index 3db91543..8fc3a4ca 100644 --- a/kernel/crates/bitmap/src/traits.rs +++ b/kernel/crates/bitmap/src/traits.rs @@ -309,6 +309,9 @@ pub trait BitMapOps { /// 判断bitmap是否为空 fn is_empty(&self) -> bool; + /// # Safety + /// *不应直接修改字节数组* + /// /// 将bitmap转换为字节数组 unsafe fn as_bytes(&self) -> &[u8]; } diff --git a/kernel/crates/unified-init/macros/src/lib.rs b/kernel/crates/unified-init/macros/src/lib.rs index 0e5f596e..0d736466 100644 --- a/kernel/crates/unified-init/macros/src/lib.rs +++ b/kernel/crates/unified-init/macros/src/lib.rs @@ -42,7 +42,7 @@ use uuid::Uuid; #[proc_macro_attribute] pub fn unified_init(args: TokenStream, input: TokenStream) -> TokenStream { do_unified_init(args, input) - .unwrap_or_else(|e| e.to_compile_error().into()) + .unwrap_or_else(|e| e.to_compile_error()) .into() } @@ -59,7 +59,7 @@ fn do_unified_init(args: TokenStream, input: TokenStream) -> syn::Result syn::Result syn::Result<()> { // 检查函数签名 - if function.sig.inputs.len() != 0 { + if !function.sig.inputs.is_empty() { return Err(syn::Error::new( function.sig.inputs.span(), "Expected no arguments", @@ -111,7 +111,7 @@ fn check_function_signature(function: &ItemFn) -> syn::Result<()> { if let syn::GenericArgument::Type(type_arg) = generic_args.args.first().unwrap() { if let syn::Type::Tuple(tuple) = type_arg { - if tuple.elems.len() != 0 { + if !tuple.elems.is_empty() { return Err(syn::Error::new(tuple.span(), "Expected empty tuple")); } } else { @@ -166,7 +166,7 @@ fn generate_unified_initializer( let initializer_name = format!( "unified_initializer_{}_{}", raw_initializer_name, - Uuid::new_v4().to_simple().to_string().to_ascii_uppercase()[..8].to_string() + &Uuid::new_v4().to_simple().to_string().to_ascii_uppercase()[..8] ) .to_ascii_uppercase(); diff --git a/kernel/src/arch/riscv64/interrupt/handle.rs b/kernel/src/arch/riscv64/interrupt/handle.rs index 3750d936..3035e33f 100644 --- a/kernel/src/arch/riscv64/interrupt/handle.rs +++ b/kernel/src/arch/riscv64/interrupt/handle.rs @@ -48,7 +48,7 @@ fn riscv64_do_interrupt(_trap_frame: &mut TrapFrame) { fn riscv64_do_exception(trap_frame: &mut TrapFrame) { kdebug!( "riscv64_do_exception: from_user: {}", - trap_frame.from_user() + trap_frame.is_from_user() ); let code = trap_frame.cause.code(); diff --git a/kernel/src/arch/riscv64/interrupt/mod.rs b/kernel/src/arch/riscv64/interrupt/mod.rs index 4053f706..bcbc23cd 100644 --- a/kernel/src/arch/riscv64/interrupt/mod.rs +++ b/kernel/src/arch/riscv64/interrupt/mod.rs @@ -108,7 +108,7 @@ impl TrapFrame { /// 中断栈帧在栈上的大小 pub const SIZE_ON_STACK: usize = align_up(Self::SIZE, STACK_ALIGN); /// 判断当前中断是否来自用户模式 - pub fn from_user(&self) -> bool { + pub fn is_from_user(&self) -> bool { self.status.spp() == riscv::register::sstatus::SPP::User } } diff --git a/kernel/src/arch/x86_64/cpu.rs b/kernel/src/arch/x86_64/cpu.rs index bf3c9666..5752dba7 100644 --- a/kernel/src/arch/x86_64/cpu.rs +++ b/kernel/src/arch/x86_64/cpu.rs @@ -1,3 +1,5 @@ +use core::hint::spin_loop; + use x86::cpuid::{cpuid, CpuIdResult}; use crate::smp::cpu::ProcessorId; @@ -14,5 +16,7 @@ pub fn current_cpu_id() -> ProcessorId { pub unsafe fn cpu_reset() -> ! { // 重启计算机 unsafe { x86::io::outb(0x64, 0xfe) }; - loop {} + loop { + spin_loop(); + } } diff --git a/kernel/src/arch/x86_64/driver/apic/apic_timer.rs b/kernel/src/arch/x86_64/driver/apic/apic_timer.rs index aaaae53b..75229f98 100644 --- a/kernel/src/arch/x86_64/driver/apic/apic_timer.rs +++ b/kernel/src/arch/x86_64/driver/apic/apic_timer.rs @@ -181,7 +181,7 @@ pub enum LocalApicTimerMode { impl LocalApicTimer { /// 定时器中断的间隔 - pub const INTERVAL_MS: u64 = 1000 / HZ as u64; + pub const INTERVAL_MS: u64 = 1000 / HZ; pub const DIVISOR: u64 = 4; /// IoApicManager 初值为0或false @@ -244,7 +244,7 @@ impl LocalApicTimer { fn set_divisor(&mut self, divisor: u32) { self.divisor = divisor; - CurrentApic.set_timer_divisor(divisor as u32); + CurrentApic.set_timer_divisor(divisor); } fn set_initial_cnt(&mut self, initial_count: u64) { @@ -307,10 +307,7 @@ impl CurrentApic { unsafe { wrmsr(IA32_X2APIC_DIV_CONF, divisor.into()) }; } else { unsafe { - self.write_xapic_register( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_CLKDIV, - divisor.into(), - ) + self.write_xapic_register(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_CLKDIV, divisor) }; } } @@ -318,7 +315,7 @@ impl CurrentApic { fn set_timer_initial_count(&self, initial_count: u64) { if self.x2apic_enabled() { unsafe { - wrmsr(IA32_X2APIC_INIT_COUNT.into(), initial_count); + wrmsr(IA32_X2APIC_INIT_COUNT, initial_count); } } else { unsafe { diff --git a/kernel/src/arch/x86_64/driver/apic/ioapic.rs b/kernel/src/arch/x86_64/driver/apic/ioapic.rs index 16152402..fcfbbb94 100644 --- a/kernel/src/arch/x86_64/driver/apic/ioapic.rs +++ b/kernel/src/arch/x86_64/driver/apic/ioapic.rs @@ -86,14 +86,13 @@ impl IoApic { } return false; }) - .map(|x| { + .and_then(|x| { if let acpi::madt::MadtEntry::IoApic(x) = x { Some(x.io_apic_address) } else { None } }) - .flatten() .unwrap(); let phys_base = PhysAddr::new(io_apic_paddr as usize); @@ -193,6 +192,7 @@ impl IoApic { /// * `active_high` - 是否为高电平有效 /// * `dest_logic` - 是否为逻辑模式 /// * `mask` - 是否屏蔽 + #[allow(clippy::too_many_arguments)] pub fn install( &mut self, rte_index: u8, @@ -335,7 +335,9 @@ impl IrqChipData for IoApicChipData { } impl IoApicChipData { - const DEFAULT: Self = Self::new(0, 0, 0, false, false, false, true); + const fn default() -> Self { + Self::new(0, 0, 0, false, false, false, true) + } const fn new( rte_index: u8, @@ -412,7 +414,7 @@ pub fn ioapic_init(ignore: &'static [IrqNumber]) { let irq_data = desc.irq_data(); let mut chip_info_guard = irq_data.chip_info_write_irqsave(); chip_info_guard.set_chip(Some(ioapic_ir_chip())); - let chip_data = IoApicChipData::DEFAULT; + let chip_data = IoApicChipData::default(); chip_data.inner().rte_index = IoApic::vector_rte_index(i as u8); chip_data.inner().vector = i as u8; chip_info_guard.set_chip_data(Some(Arc::new(chip_data))); @@ -426,14 +428,13 @@ pub fn ioapic_init(ignore: &'static [IrqNumber]) { } fn register_handler(desc: &Arc, level_triggered: bool) { - let fasteoi: bool; - if level_triggered { + let fasteoi: bool = if level_triggered { desc.modify_status(IrqLineStatus::empty(), IrqLineStatus::IRQ_LEVEL); - fasteoi = true; + true } else { desc.modify_status(IrqLineStatus::IRQ_LEVEL, IrqLineStatus::empty()); - fasteoi = false; - } + false + }; let handler: &dyn IrqFlowHandler = if fasteoi { fast_eoi_irq_handler() @@ -536,7 +537,7 @@ impl IrqChip for IoApicChip { chip_data_inner.level_triggered = level_triggered; chip_data_inner.sync_to_chip()?; - return Ok(IrqChipSetMaskResult::SetMaskOk); + return Ok(IrqChipSetMaskResult::Success); } fn irq_set_affinity( @@ -560,14 +561,14 @@ impl IrqChip for IoApicChip { let mut chip_data_inner = chip_data.inner(); let origin_dest = chip_data_inner.dest; if origin_dest == dest { - return Ok(IrqChipSetMaskResult::SetMaskOk); + return Ok(IrqChipSetMaskResult::Success); } chip_data_inner.dest = dest; chip_data_inner.sync_to_chip()?; - return Ok(IrqChipSetMaskResult::SetMaskOk); + return Ok(IrqChipSetMaskResult::Success); } fn irq_unmask(&self, irq: &Arc) -> Result<(), SystemError> { diff --git a/kernel/src/arch/x86_64/driver/apic/lapic_vector.rs b/kernel/src/arch/x86_64/driver/apic/lapic_vector.rs index 51fad236..78ef4d99 100644 --- a/kernel/src/arch/x86_64/driver/apic/lapic_vector.rs +++ b/kernel/src/arch/x86_64/driver/apic/lapic_vector.rs @@ -205,14 +205,13 @@ pub(super) fn irq_msi_compose_msg(cfg: &HardwareIrqConfig, msg: &mut MsiMsg, dma // todo: 判断vmx是否支持 extended destination mode // 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/arch/x86/kernel/apic/apic.c?fi=__irq_msi_compose_msg#2580 address_lo.set_virt_destid_8_14(cfg.apic_id.data() >> 8); - } else { - if unlikely(cfg.apic_id.data() > 0xff) { - kwarn!( - "irq_msi_compose_msg: Invalid APIC ID: {}", - cfg.apic_id.data() - ); - } + } else if unlikely(cfg.apic_id.data() > 0xff) { + kwarn!( + "irq_msi_compose_msg: Invalid APIC ID: {}", + cfg.apic_id.data() + ); } + msg.address_hi = address_hi.into(); msg.address_lo = address_lo.into(); msg.data = arch_data.into(); diff --git a/kernel/src/arch/x86_64/driver/apic/mod.rs b/kernel/src/arch/x86_64/driver/apic/mod.rs index e2831463..ae78415b 100644 --- a/kernel/src/arch/x86_64/driver/apic/mod.rs +++ b/kernel/src/arch/x86_64/driver/apic/mod.rs @@ -118,9 +118,9 @@ pub enum LVTRegister { ErrorReg = 0x837, } -impl Into for LVTRegister { - fn into(self) -> u32 { - self as u32 +impl From for u32 { + fn from(val: LVTRegister) -> Self { + val as u32 } } @@ -454,9 +454,9 @@ impl CurrentApic { } pub(self) unsafe fn write_xapic_register(&self, reg: XApicOffset, value: u32) { - current_xapic_instance().borrow_mut().as_mut().map(|xapic| { + if let Some(xapic) = current_xapic_instance().borrow_mut().as_mut() { xapic.write(reg, value); - }); + } } /// 屏蔽类8259A芯片 @@ -524,10 +524,8 @@ impl LocalAPIC for CurrentApic { fn send_eoi(&self) { if LOCAL_APIC_ENABLE_TYPE.load(Ordering::SeqCst) == LocalApicEnableType::X2Apic { X2Apic.send_eoi(); - } else { - current_xapic_instance().borrow().as_ref().map(|xapic| { - xapic.send_eoi(); - }); + } else if let Some(xapic) = current_xapic_instance().borrow().as_ref() { + xapic.send_eoi(); } } @@ -582,10 +580,8 @@ impl LocalAPIC for CurrentApic { fn set_lvt(&mut self, lvt: LVT) { if LOCAL_APIC_ENABLE_TYPE.load(Ordering::SeqCst) == LocalApicEnableType::X2Apic { X2Apic.set_lvt(lvt); - } else { - current_xapic_instance().borrow_mut().as_mut().map(|xapic| { - xapic.set_lvt(lvt); - }); + } else if let Some(xapic) = current_xapic_instance().borrow_mut().as_mut() { + xapic.set_lvt(lvt); } } @@ -604,20 +600,16 @@ impl LocalAPIC for CurrentApic { fn mask_all_lvt(&mut self) { if LOCAL_APIC_ENABLE_TYPE.load(Ordering::SeqCst) == LocalApicEnableType::X2Apic { X2Apic.mask_all_lvt(); - } else { - current_xapic_instance().borrow_mut().as_mut().map(|xapic| { - xapic.mask_all_lvt(); - }); + } else if let Some(xapic) = current_xapic_instance().borrow_mut().as_mut() { + xapic.mask_all_lvt(); } } fn write_icr(&self, icr: Icr) { if LOCAL_APIC_ENABLE_TYPE.load(Ordering::SeqCst) == LocalApicEnableType::X2Apic { X2Apic.write_icr(icr); - } else { - current_xapic_instance().borrow().as_ref().map(|xapic| { - xapic.write_icr(icr); - }); + } else if let Some(xapic) = current_xapic_instance().borrow().as_ref() { + xapic.write_icr(icr); } } } diff --git a/kernel/src/arch/x86_64/driver/apic/x2apic.rs b/kernel/src/arch/x86_64/driver/apic/x2apic.rs index 63fd105c..83025921 100644 --- a/kernel/src/arch/x86_64/driver/apic/x2apic.rs +++ b/kernel/src/arch/x86_64/driver/apic/x2apic.rs @@ -22,13 +22,10 @@ impl LocalAPIC for X2Apic { fn init_current_cpu(&mut self) -> bool { unsafe { // 设置 x2APIC 使能位 - wrmsr( - IA32_APIC_BASE.into(), - rdmsr(IA32_APIC_BASE.into()) | 1 << 10, - ); + wrmsr(IA32_APIC_BASE, rdmsr(IA32_APIC_BASE) | 1 << 10); assert!( - (rdmsr(IA32_APIC_BASE.into()) & 0xc00) == 0xc00, + (rdmsr(IA32_APIC_BASE) & 0xc00) == 0xc00, "x2APIC enable failed." ); @@ -40,17 +37,17 @@ impl LocalAPIC for X2Apic { 1 << 8 }; - wrmsr(IA32_X2APIC_SIVR.into(), val); + wrmsr(IA32_X2APIC_SIVR, val); assert!( - (rdmsr(IA32_X2APIC_SIVR.into()) & 0x100) == 0x100, + (rdmsr(IA32_X2APIC_SIVR) & 0x100) == 0x100, "x2APIC software enable failed." ); kinfo!("x2APIC software enabled."); if self.support_eoi_broadcast_suppression() { assert!( - (rdmsr(IA32_X2APIC_SIVR.into()) & 0x1000) == 0x1000, + (rdmsr(IA32_X2APIC_SIVR) & 0x1000) == 0x1000, "x2APIC EOI broadcast suppression enable failed." ); kinfo!("x2APIC EOI broadcast suppression enabled."); @@ -66,26 +63,26 @@ impl LocalAPIC for X2Apic { /// 发送 EOI (End Of Interrupt) fn send_eoi(&self) { unsafe { - wrmsr(IA32_X2APIC_EOI.into(), 0); + wrmsr(IA32_X2APIC_EOI, 0); } } /// 获取 x2APIC 版本 fn version(&self) -> u8 { - unsafe { (rdmsr(IA32_X2APIC_VERSION.into()) & 0xff) as u8 } + unsafe { (rdmsr(IA32_X2APIC_VERSION) & 0xff) as u8 } } fn support_eoi_broadcast_suppression(&self) -> bool { - unsafe { ((rdmsr(IA32_X2APIC_VERSION.into()) >> 24) & 1) == 1 } + unsafe { ((rdmsr(IA32_X2APIC_VERSION) >> 24) & 1) == 1 } } fn max_lvt_entry(&self) -> u8 { - unsafe { ((rdmsr(IA32_X2APIC_VERSION.into()) >> 16) & 0xff) as u8 + 1 } + unsafe { ((rdmsr(IA32_X2APIC_VERSION) >> 16) & 0xff) as u8 + 1 } } /// 获取 x2APIC 的 APIC ID fn id(&self) -> ApicId { - unsafe { ApicId::new(rdmsr(IA32_X2APIC_APICID.into()) as u32) } + unsafe { ApicId::new(rdmsr(IA32_X2APIC_APICID) as u32) } } /// 设置 Local Vector Table (LVT) 寄存器 diff --git a/kernel/src/arch/x86_64/driver/apic/xapic.rs b/kernel/src/arch/x86_64/driver/apic/xapic.rs index dd940db2..49211e0c 100644 --- a/kernel/src/arch/x86_64/driver/apic/xapic.rs +++ b/kernel/src/arch/x86_64/driver/apic/xapic.rs @@ -91,9 +91,9 @@ pub enum XApicOffset { LOCAL_APIC_OFFSET_Local_APIC_CLKDIV = 0x3e0, } -impl Into for XApicOffset { - fn into(self) -> u32 { - self as u32 +impl From for u32 { + fn from(val: XApicOffset) -> Self { + val as u32 } } @@ -223,14 +223,11 @@ impl LocalAPIC for XApic { return false; } // 设置 Spurious Interrupt Vector Register - let val = self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR.into()); + let val = self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR); - self.write( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR.into(), - val | ENABLE, - ); + self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR, val | ENABLE); - let val = self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR.into()); + let val = self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_SVR); if val & ENABLE == 0 { kerror!("xAPIC software enable failed."); @@ -246,23 +243,19 @@ impl LocalAPIC for XApic { self.mask_all_lvt(); // 清除错误状态寄存器(需要连续写入两次) - self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ESR.into(), 0); - self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ESR.into(), 0); + self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ESR, 0); + self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ESR, 0); // 确认任何未完成的中断 - self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_EOI.into(), 0); + self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_EOI, 0); // 发送 Init Level De-Assert 信号以同步仲裁ID + self.write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_63_32, 0); self.write( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_63_32.into(), - 0, - ); - self.write( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0.into(), + XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0, BCAST | INIT | LEVEL, ); - while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0.into()) & DELIVS != 0 - { + while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0) & DELIVS != 0 { spin_loop(); } } @@ -274,34 +267,28 @@ impl LocalAPIC for XApic { fn send_eoi(&self) { unsafe { let s = self as *const Self as *mut Self; - (*s).write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_EOI.into(), 0); + (*s).write(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_EOI, 0); } } /// 获取版本号 fn version(&self) -> u8 { - unsafe { - (self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version.into()) & 0xff) as u8 - } + unsafe { (self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version) & 0xff) as u8 } } fn support_eoi_broadcast_suppression(&self) -> bool { - unsafe { - ((self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version.into()) >> 24) & 1) == 1 - } + unsafe { ((self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version) >> 24) & 1) == 1 } } fn max_lvt_entry(&self) -> u8 { unsafe { - ((self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version.into()) >> 16) & 0xff) - as u8 - + 1 + ((self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_Version) >> 16) & 0xff) as u8 + 1 } } /// 获取ID fn id(&self) -> ApicId { - unsafe { ApicId::new(self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ID.into()) >> 24) } + unsafe { ApicId::new(self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ID) >> 24) } } /// 设置LVT寄存器的值 @@ -315,7 +302,7 @@ impl LocalAPIC for XApic { unsafe { LVT::new( reg, - self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_LVT_TIMER.into()), + self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_LVT_TIMER), ) .unwrap() } @@ -334,23 +321,21 @@ impl LocalAPIC for XApic { fn write_icr(&self, icr: x86::apic::Icr) { unsafe { // Wait for any previous send to finish - while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0.into()) & DELIVS != 0 - { + while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0) & DELIVS != 0 { spin_loop(); } self.write( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_63_32.into(), + XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_63_32, icr.upper(), ); self.write( - XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0.into(), + XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0, icr.lower(), ); // Wait for send to finish - while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0.into()) & DELIVS != 0 - { + while self.read(XApicOffset::LOCAL_APIC_OFFSET_Local_APIC_ICR_31_0) & DELIVS != 0 { spin_loop(); } } diff --git a/kernel/src/arch/x86_64/driver/hpet.rs b/kernel/src/arch/x86_64/driver/hpet.rs index 6df59297..c724ed21 100644 --- a/kernel/src/arch/x86_64/driver/hpet.rs +++ b/kernel/src/arch/x86_64/driver/hpet.rs @@ -115,7 +115,7 @@ impl Hpet { let freq = regs.frequency(); kdebug!("HPET frequency: {} Hz", freq); let ticks = Self::HPET0_INTERVAL_USEC * freq / 1000000; - if ticks <= 0 || ticks > freq * 8 { + if ticks == 0 || ticks > freq * 8 { kerror!("HPET enable: ticks '{ticks}' is invalid"); return Err(SystemError::EINVAL); } @@ -237,7 +237,7 @@ impl Hpet { /// 处理HPET的中断 pub(super) fn handle_irq(&self, timer_num: u32) { if timer_num == 0 { - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); update_timer_jiffies(Self::HPET0_INTERVAL_USEC, Self::HPET0_INTERVAL_USEC as i64); if let Ok(first_expire) = timer_get_first_expire() { diff --git a/kernel/src/arch/x86_64/driver/tsc.rs b/kernel/src/arch/x86_64/driver/tsc.rs index bac5f91a..358c6e85 100644 --- a/kernel/src/arch/x86_64/driver/tsc.rs +++ b/kernel/src/arch/x86_64/driver/tsc.rs @@ -171,7 +171,7 @@ impl TSCManager { // 如果误差在10%以内,那么认为测量成功 // 返回参考值,因为它是更精确的 - if delta >= 90 && delta <= 110 { + if (90..=110).contains(&delta) { kinfo!( "PIT calibration matches {}. {} loops", if hpet { "HPET" } else { "PMTIMER" }, diff --git a/kernel/src/arch/x86_64/init/mod.rs b/kernel/src/arch/x86_64/init/mod.rs index cf95e35c..5a2deef0 100644 --- a/kernel/src/arch/x86_64/init/mod.rs +++ b/kernel/src/arch/x86_64/init/mod.rs @@ -49,9 +49,10 @@ unsafe extern "C" fn kernel_main( gdtp.base = gdt_vaddr.data() as *const usize; gdtp.limit = bsp_gdt_size as u16 - 1; - let mut idtp = DescriptorTablePointer::::default(); - idtp.base = idt_vaddr.data() as *const usize; - idtp.limit = bsp_idt_size as u16 - 1; + let idtp = DescriptorTablePointer:: { + base: idt_vaddr.data() as *const usize, + limit: bsp_idt_size as u16 - 1, + }; x86::dtables::lgdt(&gdtp); x86::dtables::lidt(&idtp); diff --git a/kernel/src/arch/x86_64/interrupt/handle.rs b/kernel/src/arch/x86_64/interrupt/handle.rs index 033c16d7..eeb97c14 100644 --- a/kernel/src/arch/x86_64/interrupt/handle.rs +++ b/kernel/src/arch/x86_64/interrupt/handle.rs @@ -7,7 +7,7 @@ use crate::{ }, exception::{irqdesc::irq_desc_manager, softirq::do_softirq, IrqNumber}, process::{ - process::{current_pcb_flags, current_pcb_preempt_count}, + utils::{current_pcb_flags, current_pcb_preempt_count}, ProcessFlags, }, }; @@ -18,7 +18,7 @@ use super::TrapFrame; unsafe extern "C" fn x86_64_do_irq(trap_frame: &mut TrapFrame, vector: u32) { // swapgs - if trap_frame.from_user() { + if trap_frame.is_from_user() { x86_64::registers::segmentation::GS::swap(); } diff --git a/kernel/src/arch/x86_64/interrupt/ipi.rs b/kernel/src/arch/x86_64/interrupt/ipi.rs index df25b821..073ee2b6 100644 --- a/kernel/src/arch/x86_64/interrupt/ipi.rs +++ b/kernel/src/arch/x86_64/interrupt/ipi.rs @@ -40,9 +40,9 @@ impl From for ArchIpiKind { } } -impl Into for ArchIpiKind { - fn into(self) -> u8 { - match self { +impl From for u8 { + fn from(value: ArchIpiKind) -> Self { + match value { ArchIpiKind::KickCpu => IPI_NUM_KICK_CPU.data() as u8, ArchIpiKind::FlushTLB => IPI_NUM_FLUSH_TLB.data() as u8, ArchIpiKind::SpecVector(vec) => (vec.data() & 0xFF) as u8, @@ -76,16 +76,14 @@ impl From for ArchIpiTarget { } } -impl Into for ArchIpiTarget { - fn into(self) -> ApicId { - if let ArchIpiTarget::Specified(id) = self { +impl From for ApicId { + fn from(val: ArchIpiTarget) -> Self { + if let ArchIpiTarget::Specified(id) = val { return id; + } else if CurrentApic.x2apic_enabled() { + return x86::apic::ApicId::X2Apic(0); } else { - if CurrentApic.x2apic_enabled() { - return x86::apic::ApicId::X2Apic(0); - } else { - return x86::apic::ApicId::XApic(0); - } + return x86::apic::ApicId::XApic(0); } } } @@ -104,16 +102,16 @@ impl ArchIpiTarget { #[inline(always)] fn cpu_id_to_apic_id(cpu_id: ProcessorId) -> x86::apic::ApicId { if CurrentApic.x2apic_enabled() { - x86::apic::ApicId::X2Apic(cpu_id.data() as u32) + x86::apic::ApicId::X2Apic(cpu_id.data()) } else { x86::apic::ApicId::XApic(cpu_id.data() as u8) } } } -impl Into for ArchIpiTarget { - fn into(self) -> x86::apic::DestinationShorthand { - match self { +impl From for x86::apic::DestinationShorthand { + fn from(val: ArchIpiTarget) -> Self { + match val { ArchIpiTarget::Specified(_) => x86::apic::DestinationShorthand::NoShorthand, ArchIpiTarget::Current => x86::apic::DestinationShorthand::Myself, ArchIpiTarget::All => x86::apic::DestinationShorthand::AllIncludingSelf, diff --git a/kernel/src/arch/x86_64/interrupt/mod.rs b/kernel/src/arch/x86_64/interrupt/mod.rs index b5ae9787..ddd7db57 100644 --- a/kernel/src/arch/x86_64/interrupt/mod.rs +++ b/kernel/src/arch/x86_64/interrupt/mod.rs @@ -168,11 +168,7 @@ impl TrapFrame { } /// 判断当前中断是否来自用户模式 - pub fn from_user(&self) -> bool { - if (self.cs & 0x3) != 0 { - return true; - } else { - return false; - } + pub fn is_from_user(&self) -> bool { + return (self.cs & 0x3) != 0; } } diff --git a/kernel/src/arch/x86_64/interrupt/trap.rs b/kernel/src/arch/x86_64/interrupt/trap.rs index 1305c221..afa2bf14 100644 --- a/kernel/src/arch/x86_64/interrupt/trap.rs +++ b/kernel/src/arch/x86_64/interrupt/trap.rs @@ -214,23 +214,20 @@ unsafe extern "C" fn do_invalid_TSS(regs: &'static TrapFrame, error_code: u64) { const ERR_MSG_3: &str = "Refers to a descriptor in the current LDT.\n"; const ERR_MSG_4: &str = "Refers to a descriptor in the GDT.\n"; - let msg1: &str; - if (error_code & 0x1) != 0 { - msg1 = ERR_MSG_1; + let msg1: &str = if (error_code & 0x1) != 0 { + ERR_MSG_1 } else { - msg1 = ""; - } + "" + }; - let msg2: &str; - if (error_code & 0x02) != 0 { - msg2 = ERR_MSG_2; + let msg2: &str = if (error_code & 0x02) != 0 { + ERR_MSG_2 + } else if (error_code & 0x04) != 0 { + ERR_MSG_3 } else { - if (error_code & 0x04) != 0 { - msg2 = ERR_MSG_3; - } else { - msg2 = ERR_MSG_4; - } - } + ERR_MSG_4 + }; + kerror!( "do_invalid_TSS(10), \tError code: {:#x},\trsp: {:#x},\trip: {:#x},\t CPU: {}, \tpid: {:?}\n{}{}", error_code, @@ -281,30 +278,27 @@ unsafe extern "C" fn do_general_protection(regs: &'static TrapFrame, error_code: const ERR_MSG_4: &str = "Refers to a segment or gate descriptor in the LDT;\n"; const ERR_MSG_5: &str = "Refers to a descriptor in the current GDT;\n"; - let msg1: &str; - if (error_code & 0x1) != 0 { - msg1 = ERR_MSG_1; + let msg1: &str = if (error_code & 0x1) != 0 { + ERR_MSG_1 } else { - msg1 = ""; - } + "" + }; - let msg2: &str; - if (error_code & 0x02) != 0 { - msg2 = ERR_MSG_2; + let msg2: &str = if (error_code & 0x02) != 0 { + ERR_MSG_2 } else { - msg2 = ERR_MSG_3; - } + ERR_MSG_3 + }; - let msg3: &str; - if (error_code & 0x02) == 0 { + let msg3: &str = if (error_code & 0x02) == 0 { if (error_code & 0x04) != 0 { - msg3 = ERR_MSG_4; + ERR_MSG_4 } else { - msg3 = ERR_MSG_5; + ERR_MSG_5 } } else { - msg3 = ""; - } + "" + }; kerror!( "do_general_protection(13), \tError code: {:#x},\trsp: {:#x},\trip: {:#x},\t CPU: {}, \tpid: {:?} {}{}{} diff --git a/kernel/src/arch/x86_64/ipc/signal.rs b/kernel/src/arch/x86_64/ipc/signal.rs index af23d152..c874fbe6 100644 --- a/kernel/src/arch/x86_64/ipc/signal.rs +++ b/kernel/src/arch/x86_64/ipc/signal.rs @@ -92,9 +92,9 @@ impl From for Signal { } } -impl Into for Signal { - fn into(self) -> usize { - self as usize +impl From for usize { + fn from(val: Signal) -> Self { + val as usize } } @@ -109,10 +109,10 @@ impl From for Signal { } } -impl Into for Signal { - fn into(self) -> SigSet { +impl From for SigSet { + fn from(val: Signal) -> Self { SigSet { - bits: (1 << (self as usize - 1) as u64), + bits: (1 << (val as usize - 1) as u64), } } } @@ -147,39 +147,39 @@ impl Signal { Signal::INVALID => { kerror!("attempting to handler an Invalid"); } - Signal::SIGHUP => sig_terminate(self.clone()), - Signal::SIGINT => sig_terminate(self.clone()), - Signal::SIGQUIT => sig_terminate_dump(self.clone()), - Signal::SIGILL => sig_terminate_dump(self.clone()), - Signal::SIGTRAP => sig_terminate_dump(self.clone()), - Signal::SIGABRT_OR_IOT => sig_terminate_dump(self.clone()), - Signal::SIGBUS => sig_terminate_dump(self.clone()), - Signal::SIGFPE => sig_terminate_dump(self.clone()), - Signal::SIGKILL => sig_terminate(self.clone()), - Signal::SIGUSR1 => sig_terminate(self.clone()), - Signal::SIGSEGV => sig_terminate_dump(self.clone()), - Signal::SIGUSR2 => sig_terminate(self.clone()), - Signal::SIGPIPE => sig_terminate(self.clone()), - Signal::SIGALRM => sig_terminate(self.clone()), - Signal::SIGTERM => sig_terminate(self.clone()), - Signal::SIGSTKFLT => sig_terminate(self.clone()), - Signal::SIGCHLD => sig_ignore(self.clone()), - Signal::SIGCONT => sig_continue(self.clone()), - Signal::SIGSTOP => sig_stop(self.clone()), - Signal::SIGTSTP => sig_stop(self.clone()), - Signal::SIGTTIN => sig_stop(self.clone()), - Signal::SIGTTOU => sig_stop(self.clone()), - Signal::SIGURG => sig_ignore(self.clone()), - Signal::SIGXCPU => sig_terminate_dump(self.clone()), - Signal::SIGXFSZ => sig_terminate_dump(self.clone()), - Signal::SIGVTALRM => sig_terminate(self.clone()), - Signal::SIGPROF => sig_terminate(self.clone()), - Signal::SIGWINCH => sig_ignore(self.clone()), - Signal::SIGIO_OR_POLL => sig_terminate(self.clone()), - Signal::SIGPWR => sig_terminate(self.clone()), - Signal::SIGSYS => sig_terminate(self.clone()), - Signal::SIGRTMIN => sig_terminate(self.clone()), - Signal::SIGRTMAX => sig_terminate(self.clone()), + Signal::SIGHUP => sig_terminate(*self), + Signal::SIGINT => sig_terminate(*self), + Signal::SIGQUIT => sig_terminate_dump(*self), + Signal::SIGILL => sig_terminate_dump(*self), + Signal::SIGTRAP => sig_terminate_dump(*self), + Signal::SIGABRT_OR_IOT => sig_terminate_dump(*self), + Signal::SIGBUS => sig_terminate_dump(*self), + Signal::SIGFPE => sig_terminate_dump(*self), + Signal::SIGKILL => sig_terminate(*self), + Signal::SIGUSR1 => sig_terminate(*self), + Signal::SIGSEGV => sig_terminate_dump(*self), + Signal::SIGUSR2 => sig_terminate(*self), + Signal::SIGPIPE => sig_terminate(*self), + Signal::SIGALRM => sig_terminate(*self), + Signal::SIGTERM => sig_terminate(*self), + Signal::SIGSTKFLT => sig_terminate(*self), + Signal::SIGCHLD => sig_ignore(*self), + Signal::SIGCONT => sig_continue(*self), + Signal::SIGSTOP => sig_stop(*self), + Signal::SIGTSTP => sig_stop(*self), + Signal::SIGTTIN => sig_stop(*self), + Signal::SIGTTOU => sig_stop(*self), + Signal::SIGURG => sig_ignore(*self), + Signal::SIGXCPU => sig_terminate_dump(*self), + Signal::SIGXFSZ => sig_terminate_dump(*self), + Signal::SIGVTALRM => sig_terminate(*self), + Signal::SIGPROF => sig_terminate(*self), + Signal::SIGWINCH => sig_ignore(*self), + Signal::SIGIO_OR_POLL => sig_terminate(*self), + Signal::SIGPWR => sig_terminate(*self), + Signal::SIGSYS => sig_terminate(*self), + Signal::SIGRTMIN => sig_terminate(*self), + Signal::SIGRTMAX => sig_terminate(*self), } } } @@ -275,7 +275,7 @@ bitflags! { const SIGSYS = 1<<30; const SIGRTMIN = 1<<31; // TODO 写上实时信号 - const SIGRTMAX = 1< for SigChildCode { - fn into(self) -> i32 { - self as i32 +impl From for i32 { + fn from(value: SigChildCode) -> Self { + value as i32 } } @@ -363,11 +363,11 @@ impl SigContext { let pcb = ProcessManager::current_pcb(); let mut archinfo_guard = pcb.arch_info_irqsave(); self.oldmask = *mask; - self.frame = frame.clone(); + self.frame = *frame; // context.trap_num = unsafe { (*current_thread).trap_num }; // context.err_code = unsafe { (*current_thread).err_code }; // context.cr2 = unsafe { (*current_thread).cr2 }; - self.reserved_for_x87_state = archinfo_guard.fp_state().clone(); + self.reserved_for_x87_state = *archinfo_guard.fp_state(); // 保存完毕后,清空fp_state,以免下次save的时候,出现SIMD exception archinfo_guard.clear_fp_state(); @@ -385,12 +385,12 @@ impl SigContext { pub fn restore_sigcontext(&mut self, frame: &mut TrapFrame) -> bool { let guard = ProcessManager::current_pcb(); let mut arch_info = guard.arch_info_irqsave(); - (*frame) = self.frame.clone(); + (*frame) = self.frame; // (*current_thread).trap_num = (*context).trap_num; *arch_info.cr2_mut() = self.cr2 as usize; // (*current_thread).err_code = (*context).err_code; // 如果当前进程有fpstate,则将其恢复到pcb的fp_state中 - *arch_info.fp_state_mut() = self.reserved_for_x87_state.clone(); + *arch_info.fp_state_mut() = self.reserved_for_x87_state; arch_info.restore_fp_state(); return true; } @@ -425,7 +425,7 @@ impl SignalArch for X86_64SignalArch { let siginfo_read_guard = siginfo.unwrap(); // 检查sigpending是否为0 - if siginfo_read_guard.sig_pending().signal().bits() == 0 || !frame.from_user() { + if siginfo_read_guard.sig_pending().signal().bits() == 0 || !frame.is_from_user() { // 若没有正在等待处理的信号,或者将要返回到的是内核态,则返回 return; } @@ -435,7 +435,7 @@ impl SignalArch for X86_64SignalArch { let mut sig_number: Signal; let mut info: Option; let mut sigaction: Sigaction; - let sig_block: SigSet = siginfo_read_guard.sig_block().clone(); + let sig_block: SigSet = *siginfo_read_guard.sig_block(); drop(siginfo_read_guard); let sig_guard = pcb.try_sig_struct_irqsave(5); @@ -460,16 +460,16 @@ impl SignalArch for X86_64SignalArch { match sigaction.action() { SigactionType::SaHandler(action_type) => match action_type { - SaHandlerType::SigError => { + SaHandlerType::Error => { kerror!("Trying to handle a Sigerror on Process:{:?}", pcb.pid()); return; } - SaHandlerType::SigDefault => { + SaHandlerType::Default => { sigaction = Sigaction::default(); break; } - SaHandlerType::SigIgnore => continue, - SaHandlerType::SigCustomized(_) => { + SaHandlerType::Ignore => continue, + SaHandlerType::Customized(_) => { break; } }, @@ -478,7 +478,7 @@ impl SignalArch for X86_64SignalArch { // 如果当前动作是忽略这个信号,就继续循环。 } - let oldset = siginfo_mut_guard.sig_block().clone(); + let oldset = *siginfo_mut_guard.sig_block(); //避免死锁 drop(siginfo_mut_guard); drop(sig_guard); @@ -557,11 +557,11 @@ fn setup_frame( let temp_handler: *mut c_void; match sigaction.action() { SigactionType::SaHandler(handler_type) => match handler_type { - SaHandlerType::SigDefault => { + SaHandlerType::Default => { sig.handle_default(); return Ok(0); } - SaHandlerType::SigCustomized(handler) => { + SaHandlerType::Customized(handler) => { // 如果handler位于内核空间 if handler >= MMArch::USER_END_VADDR { // 如果当前是SIGSEGV,则采用默认函数处理 @@ -602,7 +602,7 @@ fn setup_frame( temp_handler = handler.data() as *mut c_void; } } - SaHandlerType::SigIgnore => { + SaHandlerType::Ignore => { return Ok(0); } _ => { @@ -615,7 +615,7 @@ fn setup_frame( return Err(SystemError::EINVAL); } } - let frame: *mut SigFrame = get_stack(&trap_frame, size_of::()); + let frame: *mut SigFrame = get_stack(trap_frame, size_of::()); // kdebug!("frame=0x{:016x}", frame as usize); // 要求这个frame的地址位于用户空间,因此进行校验 let r: Result, SystemError> = @@ -646,7 +646,7 @@ fn setup_frame( unsafe { (*frame) .context - .setup_sigcontext(oldset, &trap_frame) + .setup_sigcontext(oldset, trap_frame) .map_err(|e: SystemError| -> SystemError { let r = Syscall::kill(ProcessManager::current_pcb().pid(), Signal::SIGSEGV as i32); if r.is_err() { diff --git a/kernel/src/arch/x86_64/kvm/mod.rs b/kernel/src/arch/x86_64/kvm/mod.rs index c62da453..34e9ee82 100644 --- a/kernel/src/arch/x86_64/kvm/mod.rs +++ b/kernel/src/arch/x86_64/kvm/mod.rs @@ -52,13 +52,10 @@ impl X86_64KVMArch { Ok(()) } + #[deny(clippy::match_single_binding)] pub fn kvm_arch_dev_ioctl(cmd: u32, _arg: usize) -> Result { - match cmd { - _ => { - kerror!("unknown kvm ioctl cmd: {}", cmd); - return Err(SystemError::EINVAL); - } - } + kerror!("unknown kvm ioctl cmd: {}", cmd); + return Err(SystemError::EINVAL); } pub fn kvm_arch_vcpu_create(id: u32) -> Result>, SystemError> { diff --git a/kernel/src/arch/x86_64/kvm/vmx/mmu.rs b/kernel/src/arch/x86_64/kvm/vmx/mmu.rs index 9f4b0b22..2c03c238 100644 --- a/kernel/src/arch/x86_64/kvm/vmx/mmu.rs +++ b/kernel/src/arch/x86_64/kvm/vmx/mmu.rs @@ -53,7 +53,8 @@ pub struct KvmMmuPageRole { // num_objs: u32, // objs: [*mut u8; KVM_NR_MEM_OBJS as usize], // } - +pub type KvmMmuPageFaultHandler = + fn(vcpu: &mut VmxVcpu, gpa: u64, error_code: u32, prefault: bool) -> Result<(), SystemError>; #[derive(Default)] pub struct KvmMmu { pub root_hpa: u64, @@ -62,14 +63,7 @@ pub struct KvmMmu { // ...还有一些变量不知道用来做什么 pub get_cr3: Option u64>, pub set_eptp: Option Result<(), SystemError>>, - pub page_fault: Option< - fn( - vcpu: &mut VmxVcpu, - gpa: u64, - error_code: u32, - prefault: bool, - ) -> Result<(), SystemError>, - >, + pub page_fault: Option, // get_pdptr: Option u64>, // Page Directory Pointer Table Register?暂时不知道和CR3的区别是什么 // inject_page_fault: Option, // gva_to_gpa: Option u64>, @@ -97,7 +91,7 @@ fn tdp_get_cr3(_vcpu: &VmxVcpu) -> u64 { fn tdp_set_eptp(root_hpa: u64) -> Result<(), SystemError> { // 设置权限位,目前是写死的,可读可写可执行 // EPT paging-structure memory type: Uncacheable - let mut eptp = 0x0 as u64; + let mut eptp = 0x0_u64; // This value is 1 less than the EPT page-walk length. 3 means 4-level paging. eptp |= 0x3 << 3; eptp |= root_hpa & (PAGE_MASK as u64); @@ -121,7 +115,7 @@ fn tdp_page_fault( // fast_page_fault(vcpu, gpa, level, error_code) // gfn->pfn let mut map_writable = false; - let write = error_code & ((1 as u32) << 1); + let write = error_code & ((1_u32) << 1); let pfn = mmu_gfn_to_pfn_fast(vcpu, gpa, prefault, gfn, write == 0, &mut map_writable)?; // direct map就是映射ept页表的过程 __direct_map(vcpu, gpa, write, map_writable, level, gfn, pfn, prefault)?; @@ -206,6 +200,7 @@ pub fn init_kvm_tdp_mmu(vcpu: &Mutex) { // } } +#[allow(clippy::too_many_arguments)] pub fn __direct_map( vcpu: &mut VmxVcpu, gpa: u64, @@ -223,11 +218,10 @@ pub fn __direct_map( } // 把gpa映射到hpa let mut ept_mapper = EptMapper::lock(); - let page_flags = PageFlags::from_prot_flags(ProtFlags::from_bits_truncate(0x7 as u64), false); + let page_flags = PageFlags::from_prot_flags(ProtFlags::from_bits_truncate(0x7_u64), false); unsafe { assert!(ept_mapper.walk(gpa, pfn << PAGE_SHIFT, page_flags).is_ok()); } - drop(ept_mapper); return Ok(0); } diff --git a/kernel/src/arch/x86_64/kvm/vmx/vcpu.rs b/kernel/src/arch/x86_64/kvm/vmx/vcpu.rs index a0799d43..f940069f 100644 --- a/kernel/src/arch/x86_64/kvm/vmx/vcpu.rs +++ b/kernel/src/arch/x86_64/kvm/vmx/vcpu.rs @@ -67,9 +67,9 @@ pub struct VcpuContextFrame { #[derive(Debug)] #[allow(dead_code)] pub enum VcpuState { - VcpuInv = 0, - VcpuPend = 1, - VcpuAct = 2, + Inv = 0, + Pend = 1, + Act = 2, } #[derive(Debug)] @@ -158,7 +158,7 @@ impl VmxVcpu { rip: 0, rflags: 0, }, - vcpu_state: VcpuState::VcpuInv, + vcpu_state: VcpuState::Inv, mmu: KvmMmu::default(), data: VcpuData::alloc()?, parent_vm, @@ -200,10 +200,10 @@ impl VmxVcpu { vmx_vmwrite(VmcsFields::GUEST_RFLAGS as u32, 2)?; vmx_vmwrite(VmcsFields::GUEST_GDTR_BASE as u32, 0)?; - vmx_vmwrite(VmcsFields::GUEST_GDTR_LIMIT as u32, 0x0000_FFFF as u64)?; + vmx_vmwrite(VmcsFields::GUEST_GDTR_LIMIT as u32, 0x0000_FFFF_u64)?; vmx_vmwrite(VmcsFields::GUEST_IDTR_BASE as u32, 0)?; - vmx_vmwrite(VmcsFields::GUEST_IDTR_LIMIT as u32, 0x0000_FFFF as u64)?; + vmx_vmwrite(VmcsFields::GUEST_IDTR_LIMIT as u32, 0x0000_FFFF_u64)?; vmx_vmwrite(VmcsFields::GUEST_ACTIVITY_STATE as u32, 0)?; // State = Active vmx_vmwrite(VmcsFields::GUEST_INTERRUPTIBILITY_STATE as u32, 0)?; @@ -312,7 +312,7 @@ impl VmxVcpu { vmx_vmwrite( VmcsFields::HOST_TR_BASE as u32, get_segment_base(pseudo_descriptpr.base, pseudo_descriptpr.limit, unsafe { - x86::task::tr().bits().into() + x86::task::tr().bits() }), )?; vmx_vmwrite( @@ -534,7 +534,7 @@ pub fn adjust_vmx_exit_controls() -> u32 { } pub fn adjust_vmx_pinbased_controls() -> u32 { - let mut controls: u32 = 0000_0016; + let mut controls: u32 = 16; adjust_vmx_controls(0, 0, msr::IA32_VMX_TRUE_PINBASED_CTLS, &mut controls); // kdebug!("adjust_vmx_pinbased_controls: {:x}", controls); return controls; diff --git a/kernel/src/arch/x86_64/kvm/vmx/vmcs.rs b/kernel/src/arch/x86_64/kvm/vmx/vmcs.rs index abbfe540..5e95e8e9 100644 --- a/kernel/src/arch/x86_64/kvm/vmx/vmcs.rs +++ b/kernel/src/arch/x86_64/kvm/vmx/vmcs.rs @@ -204,7 +204,7 @@ pub enum VmcsFields { GUEST_ACTIVITY_STATE = encode_vmcs_field_full(VmcsType::GUEST, VmcsWidth::BIT32, 19) as isize, GUEST_SMBASE = encode_vmcs_field_full(VmcsType::GUEST, VmcsWidth::BIT32, 20) as isize, GUEST_SYSENTER_CS = encode_vmcs_field_full(VmcsType::GUEST, VmcsWidth::BIT32, 21) as isize, - GUEST_VMX_PREEMPT_TIMER_VALUE = 0x482E as isize, + GUEST_VMX_PREEMPT_TIMER_VALUE = 0x482E_isize, // natural guest fields GUEST_CR0 = encode_vmcs_field_full(VmcsType::GUEST, VmcsWidth::NATURAL, 0) as isize, GUEST_CR3 = encode_vmcs_field_full(VmcsType::GUEST, VmcsWidth::NATURAL, 1) as isize, @@ -519,10 +519,8 @@ const fn encode_vmcs_field( index: u32, ) -> u32 { let mut encoding: u32 = 0; - encoding |= (access_type as u32) - | (index as u32) << 1 - | (vmcs_type as u32) << 10 - | (vmcs_width as u32) << 13; + encoding |= + (access_type as u32) | (index) << 1 | (vmcs_type as u32) << 10 | (vmcs_width as u32) << 13; return encoding; } diff --git a/kernel/src/arch/x86_64/kvm/vmx/vmexit.rs b/kernel/src/arch/x86_64/kvm/vmx/vmexit.rs index 10c77b21..32fb3372 100644 --- a/kernel/src/arch/x86_64/kvm/vmx/vmexit.rs +++ b/kernel/src/arch/x86_64/kvm/vmx/vmexit.rs @@ -227,7 +227,7 @@ extern "C" fn vmexit_handler() { } VmxExitReason::EPT_VIOLATION => { kdebug!("vmexit handler: ept violation!"); - let gpa = vmx_vmread(GUEST_PHYSICAL_ADDR_FULL as u32).unwrap(); + let gpa = vmx_vmread(GUEST_PHYSICAL_ADDR_FULL).unwrap(); let exit_qualification = vmx_vmread(VmcsFields::VMEXIT_QUALIFICATION as u32).unwrap(); /* It is a write fault? */ let mut error_code = exit_qualification & (1 << 1); @@ -240,7 +240,7 @@ extern "C" fn vmexit_handler() { let vcpu = kvm.vcpu[0].clone(); // Use the data let kvm_ept_page_fault = vcpu.lock().mmu.page_fault.unwrap(); - kvm_ept_page_fault(&mut (*vcpu.lock()), gpa, error_code as u32, false) + kvm_ept_page_fault(&mut vcpu.lock(), gpa, error_code as u32, false) .expect("ept page fault error"); } _ => { diff --git a/kernel/src/arch/x86_64/mm/bump.rs b/kernel/src/arch/x86_64/mm/bump.rs index 4d2cba63..24116546 100644 --- a/kernel/src/arch/x86_64/mm/bump.rs +++ b/kernel/src/arch/x86_64/mm/bump.rs @@ -14,7 +14,7 @@ impl BumpAllocator { ret_areas: &mut [PhysMemoryArea], mut res_count: usize, ) -> usize { - let info: X86_64MMBootstrapInfo = BOOTSTRAP_MM_INFO.clone().unwrap(); + let info: X86_64MMBootstrapInfo = BOOTSTRAP_MM_INFO.unwrap(); let load_base = info.kernel_load_base_paddr; let kernel_code_start = MMA::virt_2_phys(VirtAddr::new(info.kernel_code_start)) .unwrap() diff --git a/kernel/src/arch/x86_64/mm/mod.rs b/kernel/src/arch/x86_64/mm/mod.rs index b13619fe..c1d63f9a 100644 --- a/kernel/src/arch/x86_64/mm/mod.rs +++ b/kernel/src/arch/x86_64/mm/mod.rs @@ -340,26 +340,26 @@ impl X86_64MMArch { let mb2_count = mb2_count as usize; let mut areas_count = 0usize; let mut total_mem_size = 0usize; - for i in 0..mb2_count { + for info_entry in mb2_mem_info.iter().take(mb2_count) { // Only use the memory area if its type is 1 (RAM) - if mb2_mem_info[i].type_ == 1 { + if info_entry.type_ == 1 { // Skip the memory area if its len is 0 - if mb2_mem_info[i].len == 0 { + if info_entry.len == 0 { continue; } - total_mem_size += mb2_mem_info[i].len as usize; + total_mem_size += info_entry.len as usize; mem_block_manager() .add_block( - PhysAddr::new(mb2_mem_info[i].addr as usize), - mb2_mem_info[i].len as usize, + PhysAddr::new(info_entry.addr as usize), + info_entry.len as usize, ) .unwrap_or_else(|e| { kwarn!( "Failed to add memory block: base={:#x}, size={:#x}, error={:?}", - mb2_mem_info[i].addr, - mb2_mem_info[i].len, + info_entry.addr, + info_entry.len, e ); }); @@ -521,7 +521,7 @@ pub fn test_buddy() { let mut random_size = 0u64; unsafe { x86::random::rdrand64(&mut random_size) }; // 一次最多申请4M - random_size = random_size % (1024 * 4096); + random_size %= 1024 * 4096; if random_size == 0 { continue; } @@ -551,19 +551,19 @@ pub fn test_buddy() { allocated_frame_count.data() * MMArch::PAGE_SIZE, ) }; - for i in 0..slice.len() { - slice[i] = ((i + unsafe { rdtsc() } as usize) % 256) as u8; + for (i, item) in slice.iter_mut().enumerate() { + *item = ((i + unsafe { rdtsc() } as usize) % 256) as u8; } // 随机释放一个内存块 - if v.len() > 0 { + if !v.is_empty() { let mut random_index = 0u64; unsafe { x86::random::rdrand64(&mut random_index) }; // 70%概率释放 if random_index % 10 > 7 { continue; } - random_index = random_index % v.len() as u64; + random_index %= v.len() as u64; let random_index = random_index as usize; let (paddr, allocated_frame_count) = v.remove(random_index); assert!(addr_set.remove(&paddr)); @@ -622,7 +622,7 @@ impl FrameAllocator for LockedFrameAllocator { /// 获取内核地址默认的页面标志 pub unsafe fn kernel_page_flags(virt: VirtAddr) -> PageFlags { - let info: X86_64MMBootstrapInfo = BOOTSTRAP_MM_INFO.clone().unwrap(); + let info: X86_64MMBootstrapInfo = BOOTSTRAP_MM_INFO.unwrap(); if virt.data() >= info.kernel_code_start && virt.data() < info.kernel_code_end { // Remap kernel code execute @@ -676,7 +676,7 @@ impl LowAddressRemapping { let (_, _, flusher) = mapper .unmap_phys(vaddr, true) .expect("Failed to unmap frame"); - if flush == false { + if !flush { flusher.ignore(); } } diff --git a/kernel/src/arch/x86_64/pci/mod.rs b/kernel/src/arch/x86_64/pci/mod.rs index 7652d2c4..d31d1cc0 100644 --- a/kernel/src/arch/x86_64/pci/mod.rs +++ b/kernel/src/arch/x86_64/pci/mod.rs @@ -1 +1,2 @@ +#[allow(clippy::module_inception)] pub mod pci; diff --git a/kernel/src/arch/x86_64/process/kthread.rs b/kernel/src/arch/x86_64/process/kthread.rs index d6eea6a6..1c0517d2 100644 --- a/kernel/src/arch/x86_64/process/kthread.rs +++ b/kernel/src/arch/x86_64/process/kthread.rs @@ -42,7 +42,7 @@ impl KernelThreadMechanism { frame.rip = kernel_thread_bootstrap_stage1 as usize as u64; // fork失败的话,子线程不会执行。否则将导致内存安全问题。 - let pid = ProcessManager::fork(&mut frame, clone_flags).map_err(|e| { + let pid = ProcessManager::fork(&frame, clone_flags).map_err(|e| { unsafe { KernelThreadCreateInfo::parse_unsafe_arc_ptr(create_info) }; e })?; diff --git a/kernel/src/arch/x86_64/process/mod.rs b/kernel/src/arch/x86_64/process/mod.rs index 7c4320d0..d1e0dd56 100644 --- a/kernel/src/arch/x86_64/process/mod.rs +++ b/kernel/src/arch/x86_64/process/mod.rs @@ -257,8 +257,8 @@ impl ArchPCBInfo { cr2: self.cr2, fsbase: self.fsbase, gsbase: self.gsbase, - fs: self.fs.clone(), - gs: self.gs.clone(), + fs: self.fs, + gs: self.gs, gsdata: self.gsdata.clone(), fp_state: self.fp_state, } @@ -320,7 +320,7 @@ impl ProcessManager { current_trapframe: &TrapFrame, ) -> Result<(), SystemError> { let clone_flags = clone_args.flags; - let mut child_trapframe = current_trapframe.clone(); + let mut child_trapframe = *current_trapframe; // 子进程的返回值为0 child_trapframe.set_return_value(0); @@ -351,7 +351,7 @@ impl ProcessManager { new_arch_guard.gsbase = current_arch_guard.gsbase; new_arch_guard.fs = current_arch_guard.fs; new_arch_guard.gs = current_arch_guard.gs; - new_arch_guard.fp_state = current_arch_guard.fp_state.clone(); + new_arch_guard.fp_state = current_arch_guard.fp_state; // 拷贝浮点寄存器的状态 if let Some(fp_state) = current_arch_guard.fp_state.as_ref() { @@ -383,7 +383,7 @@ impl ProcessManager { /// - `prev`:上一个进程的pcb /// - `next`:下一个进程的pcb pub unsafe fn switch_process(prev: Arc, next: Arc) { - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); // 保存浮点寄存器 prev.arch_info_irqsave().save_fp_state(); diff --git a/kernel/src/arch/x86_64/process/table.rs b/kernel/src/arch/x86_64/process/table.rs index 75380170..e28c922c 100644 --- a/kernel/src/arch/x86_64/process/table.rs +++ b/kernel/src/arch/x86_64/process/table.rs @@ -71,6 +71,6 @@ impl TSSManager { | (((vaddr >> 16) & 0xff) << 32) | (0x89 << 40) | (((vaddr >> 24) & 0xff) << 56); - gdt[index as usize + 1] = ((vaddr >> 32) & 0xffffffff) | 0; + gdt[index as usize + 1] = (vaddr >> 32) & 0xffffffff; } } diff --git a/kernel/src/arch/x86_64/smp/mod.rs b/kernel/src/arch/x86_64/smp/mod.rs index 59d5938f..2ff1cc9b 100644 --- a/kernel/src/arch/x86_64/smp/mod.rs +++ b/kernel/src/arch/x86_64/smp/mod.rs @@ -120,14 +120,14 @@ impl SmpBootData { } pub unsafe fn set_cpu_count(&self, cpu_count: u32) { - if self.initialized.load(Ordering::SeqCst) == false { + if !self.initialized.load(Ordering::SeqCst) { let p = self as *const SmpBootData as *mut SmpBootData; (*p).cpu_count = cpu_count.try_into().unwrap(); } } pub unsafe fn set_phys_id(&self, cpu_id: ProcessorId, phys_id: usize) { - if self.initialized.load(Ordering::SeqCst) == false { + if !self.initialized.load(Ordering::SeqCst) { let p = self as *const SmpBootData as *mut SmpBootData; (*p).phys_id[cpu_id.data() as usize] = phys_id; } diff --git a/kernel/src/arch/x86_64/syscall/mod.rs b/kernel/src/arch/x86_64/syscall/mod.rs index 489c3f08..fb9fb05f 100644 --- a/kernel/src/arch/x86_64/syscall/mod.rs +++ b/kernel/src/arch/x86_64/syscall/mod.rs @@ -64,7 +64,7 @@ macro_rules! syscall_return { } #[no_mangle] -pub extern "sysv64" fn syscall_handler(frame: &mut TrapFrame) -> () { +pub extern "sysv64" fn syscall_handler(frame: &mut TrapFrame) { let syscall_num = frame.rax as usize; // 防止sys_sched由于超时无法退出导致的死锁 if syscall_num == SYS_SCHED { @@ -152,13 +152,13 @@ pub(super) unsafe fn init_syscall_64() { efer |= 0x1; x86::msr::wrmsr(x86::msr::IA32_EFER, efer); - let syscall_base = (1 as u16) << 3; - let sysret_base = ((4 as u16) << 3) | 3; + let syscall_base = (1_u16) << 3; + let sysret_base = ((4_u16) << 3) | 3; let high = (u32::from(sysret_base) << 16) | u32::from(syscall_base); // 初始化STAR寄存器 x86::msr::wrmsr(x86::msr::IA32_STAR, u64::from(high) << 32); // 初始化LSTAR,该寄存器存储syscall指令入口 - x86::msr::wrmsr(x86::msr::IA32_LSTAR, syscall_64 as u64); + x86::msr::wrmsr(x86::msr::IA32_LSTAR, syscall_64 as usize as u64); x86::msr::wrmsr(x86::msr::IA32_FMASK, 0xfffffffe); } diff --git a/kernel/src/driver/base/block/block_device.rs b/kernel/src/driver/base/block/block_device.rs index 466cad04..811b9576 100644 --- a/kernel/src/driver/base/block/block_device.rs +++ b/kernel/src/driver/base/block/block_device.rs @@ -62,7 +62,7 @@ impl BlockIter { return BlockIter { begin: start_addr, end: end_addr, - blk_size_log2: blk_size_log2, + blk_size_log2, multiblock: false, }; } @@ -70,7 +70,8 @@ impl BlockIter { return BlockIter { begin: start_addr, end: end_addr, - blk_size_log2: blk_size_log2, + + blk_size_log2, multiblock: true, }; } @@ -92,9 +93,9 @@ impl BlockIter { return BlockRange { lba_start: lba_id, lba_end: lba_id + 1, - begin: begin, - end: end, - blk_size_log2: blk_size_log2, + begin, + end, + blk_size_log2, }; } @@ -119,11 +120,11 @@ impl BlockIter { self.begin += end - begin; return BlockRange { - lba_start: lba_start, - lba_end: lba_end, - begin: begin, - end: end, - blk_size_log2: blk_size_log2, + lba_start, + lba_end, + begin, + end, + blk_size_log2, }; } } @@ -252,7 +253,7 @@ pub trait BlockDevice: Device { let buf_begin = range.origin_begin() - offset; // 本次读操作的起始位置/已经读了这么多字节 let buf_end = range.origin_end() - offset; let buf_slice = &buf[buf_begin..buf_end]; - let count: usize = (range.lba_end - range.lba_start).try_into().unwrap(); + let count: usize = range.lba_end - range.lba_start; let full = multi && range.is_multi() || !multi && range.is_full(); if full { @@ -262,12 +263,11 @@ pub trait BlockDevice: Device { return Err(SystemError::E2BIG); } - let mut temp = Vec::new(); - temp.resize(1usize << self.blk_size_log2(), 0); + let mut temp = vec![0; 1usize << self.blk_size_log2()]; // 由于块设备每次读写都是整块的,在不完整写入之前,必须把不完整的地方补全 self.read_at(range.lba_start, 1, &mut temp[..])?; // 把数据从临时buffer复制到目标buffer - temp[range.begin..range.end].copy_from_slice(&buf_slice); + temp[range.begin..range.end].copy_from_slice(buf_slice); self.write_at(range.lba_start, 1, &temp[..])?; } } @@ -293,7 +293,7 @@ pub trait BlockDevice: Device { let buf_begin = range.origin_begin() - offset; // 本次读操作的起始位置/已经读了这么多字节 let buf_end = range.origin_end() - offset; let buf_slice = &mut buf[buf_begin..buf_end]; - let count: usize = (range.lba_end - range.lba_start).try_into().unwrap(); + let count: usize = range.lba_end - range.lba_start; let full = multi && range.is_multi() || !multi && range.is_full(); // 读取整个block作为有效数据 @@ -306,8 +306,7 @@ pub trait BlockDevice: Device { return Err(SystemError::E2BIG); } - let mut temp = Vec::new(); - temp.resize(1usize << self.blk_size_log2(), 0); + let mut temp = vec![0; 1usize << self.blk_size_log2()]; self.read_at(range.lba_start, 1, &mut temp[..])?; // 把数据从临时buffer复制到目标buffer @@ -332,7 +331,7 @@ impl BlockDeviceOps { /// @return: 返回下标 #[allow(dead_code)] fn major_to_index(major: Major) -> usize { - return (major.data() % DEV_MAJOR_HASH_SIZE as u32) as usize; + return (major.data() % DEV_MAJOR_HASH_SIZE) as usize; } /// @brief: 动态获取主设备号 @@ -353,11 +352,10 @@ impl BlockDeviceOps { for index in ((DEV_MAJOR_DYN_EXT_END.data() + 1)..(DEV_MAJOR_DYN_EXT_START.data() + 1)).rev() { - if let Some(blockdevss) = blockdevs.get(Self::major_to_index(Major::new(index as u32))) - { + if let Some(blockdevss) = blockdevs.get(Self::major_to_index(Major::new(index))) { let mut flag = true; for item in blockdevss { - if item.device_number().major() == Major::new(index as u32) { + if item.device_number().major() == Major::new(index) { flag = false; break; } diff --git a/kernel/src/driver/base/class.rs b/kernel/src/driver/base/class.rs index 059ae543..83b1d056 100644 --- a/kernel/src/driver/base/class.rs +++ b/kernel/src/driver/base/class.rs @@ -85,7 +85,7 @@ impl dyn Class { let subsys = self.subsystem(); let guard = subsys.devices(); for dev in guard.iter() { - if matcher.match_device(&dev, data) { + if matcher.match_device(dev, data) { return Some(dev.clone()); } } diff --git a/kernel/src/driver/base/device/bus.rs b/kernel/src/driver/base/device/bus.rs index 5cf7d95c..cfbe3429 100644 --- a/kernel/src/driver/base/device/bus.rs +++ b/kernel/src/driver/base/device/bus.rs @@ -191,7 +191,7 @@ impl dyn Bus { let subsys = self.subsystem(); let guard = subsys.devices(); for dev in guard.iter() { - if matcher.match_device(&dev, data) { + if matcher.match_device(dev, data) { return Some(dev.clone()); } } @@ -221,7 +221,7 @@ impl dyn Bus { let subsys = self.subsystem(); let guard = subsys.drivers(); for drv in guard.iter() { - if matcher.match_driver(&drv, data) { + if matcher.match_driver(drv, data) { return Some(drv.clone()); } } @@ -262,7 +262,7 @@ impl BusManager { /// /// - `dev` - 要被添加的设备 pub fn add_device(&self, dev: &Arc) -> Result<(), SystemError> { - let bus = dev.bus().map(|bus| bus.upgrade()).flatten(); + let bus = dev.bus().and_then(|bus| bus.upgrade()); if let Some(bus) = bus { device_manager().add_groups(dev, bus.dev_groups())?; @@ -280,7 +280,7 @@ impl BusManager { )?; sysfs_instance().create_link( Some(&dev_kobj), - &(&bus.subsystem().subsys().as_kobject()), + &bus.subsystem().subsys().as_kobject(), "subsystem".to_string(), )?; bus.subsystem().add_device_to_vec(dev)?; @@ -294,8 +294,7 @@ impl BusManager { pub fn add_driver(&self, driver: &Arc) -> Result<(), SystemError> { let bus = driver .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::EINVAL)?; kdebug!("bus '{}' add driver '{}'", bus.name(), driver.name()); @@ -314,25 +313,25 @@ impl BusManager { driver_manager() .add_groups(driver, bus.drv_groups()) - .or_else(|e| { + .map_err(|e| { kerror!( "BusManager::add_driver: driver '{:?}' add_groups failed, err: '{:?}", driver.name(), e ); - Err(e) + e }) .ok(); if !driver.suppress_bind_attrs() { self.add_bind_files(driver) - .or_else(|e| { + .map_err(|e| { kerror!( "BusManager::add_driver: driver '{:?}' add_bind_files failed, err: '{:?}", driver.name(), e ); - Err(e) + e }) .ok(); } @@ -423,7 +422,7 @@ impl BusManager { /// 根据bus的kset找到bus实例 fn get_bus_by_kset(&self, kset: &Arc) -> Option> { - return self.kset_bus_map.read().get(kset).map(|bus| bus.clone()); + return self.kset_bus_map.read().get(kset).cloned(); } /// 为bus上的设备选择可能的驱动程序 @@ -445,7 +444,7 @@ impl BusManager { /// /// Automatically probe for a driver if the bus allows it. pub fn probe_device(&self, dev: &Arc) { - let bus = dev.bus().map(|bus| bus.upgrade()).flatten(); + let bus = dev.bus().and_then(|bus| bus.upgrade()); if bus.is_none() { return; } @@ -498,7 +497,7 @@ fn rescan_devices_helper(dev: &Arc) -> Result<(), SystemError> { // todo: lock device parent unimplemented!() } - device_manager().device_attach(&dev)?; + device_manager().device_attach(dev)?; } return Ok(()); } @@ -641,7 +640,7 @@ impl Attribute for BusAttrDriversAutoprobe { /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#231 fn store(&self, kobj: Arc, buf: &[u8]) -> Result { - if buf.len() == 0 { + if buf.is_empty() { return Ok(0); } @@ -650,7 +649,7 @@ impl Attribute for BusAttrDriversAutoprobe { .get_bus_by_kset(&kset) .ok_or(SystemError::EINVAL)?; - if buf[0] == '0' as u8 { + if buf[0] == b'0' { bus.subsystem().set_drivers_autoprobe(false); } else { bus.subsystem().set_drivers_autoprobe(true); @@ -756,8 +755,7 @@ impl Attribute for DriverAttrUnbind { let bus = driver .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::ENODEV)?; let s = CStr::from_bytes_with_nul(buf) @@ -806,8 +804,7 @@ impl Attribute for DriverAttrBind { let bus = driver .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::ENODEV)?; let device = bus .find_device_by_name( diff --git a/kernel/src/driver/base/device/dd.rs b/kernel/src/driver/base/device/dd.rs index 8bdadacc..583ae1e4 100644 --- a/kernel/src/driver/base/device/dd.rs +++ b/kernel/src/driver/base/device/dd.rs @@ -22,7 +22,7 @@ use super::{ Device, DeviceManager, }; -static PROBE_WAIT_QUEUE: WaitQueue = WaitQueue::INIT; +static PROBE_WAIT_QUEUE: WaitQueue = WaitQueue::default(); impl DeviceManager { /// 尝试把一个设备与一个驱动匹配 @@ -84,21 +84,18 @@ impl DeviceManager { } else { let bus = dev .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::EINVAL)?; let mut data = DeviceAttachData::new(dev.clone(), allow_async, false); let mut flag = false; for driver in bus.subsystem().drivers().iter() { - let r = self.do_device_attach_driver(&driver, &mut data); + let r = self.do_device_attach_driver(driver, &mut data); if unlikely(r.is_err()) { flag = false; break; - } else { - if r.unwrap() == true { - flag = true; - break; - } + } else if r.unwrap() { + flag = true; + break; } } @@ -145,7 +142,7 @@ impl DeviceManager { driver: &Arc, data: &mut DeviceAttachData, ) -> Result { - if let Some(bus) = driver.bus().map(|bus| bus.upgrade()).flatten() { + if let Some(bus) = driver.bus().and_then(|bus| bus.upgrade()) { let r = bus.match_device(&data.dev, driver); if let Err(e) = r { @@ -158,10 +155,8 @@ impl DeviceManager { ); return Err(e); } - } else { - if r.unwrap() == false { - return Ok(false); - } + } else if !r.unwrap() { + return Ok(false); } } @@ -185,11 +180,7 @@ impl DeviceManager { /// /// 如果传递的设备已成功完成对驱动程序的探测,则返回true,否则返回false。 pub fn device_is_bound(&self, dev: &Arc) -> bool { - if dev.driver().is_some() { - return true; - } else { - return false; - } + return dev.driver().is_some(); } /// 把一个驱动绑定到设备上 @@ -211,14 +202,12 @@ impl DeviceManager { self.device_links_force_bind(dev); driver_manager().driver_bound(dev); return Err(e); - } else { - if let Some(bus) = dev.bus().map(|bus| bus.upgrade()).flatten() { - bus.subsystem().bus_notifier().call_chain( - BusNotifyEvent::DriverNotBound, - Some(dev), - None, - ); - } + } else if let Some(bus) = dev.bus().and_then(|bus| bus.upgrade()) { + bus.subsystem().bus_notifier().call_chain( + BusNotifyEvent::DriverNotBound, + Some(dev), + None, + ); } return r; } @@ -285,11 +274,10 @@ impl DriverManager { pub fn driver_attach(&self, driver: &Arc) -> Result<(), SystemError> { let bus = driver .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::EINVAL)?; for dev in bus.subsystem().devices().iter() { - if self.do_driver_attach(&dev, &driver) { + if self.do_driver_attach(dev, driver) { // 匹配成功 return Ok(()); } @@ -301,7 +289,7 @@ impl DriverManager { /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#1134 fn do_driver_attach(&self, device: &Arc, driver: &Arc) -> bool { let r = self.match_device(driver, device).unwrap_or(false); - if r == false { + if !r { // 不匹配 return false; } @@ -328,8 +316,7 @@ impl DriverManager { ) -> Result { return driver .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .unwrap() .match_device(device, driver); } @@ -384,7 +371,7 @@ impl DriverManager { }; let sysfs_failed = || { - if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() { + if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { bus.subsystem().bus_notifier().call_chain( BusNotifyEvent::DriverNotBound, Some(device), @@ -467,10 +454,10 @@ impl DriverManager { fn add_to_sysfs(&self, device: &Arc) -> Result<(), SystemError> { let driver = device.driver().ok_or(SystemError::EINVAL)?; - if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() { + if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { bus.subsystem().bus_notifier().call_chain( BusNotifyEvent::BindDriver, - Some(&device), + Some(device), None, ); } @@ -514,8 +501,7 @@ impl DriverManager { ) -> Result<(), SystemError> { let bus = device .bus() - .map(|bus| bus.upgrade()) - .flatten() + .and_then(|bus| bus.upgrade()) .ok_or(SystemError::EINVAL)?; let r = bus.probe(device); if r == Err(SystemError::EOPNOTSUPP_OR_ENOTSUP) { @@ -566,7 +552,7 @@ impl DriverManager { let driver = device.driver().unwrap(); driver.add_device(device.clone()); - if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() { + if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { bus.subsystem().bus_notifier().call_chain( BusNotifyEvent::BoundDriver, Some(device), diff --git a/kernel/src/driver/base/device/device_number.rs b/kernel/src/driver/base/device/device_number.rs index 98d90ff5..5589b12c 100644 --- a/kernel/src/driver/base/device/device_number.rs +++ b/kernel/src/driver/base/device/device_number.rs @@ -33,7 +33,7 @@ pub struct DeviceNumber { impl DeviceNumber { pub const MINOR_BITS: u32 = 20; - pub const MINOR_MASK: u32 = 1 << Self::MINOR_BITS - 1; + pub const MINOR_MASK: u32 = (1 << Self::MINOR_BITS) - 1; pub const fn new(major: Major, minor: u32) -> Self { Self { diff --git a/kernel/src/driver/base/device/driver.rs b/kernel/src/driver/base/device/driver.rs index 5c8c0384..10b5cba7 100644 --- a/kernel/src/driver/base/device/driver.rs +++ b/kernel/src/driver/base/device/driver.rs @@ -24,9 +24,9 @@ pub enum DriverError { UnInitialized, // 未初始化 } -impl Into for DriverError { - fn into(self) -> SystemError { - match self { +impl From for SystemError { + fn from(value: DriverError) -> Self { + match value { DriverError::ProbeError => SystemError::ENODEV, DriverError::RegisterError => SystemError::ENODEV, DriverError::AllocateResourceError => SystemError::EIO, @@ -138,13 +138,9 @@ impl dyn Driver { matcher: &dyn DeviceMatcher, data: T, ) -> Option> { - for dev in self.devices() { - if matcher.match_device(&dev, data) { - return Some(dev); - } - } - - return None; + self.devices() + .into_iter() + .find(|dev| matcher.match_device(dev, data)) } /// 根据设备名称查找绑定到驱动的设备 @@ -174,17 +170,13 @@ impl DriverManager { /// /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/driver.c#222 pub fn register(&self, driver: Arc) -> Result<(), SystemError> { - let bus = driver - .bus() - .map(|bus| bus.upgrade()) - .flatten() - .ok_or_else(|| { - kerror!( - "DriverManager::register() failed: driver.bus() is None. Driver: '{:?}'", - driver.name() - ); - SystemError::EINVAL - })?; + let bus = driver.bus().and_then(|bus| bus.upgrade()).ok_or_else(|| { + kerror!( + "DriverManager::register() failed: driver.bus() is None. Driver: '{:?}'", + driver.name() + ); + SystemError::EINVAL + })?; let drv_name = driver.name(); let other = bus.find_driver_by_name(&drv_name); @@ -287,9 +279,9 @@ impl DriverMatcher<&str> for DriverMatchName { } /// enum probe_type - device driver probe type to try -/// Device drivers may opt in for special handling of their -/// respective probe routines. This tells the core what to -/// expect and prefer. +/// Device drivers may opt in for special handling of their +/// respective probe routines. This tells the core what to +/// expect and prefer. /// /// Note that the end goal is to switch the kernel to use asynchronous /// probing by default, so annotating drivers with @@ -297,26 +289,21 @@ impl DriverMatcher<&str> for DriverMatchName { /// to speed up boot process while we are validating the rest of the /// drivers. #[allow(dead_code)] -#[derive(Debug)] +#[derive(Debug, Default)] pub enum DriverProbeType { - /// Used by drivers that work equally well - /// whether probed synchronously or asynchronously. - DefaultStrategy, - /// Drivers for "slow" devices which - /// probing order is not essential for booting the system may - /// opt into executing their probes asynchronously. + /// probing order is not essential for booting the system may + /// opt into executing their probes asynchronously. PreferAsync, /// Use this to annotate drivers that need - /// their probe routines to run synchronously with driver and - /// device registration (with the exception of -EPROBE_DEFER - /// handling - re-probing always ends up being done asynchronously). + /// their probe routines to run synchronously with driver and + /// device registration (with the exception of -EPROBE_DEFER + /// handling - re-probing always ends up being done asynchronously). ForceSync, -} -impl Default for DriverProbeType { - fn default() -> Self { - DriverProbeType::DefaultStrategy - } + #[default] + /// Used by drivers that work equally well + /// whether probed synchronously or asynchronously. + DefaultStrategy, } diff --git a/kernel/src/driver/base/device/mod.rs b/kernel/src/driver/base/device/mod.rs index 76dfe479..e4a90787 100644 --- a/kernel/src/driver/base/device/mod.rs +++ b/kernel/src/driver/base/device/mod.rs @@ -98,11 +98,11 @@ pub fn sys_dev_char_kset() -> Arc { unsafe { DEV_CHAR_KSET_INSTANCE.as_ref().unwrap().clone() } } -pub(self) unsafe fn set_sys_dev_block_kset(kset: Arc) { +unsafe fn set_sys_dev_block_kset(kset: Arc) { DEV_BLOCK_KSET_INSTANCE = Some(kset); } -pub(self) unsafe fn set_sys_dev_char_kset(kset: Arc) { +unsafe fn set_sys_dev_char_kset(kset: Arc) { DEV_CHAR_KSET_INSTANCE = Some(kset); } @@ -111,7 +111,7 @@ pub fn sys_devices_virtual_kset() -> Arc { unsafe { DEVICES_VIRTUAL_KSET_INSTANCE.as_ref().unwrap().clone() } } -pub(self) unsafe fn set_sys_devices_virtual_kset(kset: Arc) { +unsafe fn set_sys_devices_virtual_kset(kset: Arc) { DEVICES_VIRTUAL_KSET_INSTANCE = Some(kset); } @@ -274,7 +274,7 @@ impl IdTable { } pub fn device_number(&self) -> DeviceNumber { - return self.id.unwrap_or(DeviceNumber::default()); + return self.id.unwrap_or_default(); } } @@ -307,9 +307,9 @@ pub enum DeviceError { UnsupportedOperation, // 不支持的操作 } -impl Into for DeviceError { - fn into(self) -> SystemError { - match self { +impl From for SystemError { + fn from(value: DeviceError) -> Self { + match value { DeviceError::DriverExists => SystemError::EEXIST, DeviceError::DeviceExists => SystemError::EEXIST, DeviceError::InitializeFailed => SystemError::EIO, @@ -431,10 +431,8 @@ impl DeviceManager { let current_parent = device .parent() - .map(|x| x.upgrade()) - .flatten() - .map(|x| x.arc_any().cast::().ok()) - .flatten(); + .and_then(|x| x.upgrade()) + .and_then(|x| x.arc_any().cast::().ok()); let actual_parent = self.get_device_parent(&device, current_parent)?; if let Some(actual_parent) = actual_parent { @@ -467,7 +465,7 @@ impl DeviceManager { } // 通知客户端有关设备添加的信息。此调用必须在 dpm_sysfs_add() 之后且在 kobject_uevent() 之前执行。 - if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() { + if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { bus.subsystem().bus_notifier().call_chain( bus::BusNotifyEvent::AddDevice, Some(&device), @@ -509,19 +507,17 @@ impl DeviceManager { current_parent: Option>, ) -> Result>, SystemError> { // kdebug!("get_device_parent() device:{:?}", device.name()); - if let Some(_) = device.class() { + if device.class().is_some() { let parent_kobj: Arc; // kdebug!("current_parent:{:?}", current_parent); - if current_parent.is_none() { - parent_kobj = sys_devices_virtual_kset() as Arc; - } else { - let cp = current_parent.unwrap(); - + if let Some(cp) = current_parent { if cp.class().is_some() { return Ok(Some(cp.clone() as Arc)); } else { parent_kobj = cp.clone() as Arc; } + } else { + parent_kobj = sys_devices_virtual_kset() as Arc; } // 是否需要glue dir? @@ -531,15 +527,15 @@ impl DeviceManager { // subsystems can specify a default root directory for their devices if current_parent.is_none() { - if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() { - if let Some(root) = bus.root_device().map(|x| x.upgrade()).flatten() { + if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { + if let Some(root) = bus.root_device().and_then(|x| x.upgrade()) { return Ok(Some(root as Arc)); } } } - if current_parent.is_some() { - return Ok(Some(current_parent.unwrap().clone() as Arc)); + if let Some(current_parent) = current_parent { + return Ok(Some(current_parent as Arc)); } return Ok(None); @@ -599,10 +595,10 @@ impl DeviceManager { sysfs_instance().create_link(Some(&dev_kobj), &subsys_kobj, "subsystem".to_string())?; // todo: 这里需要处理class的parent逻辑, 添加device链接 - if let Some(parent) = dev.parent().map(|x| x.upgrade()).flatten() { + if let Some(parent) = dev.parent().and_then(|x| x.upgrade()) { let parent_kobj = parent.clone() as Arc; sysfs_instance() - .create_link(Some(&dev_kobj), &&parent_kobj, "device".to_string()) + .create_link(Some(&dev_kobj), &parent_kobj, "device".to_string()) .map_err(|e| { err_remove_subsystem(&dev_kobj); e @@ -876,7 +872,7 @@ impl DeviceMatcher<&str> for DeviceMatchName { } /// Cookie to identify the device -#[derive(Debug, Clone, Hash)] +#[derive(Debug, Clone)] pub struct DeviceId { data: Option<&'static str>, allocated: Option, @@ -918,6 +914,12 @@ impl PartialEq for DeviceId { } } +impl core::hash::Hash for DeviceId { + fn hash(&self, state: &mut H) { + self.id().hash(state); + } +} + impl Eq for DeviceId {} impl IrqHandlerData for DeviceId {} diff --git a/kernel/src/driver/base/kobject.rs b/kernel/src/driver/base/kobject.rs index 040c8884..4cbdf6d2 100644 --- a/kernel/src/driver/base/kobject.rs +++ b/kernel/src/driver/base/kobject.rs @@ -180,8 +180,7 @@ impl KObjectManager { kobj: Arc, join_kset: Option>, ) -> Result<(), SystemError> { - if join_kset.is_some() { - let kset = join_kset.unwrap(); + if let Some(kset) = join_kset { kset.join(&kobj); // 如果kobject没有parent,那么就将这个kset作为parent if kobj.parent().is_none() { diff --git a/kernel/src/driver/base/kset.rs b/kernel/src/driver/base/kset.rs index 6e98a65f..fa6b4575 100644 --- a/kernel/src/driver/base/kset.rs +++ b/kernel/src/driver/base/kset.rs @@ -109,7 +109,7 @@ impl KSet { pub fn join(&self, kobj: &Arc) { assert!(kobj.kset().is_none()); kobj.set_kset(self.self_ref.upgrade()); - self.kobjects.write().push(Arc::downgrade(&kobj)); + self.kobjects.write().push(Arc::downgrade(kobj)); } /// 把一个kobject从当前kset中移除。 diff --git a/kernel/src/driver/base/map/mod.rs b/kernel/src/driver/base/map/mod.rs index 08a61617..e39e8689 100644 --- a/kernel/src/driver/base/map/mod.rs +++ b/kernel/src/driver/base/map/mod.rs @@ -91,11 +91,8 @@ pub fn kobj_unmap(domain: Arc, dev_t: DeviceNumber, range: usize) { for i in 0..range { let rm_dev_t = &DeviceNumber::new(dev_t.major(), dev_t.minor() + i as u32); - match map.get(rm_dev_t) { - Some(_) => { - map.remove(rm_dev_t); - } - None => {} + if map.get(rm_dev_t).is_some() { + map.remove(rm_dev_t); } } } diff --git a/kernel/src/driver/base/platform/platform_device.rs b/kernel/src/driver/base/platform/platform_device.rs index f4132d05..5185dbb7 100644 --- a/kernel/src/driver/base/platform/platform_device.rs +++ b/kernel/src/driver/base/platform/platform_device.rs @@ -90,7 +90,7 @@ impl PlatformDeviceManager { let id = pdev.pdev_id().0; match id { PLATFORM_DEVID_NONE => { - pdev.set_name(format!("{}", pdev.pdev_name())); + pdev.set_name(pdev.pdev_name().to_string()); } PLATFORM_DEVID_AUTO => { let id = PLATFORM_DEVID_IDA.alloc().ok_or(SystemError::EOVERFLOW)?; @@ -158,10 +158,7 @@ impl PlatformBusDevice { #[allow(dead_code)] fn is_initialized(&self) -> bool { let state = self.inner.lock().state; - match state { - BusState::Initialized => true, - _ => false, - } + matches!(state, BusState::Initialized) } /// @brief: 设置总线状态 @@ -237,7 +234,7 @@ impl KObject for PlatformBusDevice { } fn kobj_type(&self) -> Option<&'static dyn KObjType> { - self.inner.lock().ktype.clone() + self.inner.lock().ktype } fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { diff --git a/kernel/src/driver/disk/ahci/ahci_inode.rs b/kernel/src/driver/disk/ahci/ahci_inode.rs index 5ec44763..ec2a3a52 100644 --- a/kernel/src/driver/disk/ahci/ahci_inode.rs +++ b/kernel/src/driver/disk/ahci/ahci_inode.rs @@ -39,7 +39,7 @@ impl LockedAhciInode { // uuid: Uuid::new_v5(), self_ref: Weak::default(), fs: Weak::default(), - disk: disk, + disk, metadata: Metadata { dev_id: 1, inode_id: generate_inode_id(), diff --git a/kernel/src/driver/disk/ahci/ahcidisk.rs b/kernel/src/driver/disk/ahci/ahcidisk.rs index b098e0e2..02e8af3f 100644 --- a/kernel/src/driver/disk/ahci/ahcidisk.rs +++ b/kernel/src/driver/disk/ahci/ahcidisk.rs @@ -71,7 +71,7 @@ impl AhciDisk { assert!((buf.len() & 511) == 0); compiler_fence(core::sync::atomic::Ordering::SeqCst); let check_length = ((count - 1) >> 4) + 1; // prdt length - if count * 512 > buf.len() || check_length > 8 as usize { + if count * 512 > buf.len() || check_length > 8_usize { kerror!("ahci read: e2big"); // 不可能的操作 return Err(SystemError::E2BIG); @@ -91,8 +91,7 @@ impl AhciDisk { #[allow(unused_unsafe)] let cmdheader: &mut HbaCmdHeader = unsafe { (phys_2_virt( - volatile_read!(port.clb) as usize - + slot as usize * size_of::() as usize, + volatile_read!(port.clb) as usize + slot as usize * size_of::(), ) as *mut HbaCmdHeader) .as_mut() .unwrap() @@ -109,10 +108,9 @@ impl AhciDisk { // 由于目前的内存管理机制无法把用户空间的内存地址转换为物理地址,所以只能先把数据拷贝到内核空间 // TODO:在内存管理重构后,可以直接使用用户空间的内存地址 - let user_buf = verify_area(VirtAddr::new(buf_ptr as usize), buf.len()).is_ok(); + let user_buf = verify_area(VirtAddr::new(buf_ptr), buf.len()).is_ok(); let mut kbuf = if user_buf { - let mut x: Vec = Vec::new(); - x.resize(buf.len(), 0); + let x: Vec = vec![0; buf.len()]; Some(x) } else { None @@ -220,7 +218,7 @@ impl AhciDisk { assert!((buf.len() & 511) == 0); compiler_fence(core::sync::atomic::Ordering::SeqCst); let check_length = ((count - 1) >> 4) + 1; // prdt length - if count * 512 > buf.len() || check_length > 8 as usize { + if count * 512 > buf.len() || check_length > 8 { // 不可能的操作 return Err(SystemError::E2BIG); } else if count == 0 { @@ -241,8 +239,7 @@ impl AhciDisk { #[allow(unused_unsafe)] let cmdheader: &mut HbaCmdHeader = unsafe { (phys_2_virt( - volatile_read!(port.clb) as usize - + slot as usize * size_of::() as usize, + volatile_read!(port.clb) as usize + slot as usize * size_of::(), ) as *mut HbaCmdHeader) .as_mut() .unwrap() @@ -251,7 +248,7 @@ impl AhciDisk { volatile_write_bit!( cmdheader.cfl, - (1 << 5) - 1 as u8, + (1 << 5) - 1_u8, (size_of::() / size_of::()) as u8 ); // Command FIS size @@ -264,9 +261,9 @@ impl AhciDisk { // 由于目前的内存管理机制无法把用户空间的内存地址转换为物理地址,所以只能先把数据拷贝到内核空间 // TODO:在内存管理重构后,可以直接使用用户空间的内存地址 - let user_buf = verify_area(VirtAddr::new(buf_ptr as usize), buf.len()).is_ok(); + let user_buf = verify_area(VirtAddr::new(buf_ptr), buf.len()).is_ok(); let mut kbuf = if user_buf { - let mut x: Vec = Vec::with_capacity(buf.len()); + let mut x: Vec = vec![0; buf.len()]; x.resize(buf.len(), 0); x.copy_from_slice(buf); Some(x) @@ -401,7 +398,7 @@ impl LockedAhciDisk { let mut table: MbrDiskPartionTable = Default::default(); // 数据缓冲区 - let mut buf: Vec = Vec::new(); + let mut buf: Vec = vec![0; size_of::()]; buf.resize(size_of::(), 0); self.read_at(0, 1, &mut buf)?; diff --git a/kernel/src/driver/disk/ahci/hba.rs b/kernel/src/driver/disk/ahci/hba.rs index fa39a133..2aa50440 100644 --- a/kernel/src/driver/disk/ahci/hba.rs +++ b/kernel/src/driver/disk/ahci/hba.rs @@ -1,4 +1,3 @@ -use alloc::vec::Vec; use core::{intrinsics::size_of, ptr}; use core::sync::atomic::compiler_fence; @@ -179,17 +178,12 @@ impl HbaPort { /// @return: 返回一个空闲 cmd table 的 id; 如果没有,则返回 Option::None pub fn find_cmdslot(&self) -> Option { let slots = volatile_read!(self.sact) | volatile_read!(self.ci); - for i in 0..32 { - if slots & 1 << i == 0 { - return Some(i); - } - } - return None; + (0..32).find(|&i| slots & 1 << i == 0) } /// 初始化, 把 CmdList 等变量的地址赋值到 HbaPort 上 - 这些空间由操作系统分配且固定 /// 等价于原C版本的 port_rebase 函数 - pub fn init(&mut self, clb: u64, fb: u64, ctbas: &Vec) { + pub fn init(&mut self, clb: u64, fb: u64, ctbas: &[u64]) { self.stop(); // 先暂停端口 // 赋值 command list base address @@ -217,13 +211,13 @@ impl HbaPort { // Command table offset: 40K + 8K*portno // Command table size = 256*32 = 8K per port let mut cmdheaders = phys_2_virt(clb as usize) as *mut u64 as *mut HbaCmdHeader; - for i in 0..32 as usize { + for ctbas_value in ctbas.iter().take(32) { volatile_write!((*cmdheaders).prdtl, 0); // 一开始没有询问,prdtl = 0(预留了8个PRDT项的空间) - volatile_write!((*cmdheaders).ctba, ctbas[i]); + volatile_write!((*cmdheaders).ctba, *ctbas_value); // 这里限制了 prdtl <= 8, 所以一共用了256bytes,如果需要修改,可以修改这里 compiler_fence(core::sync::atomic::Ordering::SeqCst); unsafe { - ptr::write_bytes(phys_2_virt(ctbas[i] as usize) as *mut u64, 0, 256); + ptr::write_bytes(phys_2_virt(*ctbas_value as usize) as *mut u64, 0, 256); } cmdheaders = (cmdheaders as usize + size_of::()) as *mut HbaCmdHeader; } diff --git a/kernel/src/driver/disk/ahci/mod.rs b/kernel/src/driver/disk/ahci/mod.rs index 1c009eda..15b31aad 100644 --- a/kernel/src/driver/disk/ahci/mod.rs +++ b/kernel/src/driver/disk/ahci/mod.rs @@ -3,7 +3,6 @@ pub mod ahci_inode; pub mod ahcidisk; pub mod hba; -use crate::driver::base::block::block_device::BlockDevice; use crate::driver::base::block::disk_info::BLK_GF_AHCI; // 依赖的rust工具包 use crate::driver::pci::pci::{ @@ -23,14 +22,7 @@ use crate::{ kdebug, }; use ahci_inode::LockedAhciInode; -use alloc::{ - boxed::Box, - collections::LinkedList, - format, - string::{String, ToString}, - sync::Arc, - vec::Vec, -}; +use alloc::{boxed::Box, collections::LinkedList, format, string::String, sync::Arc, vec::Vec}; use core::sync::atomic::compiler_fence; use system_error::SystemError; @@ -180,30 +172,3 @@ fn _port(ctrl_num: u8, port_num: u8) -> &'static mut HbaPort { return unsafe { (port as *const HbaPort as *mut HbaPort).as_mut().unwrap() }; } - -/// @brief: 测试函数 -pub fn __test_ahci() { - let _res = ahci_init(); - let disk: Arc = get_disks_by_name("ahci_disk_0".to_string()).unwrap(); - #[deny(overflowing_literals)] - let mut buf = [0u8; 3000usize]; - - for i in 0..2000 { - buf[i] = i as u8; - } - - let _dd = disk; - - // 测试1, 写两个块,读4个块 - // _dd.write_at(123, 2, &buf).unwrap(); - let mut read_buf = [0u8; 3000usize]; - _dd.read_at(122, 4, &mut read_buf).unwrap(); - - // 测试2, 只读写一个字节 - for i in 0..512 { - buf[i] = 233; - } - // _dd.write_at(123, 2, &buf).unwrap(); - let mut read_buf2 = [0u8; 3000usize]; - _dd.read_at(122, 4, &mut read_buf2).unwrap(); -} diff --git a/kernel/src/driver/firmware/efi/fdt.rs b/kernel/src/driver/firmware/efi/fdt.rs index a286af89..52ad8bb7 100644 --- a/kernel/src/driver/firmware/efi/fdt.rs +++ b/kernel/src/driver/firmware/efi/fdt.rs @@ -56,13 +56,13 @@ enum FdtPropType { impl FdtPropType { /// 获取属性对应的fdt属性名 fn prop_name(&self) -> &'static str { - self.clone().into() + (*self).into() } } -impl Into<&'static str> for FdtPropType { - fn into(self) -> &'static str { - match self { +impl From for &'static str { + fn from(value: FdtPropType) -> Self { + match value { FdtPropType::SystemTable => "linux,uefi-system-table", FdtPropType::MMBase => "linux,uefi-mmap-start", FdtPropType::MMSize => "linux,uefi-mmap-size", @@ -159,12 +159,11 @@ impl EFIManager { prop: &fdt::node::NodeProperty<'_>, target: &mut EFIFdtParams, ) -> Result<(), SystemError> { - let val: u64; - if prop.value.len() == 4 { - val = u32::from_be_bytes(prop.value[0..4].try_into().unwrap()) as u64; + let val = if prop.value.len() == 4 { + u32::from_be_bytes(prop.value[0..4].try_into().unwrap()) as u64 } else { - val = u64::from_be_bytes(prop.value[0..8].try_into().unwrap()); - } + u64::from_be_bytes(prop.value[0..8].try_into().unwrap()) + }; match prop_type { FdtPropType::SystemTable => { diff --git a/kernel/src/driver/firmware/efi/init.rs b/kernel/src/driver/firmware/efi/init.rs index b37d9693..67443f72 100644 --- a/kernel/src/driver/firmware/efi/init.rs +++ b/kernel/src/driver/firmware/efi/init.rs @@ -1,4 +1,4 @@ -use core::{intrinsics::unlikely, mem::size_of}; +use core::{hint::spin_loop, intrinsics::unlikely, mem::size_of}; use system_error::SystemError; use uefi_raw::table::boot::{MemoryAttribute, MemoryType}; @@ -37,7 +37,9 @@ pub fn efi_init() { // 所以如果我们无法访问它,那么继续进行下去就没有什么意义了 kerror!("Failed to initialize early memory map"); - loop {} + loop { + spin_loop(); + } } // kdebug!("NNNN"); // kwarn!("BBBB, e:{:?}", SystemError::EINVAL); @@ -76,7 +78,7 @@ pub fn efi_init() { .expect("Failed to reserve memory for EFI mmap table"); // 保留内核的内存 - if let Some(info) = efi_manager().inner.read().dragonstub_load_info.clone() { + if let Some(info) = efi_manager().inner.read().dragonstub_load_info { mem_block_manager() .reserve_block( PhysAddr::new(info.paddr as usize), diff --git a/kernel/src/driver/firmware/efi/tables.rs b/kernel/src/driver/firmware/efi/tables.rs index 82160977..7076c9ac 100644 --- a/kernel/src/driver/firmware/efi/tables.rs +++ b/kernel/src/driver/firmware/efi/tables.rs @@ -25,7 +25,7 @@ use super::{ }; /// 所有的要解析的表格的解析器 -static TABLE_PARSERS: &'static [&'static TableMatcher] = &[ +static TABLE_PARSERS: &[&TableMatcher] = &[ &TableMatcher::new(&MatchTableDragonStubPayloadEFI), &TableMatcher::new(&MatchTableMemoryAttributes), &TableMatcher::new(&MatchTableMemReserve), @@ -362,13 +362,13 @@ impl TableMatcher { /// 判断配置表与当前匹配器是否匹配 #[inline(never)] fn match_table(&self, table: &ConfigurationTable) -> Option> { - if table.vendor_guid.equivalent(self.table.guid()) == false { + if !table.vendor_guid.equivalent(self.table.guid()) { return None; } let table_map_size = self.table.map_size(); - let vendor_table_vaddr: Option; - if table_map_size > 0 { + + let vendor_table_vaddr: Option = if table_map_size > 0 { let table_paddr: PhysAddr = PhysAddr::new(table.vendor_table as usize); let vaddr = EarlyIoRemap::map_not_aligned(table_paddr, table_map_size, true); @@ -376,10 +376,10 @@ impl TableMatcher { return Some(Err(e)); } - vendor_table_vaddr = Some(vaddr.unwrap()); + Some(vaddr.unwrap()) } else { - vendor_table_vaddr = None; - } + None + }; let r = self.table.post_process(vendor_table_vaddr, table); diff --git a/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs b/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs index 66f2c050..ecac846b 100644 --- a/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs +++ b/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs @@ -95,14 +95,14 @@ enum PsMouseCommand { SetSampleRate, } -impl Into for PsMouseCommand { - fn into(self) -> u8 { - match self { - Self::SampleRate(x) => x, - Self::EnablePacketStreaming => 0xf4, - Self::InitKeyboard => 0x47, - Self::GetMouseId => 0xf2, - Self::SetSampleRate => 0xf3, +impl From for u8 { + fn from(val: PsMouseCommand) -> Self { + match val { + PsMouseCommand::SampleRate(x) => x, + PsMouseCommand::EnablePacketStreaming => 0xf4, + PsMouseCommand::InitKeyboard => 0x47, + PsMouseCommand::GetMouseId => 0xf2, + PsMouseCommand::SetSampleRate => 0xf3, } } } @@ -302,13 +302,13 @@ impl Ps2MouseDevice { guard.current_state.flags = flags; } 1 => { - let flags = guard.current_state.flags.clone(); + let flags = guard.current_state.flags; if !flags.contains(MouseFlags::X_OVERFLOW) { guard.current_state.x = self.get_x_movement(packet, flags); } } 2 => { - let flags = guard.current_state.flags.clone(); + let flags = guard.current_state.flags; if !flags.contains(MouseFlags::Y_OVERFLOW) { guard.current_state.y = self.get_y_movement(packet, flags); } @@ -546,7 +546,7 @@ impl KObject for Ps2MouseDevice { } fn kobj_type(&self) -> Option<&'static dyn KObjType> { - self.inner.lock_irqsave().kobj_type.clone() + self.inner.lock_irqsave().kobj_type } fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { @@ -605,8 +605,8 @@ impl IndexNode for Ps2MouseDevice { let mut guard = self.inner.lock_irqsave(); if guard.buf.len() >= 3 { - for i in 0..3 { - buf[i] = guard.buf.dequeue().unwrap(); + for item in buf.iter_mut().take(3) { + *item = guard.buf.dequeue().unwrap(); } return Ok(3); } else { diff --git a/kernel/src/driver/net/dma.rs b/kernel/src/driver/net/dma.rs index 0b3a7e95..8d74c335 100644 --- a/kernel/src/driver/net/dma.rs +++ b/kernel/src/driver/net/dma.rs @@ -48,7 +48,7 @@ pub unsafe fn dma_dealloc(paddr: usize, vaddr: NonNull, pages: usize) -> i32 ); // 恢复页面属性 - let vaddr = VirtAddr::new(vaddr.as_ptr() as *mut u8 as usize); + let vaddr = VirtAddr::new(vaddr.as_ptr() as usize); let mut kernel_mapper = KernelMapper::lock(); let kernel_mapper = kernel_mapper.as_mut().unwrap(); let flusher = kernel_mapper diff --git a/kernel/src/driver/net/e1000e/e1000e.rs b/kernel/src/driver/net/e1000e/e1000e.rs index aebede80..fc2cc517 100644 --- a/kernel/src/driver/net/e1000e/e1000e.rs +++ b/kernel/src/driver/net/e1000e/e1000e.rs @@ -155,7 +155,7 @@ impl E1000EBuffer { return self.length; } // 释放buffer内部的dma_pages,需要小心使用 - pub fn free_buffer(self) -> () { + pub fn free_buffer(self) { if self.length != 0 { unsafe { dma_dealloc(self.paddr, self.buffer, E1000E_DMA_PAGES) }; } @@ -274,7 +274,7 @@ impl E1000EDevice { // close the interrupt volwrite!(interrupt_regs, imc, E1000E_IMC_CLEAR); let mut gcr = volread!(pcie_regs, gcr); - gcr = gcr | (1 << 22); + gcr |= 1 << 22; volwrite!(pcie_regs, gcr, gcr); compiler_fence(Ordering::AcqRel); // PHY Initialization 14.8.1 @@ -291,11 +291,11 @@ impl E1000EDevice { let ral = unsafe { volread!(ra_regs, ral0) }; let rah = unsafe { volread!(ra_regs, rah0) }; let mac: [u8; 6] = [ - ((ral >> 0) & 0xFF) as u8, + (ral & 0xFF) as u8, ((ral >> 8) & 0xFF) as u8, ((ral >> 16) & 0xFF) as u8, ((ral >> 24) & 0xFF) as u8, - ((rah >> 0) & 0xFF) as u8, + (rah & 0xFF) as u8, ((rah >> 8) & 0xFF) as u8, ]; // 初始化receive和transimit descriptor环形队列 @@ -319,17 +319,17 @@ impl E1000EDevice { // 初始化缓冲区与descriptor,descriptor 中的addr字典应当指向buffer的物理地址 // Receive buffers of appropriate size should be allocated and pointers to these buffers should be stored in the descriptor ring. - for i in 0..recv_ring_length { + for ring in recv_desc_ring.iter_mut().take(recv_ring_length) { let buffer = E1000EBuffer::new(PAGE_SIZE); - recv_desc_ring[i].addr = buffer.as_paddr() as u64; - recv_desc_ring[i].status = 0; + ring.addr = buffer.as_paddr() as u64; + ring.status = 0; recv_buffers.push(buffer); } // Same as receive buffers - for i in 0..trans_ring_length { + for ring in trans_desc_ring.iter_mut().take(recv_ring_length) { let buffer = E1000EBuffer::new(PAGE_SIZE); - trans_desc_ring[i].addr = buffer.as_paddr() as u64; - trans_desc_ring[i].status = 1; + ring.addr = buffer.as_paddr() as u64; + ring.status = 1; trans_buffers.push(buffer); } @@ -340,7 +340,7 @@ impl E1000EDevice { while mta_adress != vaddress + E1000E_MTA_REGS_END_OFFSET { let mta: NonNull = get_register_ptr(mta_adress, 0); unsafe { volwrite!(mta, mta, 0) }; - mta_adress = mta_adress + 4; + mta_adress += 4; } // 连续的寄存器读-写操作,放在同一个unsafe块中 unsafe { @@ -491,8 +491,8 @@ impl E1000EDevice { pub fn e1000e_intr_set(&mut self, state: bool) { let mut ims = unsafe { volread!(self.interrupt_regs, ims) }; match state { - true => ims = ims | E1000E_IMS_RXT0, - false => ims = ims & !E1000E_IMS_RXT0, + true => ims |= E1000E_IMS_RXT0, + false => ims &= !E1000E_IMS_RXT0, } unsafe { volwrite!(self.interrupt_regs, ims, ims) }; } @@ -512,8 +512,7 @@ impl E1000EDevice { // close interrupt self.e1000e_intr_set(false); loop { - if self.napi_buffer_tail == self.napi_buffer_head && self.napi_buffer_empty == false - { + if self.napi_buffer_tail == self.napi_buffer_head && !self.napi_buffer_empty { // napi缓冲队列已满,停止收包 // napi queue is full, stop break; @@ -593,7 +592,7 @@ pub extern "C" fn rs_e1000e_init() { e1000e_init(); } -pub fn e1000e_init() -> () { +pub fn e1000e_init() { match e1000e_probe() { Ok(_code) => { kinfo!("Successfully init e1000e device!"); diff --git a/kernel/src/driver/net/e1000e/e1000e_driver.rs b/kernel/src/driver/net/e1000e/e1000e_driver.rs index 29a09815..91a01f0f 100644 --- a/kernel/src/driver/net/e1000e/e1000e_driver.rs +++ b/kernel/src/driver/net/e1000e/e1000e_driver.rs @@ -34,6 +34,8 @@ pub struct E1000ETxToken { pub struct E1000EDriver { pub inner: Arc>, } +unsafe impl Send for E1000EDriver {} +unsafe impl Sync for E1000EDriver {} /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。 /// 参阅virtio_net.rs @@ -54,6 +56,7 @@ impl DerefMut for E1000EDriverWrapper { } impl E1000EDriverWrapper { + #[allow(clippy::mut_from_ref)] fn force_get_mut(&self) -> &mut E1000EDriver { unsafe { &mut *self.0.get() } } @@ -76,7 +79,7 @@ impl phy::RxToken for E1000ERxToken { where F: FnOnce(&mut [u8]) -> R, { - let result = f(&mut self.0.as_mut_slice()); + let result = f(self.0.as_mut_slice()); self.0.free_buffer(); return result; } @@ -97,6 +100,7 @@ impl phy::TxToken for E1000ETxToken { } impl E1000EDriver { + #[allow(clippy::arc_with_non_send_sync)] pub fn new(device: E1000EDevice) -> Self { let mut iface_config = smoltcp::iface::Config::new(); @@ -253,11 +257,11 @@ impl NetDriver for E1000EInterface { self.iface.lock().update_ip_addrs(|addrs| { let dest = addrs.iter_mut().next(); - if let None = dest { - addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); - } else { - let dest = dest.unwrap(); + + if let Some(dest) = dest { *dest = ip_addrs[0]; + } else { + addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); } }); return Ok(()); diff --git a/kernel/src/driver/net/e1000e/mod.rs b/kernel/src/driver/net/e1000e/mod.rs index 45cbc3b7..0958ce1a 100644 --- a/kernel/src/driver/net/e1000e/mod.rs +++ b/kernel/src/driver/net/e1000e/mod.rs @@ -1,2 +1,3 @@ +#[allow(clippy::module_inception)] pub mod e1000e; pub mod e1000e_driver; diff --git a/kernel/src/driver/net/virtio_net.rs b/kernel/src/driver/net/virtio_net.rs index 8d0a2a84..d3321d23 100644 --- a/kernel/src/driver/net/virtio_net.rs +++ b/kernel/src/driver/net/virtio_net.rs @@ -61,6 +61,7 @@ impl DerefMut for VirtioNICDriverWrapper { } } +#[allow(clippy::mut_from_ref)] impl VirtioNICDriverWrapper { fn force_get_mut(&self) -> &mut VirtioNICDriver { unsafe { &mut *self.0.get() } @@ -160,7 +161,7 @@ pub struct VirtioNetToken { rx_buffer: Option, } -impl<'a, T: Transport> VirtioNetToken { +impl VirtioNetToken { pub fn new( driver: VirtioNICDriver, rx_buffer: Option, @@ -322,11 +323,11 @@ impl NetDriver for VirtioInterface { self.iface.lock().update_ip_addrs(|addrs| { let dest = addrs.iter_mut().next(); - if let None = dest { - addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); - } else { - let dest = dest.unwrap(); + + if let Some(dest) = dest { *dest = ip_addrs[0]; + } else { + addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); } }); return Ok(()); diff --git a/kernel/src/driver/open_firmware/fdt.rs b/kernel/src/driver/open_firmware/fdt.rs index 59c9bb0f..7e47097d 100644 --- a/kernel/src/driver/open_firmware/fdt.rs +++ b/kernel/src/driver/open_firmware/fdt.rs @@ -92,10 +92,10 @@ impl OpenFirmwareFdtDriver { /// 扫描 `/chosen` 节点 fn early_init_scan_chosen(&self, fdt: &Fdt) -> Result<(), SystemError> { - const CHOSEN_NAME1: &'static str = "/chosen"; + const CHOSEN_NAME1: &str = "/chosen"; let mut node = fdt.find_node(CHOSEN_NAME1); if node.is_none() { - const CHOSEN_NAME2: &'static str = "/chosen@0"; + const CHOSEN_NAME2: &str = "/chosen@0"; node = fdt.find_node(CHOSEN_NAME2); if node.is_some() { FDT_GLOBAL_DATA.write().chosen_node_name = Some(CHOSEN_NAME2); diff --git a/kernel/src/driver/pci/mod.rs b/kernel/src/driver/pci/mod.rs index 457dff62..da14fd1f 100644 --- a/kernel/src/driver/pci/mod.rs +++ b/kernel/src/driver/pci/mod.rs @@ -1,2 +1,3 @@ +#[allow(clippy::module_inception)] pub mod pci; pub mod pci_irq; diff --git a/kernel/src/driver/pci/pci.rs b/kernel/src/driver/pci/pci.rs index 8c7a0ab8..2e9e4850 100644 --- a/kernel/src/driver/pci/pci.rs +++ b/kernel/src/driver/pci/pci.rs @@ -128,6 +128,7 @@ pub fn get_pci_device_structure_mut<'a>( /// @param class_code 寄存器值 /// @param subclass 寄存器值,与class_code一起确定设备类型 /// @return Vec<&'a Box<(dyn PciDeviceStructure) 包含链表中所有满足条件的PCI结构体的不可变引用的容器 +#[allow(clippy::borrowed_box)] pub fn get_pci_device_structure<'a>( list: &'a mut RwLockReadGuard<'_, LinkedList>>, class_code: u8, @@ -567,7 +568,7 @@ impl PciDeviceStructure for PciDeviceStructurePciToCardbusBridge { } #[inline(always)] fn as_pci_to_carbus_bridge_device(&self) -> Option<&PciDeviceStructurePciToCardbusBridge> { - Some(&self) + Some(self) } #[inline(always)] fn as_pci_to_carbus_bridge_device_mut( @@ -634,7 +635,7 @@ impl PciRoot { let size = (bus_number_double as usize) * (PAGE_2M_SIZE as usize); unsafe { let space_guard = mmio_pool() - .create_mmio(size as usize) + .create_mmio(size) .map_err(|_| PciError::CreateMmioError)?; let space_guard = Arc::new(space_guard); self.mmio_guard = Some(space_guard.clone()); diff --git a/kernel/src/driver/serial/serial8250/mod.rs b/kernel/src/driver/serial/serial8250/mod.rs index f9c39f5e..1b0b5a93 100644 --- a/kernel/src/driver/serial/serial8250/mod.rs +++ b/kernel/src/driver/serial/serial8250/mod.rs @@ -497,7 +497,7 @@ impl KObject for Serial8250ISADriver { } fn kobj_type(&self) -> Option<&'static dyn KObjType> { - self.inner.read().kobj_type.clone() + self.inner.read().kobj_type } fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { diff --git a/kernel/src/driver/serial/serial8250/serial8250_pio.rs b/kernel/src/driver/serial/serial8250/serial8250_pio.rs index 77b2bd69..fbf909ce 100644 --- a/kernel/src/driver/serial/serial8250/serial8250_pio.rs +++ b/kernel/src/driver/serial/serial8250/serial8250_pio.rs @@ -25,11 +25,9 @@ impl Serial8250Manager { uart_driver: &Arc, devs: &Arc, ) { - for i in 0..8 { - if let Some(port) = unsafe { PIO_PORTS[i].as_ref() } { - port.set_device(Some(devs)); - self.uart_add_one_port(uart_driver, port).ok(); - } + for port in unsafe { &PIO_PORTS }.iter().flatten() { + port.set_device(Some(devs)); + self.uart_add_one_port(uart_driver, port).ok(); } } } @@ -86,9 +84,7 @@ impl Serial8250PIOPort { inner: RwLock::new(Serial8250PIOPortInner::new()), }; - if let Err(e) = r.check_baudrate(&baudrate) { - return Err(e); - } + r.check_baudrate(&baudrate)?; return Ok(r); } @@ -112,10 +108,10 @@ impl Serial8250PIOPort { CurrentPortIOArch::out8(port + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold CurrentPortIOArch::out8(port + 4, 0x08); // IRQs enabled, RTS/DSR clear (现代计算机上一般都不需要hardware flow control,因此不需要置位RTS/DSR) CurrentPortIOArch::out8(port + 4, 0x1E); // Set in loopback mode, test the serial chip - CurrentPortIOArch::out8(port + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial returns same byte) + CurrentPortIOArch::out8(port, 0xAE); // Test serial chip (send byte 0xAE and check if serial returns same byte) // Check if serial is faulty (i.e: not same byte as sent) - if CurrentPortIOArch::in8(port + 0) != 0xAE { + if CurrentPortIOArch::in8(port) != 0xAE { self.initialized.store(false, Ordering::SeqCst); return Err(SystemError::ENODEV); } @@ -149,19 +145,11 @@ impl Serial8250PIOPort { #[allow(dead_code)] fn serial_received(&self) -> bool { - if self.serial_in(5) & 1 != 0 { - true - } else { - false - } + self.serial_in(5) & 1 != 0 } fn is_transmit_empty(&self) -> bool { - if self.serial_in(5) & 0x20 != 0 { - true - } else { - false - } + self.serial_in(5) & 0x20 != 0 } /// 发送字节 @@ -170,7 +158,7 @@ impl Serial8250PIOPort { /// /// - `s`:待发送的字节 fn send_bytes(&self, s: &[u8]) { - while self.is_transmit_empty() == false { + while !self.is_transmit_empty() { spin_loop(); } @@ -182,7 +170,7 @@ impl Serial8250PIOPort { /// 读取一个字节 #[allow(dead_code)] fn read_one_byte(&self) -> u8 { - while self.serial_received() == false { + while !self.serial_received() { spin_loop(); } return self.serial_in(0) as u8; @@ -223,7 +211,7 @@ impl UartPort for Serial8250PIOPort { let divisor = self.divisor(baud).0; - CurrentPortIOArch::out8(port + 0, (divisor & 0xff) as u8); // Set divisor (lo byte) + CurrentPortIOArch::out8(port, (divisor & 0xff) as u8); // Set divisor (lo byte) CurrentPortIOArch::out8(port + 1, ((divisor >> 8) & 0xff) as u8); // (hi byte) CurrentPortIOArch::out8(port + 3, 0x03); // 8 bits, no parity, one stop bit } @@ -271,7 +259,7 @@ impl Serial8250PIOPortInner { } fn set_device(&mut self, device: Option<&Arc>) { - self.device = device.map(|d| Arc::downgrade(d)); + self.device = device.map(Arc::downgrade); } } diff --git a/kernel/src/driver/timers/hpet/mod.rs b/kernel/src/driver/timers/hpet/mod.rs index 82717fea..4fea9745 100644 --- a/kernel/src/driver/timers/hpet/mod.rs +++ b/kernel/src/driver/timers/hpet/mod.rs @@ -33,7 +33,7 @@ impl HpetRegisters { /// 获取 HPET 计数器的频率 pub fn frequency(&self) -> u64 { - 10000_0000_0000_000 / self.counter_clock_period() + 1_000_000_000_000_000 / self.counter_clock_period() } pub fn main_counter_value(&self) -> u64 { diff --git a/kernel/src/driver/timers/rtc/mod.rs b/kernel/src/driver/timers/rtc/mod.rs index 2f5f4717..1339763e 100644 --- a/kernel/src/driver/timers/rtc/mod.rs +++ b/kernel/src/driver/timers/rtc/mod.rs @@ -1 +1,2 @@ +#[allow(clippy::module_inception)] pub mod rtc; diff --git a/kernel/src/driver/timers/rtc/rtc.rs b/kernel/src/driver/timers/rtc/rtc.rs index 00f22124..5383f10d 100644 --- a/kernel/src/driver/timers/rtc/rtc.rs +++ b/kernel/src/driver/timers/rtc/rtc.rs @@ -5,6 +5,7 @@ use crate::{ exception::InterruptArch, }; +#[derive(Default)] pub struct RtcTime { pub second: i32, pub minute: i32, @@ -14,19 +15,6 @@ pub struct RtcTime { pub year: i32, } -impl Default for RtcTime { - fn default() -> Self { - Self { - second: (0), - minute: (0), - hour: (0), - day: (0), - month: (0), - year: (0), - } - } -} - impl RtcTime { ///@brief 从主板cmos中获取时间 /// @@ -37,17 +25,10 @@ impl RtcTime { let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() }; //0x0B let status_register_b: u8 = read_cmos(0x0B); // 读取状态寄存器B - let is_24h: bool = if (status_register_b & 0x02) != 0 { - true - } else { - false - }; // 判断是否启用24小时模式 + let is_24h: bool = (status_register_b & 0x02) != 0; + // 判断是否启用24小时模式 - let is_binary: bool = if (status_register_b & 0x04) != 0 { - true - } else { - false - }; // 判断是否为二进制码 + let is_binary: bool = (status_register_b & 0x04) != 0; // 判断是否为二进制码 loop { self.year = read_cmos(CMOSTimeSelector::Year as u8) as i32; diff --git a/kernel/src/driver/tty/console.rs b/kernel/src/driver/tty/console.rs index d9df2f7f..a9064ccb 100644 --- a/kernel/src/driver/tty/console.rs +++ b/kernel/src/driver/tty/console.rs @@ -85,6 +85,7 @@ pub trait ConsoleSwitch: Sync + Send { /// - underline: 下划线 /// - reverse: 颜色反转 /// - italic: 斜体 + #[allow(clippy::too_many_arguments)] fn con_build_attr( &self, _vc_data: &VirtualConsoleData, diff --git a/kernel/src/driver/tty/kthread.rs b/kernel/src/driver/tty/kthread.rs index 1e506939..8cecd0f5 100644 --- a/kernel/src/driver/tty/kthread.rs +++ b/kernel/src/driver/tty/kthread.rs @@ -50,8 +50,8 @@ fn tty_refresh_thread() -> i32 { continue; } let mut data = [0u8; TO_DEQUEUE_MAX]; - for i in 0..to_dequeue { - data[i] = KEYBUF.pop().unwrap(); + for item in data.iter_mut().take(to_dequeue) { + *item = KEYBUF.pop().unwrap(); } let _ = current_tty_port().receive_buf(&data[0..to_dequeue], &[], to_dequeue); @@ -60,7 +60,7 @@ fn tty_refresh_thread() -> i32 { /// 发送数据到tty刷新线程 pub fn send_to_tty_refresh_thread(data: &[u8]) { - for i in 0..data.len() { - KEYBUF.push(data[i]).ok(); + for item in data { + KEYBUF.push(*item).ok(); } } diff --git a/kernel/src/driver/tty/termios.rs b/kernel/src/driver/tty/termios.rs index 5dd8b406..8490e68d 100644 --- a/kernel/src/driver/tty/termios.rs +++ b/kernel/src/driver/tty/termios.rs @@ -45,7 +45,7 @@ impl PosixTermios { c_oflag: termios.output_mode.bits, c_cflag: termios.control_mode.bits, c_lflag: termios.local_mode.bits, - c_cc: termios.control_characters.clone(), + c_cc: termios.control_characters, c_line: termios.line as u8, c_ispeed: termios.input_speed, c_ospeed: termios.output_speed, @@ -53,14 +53,14 @@ impl PosixTermios { } #[allow(dead_code)] - pub fn to_kernel_termios(&self) -> Termios { + pub fn to_kernel_termios(self) -> Termios { // TODO:这里没有考虑非规范模式 Termios { input_mode: InputMode::from_bits_truncate(self.c_iflag), output_mode: OutputMode::from_bits_truncate(self.c_oflag), control_mode: ControlMode::from_bits_truncate(self.c_cflag), local_mode: LocalMode::from_bits_truncate(self.c_lflag), - control_characters: self.c_cc.clone(), + control_characters: self.c_cc, line: LineDisciplineType::from_line(self.c_line), input_speed: self.c_ispeed, output_speed: self.c_ospeed, @@ -126,7 +126,7 @@ lazy_static! { | LocalMode::ECHOCTL | LocalMode::ECHOKE | LocalMode::IEXTEN, - control_characters: INIT_CONTORL_CHARACTERS.clone(), + control_characters: INIT_CONTORL_CHARACTERS, line: LineDisciplineType::NTty, input_speed: 38400, output_speed: 38400, diff --git a/kernel/src/driver/tty/tty_core.rs b/kernel/src/driver/tty/tty_core.rs index cb351380..1ba0a00e 100644 --- a/kernel/src/driver/tty/tty_core.rs +++ b/kernel/src/driver/tty/tty_core.rs @@ -142,18 +142,17 @@ impl TtyCore { } pub fn tty_mode_ioctl(tty: Arc, cmd: u32, arg: usize) -> Result { - let real_tty; let core = tty.core(); - if core.driver().tty_driver_type() == TtyDriverType::Pty + let real_tty = if core.driver().tty_driver_type() == TtyDriverType::Pty && core.driver().tty_driver_sub_type() == TtyDriverSubType::PtyMaster { - real_tty = core.link().unwrap(); + core.link().unwrap() } else { - real_tty = tty; - } + tty + }; match cmd { TtyIoctlCmd::TCGETS => { - let termios = PosixTermios::from_kernel_termios(real_tty.core.termios().clone()); + let termios = PosixTermios::from_kernel_termios(*real_tty.core.termios()); let mut user_writer = UserBufferWriter::new( VirtAddr::new(arg).as_ptr::(), core::mem::size_of::(), @@ -190,7 +189,7 @@ impl TtyCore { ) -> Result { #[allow(unused_assignments)] // TERMIOS_TERMIO下会用到 - let mut tmp_termios = tty.core().termios().clone(); + let mut tmp_termios = *tty.core().termios(); if opt.contains(TtySetTermiosOpt::TERMIOS_TERMIO) { todo!() @@ -223,7 +222,7 @@ impl TtyCore { pub fn set_termios_next(tty: Arc, new_termios: Termios) -> Result<(), SystemError> { let mut termios = tty.core().termios_write(); - let old_termios = termios.clone(); + let old_termios = *termios; *termios = new_termios; let tmp = termios.control_mode; termios.control_mode ^= (tmp ^ old_termios.control_mode) & ControlMode::ADDRB; @@ -245,7 +244,7 @@ impl TtyCore { } } -#[derive(Debug)] +#[derive(Debug, Default)] pub struct TtyContorlInfo { /// 前台进程pid pub session: Option, @@ -257,17 +256,6 @@ pub struct TtyContorlInfo { pub packet: bool, } -impl Default for TtyContorlInfo { - fn default() -> Self { - Self { - session: None, - pgid: None, - pktstatus: Default::default(), - packet: Default::default(), - } - } -} - #[derive(Debug, Default)] pub struct TtyCoreWriteData { /// 写缓冲区 @@ -341,7 +329,7 @@ impl TtyCoreData { #[inline] pub fn flags(&self) -> TtyFlag { - self.flags.read_irqsave().clone() + *self.flags.read_irqsave() } #[inline] diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index 4e791360..3f4c4461 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/kernel/src/driver/tty/tty_device.rs @@ -117,8 +117,7 @@ impl IndexNode for TtyDevice { }); let ret = tty.open(tty.core()); - if ret.is_err() { - let err = ret.unwrap_err(); + if let Err(err) = ret { if err == SystemError::ENOSYS { return Err(SystemError::ENODEV); } diff --git a/kernel/src/driver/tty/tty_driver.rs b/kernel/src/driver/tty/tty_driver.rs index 4b22f653..2c89feda 100644 --- a/kernel/src/driver/tty/tty_driver.rs +++ b/kernel/src/driver/tty/tty_driver.rs @@ -1,6 +1,10 @@ use core::{fmt::Debug, sync::atomic::Ordering}; -use alloc::{string::String, sync::Arc, vec::Vec}; +use alloc::{ + string::{String, ToString}, + sync::Arc, + vec::Vec, +}; use hashbrown::HashMap; use system_error::SystemError; @@ -109,6 +113,7 @@ pub struct TtyDriver { } impl TtyDriver { + #[allow(clippy::too_many_arguments)] pub fn new( count: u32, node_name: &'static str, @@ -142,7 +147,7 @@ impl TtyDriver { .flags .contains(TtyDriverFlag::TTY_DRIVER_UNNUMBERED_NODE) { - return format!("{}", self.name); + return self.name.to_string(); } else { return format!("{}{}", self.name, index + self.name_base); } @@ -165,10 +170,7 @@ impl TtyDriver { #[inline] fn lockup_tty(&self, index: usize) -> Option> { let device_guard = self.ttys.lock(); - return match device_guard.get(&index) { - Some(tty) => Some(tty.clone()), - None => None, - }; + return device_guard.get(&index).cloned(); } fn standard_install(&self, tty_core: Arc) -> Result<(), SystemError> { @@ -178,7 +180,7 @@ impl TtyDriver { if !self.flags.contains(TtyDriverFlag::TTY_DRIVER_RESET_TERMIOS) { // 先查看是否有已经保存的termios if let Some(t) = self.saved_termios.get(tty_index) { - let mut termios = t.clone(); + let mut termios = *t; termios.line = self.init_termios.line; tty.set_termios(termios); } @@ -195,8 +197,7 @@ impl TtyDriver { fn driver_install_tty(driver: Arc, tty: Arc) -> Result<(), SystemError> { let res = tty.install(driver.clone(), tty.clone()); - if res.is_err() { - let err = res.unwrap_err(); + if let Err(err) = res { if err == SystemError::ENOSYS { return driver.standard_install(tty); } else { @@ -236,10 +237,8 @@ impl TtyDriver { // TODO: 暂时这么写,因为还没写TtyPort if tty.core().port().is_none() { kwarn!("{} port is None", tty.core().name()); - } else { - if tty.core().port().unwrap().state() == TtyPortState::KOPENED { - return Err(SystemError::EBUSY); - } + } else if tty.core().port().unwrap().state() == TtyPortState::KOPENED { + return Err(SystemError::EBUSY); } tty.reopen()?; diff --git a/kernel/src/driver/tty/tty_ldisc/mod.rs b/kernel/src/driver/tty/tty_ldisc/mod.rs index 8f3d0475..4818e17b 100644 --- a/kernel/src/driver/tty/tty_ldisc/mod.rs +++ b/kernel/src/driver/tty/tty_ldisc/mod.rs @@ -103,8 +103,7 @@ impl TtyLdiscManager { let ld = tty.ldisc(); let ret = ld.open(tty); - if ret.is_err() { - let err = ret.unwrap_err(); + if let Err(err) = ret { if err == SystemError::ENOSYS { return Err(err); } diff --git a/kernel/src/driver/tty/tty_ldisc/ntty.rs b/kernel/src/driver/tty/tty_ldisc/ntty.rs index 98007e1a..25e82c1b 100644 --- a/kernel/src/driver/tty/tty_ldisc/ntty.rs +++ b/kernel/src/driver/tty/tty_ldisc/ntty.rs @@ -209,15 +209,10 @@ impl NTtyData { } if !overflow { - if flags.is_none() { - self.receive_buf(tty.clone(), &buf[offset..], flags, n); + if let Some(flags) = flags { + self.receive_buf(tty.clone(), &buf[offset..], Some(&flags[offset..]), n); } else { - self.receive_buf( - tty.clone(), - &buf[offset..], - Some(&flags.unwrap()[offset..]), - n, - ); + self.receive_buf(tty.clone(), &buf[offset..], flags, n); } } @@ -792,8 +787,8 @@ impl NTtyData { // 先处理信号 let mut ctrl_info = tty.core().contorl_info_irqsave(); let pg = ctrl_info.pgid; - if pg.is_some() { - let _ = Syscall::kill(pg.unwrap(), signal as i32); + if let Some(pg) = pg { + let _ = Syscall::kill(pg, signal as i32); } ctrl_info.pgid = None; @@ -1023,7 +1018,7 @@ impl NTtyData { // 找到eol的坐标 let tmp = self.read_flags.next_index(tail); // 找到的话即为坐标,未找到的话即为NTTY_BUFSIZE - let mut eol = if tmp.is_none() { size } else { tmp.unwrap() }; + let mut eol = if let Some(tmp) = tmp { tmp } else { size }; if eol > size { eol = size } @@ -1035,8 +1030,7 @@ impl NTtyData { let found = if eol == NTTY_BUFSIZE && more > 0 { // 需要返回头部 let ret = self.read_flags.first_index(); - if ret.is_some() { - let tmp = ret.unwrap(); + if let Some(tmp) = ret { // 在头部范围内找到eol if tmp < more { eol = tmp; @@ -1179,9 +1173,9 @@ impl NTtyData { } let mut cnt = 0; - for i in 0..nr { + for (i, c) in buf.iter().enumerate().take(nr) { cnt = i; - let c = buf[i]; + let c = *c; if c as usize == 8 { // 表示退格 if self.cursor_column > 0 { @@ -1247,7 +1241,7 @@ impl NTtyData { let echoed = self.echoes(tty.clone()); if echoed.is_ok() && echoed.unwrap() > 0 { - let _ = tty.flush_chars(tty.core()); + tty.flush_chars(tty.core()); } } @@ -1345,8 +1339,8 @@ impl NTtyData { if tty.put_char(tty.core(), 8).is_err() { tty.write(core, &[8], 1)?; } - if tty.put_char(tty.core(), ' ' as u8).is_err() { - tty.write(core, &[' ' as u8], 1)?; + if tty.put_char(tty.core(), b' ').is_err() { + tty.write(core, &[b' '], 1)?; } self.cursor_column -= 1; space -= 1; @@ -1490,18 +1484,18 @@ impl NTtyData { '\t' => { // 计算输出一个\t需要的空间 let spaces = 8 - (self.cursor_column & 7) as usize; - if termios.output_mode.contains(OutputMode::TABDLY) { - if OutputMode::TABDLY.bits() == OutputMode::XTABS.bits() { - // 配置的tab选项是真正输出空格到驱动 - if space < spaces { - // 空间不够 - return Err(SystemError::ENOBUFS); - } - self.cursor_column += spaces as u32; - // 写入sapces个空格 - tty.write(core, " ".as_bytes(), spaces)?; - return Ok(spaces); + if termios.output_mode.contains(OutputMode::TABDLY) + && OutputMode::TABDLY.bits() == OutputMode::XTABS.bits() + { + // 配置的tab选项是真正输出空格到驱动 + if space < spaces { + // 空间不够 + return Err(SystemError::ENOBUFS); } + self.cursor_column += spaces as u32; + // 写入sapces个空格 + tty.write(core, " ".as_bytes(), spaces)?; + return Ok(spaces); } self.cursor_column += spaces as u32; } @@ -1598,10 +1592,8 @@ impl TtyLineDiscipline for NTtyLinediscipline { } else if ldata.canon_copy_from_read_buf(buf, &mut nr, &mut offset)? { return Ok(len - nr); } - } else { - if ldata.copy_from_read_buf(termios, buf, &mut nr, &mut offset)? { - return Ok(len - nr); - } + } else if ldata.copy_from_read_buf(termios, buf, &mut nr, &mut offset)? { + return Ok(len - nr); } // 没有数据可读 @@ -1723,7 +1715,7 @@ impl TtyLineDiscipline for NTtyLinediscipline { let pcb = ProcessManager::current_pcb(); let binding = tty.clone(); let core = binding.core(); - let termios = core.termios().clone(); + let termios = *core.termios(); if termios.local_mode.contains(LocalMode::TOSTOP) { TtyJobCtrlManager::tty_check_change(tty.clone(), Signal::SIGTTOU)?; } @@ -1769,7 +1761,7 @@ impl TtyLineDiscipline for NTtyLinediscipline { nr -= 1; } - let _ = tty.flush_chars(core); + tty.flush_chars(core); } else { while nr > 0 { let write = tty.write(core, &buf[offset..], nr)?; @@ -1876,8 +1868,8 @@ impl TtyLineDiscipline for NTtyLinediscipline { // 第一次设置或者规范模式 (ICANON) 或者扩展处理 (EXTPROC) 标志发生变化 let mut spec_mode_changed = false; - if old.is_some() { - let local_mode = old.clone().unwrap().local_mode.bitxor(termios.local_mode); + if let Some(old) = old { + let local_mode = old.local_mode.bitxor(termios.local_mode); spec_mode_changed = local_mode.contains(LocalMode::ICANON) || local_mode.contains(LocalMode::EXTPROC); } @@ -2001,7 +1993,7 @@ impl TtyLineDiscipline for NTtyLinediscipline { // 原模式或real_raw ldata.raw = true; - if termios.input_mode.contains(InputMode::IGNBRK) + ldata.real_raw = termios.input_mode.contains(InputMode::IGNBRK) || (!termios.input_mode.contains(InputMode::BRKINT) && !termios.input_mode.contains(InputMode::PARMRK)) && (termios.input_mode.contains(InputMode::IGNPAR) @@ -2009,12 +2001,7 @@ impl TtyLineDiscipline for NTtyLinediscipline { && (core .driver() .flags() - .contains(TtyDriverFlag::TTY_DRIVER_REAL_RAW)) - { - ldata.real_raw = true; - } else { - ldata.real_raw = false; - } + .contains(TtyDriverFlag::TTY_DRIVER_REAL_RAW)); } // if !termios.input_mode.contains(InputMode::IXON) diff --git a/kernel/src/driver/tty/virtual_terminal/console_map.rs b/kernel/src/driver/tty/virtual_terminal/console_map.rs index 46f900b8..744c333a 100644 --- a/kernel/src/driver/tty/virtual_terminal/console_map.rs +++ b/kernel/src/driver/tty/virtual_terminal/console_map.rs @@ -1,5 +1,5 @@ /// Latin-1 字符集到 Unicode 的映射表。在这个表格中,每个位置都存储了相应 Latin-1 字符的 Unicode 编码。 -pub const LAT1_MAP: &'static [u16] = &[ +pub const LAT1_MAP: &[u16] = &[ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, @@ -25,7 +25,7 @@ pub const LAT1_MAP: &'static [u16] = &[ ]; /// 将 VT100 图形字符映射到 Unicode 的映射表 -pub const GRAF_MAP: &'static [u16] = &[ +pub const GRAF_MAP: &[u16] = &[ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, @@ -51,7 +51,7 @@ pub const GRAF_MAP: &'static [u16] = &[ ]; /// 将 IBM Codepage 437 字符集映射到 Unicode 的映射表 -pub const IBMPC_MAP: &'static [u16] = &[ +pub const IBMPC_MAP: &[u16] = &[ 0x0000, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c, 0x25b6, 0x25c0, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8, 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bc, 0x0020, 0x0021, 0x0022, 0x0023, @@ -77,7 +77,7 @@ pub const IBMPC_MAP: &'static [u16] = &[ ]; /// 默认直接映射表 -pub const USER_MAP: &'static [u16] = &[ +pub const USER_MAP: &[u16] = &[ 0xf000, 0xf001, 0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007, 0xf008, 0xf009, 0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f, 0xf010, 0xf011, 0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017, 0xf018, 0xf019, 0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf020, 0xf021, 0xf022, 0xf023, @@ -105,10 +105,10 @@ pub const USER_MAP: &'static [u16] = &[ #[allow(dead_code)] #[derive(Debug, Clone)] pub enum TranslationMapType { - Lat1Map, - GrafMap, - IbmpcMap, - UserMap, + Lat1, + Graf, + Ibmpc, + User, } #[derive(Debug, Clone)] @@ -120,10 +120,10 @@ pub struct TranslationMap { impl TranslationMap { pub const fn new(map_type: TranslationMapType) -> Self { let map = match map_type { - TranslationMapType::Lat1Map => LAT1_MAP, - TranslationMapType::GrafMap => GRAF_MAP, - TranslationMapType::IbmpcMap => IBMPC_MAP, - TranslationMapType::UserMap => USER_MAP, + TranslationMapType::Lat1 => LAT1_MAP, + TranslationMapType::Graf => GRAF_MAP, + TranslationMapType::Ibmpc => IBMPC_MAP, + TranslationMapType::User => USER_MAP, }; Self { map_type, map } diff --git a/kernel/src/driver/tty/virtual_terminal/mod.rs b/kernel/src/driver/tty/virtual_terminal/mod.rs index 1f8ab8d6..3543110b 100644 --- a/kernel/src/driver/tty/virtual_terminal/mod.rs +++ b/kernel/src/driver/tty/virtual_terminal/mod.rs @@ -44,7 +44,7 @@ pub const DEFAULT_BLUE: [u16; 16] = [ 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0xff, 0xff, 0xff, 0xff, ]; -pub const COLOR_TABLE: &'static [u8] = &[0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15]; +pub const COLOR_TABLE: &[u8] = &[0, 4, 2, 6, 1, 5, 3, 7, 8, 12, 10, 14, 9, 13, 11, 15]; lazy_static! { pub static ref VIRT_CONSOLES: Vec>> = { @@ -293,7 +293,7 @@ pub fn vty_init() -> Result<(), SystemError> { Major::TTY_MAJOR, 0, TtyDriverType::Console, - TTY_STD_TERMIOS.clone(), + *TTY_STD_TERMIOS, Arc::new(TtyConsoleDriverInner::new()?), ); diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index 5746326e..e0019d93 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -187,13 +187,13 @@ impl VirtualConsoleData { autowrap: Default::default(), cursor_visible: Default::default(), insert_mode: Default::default(), - private: Vt102_OP::EPecma, + private: Vt102_OP::Pecma, need_wrap: Default::default(), report_mouse: Default::default(), utf: Default::default(), utf_count: Default::default(), utf_char: Default::default(), - translate: TranslationMap::new(TranslationMapType::Lat1Map), + translate: TranslationMap::new(TranslationMapType::Lat1), npar: Default::default(), tab_stop: StaticBitmap::new(), par: [0; 16], @@ -206,11 +206,11 @@ impl VirtualConsoleData { } pub(super) fn init(&mut self, rows: Option, cols: Option, clear: bool) { - if rows.is_some() { - self.rows = rows.unwrap(); + if let Some(rows) = rows { + self.rows = rows; } - if cols.is_some() { - self.cols = cols.unwrap(); + if let Some(cols) = cols { + self.cols = cols; } self.pos = self.cols * self.state.y + self.state.x; @@ -263,7 +263,7 @@ impl VirtualConsoleData { self.need_wrap = false; self.report_mouse = 0; self.utf_count = 0; - self.translate = TranslationMap::new(TranslationMapType::Lat1Map); + self.translate = TranslationMap::new(TranslationMapType::Lat1); self.utf = true; self.pid = None; self.vc_state = VirtualConsoleState::ESnormal; @@ -321,8 +321,8 @@ impl VirtualConsoleData { if self.utf && !self.display_ctrl { // utf模式并且不显示控制字符 let (ret, rescan) = self.translate_unicode(*c); - if ret.is_some() { - *c = ret.unwrap(); + if let Some(ret) = ret { + *c = ret; } return (ret, rescan); } @@ -425,7 +425,7 @@ impl VirtualConsoleData { /// 但是有一些特殊的代码点是无效的或者保留给特定用途的。 /// 这个函数的主要目的是将无效的 Unicode 代码点替换为 U+FFFD,即 Unicode 替代字符。 fn sanitize_unicode(c: u32) -> u32 { - if (c >= 0xd800 && c <= 0xdfff) || c == 0xfffe || c == 0xffff { + if (0xd800..=0xdfff).contains(&c) || c == 0xfffe || c == 0xffff { return 0xfffd; } return c; @@ -502,7 +502,7 @@ impl VirtualConsoleData { } let mut soft_cursor_guard = SOFTCURSOR_ORIGINAL.write_irqsave(); - *soft_cursor_guard = Some(unsafe { VcCursor::from_bits_unchecked(i as u32) }); + *soft_cursor_guard = Some(unsafe { VcCursor::from_bits_unchecked(i) }); let soft_cursor = soft_cursor_guard.unwrap(); @@ -523,7 +523,7 @@ impl VirtualConsoleData { let _ = self.driver_funcs() - .con_putc(&self, i as u16, self.state.y as u32, self.state.x as u32); + .con_putc(self, i as u16, self.state.y as u32, self.state.x as u32); } pub fn hide_cursor(&mut self) { @@ -538,7 +538,7 @@ impl VirtualConsoleData { if softcursor.is_some() { self.screen_buf[self.pos] = softcursor.unwrap().bits as u16; let _ = self.driver_funcs().con_putc( - &self, + self, softcursor.unwrap().bits as u16, self.state.y as u32, self.state.x as u32, @@ -560,12 +560,10 @@ impl VirtualConsoleData { fn gotoxy(&mut self, x: i32, y: i32) { if x < 0 { self.state.x = 0; + } else if x as usize >= self.cols { + self.state.x = self.cols - 1; } else { - if x as usize >= self.cols { - self.state.x = self.cols - 1; - } else { - self.state.x = x as usize; - } + self.state.x = x as usize; } let max_y; @@ -579,9 +577,9 @@ impl VirtualConsoleData { } if y < min_y as i32 { - self.state.y = min_y as usize; + self.state.y = min_y; } else if y >= max_y as i32 { - self.state.y = max_y as usize; + self.state.y = max_y; } else { self.state.y = y as usize; } @@ -635,7 +633,7 @@ impl VirtualConsoleData { /// ## 换行 fn line_feed(&mut self) { - if self.state.y + 1 == self.bottom as usize { + if self.state.y + 1 == self.bottom { self.scroll(ScrollDir::Up, 1); } else if self.state.y < self.rows - 1 { self.state.y += 1; @@ -661,7 +659,7 @@ impl VirtualConsoleData { /// ## 向上滚动虚拟终端的内容,或者将光标上移一行 fn reverse_index(&mut self) { - if self.state.y == self.top as usize { + if self.state.y == self.top { self.scroll(ScrollDir::Down, 1); } else if self.state.y > 0 { self.state.y -= 1; @@ -686,7 +684,7 @@ impl VirtualConsoleData { /// ## 设置当前vt的各项属性 fn set_mode(&mut self, on_off: bool) { for i in 0..self.npar as usize { - if self.private == Vt102_OP::EPdec { + if self.private == Vt102_OP::Pdec { match self.par[i] { 1 => { todo!("kbd todo"); @@ -746,9 +744,9 @@ impl VirtualConsoleData { return; } - if c >= '0' && c <= '9' { + if c.is_ascii_digit() { self.par[self.npar as usize] *= 10; - self.par[self.npar as usize] += (c as u8 - '0' as u8) as u32; + self.par[self.npar as usize] += (c as u8 - b'0') as u32; return; } @@ -761,19 +759,19 @@ impl VirtualConsoleData { match c { 'h' => { - if self.private <= Vt102_OP::EPdec { + if self.private <= Vt102_OP::Pdec { self.set_mode(true); } return; } 'l' => { - if self.private <= Vt102_OP::EPdec { + if self.private <= Vt102_OP::Pdec { self.set_mode(false); } return; } 'c' => { - if self.private == Vt102_OP::EPdec { + if self.private == Vt102_OP::Pdec { if self.par[0] != 0 { self.cursor_type = VcCursor::make_cursor(self.par[0], self.par[1], self.par[2]) @@ -784,7 +782,7 @@ impl VirtualConsoleData { } } 'm' => { - if self.private == Vt102_OP::EPdec { + if self.private == Vt102_OP::Pdec { if self.par[0] != 0 { self.complement_mask = (self.par[0] << 8 | self.par[1]) as u16; } else { @@ -794,7 +792,7 @@ impl VirtualConsoleData { } } 'n' => { - if self.private == Vt102_OP::EPecma { + if self.private == Vt102_OP::Pecma { if self.par[0] == 5 { send_to_default_serial8250_port("tty status report todo".as_bytes()); panic!(); @@ -808,8 +806,8 @@ impl VirtualConsoleData { _ => {} } - if self.private != Vt102_OP::EPecma { - self.private = Vt102_OP::EPecma; + if self.private != Vt102_OP::Pecma { + self.private = Vt102_OP::Pecma; return; } @@ -930,7 +928,7 @@ impl VirtualConsoleData { } 'g' => { if self.par[0] == 0 && self.state.x < 256 { - self.tab_stop.set(self.state.x as usize, true); + self.tab_stop.set(self.state.x, true); } else if self.par[0] == 3 { self.tab_stop.set_all(false); } @@ -994,12 +992,12 @@ impl VirtualConsoleData { 1 => { // 设置粗体 - self.state.intensity = VirtualConsoleIntensity::VciBold; + self.state.intensity = VirtualConsoleIntensity::Bold; } 2 => { // 设置半亮度(半明显 - self.state.intensity = VirtualConsoleIntensity::VciHalfBright; + self.state.intensity = VirtualConsoleIntensity::HalfBright; } 3 => { @@ -1041,7 +1039,7 @@ impl VirtualConsoleData { 22 => { // 关闭粗体和半亮度,恢复正常亮度 - self.state.intensity = VirtualConsoleIntensity::VciNormal; + self.state.intensity = VirtualConsoleIntensity::Normal; } 23 => { @@ -1068,8 +1066,7 @@ impl VirtualConsoleData { // 设置前景色 let (idx, color) = self.t416_color(i); i = idx; - if color.is_some() { - let color = color.unwrap(); + if let Some(color) = color { let mut max = color.red.max(color.green); max = max.max(color.blue); @@ -1086,11 +1083,11 @@ impl VirtualConsoleData { if hue == 7 && max <= 0x55 { hue = 0; - self.state.intensity = VirtualConsoleIntensity::VciBold; + self.state.intensity = VirtualConsoleIntensity::Bold; } else if max > 0xaa { - self.state.intensity = VirtualConsoleIntensity::VciBold; + self.state.intensity = VirtualConsoleIntensity::Bold; } else { - self.state.intensity = VirtualConsoleIntensity::VciNormal; + self.state.intensity = VirtualConsoleIntensity::Normal; } self.state.color = (self.state.color & 0xf0) | hue; @@ -1101,8 +1098,7 @@ impl VirtualConsoleData { // 设置背景色 let (idx, color) = self.t416_color(i); i = idx; - if color.is_some() { - let color = color.unwrap(); + if let Some(color) = color { self.state.color = (self.state.color & 0x0f) | ((color.red as u8 & 0x80) >> 1) | ((color.green as u8 & 0x80) >> 2) @@ -1123,7 +1119,7 @@ impl VirtualConsoleData { _ => { if self.par[i] >= 90 && self.par[i] <= 107 { if self.par[i] < 100 { - self.state.intensity = VirtualConsoleIntensity::VciBold; + self.state.intensity = VirtualConsoleIntensity::Bold; } self.par[i] -= 60; } @@ -1241,16 +1237,18 @@ impl VirtualConsoleData { return (idx, None); } - if self.par[idx] == 5 && idx + 1 <= self.npar as usize { + if self.par[idx] == 5 && idx < self.npar as usize { // 256色 idx += 1; return (idx, Some(Color::from_256(self.par[idx]))); } else if self.par[idx] == 2 && idx + 3 <= self.npar as usize { // 24位 - let mut color = Color::default(); - color.red = self.par[idx + 1] as u16; - color.green = self.par[idx + 2] as u16; - color.blue = self.par[idx + 3] as u16; + let color = Color { + red: self.par[idx + 1] as u16, + green: self.par[idx + 2] as u16, + blue: self.par[idx + 3] as u16, + ..Default::default() + }; idx += 3; return (idx, Some(color)); } else { @@ -1262,7 +1260,7 @@ impl VirtualConsoleData { #[inline(never)] pub(super) fn do_control(&mut self, ch: u32) { // 首先检查是否处于 ANSI 控制字符串状态 - if self.vc_state.is_ansi_control_string() && ch >= 8 && ch <= 13 { + if self.vc_state.is_ansi_control_string() && (8..=13).contains(&ch) { return; } @@ -1289,17 +1287,17 @@ impl VirtualConsoleData { let ret = self.tab_stop.next_index(self.state.x + 1); - if ret.is_none() { - self.state.x = self.cols - 1; + if let Some(x) = ret { + self.state.x = x; } else { - self.state.x = ret.unwrap(); + self.state.x = self.cols - 1; } self.pos += self.state.x; // TODO: notify return; } - 10 | 11 | 12 => { + 10..=12 => { // LD line feed self.line_feed(); // TODO: 检查键盘模式 @@ -1416,25 +1414,25 @@ impl VirtualConsoleData { match c { '?' => { - self.private = Vt102_OP::EPdec; + self.private = Vt102_OP::Pdec; return; } '>' => { - self.private = Vt102_OP::EPgt; + self.private = Vt102_OP::Pgt; return; } '=' => { - self.private = Vt102_OP::EPeq; + self.private = Vt102_OP::Peq; return; } '<' => { - self.private = Vt102_OP::EPlt; + self.private = Vt102_OP::Plt; return; } _ => {} } - self.private = Vt102_OP::EPecma; + self.private = Vt102_OP::Pecma; self.do_getpars(c); } VirtualConsoleState::ESgetpars => { @@ -1478,7 +1476,7 @@ impl VirtualConsoleData { return; } VirtualConsoleState::EScsiignore => { - if ch >= 20 && ch <= 0x3f { + if (20..=0x3f).contains(&ch) { return; } self.vc_state = VirtualConsoleState::ESnormal; @@ -1496,7 +1494,7 @@ impl VirtualConsoleData { } else if c == 'R' { self.reset_palette(); self.vc_state = VirtualConsoleState::ESnormal; - } else if c >= '0' && c <= '9' { + } else if c.is_ascii_digit() { self.vc_state = VirtualConsoleState::ESosc; } else { self.vc_state = VirtualConsoleState::ESnormal; @@ -1504,7 +1502,7 @@ impl VirtualConsoleData { } VirtualConsoleState::ESpalette => { let c = ch as u8 as char; - if c.is_digit(16) { + if c.is_ascii_hexdigit() { self.npar += 1; self.par[self.npar as usize] = c.to_digit(16).unwrap(); @@ -1549,10 +1547,8 @@ impl VirtualConsoleData { let mut width = 1; // 表示需不需要反转 let mut invert = false; - if self.utf && !self.display_ctrl { - if FontDesc::is_double_width(c) { - width = 2; - } + if self.utf && !self.display_ctrl && FontDesc::is_double_width(c) { + width = 2; } let tmp = self.unicode_to_index(tc); @@ -1597,7 +1593,7 @@ impl VirtualConsoleData { // TODO: 处理unicode screen buf if himask != 0 { - tc = ((if tc & 0x100 != 0 { himask as u32 } else { 0 }) | (tc & 0xff)) as u32; + tc = (if tc & 0x100 != 0 { himask as u32 } else { 0 }) | (tc & 0xff); } tc |= ((attr as u32) << 8) & (!himask as u32); @@ -1665,12 +1661,11 @@ impl VirtualConsoleData { /// ## 更新虚拟控制台指定区域的显示 fn do_update_region(&self, mut start: usize, mut count: usize) { let ret = self.driver_funcs().con_getxy(self, start); - let (mut x, mut y) = if ret.is_err() { - (start % self.cols, start / self.cols) - } else { - let (_, tmp_x, tmp_y) = ret.unwrap(); + let (mut x, mut y) = if let Ok((_, tmp_x, tmp_y)) = ret { // start = tmp_start; (tmp_x, tmp_y) + } else { + (start % self.cols, start / self.cols) }; loop { @@ -1681,20 +1676,18 @@ impl VirtualConsoleData { while count != 0 && x < self.cols { // 检查属性是否变化,如果属性变了,则将前一个字符先输出 - if attr != (self.screen_buf[start] & 0xff00) { - if size > 0 { - let _ = self.driver_funcs().con_putcs( - self, - &self.screen_buf[start..], - size, - y as u32, - startx as u32, - ); - startx = x; - start += size; - size = 0; - attr = self.screen_buf[start] & 0xff00; - } + if attr != (self.screen_buf[start] & 0xff00) && size > 0 { + let _ = self.driver_funcs().con_putcs( + self, + &self.screen_buf[start..], + size, + y as u32, + startx as u32, + ); + startx = x; + start += size; + size = 0; + attr = self.screen_buf[start] & 0xff00; } size += 1; x += 1; @@ -1719,8 +1712,8 @@ impl VirtualConsoleData { y += 1; let ret = self.driver_funcs().con_getxy(self, start); - if ret.is_ok() { - start = ret.unwrap().0; + if let Ok(ret) = ret { + start = ret.0; } else { return; } @@ -1738,7 +1731,7 @@ impl VirtualConsoleData { } else if ch < 0x20 { // 不可打印 return -1; - } else if ch == 0xfeff || (ch >= 0x200b && ch <= 0x200f) { + } else if ch == 0xfeff || (0x200b..=0x200f).contains(&ch) { // 零长空格 return -2; } else if (ch & !Self::UNI_DIRECT_MAKS) == Self::UNI_DIRECT_BASE { @@ -1771,7 +1764,7 @@ impl VirtualConsoleData { &self.screen_buf[draw.offset..draw.offset + draw.size], draw.size, self.state.y as u32, - draw.x.unwrap() as u32, + draw.x.unwrap(), ); draw.x = None; @@ -1791,8 +1784,8 @@ impl VirtualConsoleData { .driver_funcs() .con_build_attr(self, color, intensity, blink, underline, reverse, italic); - if ret.is_ok() { - return ret.unwrap(); + if let Ok(ret) = ret { + return ret; } let mut ret = color; @@ -1809,7 +1802,7 @@ impl VirtualConsoleData { ret = (ret & 0xf0) | self.italic_color as u8; } else if underline { ret = (ret & 0xf0) | self.underline_color as u8; - } else if intensity == VirtualConsoleIntensity::VciHalfBright { + } else if intensity == VirtualConsoleIntensity::HalfBright { ret = (ret & 0xf0) | self.half_color as u8; } @@ -1821,7 +1814,7 @@ impl VirtualConsoleData { ret ^= 0x80; } - if intensity == VirtualConsoleIntensity::VciBold { + if intensity == VirtualConsoleIntensity::Bold { ret ^= 0x08; } @@ -1845,7 +1838,7 @@ impl VirtualConsoleData { self.erase_char = ' ' as u16 | ((self.build_attr( self.state.color, - VirtualConsoleIntensity::VciNormal, + VirtualConsoleIntensity::Normal, self.state.blink, false, self.screen_mode, @@ -1855,7 +1848,7 @@ impl VirtualConsoleData { } fn default_attr(&mut self) { - self.state.intensity = VirtualConsoleIntensity::VciNormal; + self.state.intensity = VirtualConsoleIntensity::Normal; self.state.italic = false; self.state.underline = false; self.state.reverse = false; @@ -1903,16 +1896,16 @@ impl VirtualConsoleInfo { #[derive(Debug, Clone, PartialEq, Copy)] pub enum VirtualConsoleIntensity { /// 暗淡 - VciHalfBright = 0, + HalfBright = 0, /// 正常 - VciNormal = 1, + Normal = 1, /// 粗体 - VciBold = 2, + Bold = 2, } impl Default for VirtualConsoleIntensity { fn default() -> Self { - Self::VciNormal + Self::Normal } } @@ -1972,11 +1965,11 @@ impl VirtualConsoleState { #[derive(Debug, Clone, PartialEq, PartialOrd)] #[allow(non_camel_case_types)] pub enum Vt102_OP { - EPecma, - EPdec, - EPeq, - EPgt, - EPlt, + Pecma, + Pdec, + Peq, + Pgt, + Plt, } bitflags! { diff --git a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs index d225c1c2..9ffa4d10 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs @@ -81,10 +81,10 @@ impl BlittingFbConsole { 其中颜色0映射为黑色,颜色1到6映射为白色, 颜色7到8映射为灰色,其他颜色映射为强烈的白色。 */ - if color >= 1 && color <= 6 { + if (1..=6).contains(&color) { // 白色 color = 2; - } else if color >= 7 && color <= 8 { + } else if (7..=8).contains(&color) { // 灰色 color = 1; } else { @@ -138,17 +138,16 @@ impl BlittingFbConsole { let byte_width = vc_data.font.width as usize / 8; let font_height = vc_data.font.height as usize; // let mut char_offset = 0; - for char_offset in 0..cnt as usize { + for (char_offset, char_item) in buf.iter().enumerate().take(cnt as usize) { // 在字符表中的index - let ch = buf[char_offset] & charmask; + let ch = char_item & charmask; // 计算出在font表中的偏移量 let font_offset = ch as usize * cellsize as usize; let font_offset_end = font_offset + cellsize as usize; // 设置image的data let src = &vc_data.font.data[font_offset..font_offset_end]; - let mut dst = Vec::new(); - dst.resize(src.len(), 0); + let mut dst = vec![0; src.len()]; dst.copy_from_slice(src); if !attr.is_empty() { @@ -255,18 +254,18 @@ impl ConsoleSwitch for BlittingFbConsole { } let y_break = (fb_data.display.virt_rows - fb_data.display.yscroll) as usize; - if sy < y_break && sy + height - 1 >= y_break { + if sy < y_break && sy + height > y_break { // 分两次clear let b = y_break - sy; let _ = self.clear( - &vc_data, + vc_data, fb_data.display.real_y(sy as u32), sx as u32, b as u32, width as u32, ); let _ = self.clear( - &vc_data, + vc_data, fb_data.display.real_y((sy + b) as u32), sx as u32, (height - b) as u32, @@ -274,7 +273,7 @@ impl ConsoleSwitch for BlittingFbConsole { ); } else { let _ = self.clear( - &vc_data, + vc_data, fb_data.display.real_y(sy as u32), sx as u32, height as u32, @@ -337,6 +336,7 @@ impl ConsoleSwitch for BlittingFbConsole { } } + #[allow(clippy::if_same_then_else)] fn con_cursor( &self, vc_data: &VirtualConsoleData, @@ -671,7 +671,7 @@ impl FrameBufferConsole for BlittingFbConsole { let attr = FbConAttr::get_attr(c, fb_info.color_depth()); let char_offset = (c as usize & charmask) * ((w * vc_data.font.height) as usize); - if fbcon_data.cursor_state.image.data != &vc_data.font.data[char_offset..] + if fbcon_data.cursor_state.image.data != vc_data.font.data[char_offset..] || fbcon_data.cursor_reset { fbcon_data.cursor_state.image.data = vc_data.font.data[char_offset..].to_vec(); diff --git a/kernel/src/driver/video/fbdev/base/fbcon/mod.rs b/kernel/src/driver/video/fbdev/base/fbcon/mod.rs index e9a16fc5..2d0b346c 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/mod.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/mod.rs @@ -367,6 +367,7 @@ pub trait FrameBufferConsole { /// ### dx: 目标位置的x坐标 /// ### height: 位图高度 /// ### width: 位图宽度 + #[allow(clippy::too_many_arguments)] fn bmove( &self, vc_data: &VirtualConsoleData, @@ -401,6 +402,7 @@ pub trait FrameBufferConsole { /// ### x: 起始位置的x坐标、 /// ### fg: 前景色 /// ### bg: 背景色 + #[allow(clippy::too_many_arguments)] fn put_string( &self, vc_data: &VirtualConsoleData, diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index e3025080..41dacf85 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -10,14 +10,14 @@ use crate::{ use self::fbmem::{FbDevice, FrameBufferManager}; -const COLOR_TABLE_8: &'static [u32] = &[ +const COLOR_TABLE_8: &[u32] = &[ 0x00000000, 0xff000000, 0x00ff0000, 0xffff0000, 0x0000ff00, 0xff00ff00, 0x00ffff00, 0xffffff00, 0x000000ff, 0xff0000ff, 0x00ff00ff, 0xffff00ff, 0x0000ffff, 0xff00ffff, 0x00ffffff, 0xffffffff, ]; -const COLOR_TABLE_16: &'static [u32] = &[0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff]; +const COLOR_TABLE_16: &[u32] = &[0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff]; -const COLOR_TABLE_32: &'static [u32] = &[0x00000000, 0xffffffff]; +const COLOR_TABLE_32: &[u32] = &[0x00000000, 0xffffffff]; pub mod fbcon; pub mod fbmem; @@ -80,7 +80,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { return; } let mut dst1 = dst1.unwrap(); - dst1 = dst1 + VirtAddr::new(bitstart as usize); + dst1 += VirtAddr::new(bitstart as usize); let _ = self.fb_sync(); @@ -102,8 +102,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { && start_index == 0 && pitch_index == 0 && image.width & (32 / bit_per_pixel - 1) == 0 - && bit_per_pixel >= 8 - && bit_per_pixel <= 32 + && (8..=32).contains(&bit_per_pixel) { unsafe { self.fast_imageblit(image, dst1, fg, bg) } } else { @@ -126,23 +125,16 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { let mut bgx = bg; let ppw = 32 / bpp; let spitch = (image.width + 7) / 8; - let tab: &[u32]; let mut color_tab: [u32; 16] = [0; 16]; - match bpp { - 8 => { - tab = COLOR_TABLE_8; - } - 16 => { - tab = COLOR_TABLE_16; - } - 32 => { - tab = COLOR_TABLE_32; - } + let tab: &[u32] = match bpp { + 8 => COLOR_TABLE_8, + 16 => COLOR_TABLE_16, + 32 => COLOR_TABLE_32, _ => { return; } - } + }; for _ in (0..(ppw - 1)).rev() { fgx <<= bpp; @@ -175,7 +167,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { while j >= 2 { *dst = color_tab[(image.data[src] as usize >> 4) & bitmask]; dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 0) & bitmask]; + *dst = color_tab[(image.data[src] as usize) & bitmask]; dst = dst.add(1); j -= 2; src += 1; @@ -191,7 +183,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { dst = dst.add(1); *dst = color_tab[(image.data[src] as usize >> 2) & bitmask]; dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 0) & bitmask]; + *dst = color_tab[(image.data[src] as usize) & bitmask]; dst = dst.add(1); src += 1; j -= 4; @@ -215,7 +207,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { dst = dst.add(1); *dst = color_tab[(image.data[src] as usize >> 1) & bitmask]; dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 0) & bitmask]; + *dst = color_tab[(image.data[src] as usize) & bitmask]; dst = dst.add(1); src += 1; j -= 8; @@ -224,6 +216,11 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _ => {} } + /* + * For image widths that are not a multiple of 8, there + * are trailing pixels left on the current line. Print + * them as well. + */ while j != 0 { shift -= ppw; *dst = color_tab[(image.data[src] as usize >> shift) & bitmask]; @@ -232,6 +229,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { shift = 8; src += 1; } + j -= 1; } dst1 += VirtAddr::new(self.current_fb_fix().line_length as usize); @@ -441,7 +439,7 @@ pub trait FrameBufferOps { } } - let _ = self.fb_image_blit(&image); + self.fb_image_blit(&image); Ok(()) } @@ -660,22 +658,17 @@ impl Default for FbVarScreenInfo { /// /// 默认为彩色 #[allow(dead_code)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum FbColorMode { /// 灰度 GrayScale, /// 彩色 + #[default] Color, /// FOURCC FourCC, } -impl Default for FbColorMode { - fn default() -> Self { - FbColorMode::Color - } -} - /// `FbBitfield` 结构体用于描述颜色字段的位域。 /// /// 所有的偏移量都是从右边开始,位于一个精确为'bits_per_pixel'宽度的"像素"值内。 @@ -684,7 +677,7 @@ impl Default for FbColorMode { /// 对于伪颜色:所有颜色组件的偏移和长度应该相同。 /// 偏移指定了调色板索引在像素值中的最低有效位的位置。 /// 长度表示可用的调色板条目的数量(即条目数 = 1 << 长度)。 -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub struct FbBitfield { /// 位域的起始位置 pub offset: u32, @@ -705,16 +698,6 @@ impl FbBitfield { } } -impl Default for FbBitfield { - fn default() -> Self { - Self { - offset: Default::default(), - length: Default::default(), - msb_right: Default::default(), - } - } -} - bitflags! { /// `FbActivateFlags` 用于描述帧缓冲区的激活标志。 /// @@ -750,8 +733,9 @@ impl Default for FbActivateFlags { } #[allow(dead_code)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum FbPixelFormat { + #[default] Standard, /// Hold And Modify HAM, @@ -759,12 +743,6 @@ pub enum FbPixelFormat { Reserved, } -impl Default for FbPixelFormat { - fn default() -> Self { - FbPixelFormat::Standard - } -} - bitflags! { pub struct FbSyncFlags: u32 { /// 水平同步高电平有效 @@ -806,9 +784,10 @@ bitflags! { /// 视频颜色空间 #[allow(dead_code)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum V4l2Colorspace { /// 默认颜色空间,即让驱动程序自行判断。只能用于视频捕获。 + #[default] Default = 0, /// SMPTE 170M:用于广播NTSC/PAL SDTV Smpte170m = 1, @@ -840,12 +819,6 @@ pub enum V4l2Colorspace { Last, } -impl Default for V4l2Colorspace { - fn default() -> Self { - V4l2Colorspace::Default - } -} - /// `FixedScreenInfo` 结构体用于描述屏幕的固定属性。 #[allow(dead_code)] #[derive(Debug, Copy, Clone, Eq, PartialEq)] @@ -964,19 +937,14 @@ pub enum FbVisual { } #[allow(dead_code)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum FbCapability { + #[default] Default = 0, /// 设备支持基于FOURCC的格式。 FourCC, } -impl Default for FbCapability { - fn default() -> Self { - FbCapability::Default - } -} - /// 视频模式 #[allow(dead_code)] #[derive(Debug, Clone, Eq, PartialEq)] @@ -1012,9 +980,10 @@ pub struct FbVideoMode { } #[allow(dead_code)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub enum FbAccel { /// 没有硬件加速器 + #[default] None, AtariBlitter = 1, @@ -1078,12 +1047,6 @@ pub enum FbAccel { // Add other accelerators here } -impl Default for FbAccel { - fn default() -> Self { - FbAccel::None - } -} - #[derive(Debug, Copy, Clone)] pub struct BootTimeScreenInfo { pub origin_x: u8, diff --git a/kernel/src/driver/video/fbdev/vesafb.rs b/kernel/src/driver/video/fbdev/vesafb.rs index f718f71c..c191f05b 100644 --- a/kernel/src/driver/video/fbdev/vesafb.rs +++ b/kernel/src/driver/video/fbdev/vesafb.rs @@ -390,14 +390,14 @@ impl FrameBufferOps for VesaFb { .screen_info .lfb_virt_base .ok_or(SystemError::ENODEV)?; - let fg; - if self.current_fb_fix().visual == FbVisual::TrueColor + + let fg = if self.current_fb_fix().visual == FbVisual::TrueColor || self.current_fb_fix().visual == FbVisual::DirectColor { - fg = self.fb_data.read().pesudo_palette[rect.color as usize]; + self.fb_data.read().pesudo_palette[rect.color as usize] } else { - fg = rect.color; - } + rect.color + }; let bpp = self.current_fb_var().bits_per_pixel; // 每行像素数 @@ -533,8 +533,7 @@ impl FrameBufferOps for VesaFb { } } } else { - let mut tmp: Vec = Vec::with_capacity(size); - tmp.resize(size, 0); + let mut tmp: Vec = vec![0; size]; let mut tmp_ptr = tmp.as_mut_ptr(); // 这里是一个可以优化的点,现在为了避免指针拷贝时覆盖,统一先拷贝进入buf再拷贝到dst @@ -575,11 +574,11 @@ impl FrameBufferInfo for VesaFb { } fn current_fb_var(&self) -> FbVarScreenInfo { - VESAFB_DEFINED.read().clone() + *VESAFB_DEFINED.read() } fn current_fb_fix(&self) -> FixedScreenInfo { - VESAFB_FIX_INFO.read().clone() + *VESAFB_FIX_INFO.read() } fn video_mode(&self) -> Option<&FbVideoMode> { diff --git a/kernel/src/driver/video/mod.rs b/kernel/src/driver/video/mod.rs index 569029fb..7cc95b50 100644 --- a/kernel/src/driver/video/mod.rs +++ b/kernel/src/driver/video/mod.rs @@ -25,12 +25,12 @@ static mut __MAMAGER: Option = None; pub fn video_refresh_manager() -> &'static VideoRefreshManager { return unsafe { - &__MAMAGER + __MAMAGER .as_ref() .expect("Video refresh manager has not been initialized yet!") }; } - +#[allow(clippy::type_complexity)] ///管理显示刷新变量的结构体 pub struct VideoRefreshManager { device_buffer: RwLock, @@ -69,11 +69,7 @@ impl VideoRefreshManager { let res = self .running .compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst); - if res.is_ok() { - return true; - } else { - return false; - } + return res.is_ok(); } /** @@ -152,7 +148,7 @@ impl VideoRefreshManager { } return Err(SystemError::EINVAL); } - + #[allow(clippy::type_complexity)] #[allow(dead_code)] pub fn refresh_target(&self) -> RwLockReadGuard<'_, Option>>>> { let x = self.refresh_target.read(); @@ -244,6 +240,7 @@ impl TimerFunction for VideoRefreshExecutor { * @brief 交给定时器执行的任务,此方法不应手动调用 * @return Ok(()) */ + #[allow(clippy::type_complexity)] fn run(&mut self) -> Result<(), SystemError> { // 获得Manager let manager = video_refresh_manager(); @@ -276,7 +273,7 @@ impl TimerFunction for VideoRefreshExecutor { let refresh_target = refresh_target.unwrap(); if let ScmBuffer::DeviceBuffer(vaddr) = manager.device_buffer().buf { - let p = vaddr.as_ptr() as *mut u8; + let p: *mut u8 = vaddr.as_ptr(); let mut target_guard = None; for _ in 0..2 { if let Ok(guard) = refresh_target.as_ref().unwrap().try_lock_irqsave() { diff --git a/kernel/src/driver/virtio/irq.rs b/kernel/src/driver/virtio/irq.rs index f3717888..629c09f8 100644 --- a/kernel/src/driver/virtio/irq.rs +++ b/kernel/src/driver/virtio/irq.rs @@ -71,7 +71,7 @@ impl VirtIOIrqManager { pub fn lookup_device(&self, dev_id: &Arc) -> Option> { let map = self.map.read_irqsave(); - map.get(dev_id).map(|x| x.clone()) + map.get(dev_id).cloned() } } diff --git a/kernel/src/driver/virtio/mod.rs b/kernel/src/driver/virtio/mod.rs index 6da95197..2aaa406e 100644 --- a/kernel/src/driver/virtio/mod.rs +++ b/kernel/src/driver/virtio/mod.rs @@ -9,6 +9,7 @@ use super::base::device::DeviceId; pub(super) mod irq; pub mod transport_pci; +#[allow(clippy::module_inception)] pub mod virtio; pub mod virtio_impl; diff --git a/kernel/src/driver/virtio/transport_pci.rs b/kernel/src/driver/virtio/transport_pci.rs index 0453ad07..91264c55 100644 --- a/kernel/src/driver/virtio/transport_pci.rs +++ b/kernel/src/driver/virtio/transport_pci.rs @@ -119,6 +119,7 @@ impl PciTransport { /// - `device` - The PCI device structure for the VirtIO device. /// - `irq_handler` - An optional handler for the device's interrupt. If `None`, a default /// handler `DefaultVirtioIrqHandler` will be used. + #[allow(clippy::extra_unused_type_parameters)] pub fn new( device: &mut PciDeviceStructureGeneralDevice, dev_id: Arc, diff --git a/kernel/src/driver/virtio/virtio_impl.rs b/kernel/src/driver/virtio/virtio_impl.rs index 645979b6..8d63dde2 100644 --- a/kernel/src/driver/virtio/virtio_impl.rs +++ b/kernel/src/driver/virtio/virtio_impl.rs @@ -59,7 +59,7 @@ unsafe impl Hal for HalImpl { ); // 恢复页面属性 - let vaddr = VirtAddr::new(vaddr.as_ptr() as *mut u8 as usize); + let vaddr = VirtAddr::new(vaddr.as_ptr() as usize); let mut kernel_mapper = KernelMapper::lock(); let kernel_mapper = kernel_mapper.as_mut().unwrap(); let flusher = kernel_mapper diff --git a/kernel/src/exception/handle.rs b/kernel/src/exception/handle.rs index dfb59269..9fb513ca 100644 --- a/kernel/src/exception/handle.rs +++ b/kernel/src/exception/handle.rs @@ -104,7 +104,7 @@ impl IrqFlowHandler for EdgeIrqHandler { .contains(IrqDescState::IRQS_PENDING) { let status = desc_inner_guard.common_data().status(); - if status.disabled() == false && status.masked() { + if !status.disabled() && status.masked() { // kdebug!("re-enable irq"); irq_manager().unmask_irq(&desc_inner_guard); } @@ -124,10 +124,10 @@ impl IrqFlowHandler for EdgeIrqHandler { desc_inner_guard = irq_desc.inner(); desc_inner_guard.common_data().clear_inprogress(); - if !(desc_inner_guard + if !desc_inner_guard .internal_state() .contains(IrqDescState::IRQS_PENDING) - && desc_inner_guard.common_data().disabled() == false) + || desc_inner_guard.common_data().disabled() { break; } @@ -152,11 +152,11 @@ fn irq_may_run(desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>) -> bool { pub(super) fn mask_ack_irq(irq_data: &Arc) { let chip = irq_data.chip_info_read_irqsave().chip(); if chip.can_mask_ack() { - chip.irq_mask_ack(&irq_data); + chip.irq_mask_ack(irq_data); irq_data.common_data().set_masked(); } else { irq_manager().mask_irq(irq_data); - chip.irq_ack(&irq_data); + chip.irq_ack(irq_data); } } diff --git a/kernel/src/exception/irqchip.rs b/kernel/src/exception/irqchip.rs index 4ac66a1d..2f02b0f2 100644 --- a/kernel/src/exception/irqchip.rs +++ b/kernel/src/exception/irqchip.rs @@ -308,13 +308,13 @@ pub struct IrqChipType { #[derive(Debug)] pub enum IrqChipSetMaskResult { /// core updates mask ok. - SetMaskOk, + Success, /// core updates mask ok. No change. - SetMaskOkNoChange, + NoChange, /// core updates mask ok. Done.(same as SetMaskOk) /// /// 支持堆叠irq芯片的特殊代码, 表示跳过所有子irq芯片。 - SetMaskOkDone, + Done, } bitflags! { @@ -351,7 +351,7 @@ impl IrqManager { /// Acknowledge the parent interrupt #[allow(dead_code)] pub fn irq_chip_ack_parent(&self, irq_data: &Arc) { - let parent_data = irq_data.parent_data().map(|p| p.upgrade()).flatten(); + let parent_data = irq_data.parent_data().and_then(|p| p.upgrade()); if let Some(parent_data) = parent_data { let parent_chip = parent_data.chip_info_read_irqsave().chip(); @@ -364,19 +364,15 @@ impl IrqManager { /// 遍历中断域的层次结构,并检查是否存在一个硬件重新触发函数。如果存在则调用它 pub fn irq_chip_retrigger_hierarchy(&self, irq_data: &Arc) -> Result<(), SystemError> { let mut data: Option> = Some(irq_data.clone()); - loop { - if let Some(d) = data { - if let Err(e) = d.chip_info_read_irqsave().chip().retrigger(&d) { - if e == SystemError::ENOSYS { - data = d.parent_data().map(|p| p.upgrade()).flatten(); - } else { - return Err(e); - } + while let Some(d) = data { + if let Err(e) = d.chip_info_read_irqsave().chip().retrigger(&d) { + if e == SystemError::ENOSYS { + data = d.parent_data().and_then(|p| p.upgrade()); } else { - return Ok(()); + return Err(e); } } else { - break; + return Ok(()); } } @@ -445,7 +441,7 @@ impl IrqManager { } // try the parent - let parent_data = dt.parent_data().map(|p| p.upgrade()).flatten(); + let parent_data = dt.parent_data().and_then(|p| p.upgrade()); irq_data = parent_data; } @@ -462,27 +458,27 @@ impl IrqManager { } } let handler = handler.unwrap(); - if core::ptr::eq(handler, bad_irq_handler()) { - if Arc::ptr_eq( + if handler.type_id() == bad_irq_handler().type_id() + && Arc::ptr_eq( &desc_inner.irq_data().chip_info_read_irqsave().chip(), &no_irq_chip(), - ) { - let irq_data = desc_inner.irq_data(); - mask_ack_irq(irq_data); + ) + { + let irq_data = desc_inner.irq_data(); + mask_ack_irq(irq_data); - irq_data.irqd_set(IrqStatus::IRQD_IRQ_DISABLED); + irq_data.irqd_set(IrqStatus::IRQD_IRQ_DISABLED); - if is_chained { - desc_inner.clear_actions(); - } - desc_inner.set_depth(1); + if is_chained { + desc_inner.clear_actions(); } + desc_inner.set_depth(1); } let chip = desc_inner.irq_data().chip_info_read_irqsave().chip(); desc.set_handler_no_lock_inner(handler, desc_inner.irq_data(), &chip); desc_inner.set_name(name); - if !core::ptr::eq(handler, bad_irq_handler()) && is_chained { + if handler.type_id() != bad_irq_handler().type_id() && is_chained { let trigger_type = desc_inner.common_data().trigger_type(); /* diff --git a/kernel/src/exception/irqdata.rs b/kernel/src/exception/irqdata.rs index 15812321..66d210ac 100644 --- a/kernel/src/exception/irqdata.rs +++ b/kernel/src/exception/irqdata.rs @@ -331,6 +331,7 @@ pub trait IrqHandlerData: Send + Sync + Any + Debug + CastFromSync {} bitflags! { /// 中断线状态 /// https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/irq.h?fi=IRQ_TYPE_PROBE#77 + #[allow(clippy::bad_bit_mask)] pub struct IrqLineStatus: u32 { /// 默认,未指明类型 const IRQ_TYPE_NONE = 0x00000000; @@ -420,10 +421,12 @@ impl IrqLineStatus { self.contains(Self::IRQ_PER_CPU_DEVID) } } + bitflags! { /// 中断状态(存储在IrqCommonData) /// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/irq.h#227 + #[allow(clippy::bad_bit_mask)] pub struct IrqStatus: u32 { const IRQD_TRIGGER_NONE = IrqLineStatus::IRQ_TYPE_NONE.bits(); const IRQD_TRIGGER_RISING = IrqLineStatus::IRQ_TYPE_EDGE_RISING.bits(); @@ -493,7 +496,7 @@ impl IrqStatus { } pub const fn can_balance(&self) -> bool { - !((self.bits & (Self::IRQD_PER_CPU.bits | Self::IRQD_NO_BALANCING.bits)) != 0) + (self.bits & (Self::IRQD_PER_CPU.bits | Self::IRQD_NO_BALANCING.bits)) == 0 } pub const fn affinity_was_set(&self) -> bool { diff --git a/kernel/src/exception/irqdesc.rs b/kernel/src/exception/irqdesc.rs index 8703b2d0..128daebc 100644 --- a/kernel/src/exception/irqdesc.rs +++ b/kernel/src/exception/irqdesc.rs @@ -444,13 +444,12 @@ impl InnerIrqDesc { /// 中断是否可以设置CPU亲和性 pub fn can_set_affinity(&self) -> bool { - if self.common_data.status().can_balance() == false - || self + if !self.common_data.status().can_balance() + || !self .irq_data() .chip_info_read_irqsave() .chip() .can_set_affinity() - == false { return false; } @@ -792,8 +791,10 @@ impl ThreadedHandlerFlags { } // 定义IrqFlags位标志 + bitflags! { /// 这些标志仅由内核在中断处理例程中使用。 + #[allow(clippy::bad_bit_mask)] pub struct IrqHandleFlags: u32 { const IRQF_TRIGGER_NONE = IrqLineStatus::IRQ_TYPE_NONE.bits(); @@ -893,7 +894,7 @@ impl IrqDescManager { /// 查找中断描述符 pub fn lookup(&self, irq: IrqNumber) -> Option> { - self.irq_descs.get(&irq).map(|desc| desc.clone()) + self.irq_descs.get(&irq).cloned() } /// 查找中断描述符并锁定总线(没有对irqdesc进行加锁) diff --git a/kernel/src/exception/irqdomain.rs b/kernel/src/exception/irqdomain.rs index be9d7e04..7f76bcc9 100644 --- a/kernel/src/exception/irqdomain.rs +++ b/kernel/src/exception/irqdomain.rs @@ -198,7 +198,7 @@ impl IrqDomainManager { irq_data_guard.set_hwirq(hwirq); irq_data_guard.set_domain(Some(domain.clone())); drop(irq_data_guard); - let r = domain.ops.map(&domain, hwirq, irq); + let r = domain.ops.map(domain, hwirq, irq); if let Err(e) = r { if e != SystemError::ENOSYS { if e != SystemError::EPERM { @@ -216,7 +216,7 @@ impl IrqDomainManager { domain.set_name(chip.name().to_string()); } - self.irq_domain_set_mapping(&domain, hwirq, irq_data); + self.irq_domain_set_mapping(domain, hwirq, irq_data); irq_manager().irq_clear_status_flags(irq, IrqLineStatus::IRQ_NOREQUEST)?; @@ -249,7 +249,7 @@ impl IrqDomainManager { r = self.do_activate_irq(Some(irq_data.clone()), reserve); } - if !r.is_ok() { + if r.is_err() { irq_data.common_data().status().set_activated(); } @@ -264,21 +264,19 @@ impl IrqDomainManager { ) -> Result<(), SystemError> { let mut r = Ok(()); - if irq_data.is_some() && irq_data.as_ref().unwrap().domain().is_some() { - let domain = irq_data.as_ref().unwrap().domain().unwrap(); + if let Some(irq_data) = irq_data { + if let Some(domain) = irq_data.domain() { + let parent_data = irq_data.parent_data().and_then(|x| x.upgrade()); + if let Some(parent_data) = parent_data.clone() { + r = self.do_activate_irq(Some(parent_data), reserve); + } - let irq_data = irq_data.unwrap(); - - let parent_data = irq_data.parent_data().map(|x| x.upgrade()).flatten(); - if let Some(parent_data) = parent_data.clone() { - r = self.do_activate_irq(Some(parent_data), reserve); - } - - if r.is_err() { - let tmpr = domain.ops.activate(&domain, &irq_data, reserve); - if let Err(e) = tmpr { - if e != SystemError::ENOSYS && parent_data.is_some() { - self.do_deactivate_irq(parent_data); + if r.is_err() { + let tmpr = domain.ops.activate(&domain, &irq_data, reserve); + if let Err(e) = tmpr { + if e != SystemError::ENOSYS && parent_data.is_some() { + self.do_deactivate_irq(parent_data); + } } } } @@ -286,12 +284,12 @@ impl IrqDomainManager { return r; } - + #[allow(clippy::only_used_in_recursion)] fn do_deactivate_irq(&self, irq_data: Option>) { if let Some(irq_data) = irq_data { if let Some(domain) = irq_data.domain() { domain.ops.deactivate(&domain, &irq_data); - let pp = irq_data.parent_data().map(|x| x.upgrade()).flatten(); + let pp = irq_data.parent_data().and_then(|x| x.upgrade()); if pp.is_some() { self.do_deactivate_irq(pp); @@ -312,6 +310,7 @@ impl IrqDomainManager { /// - `handler`: 中断流处理器 /// - `handler_data`: 中断流处理程序数据 /// - `handler_name`: 中断处理程序名称 + #[allow(clippy::too_many_arguments)] pub fn domain_set_info( &self, domain: &Arc, @@ -385,7 +384,7 @@ impl IrqDomainManager { if dt.domain().is_some() && Arc::ptr_eq(dt.domain().as_ref().unwrap(), domain) { return Some(dt); } - irq_data = dt.parent_data().map(|x| x.upgrade()).flatten(); + irq_data = dt.parent_data().and_then(|x| x.upgrade()); } return None; diff --git a/kernel/src/exception/manage.rs b/kernel/src/exception/manage.rs index f25c7d7e..018ec6b9 100644 --- a/kernel/src/exception/manage.rs +++ b/kernel/src/exception/manage.rs @@ -251,10 +251,8 @@ impl IrqManager { } action_guard.set_handler(Some(&IrqNestedPrimaryHandler)); - } else { - if desc.can_thread() { - self.setup_forced_threading(action_guard.deref_mut())?; - } + } else if desc.can_thread() { + self.setup_forced_threading(action_guard.deref_mut())?; } // 如果具有中断线程处理程序,并且中断不是嵌套的,则设置中断线程 @@ -322,7 +320,7 @@ impl IrqManager { // 标记当前irq是否是共享的 let mut irq_shared = false; - if desc_inner_guard.actions().is_empty() == false { + if !desc_inner_guard.actions().is_empty() { // 除非双方都同意并且是相同类型(级别、边沿、极性),否则不能共享中断。 // 因此,两个标志字段都必须设置IRQF_SHARED,并且设置触发类型的位必须匹配。 // 另外,所有各方都必须就ONESHOT达成一致。 @@ -364,11 +362,10 @@ impl IrqManager { let old = &desc_inner_guard.actions()[0].clone(); let old_guard = old.inner(); - if ((old_guard + if (!(old_guard .flags() .intersection(*action_guard.flags()) - .contains(IrqHandleFlags::IRQF_SHARED)) - == false) + .contains(IrqHandleFlags::IRQF_SHARED))) || (old_trigger_type != (action_guard.flags().trigger_type())) || ((old_guard.flags().bitxor(*action_guard.flags())) .contains(IrqHandleFlags::IRQF_ONESHOT)) @@ -402,13 +399,12 @@ impl IrqManager { // todo: oneshot } else if action_guard.handler().is_some_and(|h| { h.type_id() == (&DefaultPrimaryIrqHandler as &dyn IrqHandler).type_id() - }) && desc_inner_guard + }) && !desc_inner_guard .irq_data() .chip_info_read_irqsave() .chip() .flags() .contains(IrqChipFlags::IRQCHIP_ONESHOT_SAFE) - == false { // 请求中断时 hander = NULL,因此我们为其使用默认的主处理程序。 // 但它没有设置ONESHOT标志。与电平触发中断结合时, @@ -510,15 +506,14 @@ impl IrqManager { // 共享中断可能在它仍然被禁用时请求它,然后永远等待中断。 static mut WARNED: bool = false; - if action_guard.flags().contains(IrqHandleFlags::IRQF_SHARED) { - if unsafe { !WARNED } { - kwarn!( - "Shared interrupt {} for {} requested but not auto enabled", - irq.data(), - action_guard.name() - ); - unsafe { WARNED = true }; - } + if action_guard.flags().contains(IrqHandleFlags::IRQF_SHARED) && unsafe { !WARNED } + { + kwarn!( + "Shared interrupt {} for {} requested but not auto enabled", + irq.data(), + action_guard.name() + ); + unsafe { WARNED = true }; } desc_inner_guard.set_depth(1); @@ -661,7 +656,7 @@ impl IrqManager { } } IrqStartupResult::Managed => { - self.irq_do_set_affinity(&irq_data, &desc_inner_guard, &affinity, false) + self.irq_do_set_affinity(&irq_data, desc_inner_guard, &affinity, false) .ok(); ret = self.__irq_startup(desc_inner_guard); } @@ -696,7 +691,7 @@ impl IrqManager { let chip = desc_inner_guard.irq_data().chip_info_read_irqsave().chip(); - if let Err(e) = chip.irq_enable(&desc_inner_guard.irq_data()) { + if let Err(e) = chip.irq_enable(desc_inner_guard.irq_data()) { if e == SystemError::ENOSYS { self.unmask_irq(desc_inner_guard); } @@ -744,7 +739,7 @@ impl IrqManager { return self.irq_do_set_affinity( desc_inner_guard.irq_data(), - &desc_inner_guard, + desc_inner_guard, &to_set, false, ); @@ -765,22 +760,19 @@ impl IrqManager { // todo: 处理CPU中断隔离相关的逻辑 let common_data = desc_inner_guard.common_data(); - let r; - if !force && !cpumask.is_empty() { - r = chip.irq_set_affinity(irq_data, &cpumask, force); - } else if force { - r = chip.irq_set_affinity(irq_data, &cpumask, force); + let r = if force || !cpumask.is_empty() { + chip.irq_set_affinity(irq_data, cpumask, force) } else { return Err(SystemError::EINVAL); - } + }; let mut ret = Ok(()); if let Ok(rs) = r { match rs { - IrqChipSetMaskResult::SetMaskOk | IrqChipSetMaskResult::SetMaskOkDone => { + IrqChipSetMaskResult::Success | IrqChipSetMaskResult::Done => { common_data.set_affinity(cpumask.clone()); } - IrqChipSetMaskResult::SetMaskOkNoChange => { + IrqChipSetMaskResult::NoChange => { // irq_validate_effective_affinity(data); // irq_set_thread_affinity(desc); @@ -900,10 +892,10 @@ impl IrqManager { } if chip.flags().contains(IrqChipFlags::IRQCHIP_SET_TYPE_MASKED) { - if desc_inner_guard.common_data().status().masked() == false { + if !desc_inner_guard.common_data().status().masked() { self.mask_irq(desc_inner_guard.irq_data()); } - if desc_inner_guard.common_data().status().disabled() == false { + if !desc_inner_guard.common_data().status().disabled() { to_unmask = true; } } @@ -914,14 +906,14 @@ impl IrqManager { let ret; if let Ok(rs) = r { match rs { - IrqChipSetMaskResult::SetMaskOk | IrqChipSetMaskResult::SetMaskOkDone => { + IrqChipSetMaskResult::Success | IrqChipSetMaskResult::Done => { let common_data = desc_inner_guard.common_data(); common_data.clear_status(IrqStatus::IRQD_TRIGGER_MASK); let mut irqstatus = IrqStatus::empty(); irqstatus.set_trigger_type(trigger_type); common_data.insert_status(irqstatus); } - IrqChipSetMaskResult::SetMaskOkNoChange => { + IrqChipSetMaskResult::NoChange => { let flags = desc_inner_guard.common_data().trigger_type(); desc_inner_guard.set_trigger_type(flags); desc_inner_guard @@ -929,7 +921,7 @@ impl IrqManager { .clear_status(IrqStatus::IRQD_LEVEL); desc_inner_guard.clear_level(); - if (flags & IrqLineStatus::IRQ_TYPE_LEVEL_MASK).is_empty() == false { + if !(flags & IrqLineStatus::IRQ_TYPE_LEVEL_MASK).is_empty() { desc_inner_guard.set_level(); desc_inner_guard .common_data() @@ -1008,7 +1000,7 @@ impl IrqManager { /// 解除屏蔽中断 pub(super) fn unmask_irq(&self, desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>) { - if desc_inner_guard.common_data().status().masked() == false { + if !desc_inner_guard.common_data().status().masked() { return; } @@ -1016,7 +1008,7 @@ impl IrqManager { .irq_data() .chip_info_read_irqsave() .chip() - .irq_unmask(&desc_inner_guard.irq_data()); + .irq_unmask(desc_inner_guard.irq_data()); if let Err(e) = r { if e != SystemError::ENOSYS { diff --git a/kernel/src/exception/resend.rs b/kernel/src/exception/resend.rs index 8089c294..38a106d7 100644 --- a/kernel/src/exception/resend.rs +++ b/kernel/src/exception/resend.rs @@ -40,11 +40,10 @@ impl IrqManager { return Err(SystemError::EBUSY); } - if desc_inner_guard + if !desc_inner_guard .internal_state() .contains(IrqDescState::IRQS_PENDING) - == false - && inject == false + && !inject { return Ok(()); } diff --git a/kernel/src/exception/sysfs.rs b/kernel/src/exception/sysfs.rs index 357b66d5..390e65a9 100644 --- a/kernel/src/exception/sysfs.rs +++ b/kernel/src/exception/sysfs.rs @@ -305,8 +305,7 @@ impl Attribute for AttrActions { len += sysfs_emit_str(&mut buf[len..], &format!(",{}", action.inner().name())) .unwrap(); } else { - len += - sysfs_emit_str(&mut buf[len..], &format!("{}", action.inner().name())).unwrap(); + len += sysfs_emit_str(&mut buf[len..], &action.inner().name().to_string()).unwrap(); } if len >= buf.len() { diff --git a/kernel/src/filesystem/devfs/mod.rs b/kernel/src/filesystem/devfs/mod.rs index c7b82f8a..24886de9 100644 --- a/kernel/src/filesystem/devfs/mod.rs +++ b/kernel/src/filesystem/devfs/mod.rs @@ -114,7 +114,7 @@ impl DevFS { match metadata.file_type { // 字节设备挂载在 /dev/char FileType::CharDevice => { - if let Err(_) = dev_root_inode.find("char") { + if dev_root_inode.find("char").is_err() { dev_root_inode.create( "char", FileType::Dir, @@ -137,7 +137,7 @@ impl DevFS { device.set_fs(dev_char_inode.0.lock().fs.clone()); } FileType::BlockDevice => { - if let Err(_) = dev_root_inode.find("block") { + if dev_root_inode.find("block").is_err() { dev_root_inode.create( "block", FileType::Dir, @@ -182,7 +182,7 @@ impl DevFS { match device.metadata().unwrap().file_type { // 字节设备挂载在 /dev/char FileType::CharDevice => { - if let Err(_) = dev_root_inode.find("char") { + if dev_root_inode.find("char").is_err() { return Err(SystemError::ENOENT); } @@ -195,7 +195,7 @@ impl DevFS { dev_char_inode.remove(name)?; } FileType::BlockDevice => { - if let Err(_) = dev_root_inode.find("block") { + if dev_root_inode.find("block").is_err() { return Err(SystemError::ENOENT); } @@ -247,7 +247,7 @@ impl DevFSInode { data_: usize, ) -> Self { return DevFSInode { - parent: parent, + parent, self_ref: Weak::default(), children: BTreeMap::new(), metadata: Metadata { diff --git a/kernel/src/filesystem/devfs/zero_dev.rs b/kernel/src/filesystem/devfs/zero_dev.rs index 91340663..5f3a8f32 100644 --- a/kernel/src/filesystem/devfs/zero_dev.rs +++ b/kernel/src/filesystem/devfs/zero_dev.rs @@ -115,8 +115,8 @@ impl IndexNode for LockedZeroInode { return Err(SystemError::EINVAL); } - for i in 0..len { - buf[i] = 0; + for itr in buf.iter_mut().take(len) { + *itr = 0; } return Ok(len); diff --git a/kernel/src/filesystem/fat/bpb.rs b/kernel/src/filesystem/fat/bpb.rs index 871f8342..22e85673 100644 --- a/kernel/src/filesystem/fat/bpb.rs +++ b/kernel/src/filesystem/fat/bpb.rs @@ -1,5 +1,5 @@ #![allow(dead_code)] -use alloc::{sync::Arc, vec::Vec}; +use alloc::sync::Arc; use system_error::SystemError; use crate::{ @@ -220,8 +220,7 @@ impl BiosParameterBlockFAT32 { impl BiosParameterBlock { pub fn new(partition: Arc) -> Result { - let mut v = Vec::with_capacity(LBA_SIZE); - v.resize(LBA_SIZE, 0); + let mut v = vec![0; LBA_SIZE]; // 读取分区的引导扇区 partition @@ -248,19 +247,20 @@ impl BiosParameterBlock { bpb.hidden_sectors = cursor.read_u32()?; bpb.total_sectors_32 = cursor.read_u32()?; - let mut bpb32 = BiosParameterBlockFAT32::default(); - bpb32.fat_size_32 = cursor.read_u32()?; - bpb32.ext_flags = cursor.read_u16()?; - bpb32.fs_version = cursor.read_u16()?; - bpb32.root_cluster = cursor.read_u32()?; - bpb32.fs_info = cursor.read_u16()?; - bpb32.backup_boot_sec = cursor.read_u16()?; - + let mut bpb32 = BiosParameterBlockFAT32 { + fat_size_32: cursor.read_u32()?, + ext_flags: cursor.read_u16()?, + fs_version: cursor.read_u16()?, + root_cluster: cursor.read_u32()?, + fs_info: cursor.read_u16()?, + backup_boot_sec: cursor.read_u16()?, + drive_num: cursor.read_u8()?, + reserved1: cursor.read_u8()?, + boot_sig: cursor.read_u8()?, + volume_id: cursor.read_u32()?, + ..Default::default() + }; cursor.read_exact(&mut bpb32.reserved0)?; - bpb32.drive_num = cursor.read_u8()?; - bpb32.reserved1 = cursor.read_u8()?; - bpb32.boot_sig = cursor.read_u8()?; - bpb32.volume_id = cursor.read_u32()?; cursor.read_exact(&mut bpb32.volume_label)?; cursor.read_exact(&mut bpb32.filesystem_type)?; diff --git a/kernel/src/filesystem/fat/entry.rs b/kernel/src/filesystem/fat/entry.rs index 1437e4b1..c7d562d9 100644 --- a/kernel/src/filesystem/fat/entry.rs +++ b/kernel/src/filesystem/fat/entry.rs @@ -111,7 +111,7 @@ impl FATFile { loop { // 当前簇已经读取完,尝试读取下一个簇 if in_cluster_offset >= fs.bytes_per_cluster() { - if let Some(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster).ok() { + if let Ok(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster) { current_cluster = c; in_cluster_offset %= fs.bytes_per_cluster(); } else { @@ -182,9 +182,9 @@ impl FATFile { // 循环写入数据 loop { if in_cluster_bytes_offset >= fs.bytes_per_cluster() { - if let Some(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster).ok() { + if let Ok(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster) { current_cluster = c; - in_cluster_bytes_offset = in_cluster_bytes_offset % fs.bytes_per_cluster(); + in_cluster_bytes_offset %= fs.bytes_per_cluster(); } else { break; } @@ -388,7 +388,7 @@ impl FATDir { current_cluster: self.first_cluster, offset: self.root_offset.unwrap_or(0), is_root: self.is_root(), - fs: fs, + fs, }; } @@ -425,10 +425,10 @@ impl FATDir { // 如果当前簇没有空间了,并且当前不是FAT12和FAT16的根目录,那么就读取下一个簇。 if offset >= fs.bytes_per_cluster() && !self.is_root() { // 成功读取下一个簇 - if let Some(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster).ok() { + if let Ok(FATEntry::Next(c)) = fs.get_fat_entry(current_cluster) { current_cluster = c; // 计算簇内偏移量 - offset = offset % fs.bytes_per_cluster(); + offset %= fs.bytes_per_cluster(); } else { // 读取失败,当前已经是最后一个簇,退出循环 break; @@ -555,8 +555,7 @@ impl FATDir { let r: Result = self.check_existence(name, Some(false), fs.clone()); // 检查错误码,如果能够表明目录项已经存在,则返回-EEXIST - if r.is_err() { - let err_val = r.unwrap_err(); + if let Err(err_val) = r { if err_val == (SystemError::EISDIR) || err_val == (SystemError::ENOTDIR) { return Err(SystemError::EEXIST); } else { @@ -595,8 +594,7 @@ impl FATDir { self.check_existence(name, Some(true), fs.clone()); // kdebug!("check existence ok"); // 检查错误码,如果能够表明目录项已经存在,则返回-EEXIST - if r.is_err() { - let err_val = r.unwrap_err(); + if let Err(err_val) = r { if err_val == (SystemError::EISDIR) || err_val == (SystemError::ENOTDIR) { return Err(SystemError::EEXIST); } else { @@ -617,25 +615,29 @@ impl FATDir { // === 接下来在子目录中创建'.'目录项和'..'目录项 let mut offset = 0; // '.'目录项 - let mut dot_entry = ShortDirEntry::default(); - dot_entry.name = ShortNameGenerator::new(".").generate().unwrap(); - dot_entry.attributes.value = FileAttributes::DIRECTORY; + let mut dot_entry = ShortDirEntry { + name: ShortNameGenerator::new(".").generate().unwrap(), + attributes: FileAttributes::new(FileAttributes::DIRECTORY), + ..Default::default() + }; dot_entry.set_first_cluster(first_cluster); // todo: 设置创建、访问时间 - dot_entry.flush(&fs, fs.cluster_bytes_offset(first_cluster) + offset)?; + dot_entry.flush(fs, fs.cluster_bytes_offset(first_cluster) + offset)?; // 偏移量加上一个目录项的长度 offset += FATRawDirEntry::DIR_ENTRY_LEN; // '..'目录项 - let mut dot_dot_entry = ShortDirEntry::default(); - dot_dot_entry.name = ShortNameGenerator::new("..").generate().unwrap(); - dot_dot_entry.attributes.value = FileAttributes::DIRECTORY; + let mut dot_dot_entry = ShortDirEntry { + name: ShortNameGenerator::new("..").generate().unwrap(), + attributes: FileAttributes::new(FileAttributes::DIRECTORY), + ..Default::default() + }; dot_dot_entry.set_first_cluster(self.first_cluster); // todo: 设置创建、访问时间 - dot_dot_entry.flush(&fs, fs.cluster_bytes_offset(first_cluster) + offset)?; + dot_dot_entry.flush(fs, fs.cluster_bytes_offset(first_cluster) + offset)?; // kdebug!("to create dentries"); // 在当前目录下创建目标目录项 @@ -720,8 +722,8 @@ impl FATDir { attrs: FileAttributes, fs: Arc, ) -> Result { - let mut short_dentry: ShortDirEntry = short_dentry.unwrap_or(ShortDirEntry::default()); - short_dentry.name = short_name.clone(); + let mut short_dentry: ShortDirEntry = short_dentry.unwrap_or_default(); + short_dentry.name = *short_name; short_dentry.attributes = attrs; // todo: 设置创建时间、修改时间 @@ -756,7 +758,9 @@ impl FATDir { let offset = fs.cluster_bytes_offset(end.0) + end.1; short_dentry.flush(&fs, offset)?; - return Ok(short_dentry.to_dir_entry_with_long_name(long_name.to_string(), (start, end))); + return Ok( + short_dentry.convert_to_dir_entry_with_long_name(long_name.to_string(), (start, end)) + ); } /// @brief 判断当前目录是否为空 @@ -1037,14 +1041,16 @@ impl LongDirEntry { /// /// @return Self 初始化好的长目录项对象 fn new(ord: u8, name_part: &[u16], check_sum: u8) -> Self { - let mut result = LongDirEntry::default(); - result.ord = ord; + let mut result = LongDirEntry { + ord, + file_attrs: FileAttributes::new(FileAttributes::LONG_NAME), + dirent_type: 0, + checksum: check_sum, + ..Default::default() + }; result .insert_name(name_part) .expect("Name part's len should be equal to 13."); - result.file_attrs.value = FileAttributes::LONG_NAME; - result.dirent_type = 0; - result.checksum = check_sum; // 该字段需要外层的代码手动赋值 result.first_clus_low = 0; return result; @@ -1095,7 +1101,7 @@ impl LongDirEntry { name = name.trim(); // 名称不能为0 - if name.len() == 0 { + if name.is_empty() { return Err(SystemError::EINVAL); } @@ -1133,11 +1139,10 @@ impl LongDirEntry { let lba = fs.get_lba_from_offset( fs.bytes_to_sector(fs.get_in_partition_bytes_offset(disk_bytes_offset)), ); - let mut v: Vec = Vec::new(); - v.resize(1 * fs.lba_per_sector() * LBA_SIZE, 0); + let mut v: Vec = vec![0; fs.lba_per_sector() * LBA_SIZE]; fs.partition .disk() - .read_at(lba, 1 * fs.lba_per_sector(), &mut v)?; + .read_at(lba, fs.lba_per_sector(), &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); // 切换游标到对应位置 @@ -1166,7 +1171,7 @@ impl LongDirEntry { // 把修改后的长目录项刷入磁盘 fs.partition .disk() - .write_at(lba, 1 * fs.lba_per_sector(), cursor.as_slice())?; + .write_at(lba, fs.lba_per_sector(), cursor.as_slice())?; fs.partition.disk().sync()?; return Ok(()); @@ -1174,7 +1179,7 @@ impl LongDirEntry { } impl ShortDirEntry { - const PADDING: u8 = ' ' as u8; + const PADDING: u8 = b' '; /// @brief 判断当前目录项是否为文件夹 /// @@ -1225,7 +1230,7 @@ impl ShortDirEntry { // 拷贝扩展名,并计算总的长度 let total_len = if ext_len > 0 { - name[base_len] = '.' as u8; + name[base_len] = b'.'; name[base_len + 1..base_len + 1 + ext_len].copy_from_slice(&self.name[8..8 + ext_len]); // 总长度为基础名长度+点号+扩展名长度 base_len + 1 + ext_len @@ -1246,19 +1251,19 @@ impl ShortDirEntry { /// /// @param loc 当前文件的起始、终止簇。格式:(簇,簇内偏移量) /// @return 生成的FATDirENtry枚举类型 - pub fn to_dir_entry(&self, loc: (Cluster, u64)) -> FATDirEntry { + pub fn convert_to_dir_entry(&self, loc: (Cluster, u64)) -> FATDirEntry { // 当前文件的第一个簇 let first_cluster = Cluster::new(((self.fst_clus_hi as u64) << 16) | (self.fst_clus_lo as u64)); // 当前是文件或卷号 if self.is_file() || self.is_volume_id() { - let mut file: FATFile = FATFile::default(); - - file.file_name = self.name_to_string(); - file.first_cluster = first_cluster; - file.short_dir_entry = self.clone(); - file.loc = (loc, loc); + let file: FATFile = FATFile { + file_name: self.name_to_string(), + first_cluster, + short_dir_entry: *self, + loc: (loc, loc), + }; // 根据当前短目录项的类型的不同,返回对应的枚举类型。 if self.is_file() { @@ -1268,12 +1273,13 @@ impl ShortDirEntry { } } else { // 当前是文件夹 - let mut dir = FATDir::default(); - dir.dir_name = self.name_to_string(); - dir.first_cluster = first_cluster; - dir.root_offset = None; - dir.short_dir_entry = Some(self.clone()); - dir.loc = Some((loc, loc)); + let dir = FATDir { + dir_name: self.name_to_string(), + first_cluster, + root_offset: None, + short_dir_entry: Some(*self), + loc: Some((loc, loc)), + }; return FATDirEntry::Dir(dir); } @@ -1285,7 +1291,7 @@ impl ShortDirEntry { /// @param name 从长目录项获取的完整文件名 /// @param loc 当前文件的起始、终止簇。格式:(簇,簇内偏移量) /// @return 生成的FATDirENtry枚举类型 - pub fn to_dir_entry_with_long_name( + pub fn convert_to_dir_entry_with_long_name( &self, name: String, loc: ((Cluster, u64), (Cluster, u64)), @@ -1295,12 +1301,12 @@ impl ShortDirEntry { Cluster::new(((self.fst_clus_hi as u64) << 16) | (self.fst_clus_lo as u64)); if self.is_file() || self.is_volume_id() { - let mut file = FATFile::default(); - - file.first_cluster = first_cluster; - file.file_name = name; - file.loc = loc; - file.short_dir_entry = self.clone(); + let file = FATFile { + first_cluster, + file_name: name, + loc, + short_dir_entry: *self, + }; if self.is_file() { return FATDirEntry::File(file); @@ -1308,13 +1314,13 @@ impl ShortDirEntry { return FATDirEntry::VolId(file); } } else { - let mut dir = FATDir::default(); - - dir.first_cluster = first_cluster; - dir.dir_name = name; - dir.loc = Some(loc); - dir.short_dir_entry = Some(self.clone()); - dir.root_offset = None; + let dir = FATDir { + first_cluster, + dir_name: name, + loc: Some(loc), + short_dir_entry: Some(*self), + root_offset: None, + }; return FATDirEntry::Dir(dir); } @@ -1347,11 +1353,10 @@ impl ShortDirEntry { let lba = fs.get_lba_from_offset( fs.bytes_to_sector(fs.get_in_partition_bytes_offset(disk_bytes_offset)), ); - let mut v: Vec = Vec::new(); - v.resize(1 * fs.lba_per_sector() * LBA_SIZE, 0); + let mut v: Vec = vec![0; fs.lba_per_sector() * LBA_SIZE]; fs.partition .disk() - .read_at(lba, 1 * fs.lba_per_sector(), &mut v)?; + .read_at(lba, fs.lba_per_sector(), &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); // 切换游标到对应位置 @@ -1372,7 +1377,7 @@ impl ShortDirEntry { // 把修改后的长目录项刷入磁盘 fs.partition .disk() - .write_at(lba, 1 * fs.lba_per_sector(), cursor.as_slice())?; + .write_at(lba, fs.lba_per_sector(), cursor.as_slice())?; fs.partition.disk().sync()?; return Ok(()); @@ -1404,11 +1409,11 @@ impl FATRawDirEntry { /// @brief 判断当前目录项是否为这个文件的最后一个目录项 fn is_last(&self) -> bool { - match self { - &Self::Short(_) => { + match *self { + Self::Short(_) => { return true; } - &Self::Long(l) => { + Self::Long(l) => { return l.is_last(); } _ => { @@ -1501,7 +1506,7 @@ impl FATDirIter { return Ok(( self.current_cluster, self.offset, - Some(s.to_dir_entry(( + Some(s.convert_to_dir_entry(( self.current_cluster, self.offset - FATRawDirEntry::DIR_ENTRY_LEN, ))), @@ -1664,7 +1669,9 @@ impl FATDirEntry { // 检验校验和是否正确 if extractor.validate_checksum(&short_dentry) { // 校验和正确,返回一个长目录项 - return Ok(short_dentry.to_dir_entry_with_long_name(extractor.to_string(), loc)); + return Ok( + short_dentry.convert_to_dir_entry_with_long_name(extractor.extracted_name(), loc) + ); } else { // 校验和不相同,认为文件系统出错 return Err(SystemError::EROFS); @@ -1747,7 +1754,7 @@ impl FATDirEntry { // 是根目录项 None => { let mut s = [0x20u8; 11]; - s[0] = '/' as u8; + s[0] = b'/'; return s; } }, @@ -1777,26 +1784,17 @@ impl FATDirEntry { /// @brief 判断目录项是否为文件 pub fn is_file(&self) -> bool { - match self { - &FATDirEntry::File(_) | &FATDirEntry::VolId(_) => true, - _ => false, - } + matches!(self, &FATDirEntry::File(_) | &FATDirEntry::VolId(_)) } /// @brief 判断目录项是否为文件夹 pub fn is_dir(&self) -> bool { - match &self { - &FATDirEntry::Dir(_) => true, - _ => false, - } + matches!(self, &FATDirEntry::Dir(_)) } /// @brief 判断目录项是否为Volume id pub fn is_vol_id(&self) -> bool { - match self { - &FATDirEntry::VolId(_) => true, - _ => false, - } + matches!(self, &FATDirEntry::VolId(_)) } /// @brief 判断FAT目录项的名字与给定的是否相等 @@ -1821,7 +1819,7 @@ impl FATDirEntry { /// @brief 将FATDirEntry转换为FATFile对象 pub fn to_file(&self) -> Result { - if self.is_file() == false { + if !self.is_file() { return Err(SystemError::EISDIR); } @@ -1835,7 +1833,7 @@ impl FATDirEntry { /// @brief 将FATDirEntry转换为FATDir对象 pub fn to_dir(&self) -> Result { - if self.is_dir() == false { + if !self.is_dir() { return Err(SystemError::ENOTDIR); } match &self { @@ -1882,12 +1880,12 @@ impl ShortNameGenerator { let mut short_name: [u8; 11] = [0x20u8; 11]; if name == "." { - short_name[0] = '.' as u8; + short_name[0] = b'.'; } if name == ".." { - short_name[0] = '.' as u8; - short_name[1] = '.' as u8; + short_name[0] = b'.'; + short_name[1] = b'.'; } // @name_fits: 名称是否被完全拷贝 @@ -1911,7 +1909,7 @@ impl ShortNameGenerator { None => { // 文件名中,不存在"." let (b_len, fits, b_lossy) = - Self::copy_part(&mut short_name[..Self::SHORT_NAME_LEN], &name); + Self::copy_part(&mut short_name[..Self::SHORT_NAME_LEN], name); (fits, b_len, b_lossy) } }; @@ -1934,8 +1932,8 @@ impl ShortNameGenerator { return ShortNameGenerator { name: short_name, - flags: flags, - basename_len: basename_len, + flags, + basename_len, checksum: Self::fletcher_16_checksum(name), ..Default::default() }; @@ -2017,8 +2015,9 @@ impl ShortNameGenerator { && ext_matches // 扩展名相匹配 { - let num = num_suffix.unwrap(); - self.suffix_bitmask |= 1 << num; + if let Some(num) = num_suffix { + self.suffix_bitmask |= 1 << num; + } } // === 检查是否存在短前缀+校验和的冲突,文件名形如:(TE021F~1.TXT) @@ -2038,9 +2037,10 @@ impl ShortNameGenerator { .map(|s| u16::from_str_radix(s, 16)); // 如果校验码相同 if checksum_result == Ok(Ok(self.checksum)) { - let num = num_suffix.unwrap(); // 置位checksum_bitmask中,基础名末尾数字的对应位 - self.checksum_bitmask |= 1 << num; + if let Some(num) = num_suffix { + self.checksum_bitmask |= 1 << num; + } } } } @@ -2099,7 +2099,7 @@ impl ShortNameGenerator { prefix_len }; - buf[prefix_len] = '~' as u8; + buf[prefix_len] = b'~'; buf[prefix_len + 1] = char::from_digit(num, 10).unwrap() as u8; buf[8..].copy_from_slice(&self.name[8..]); return buf; @@ -2117,7 +2117,7 @@ impl ShortNameGenerator { let c3 = char::from_digit((x as u32 >> 4) & 0xf, 16) .unwrap() .to_ascii_uppercase() as u8; - let c4 = char::from_digit((x as u32 >> 0) & 0xf, 16) + let c4 = char::from_digit((x as u32) & 0xf, 16) .unwrap() .to_ascii_uppercase() as u8; return [c1, c2, c3, c4]; @@ -2203,14 +2203,14 @@ impl LongNameExtractor { return Ok(()); } - /// @brief 返回名称的长度 + /// 返回名称的长度 #[inline] fn len(&self) -> usize { return self.name.len(); } - /// @brief 返回抽取得到的名称字符串 - fn to_string(&self) -> String { + /// 返回抽取得到的名称字符串 + fn extracted_name(&self) -> String { let mut s = String::from_utf16_lossy(self.name.as_slice()); // 计算字符串的长度。如果字符串中有\0,那么就截取字符串的前面部分 if let Some(len) = s.find('\u{0}') { @@ -2261,8 +2261,8 @@ impl LongNameEntryGenerator { // 先从最后一个长目录项开始生成 let start_index = (name.len() / 13) as u8; return LongNameEntryGenerator { - name: name, - checksum: checksum, + name, + checksum, idx: start_index, last_index: start_index, }; @@ -2411,8 +2411,7 @@ pub fn get_raw_dir_entry( // let step2 = fs.bytes_to_sector(step1); // let lba = fs.get_lba_from_offset(step2); // kdebug!("step1={step1}, step2={step2}, lba={lba}"); - let mut v: Vec = Vec::new(); - v.resize(1 * LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; fs.partition.disk().read_at(lba, 1, &mut v)?; @@ -2438,9 +2437,10 @@ pub fn get_raw_dir_entry( if file_attr.contains(FileAttributes::LONG_NAME) { // 当前目录项是一个长目录项 - let mut long_dentry = LongDirEntry::default(); - - long_dentry.ord = cursor.read_u8()?; + let mut long_dentry = LongDirEntry { + ord: cursor.read_u8()?, + ..Default::default() + }; cursor.read_u16_into(&mut long_dentry.name1)?; long_dentry.file_attrs = FileAttributes::new(cursor.read_u8()?); long_dentry.dirent_type = cursor.read_u8()?; diff --git a/kernel/src/filesystem/fat/fs.rs b/kernel/src/filesystem/fat/fs.rs index 15236597..ba2c5116 100644 --- a/kernel/src/filesystem/fat/fs.rs +++ b/kernel/src/filesystem/fat/fs.rs @@ -1,3 +1,4 @@ +use core::cmp::Ordering; use core::intrinsics::unlikely; use core::{any::Any, fmt::Debug}; use system_error::SystemError; @@ -177,11 +178,11 @@ impl LockedFATInode { }; let inode: Arc = Arc::new(LockedFATInode(SpinLock::new(FATInode { - parent: parent, + parent, self_ref: Weak::default(), children: BTreeMap::new(), fs: Arc::downgrade(&fs), - inode_type: inode_type, + inode_type, metadata: Metadata { dev_id: 0, inode_id: generate_inode_id(), @@ -195,7 +196,7 @@ impl LockedFATInode { atime: TimeSpec::default(), mtime: TimeSpec::default(), ctime: TimeSpec::default(), - file_type: file_type, + file_type, mode: ModeType::from_bits_truncate(0o777), nlinks: 1, uid: 0, @@ -330,11 +331,11 @@ impl FATFileSystem { }))); let result: Arc = Arc::new(FATFileSystem { - partition: partition, + partition, bpb, first_data_sector, fs_info: Arc::new(LockedFATFsInfo::new(fs_info)), - root_inode: root_inode, + root_inode, }); // 对root inode加锁,并继续完成初始化工作 @@ -384,11 +385,10 @@ impl FATFileSystem { // FAT表项在逻辑块内的字节偏移量 let blk_offset = self.get_in_block_offset(fat_bytes_offset); - let mut v = Vec::::new(); - v.resize(self.bpb.bytes_per_sector as usize, 0); + let mut v: Vec = vec![0; self.bpb.bytes_per_sector as usize]; self.partition .disk() - .read_at(fat_ent_lba as usize, 1 * self.lba_per_sector(), &mut v)?; + .read_at(fat_ent_lba as usize, self.lba_per_sector(), &mut v)?; let mut cursor = VecCursor::new(v); cursor.seek(SeekFrom::SeekSet(blk_offset as i64))?; @@ -436,7 +436,7 @@ impl FATFileSystem { let entry = cursor.read_u32()? & 0x0fffffff; match entry { - _n if (current_cluster >= 0x0ffffff7 && current_cluster <= 0x0fffffff) => { + _n if (0x0ffffff7..=0x0fffffff).contains(¤t_cluster) => { // 当前簇号不是一个能被获得的簇(可能是文件系统出错了) kerror!("FAT32 get fat entry: current cluster number [{}] is not an allocatable cluster number.", current_cluster); FATEntry::Bad @@ -478,11 +478,10 @@ impl FATFileSystem { // FAT表项在逻辑块内的字节偏移量 let blk_offset = self.get_in_block_offset(fat_bytes_offset); - let mut v = Vec::::new(); - v.resize(self.bpb.bytes_per_sector as usize, 0); + let mut v: Vec = vec![0; self.bpb.bytes_per_sector as usize]; self.partition .disk() - .read_at(fat_ent_lba, 1 * self.lba_per_sector(), &mut v)?; + .read_at(fat_ent_lba, self.lba_per_sector(), &mut v)?; let mut cursor = VecCursor::new(v); cursor.seek(SeekFrom::SeekSet(blk_offset as i64))?; @@ -565,10 +564,7 @@ impl FATFileSystem { let end_cluster: Cluster = self.max_cluster_number(); let start_cluster: Cluster = match self.bpb.fat_type { FATType::FAT32(_) => { - let next_free: u64 = match self.fs_info.0.lock().next_free() { - Some(x) => x, - None => 0xffffffff, - }; + let next_free: u64 = self.fs_info.0.lock().next_free().unwrap_or(0xffffffff); if next_free < end_cluster.cluster_num { Cluster::new(next_free) } else { @@ -771,7 +767,7 @@ impl FATFileSystem { /// @brief 获取从start_cluster开始的簇链中,第n个簇的信息。(请注意,下标从0开始) #[inline] pub fn get_cluster_by_relative(&self, start_cluster: Cluster, n: usize) -> Option { - return self.cluster_iter(start_cluster).skip(n).next(); + return self.cluster_iter(start_cluster).nth(n); } /// @brief 获取整个簇链的最后一个簇 @@ -947,8 +943,7 @@ impl FATFileSystem { // 由于FAT12的FAT表不大于6K,因此直接读取6K let num_lba = (6 * 1024) / LBA_SIZE; - let mut v: Vec = Vec::new(); - v.resize(num_lba * LBA_SIZE, 0); + let mut v: Vec = vec![0; num_lba * LBA_SIZE]; self.partition.disk().read_at(lba, num_lba, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); @@ -962,7 +957,7 @@ impl FATFileSystem { packed_val & 0x0fff }; if val == 0 { - return Ok(Cluster::new(cluster as u64)); + return Ok(Cluster::new(cluster)); } cluster += 1; @@ -993,8 +988,7 @@ impl FATFileSystem { let lba = self.get_lba_from_offset(self.bytes_to_sector(part_bytes_offset)); - let mut v: Vec = Vec::new(); - v.resize(self.lba_per_sector() * LBA_SIZE, 0); + let mut v: Vec = vec![0; self.lba_per_sector() * LBA_SIZE]; self.partition .disk() .read_at(lba, self.lba_per_sector(), &mut v)?; @@ -1025,8 +1019,7 @@ impl FATFileSystem { let lba = self.get_lba_from_offset(self.bytes_to_sector(part_bytes_offset)); - let mut v: Vec = Vec::new(); - v.resize(self.lba_per_sector() * LBA_SIZE, 0); + let mut v: Vec = vec![0; self.lba_per_sector() * LBA_SIZE]; self.partition .disk() .read_at(lba, self.lba_per_sector(), &mut v)?; @@ -1074,8 +1067,7 @@ impl FATFileSystem { let lba = self.get_lba_from_offset(self.bytes_to_sector(fat_part_bytes_offset)); - let mut v: Vec = Vec::new(); - v.resize(LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; self.partition.disk().read_at(lba, 1, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); @@ -1107,8 +1099,7 @@ impl FATFileSystem { let lba = self.get_lba_from_offset(self.bytes_to_sector(fat_part_bytes_offset)); - let mut v: Vec = Vec::new(); - v.resize(LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; self.partition.disk().read_at(lba, 1, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); @@ -1134,8 +1125,7 @@ impl FATFileSystem { let lba = self.get_lba_from_offset(self.bytes_to_sector(f_offset)); // kdebug!("set entry, lba={lba}, in_block_offset={in_block_offset}"); - let mut v: Vec = Vec::new(); - v.resize(LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; self.partition.disk().read_at(lba, 1, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); @@ -1222,8 +1212,7 @@ impl FATFsInfo { in_disk_fs_info_offset: u64, bytes_per_sec: usize, ) -> Result { - let mut v = Vec::::new(); - v.resize(bytes_per_sec, 0); + let mut v = vec![0; bytes_per_sec]; // 计算fs_info扇区在磁盘上的字节偏移量,从磁盘读取数据 partition @@ -1231,9 +1220,10 @@ impl FATFsInfo { .read_at(in_disk_fs_info_offset as usize / LBA_SIZE, 1, &mut v)?; let mut cursor = VecCursor::new(v); - let mut fsinfo = FATFsInfo::default(); - - fsinfo.lead_sig = cursor.read_u32()?; + let mut fsinfo = FATFsInfo { + lead_sig: cursor.read_u32()?, + ..Default::default() + }; cursor.seek(SeekFrom::SeekCurrent(480))?; fsinfo.struc_sig = cursor.read_u32()?; fsinfo.free_count = cursor.read_u32()?; @@ -1318,8 +1308,7 @@ impl FATFsInfo { let lba = off as usize / LBA_SIZE; - let mut v: Vec = Vec::new(); - v.resize(LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; partition.disk().read_at(lba, 1, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); @@ -1347,8 +1336,7 @@ impl FATFsInfo { let lba = off as usize / LBA_SIZE; - let mut v: Vec = Vec::new(); - v.resize(LBA_SIZE, 0); + let mut v: Vec = vec![0; LBA_SIZE]; partition.disk().read_at(lba, 1, &mut v)?; let mut cursor: VecCursor = VecCursor::new(v); cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?; @@ -1473,25 +1461,29 @@ impl IndexNode for LockedFATInode { match &mut guard.inode_type { FATDirEntry::File(file) | FATDirEntry::VolId(file) => { // 如果新的长度和旧的长度相同,那么就直接返回 - if len == old_size { - return Ok(()); - } else if len > old_size { - // 如果新的长度比旧的长度大,那么就在文件末尾添加空白 - let mut buf: Vec = Vec::new(); - let mut remain_size = len - old_size; - let buf_size = remain_size; - // let buf_size = core::cmp::min(remain_size, 512 * 1024); - buf.resize(buf_size, 0); - - let mut offset = old_size; - while remain_size > 0 { - let write_size = core::cmp::min(remain_size, buf_size); - file.write(fs, &buf[0..write_size], offset as u64)?; - remain_size -= write_size; - offset += write_size; + match len.cmp(&old_size) { + Ordering::Equal => { + return Ok(()); + } + Ordering::Greater => { + // 如果新的长度比旧的长度大,那么就在文件末尾添加空白 + let mut buf: Vec = Vec::new(); + let mut remain_size = len - old_size; + let buf_size = remain_size; + // let buf_size = core::cmp::min(remain_size, 512 * 1024); + buf.resize(buf_size, 0); + + let mut offset = old_size; + while remain_size > 0 { + let write_size = core::cmp::min(remain_size, buf_size); + file.write(fs, &buf[0..write_size], offset as u64)?; + remain_size -= write_size; + offset += write_size; + } + } + Ordering::Less => { + file.truncate(fs, len as u64)?; } - } else { - file.truncate(fs, len as u64)?; } guard.update_metadata(); return Ok(()); @@ -1533,7 +1525,7 @@ impl IndexNode for LockedFATInode { let name: String = ent.name(); // kdebug!("name={name}"); - if guard.children.contains_key(&name.to_uppercase()) == false + if !guard.children.contains_key(&name.to_uppercase()) && name != "." && name != ".." { @@ -1581,7 +1573,7 @@ impl IndexNode for LockedFATInode { let nod = guard.children.remove(&name.to_uppercase()); // 若删除缓存中为管道的文件,则不需要再到磁盘删除 - if let Some(_) = nod { + if nod.is_some() { let file_type = target_guard.metadata.file_type; if file_type == FileType::Pipe { return Ok(()); @@ -1631,16 +1623,16 @@ impl IndexNode for LockedFATInode { // 再从磁盘删除 let r: Result<(), SystemError> = dir.remove(guard.fs.upgrade().unwrap().clone(), name, true); - if r.is_ok() { - return r; - } else { - let r = r.unwrap_err(); - if r == SystemError::ENOTEMPTY { - // 如果要删除的是目录,且不为空,则删除动作未发生,重新加入缓存 - guard.children.insert(name.to_uppercase(), target.clone()); - drop(target_guard); + match r { + Ok(_) => return r, + Err(r) => { + if r == SystemError::ENOTEMPTY { + // 如果要删除的是目录,且不为空,则删除动作未发生,重新加入缓存 + guard.children.insert(name.to_uppercase(), target.clone()); + drop(target_guard); + } + return Err(r); } - return Err(r); } } @@ -1771,7 +1763,7 @@ impl IndexNode for LockedFATInode { // 判断需要创建的类型 if unlikely(mode.contains(ModeType::S_IFREG)) { // 普通文件 - return Ok(self.create(filename, FileType::File, mode)?); + return self.create(filename, FileType::File, mode); } let nod = LockedFATInode::new( diff --git a/kernel/src/filesystem/kernfs/mod.rs b/kernel/src/filesystem/kernfs/mod.rs index df7715aa..9b2066a5 100644 --- a/kernel/src/filesystem/kernfs/mod.rs +++ b/kernel/src/filesystem/kernfs/mod.rs @@ -297,7 +297,6 @@ impl IndexNode for KernFSInode { self.children .lock() .keys() - .into_iter() .for_each(|x| keys.push(x.clone())); return Ok(keys); @@ -641,9 +640,9 @@ pub enum KernInodeType { SymLink, } -impl Into for KernInodeType { - fn into(self) -> FileType { - match self { +impl From for FileType { + fn from(val: KernInodeType) -> Self { + match val { KernInodeType::Dir => FileType::Dir, KernInodeType::File => FileType::File, KernInodeType::SymLink => FileType::SymLink, diff --git a/kernel/src/filesystem/mbr.rs b/kernel/src/filesystem/mbr.rs index f6f7dbb2..807b0557 100644 --- a/kernel/src/filesystem/mbr.rs +++ b/kernel/src/filesystem/mbr.rs @@ -3,7 +3,7 @@ use core::default::Default; /// @brief MBR硬盘分区表项的结构 #[repr(packed)] -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Default)] pub struct MbrDiskPartitionTableEntry { pub flags: u8, // 引导标志符,标记此分区为活动分区 pub starting_head: u8, // 起始磁头号 @@ -39,21 +39,6 @@ pub struct MbrDiskPartionTable { pub bs_trailsig: u16, } -impl Default for MbrDiskPartitionTableEntry { - fn default() -> Self { - MbrDiskPartitionTableEntry { - flags: 0, - starting_head: 0, - starting_sector_cylinder: 0, - part_type: 0, - ending_head: 0, - ending_sector_cylingder: 0, - starting_lba: 0, - total_sectors: 0, - } - } -} - impl Default for MbrDiskPartionTable { fn default() -> Self { MbrDiskPartionTable { diff --git a/kernel/src/filesystem/procfs/mod.rs b/kernel/src/filesystem/procfs/mod.rs index 6967836a..25bfebd3 100644 --- a/kernel/src/filesystem/procfs/mod.rs +++ b/kernel/src/filesystem/procfs/mod.rs @@ -4,7 +4,7 @@ use alloc::{ borrow::ToOwned, collections::BTreeMap, format, - string::String, + string::{String, ToString}, sync::{Arc, Weak}, vec::Vec, }; @@ -99,6 +99,12 @@ impl ProcfsFilePrivateData { } } +impl Default for ProcfsFilePrivateData { + fn default() -> Self { + Self::new() + } +} + /// @brief procfs文件系统的Inode结构体(不包含锁) #[derive(Debug)] pub struct ProcFSInode { @@ -135,14 +141,14 @@ impl ProcFSInode { // 获取该pid对应的pcb结构体 let pid = self.fdata.pid; let pcb = ProcessManager::find(pid); - let pcb = if pcb.is_none() { + let pcb = if let Some(pcb) = pcb { + pcb + } else { kerror!( "ProcFS: Cannot find pcb for pid {:?} when opening its 'status' file.", pid ); return Err(SystemError::ESRCH); - } else { - pcb.unwrap() }; // 传入数据 let pdata: &mut Vec = &mut pdata.data; @@ -579,8 +585,8 @@ impl IndexNode for LockedProcFSInode { atime: TimeSpec::default(), mtime: TimeSpec::default(), ctime: TimeSpec::default(), - file_type: file_type, - mode: mode, + file_type, + mode, nlinks: 1, uid: 0, gid: 0, diff --git a/kernel/src/filesystem/procfs/syscall.rs b/kernel/src/filesystem/procfs/syscall.rs index b2e55b6e..2c4aa041 100644 --- a/kernel/src/filesystem/procfs/syscall.rs +++ b/kernel/src/filesystem/procfs/syscall.rs @@ -9,34 +9,34 @@ use super::kmsg::KMSG; /// 操作内核环形缓冲区 enum SyslogAction { /// Close the log. Currently a NOP. - SyslogActionClose = 0, + Close = 0, /// Open the log. Currently a NOP. - SyslogActionOpen = 1, + Open = 1, /// Read from the log. - SyslogActionRead = 2, + Read = 2, /// Read and clear all messages remaining in the ring buffer. - SyslogActionReadClear = 4, + ReadClear = 4, /// Clear ring buffer. - SyslogActionClear = 5, + Clear = 5, /// Set level of messages printed to console. - SyslogActionConsoleLevel = 8, + ConsoleLevel = 8, /// Return size of the log buffer. - SyslogActionSizeBuffer = 10, + SizeBuffer = 10, /// Invalid SyslogAction - SyslogActionInval, + Inval, } impl From for SyslogAction { fn from(value: usize) -> Self { match value { - 0 => SyslogAction::SyslogActionClose, - 1 => SyslogAction::SyslogActionOpen, - 2 => SyslogAction::SyslogActionRead, - 4 => SyslogAction::SyslogActionReadClear, - 5 => SyslogAction::SyslogActionClear, - 8 => SyslogAction::SyslogActionConsoleLevel, - 10 => SyslogAction::SyslogActionSizeBuffer, - _ => SyslogAction::SyslogActionInval, + 0 => SyslogAction::Close, + 1 => SyslogAction::Open, + 2 => SyslogAction::Read, + 4 => SyslogAction::ReadClear, + 5 => SyslogAction::Clear, + 8 => SyslogAction::ConsoleLevel, + 10 => SyslogAction::SizeBuffer, + _ => SyslogAction::Inval, } } } @@ -64,14 +64,14 @@ impl Syscall { let mut kmsg_guard = unsafe { KMSG.as_ref().unwrap().lock_irqsave() }; match syslog_action { - SyslogAction::SyslogActionClose => Ok(0), - SyslogAction::SyslogActionOpen => Ok(0), - SyslogAction::SyslogActionRead => kmsg_guard.read(buf), - SyslogAction::SyslogActionReadClear => kmsg_guard.read_clear(buf), - SyslogAction::SyslogActionClear => kmsg_guard.clear(), - SyslogAction::SyslogActionSizeBuffer => kmsg_guard.data_size(), - SyslogAction::SyslogActionConsoleLevel => kmsg_guard.set_level(len), - SyslogAction::SyslogActionInval => return Err(SystemError::EINVAL), + SyslogAction::Close => Ok(0), + SyslogAction::Open => Ok(0), + SyslogAction::Read => kmsg_guard.read(buf), + SyslogAction::ReadClear => kmsg_guard.read_clear(buf), + SyslogAction::Clear => kmsg_guard.clear(), + SyslogAction::SizeBuffer => kmsg_guard.data_size(), + SyslogAction::ConsoleLevel => kmsg_guard.set_level(len), + SyslogAction::Inval => return Err(SystemError::EINVAL), } } } diff --git a/kernel/src/filesystem/ramfs/mod.rs b/kernel/src/filesystem/ramfs/mod.rs index b3209bde..71d6a5f3 100644 --- a/kernel/src/filesystem/ramfs/mod.rs +++ b/kernel/src/filesystem/ramfs/mod.rs @@ -297,8 +297,8 @@ impl IndexNode for LockedRamFSInode { atime: TimeSpec::default(), mtime: TimeSpec::default(), ctime: TimeSpec::default(), - file_type: file_type, - mode: mode, + file_type, + mode, nlinks: 1, uid: 0, gid: 0, @@ -501,7 +501,7 @@ impl IndexNode for LockedRamFSInode { // 判断需要创建的类型 if unlikely(mode.contains(ModeType::S_IFREG)) { // 普通文件 - return Ok(self.create(filename, FileType::File, mode)?); + return self.create(filename, FileType::File, mode); } let nod = Arc::new(LockedRamFSInode(SpinLock::new(RamFSInode { @@ -519,7 +519,7 @@ impl IndexNode for LockedRamFSInode { mtime: TimeSpec::default(), ctime: TimeSpec::default(), file_type: FileType::Pipe, - mode: mode, + mode, nlinks: 1, uid: 0, gid: 0, diff --git a/kernel/src/filesystem/sysfs/file.rs b/kernel/src/filesystem/sysfs/file.rs index 033a5389..01450a8a 100644 --- a/kernel/src/filesystem/sysfs/file.rs +++ b/kernel/src/filesystem/sysfs/file.rs @@ -412,12 +412,11 @@ impl KernFSCallback for PreallocKFOpsEmpty { } pub fn sysfs_emit_str(buf: &mut [u8], s: &str) -> Result { - let len; - if buf.len() > s.len() { - len = s.len(); + let len = if buf.len() > s.len() { + s.len() } else { - len = buf.len() - 1; - } + buf.len() - 1 + }; buf[..len].copy_from_slice(&s.as_bytes()[..len]); buf[len] = b'\0'; return Ok(len); diff --git a/kernel/src/filesystem/sysfs/mod.rs b/kernel/src/filesystem/sysfs/mod.rs index f35b519c..43179dc5 100644 --- a/kernel/src/filesystem/sysfs/mod.rs +++ b/kernel/src/filesystem/sysfs/mod.rs @@ -21,12 +21,12 @@ pub mod group; pub mod symlink; /// 全局的sysfs实例 -pub(self) static mut SYSFS_INSTANCE: Option = None; +static mut SYSFS_INSTANCE: Option = None; #[inline(always)] pub fn sysfs_instance() -> &'static SysFS { unsafe { - return &SYSFS_INSTANCE.as_ref().unwrap(); + return SYSFS_INSTANCE.as_ref().unwrap(); } } diff --git a/kernel/src/filesystem/vfs/core.rs b/kernel/src/filesystem/vfs/core.rs index a2326cc8..01a5eaa0 100644 --- a/kernel/src/filesystem/vfs/core.rs +++ b/kernel/src/filesystem/vfs/core.rs @@ -1,6 +1,6 @@ use core::{hint::spin_loop, sync::atomic::Ordering}; -use alloc::{format, string::ToString, sync::Arc}; +use alloc::{string::ToString, sync::Arc}; use system_error::SystemError; use crate::{ @@ -75,7 +75,7 @@ pub fn vfs_init() -> Result<(), SystemError> { sysfs_init().expect("Failed to initialize sysfs"); let root_entries = ROOT_INODE().list().expect("VFS init failed"); - if root_entries.len() > 0 { + if !root_entries.is_empty() { kinfo!("Successfully initialized VFS!"); } return Ok(()); @@ -91,21 +91,21 @@ fn do_migrate( fs: &MountFS, ) -> Result<(), SystemError> { let r = new_root_inode.find(mountpoint_name); - let mountpoint = if r.is_err() { + let mountpoint = if let Ok(r) = r { + r + } else { new_root_inode .create( mountpoint_name, FileType::Dir, ModeType::from_bits_truncate(0o755), ) - .expect(format!("Failed to create '/{mountpoint_name}' in migrating").as_str()) - } else { - r.unwrap() + .unwrap_or_else(|_| panic!("Failed to create '/{mountpoint_name}' in migrating")) }; // 迁移挂载点 mountpoint .mount(fs.inner_filesystem()) - .expect(format!("Failed to migrate {mountpoint_name} ").as_str()); + .unwrap_or_else(|_| panic!("Failed to migrate {mountpoint_name} ")); return Ok(()); } @@ -182,8 +182,7 @@ pub fn do_mkdir(path: &str, _mode: FileMode) -> Result { let inode: Result, SystemError> = ROOT_INODE().lookup(path); - if inode.is_err() { - let errno = inode.unwrap_err(); + if let Err(errno) = inode { // 文件不存在,且需要创建 if errno == SystemError::ENOENT { let (filename, parent_path) = rsplit_path(path); @@ -277,7 +276,7 @@ pub fn do_unlink_at(dirfd: i32, path: &str) -> Result { // @brief mount filesystem pub fn do_mount(fs: Arc, mount_point: &str) -> Result { ROOT_INODE() - .lookup_follow_symlink(&mount_point, VFS_MAX_FOLLOW_SYMLINK_TIMES)? + .lookup_follow_symlink(mount_point, VFS_MAX_FOLLOW_SYMLINK_TIMES)? .mount(fs)?; Ok(0) } diff --git a/kernel/src/filesystem/vfs/fcntl.rs b/kernel/src/filesystem/vfs/fcntl.rs index 900db6fe..0c7b42d5 100644 --- a/kernel/src/filesystem/vfs/fcntl.rs +++ b/kernel/src/filesystem/vfs/fcntl.rs @@ -24,7 +24,7 @@ pub enum FcntlCommand { /// set record locking info (blocking) SetLockWait = 7, - SetLease = F_LINUX_SPECIFIC_BASE + 0, + SetLease = F_LINUX_SPECIFIC_BASE, GetLease = F_LINUX_SPECIFIC_BASE + 1, /// Request nofications on a directory. @@ -66,6 +66,7 @@ bitflags! { /// the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to /// faccessat would be undefined behavior and thus treating it equivalent to /// AT_EACCESS is valid undefined behavior. + #[allow(clippy::bad_bit_mask)] pub struct AtFlags: i32 { /// 特殊值,用于指示openat应使用当前工作目录。 const AT_FDCWD = -100; diff --git a/kernel/src/filesystem/vfs/file.rs b/kernel/src/filesystem/vfs/file.rs index cf62990b..83ae52ec 100644 --- a/kernel/src/filesystem/vfs/file.rs +++ b/kernel/src/filesystem/vfs/file.rs @@ -61,6 +61,7 @@ bitflags! { /// /// 与Linux 5.19.10的uapi/asm-generic/fcntl.h相同 /// https://code.dragonos.org.cn/xref/linux-5.19.10/tools/include/uapi/asm-generic/fcntl.h#19 + #[allow(clippy::bad_bit_mask)] pub struct FileMode: u32{ /* File access modes for `open' and `fcntl'. */ /// Open Read-only @@ -138,13 +139,10 @@ impl File { pub fn new(inode: Arc, mode: FileMode) -> Result { let mut inode = inode; let file_type = inode.metadata()?.file_type; - match file_type { - FileType::Pipe => { - if let Some(SpecialNodeData::Pipe(pipe_inode)) = inode.special_node() { - inode = pipe_inode; - } + if file_type == FileType::Pipe { + if let Some(SpecialNodeData::Pipe(pipe_inode)) = inode.special_node() { + inode = pipe_inode; } - _ => {} } let mut f = File { @@ -289,22 +287,17 @@ impl File { _ => {} } - let pos: i64; - match origin { - SeekFrom::SeekSet(offset) => { - pos = offset; - } - SeekFrom::SeekCurrent(offset) => { - pos = self.offset as i64 + offset; - } + let pos: i64 = match origin { + SeekFrom::SeekSet(offset) => offset, + SeekFrom::SeekCurrent(offset) => self.offset as i64 + offset, SeekFrom::SeekEnd(offset) => { let metadata = self.metadata()?; - pos = metadata.size + offset; + metadata.size + offset } SeekFrom::Invalid => { return Err(SystemError::EINVAL); } - } + }; // 根据linux man page, lseek允许超出文件末尾,并且不改变文件大小 // 当pos超出文件末尾时,read返回0。直到开始写入数据时,才会改变文件大小 if pos < 0 { @@ -355,7 +348,7 @@ impl File { return Ok(0); } let name = &self.readdir_subdirs_name[self.offset]; - let sub_inode: Arc = match inode.find(&name) { + let sub_inode: Arc = match inode.find(name) { Ok(i) => i, Err(e) => { kerror!( @@ -401,9 +394,9 @@ impl File { pub fn try_clone(&self) -> Option { let mut res = Self { inode: self.inode.clone(), - offset: self.offset.clone(), - mode: self.mode.clone(), - file_type: self.file_type.clone(), + offset: self.offset, + mode: self.mode, + file_type: self.file_type, readdir_subdirs_name: self.readdir_subdirs_name.clone(), private_data: self.private_data.clone(), }; @@ -573,11 +566,7 @@ impl FileDescriptorVec { /// @return false 不合法 #[inline] pub fn validate_fd(fd: i32) -> bool { - if fd < 0 || fd as usize > FileDescriptorVec::PROCESS_MAX_FD { - return false; - } else { - return true; - } + return !(fd < 0 || fd as usize > FileDescriptorVec::PROCESS_MAX_FD); } /// 申请文件描述符,并把文件对象存入其中。 @@ -592,9 +581,7 @@ impl FileDescriptorVec { /// - `Ok(i32)` 申请成功,返回申请到的文件描述符 /// - `Err(SystemError)` 申请失败,返回错误码,并且,file对象将被drop掉 pub fn alloc_fd(&mut self, file: File, fd: Option) -> Result { - if fd.is_some() { - // 指定了要申请的文件描述符编号 - let new_fd = fd.unwrap(); + if let Some(new_fd) = fd { let x = &mut self.fds[new_fd as usize]; if x.is_none() { *x = Some(Arc::new(SpinLock::new(file))); diff --git a/kernel/src/filesystem/vfs/mount.rs b/kernel/src/filesystem/vfs/mount.rs index ab58a25e..9661b139 100644 --- a/kernel/src/filesystem/vfs/mount.rs +++ b/kernel/src/filesystem/vfs/mount.rs @@ -48,7 +48,7 @@ impl MountFS { return MountFS { inner_filesystem: inner_fs, mountpoints: SpinLock::new(BTreeMap::new()), - self_mountpoint: self_mountpoint, + self_mountpoint, self_ref: Weak::default(), } .wrap(); diff --git a/kernel/src/filesystem/vfs/open.rs b/kernel/src/filesystem/vfs/open.rs index 33db06e4..f19ba155 100644 --- a/kernel/src/filesystem/vfs/open.rs +++ b/kernel/src/filesystem/vfs/open.rs @@ -89,30 +89,30 @@ fn do_sys_openat2( }, ); - let inode: Arc = if inode.is_err() { - let errno = inode.unwrap_err(); - // 文件不存在,且需要创建 - if how.o_flags.contains(FileMode::O_CREAT) - && !how.o_flags.contains(FileMode::O_DIRECTORY) - && errno == SystemError::ENOENT - { - let (filename, parent_path) = rsplit_path(&path); - // 查找父目录 - let parent_inode: Arc = - ROOT_INODE().lookup(parent_path.unwrap_or("/"))?; - // 创建文件 - let inode: Arc = parent_inode.create( - filename, - FileType::File, - ModeType::from_bits_truncate(0o755), - )?; - inode - } else { - // 不需要创建文件,因此返回错误码 - return Err(errno); + let inode: Arc = match inode { + Ok(inode) => inode, + Err(errno) => { + // 文件不存在,且需要创建 + if how.o_flags.contains(FileMode::O_CREAT) + && !how.o_flags.contains(FileMode::O_DIRECTORY) + && errno == SystemError::ENOENT + { + let (filename, parent_path) = rsplit_path(&path); + // 查找父目录 + let parent_inode: Arc = + ROOT_INODE().lookup(parent_path.unwrap_or("/"))?; + // 创建文件 + let inode: Arc = parent_inode.create( + filename, + FileType::File, + ModeType::from_bits_truncate(0o755), + )?; + inode + } else { + // 不需要创建文件,因此返回错误码 + return Err(errno); + } } - } else { - inode.unwrap() }; let file_type: FileType = inode.metadata()?.file_type; diff --git a/kernel/src/filesystem/vfs/syscall.rs b/kernel/src/filesystem/vfs/syscall.rs index 52cb9403..871cd8c8 100644 --- a/kernel/src/filesystem/vfs/syscall.rs +++ b/kernel/src/filesystem/vfs/syscall.rs @@ -1,6 +1,7 @@ use core::ffi::c_void; use core::mem::size_of; +use alloc::string::ToString; use alloc::{string::String, sync::Arc, vec::Vec}; use system_error::SystemError; @@ -383,7 +384,7 @@ impl From for OpenHow { fn from(posix_open_how: PosixOpenHow) -> Self { let o_flags = FileMode::from_bits_truncate(posix_open_how.flags as u32); let mode = ModeType::from_bits_truncate(posix_open_how.mode as u32); - let resolve = OpenHowResolve::from_bits_truncate(posix_open_how.resolve as u64); + let resolve = OpenHowResolve::from_bits_truncate(posix_open_how.resolve); return Self::new(o_flags, mode, resolve); } } @@ -430,7 +431,7 @@ impl Syscall { ) -> Result { let path = check_and_clone_cstr(path, Some(MAX_PATHLEN))?; let open_flags: FileMode = FileMode::from_bits(o_flags).ok_or(SystemError::EINVAL)?; - let mode = ModeType::from_bits(mode as u32).ok_or(SystemError::EINVAL)?; + let mode = ModeType::from_bits(mode).ok_or(SystemError::EINVAL)?; return do_sys_open( AtFlags::AT_FDCWD.bits(), &path, @@ -449,7 +450,7 @@ impl Syscall { ) -> Result { let path = check_and_clone_cstr(path, Some(MAX_PATHLEN))?; let open_flags: FileMode = FileMode::from_bits(o_flags).ok_or(SystemError::EINVAL)?; - let mode = ModeType::from_bits(mode as u32).ok_or(SystemError::EINVAL)?; + let mode = ModeType::from_bits(mode).ok_or(SystemError::EINVAL)?; return do_sys_open(dirfd, &path, open_flags, mode, follow_symlink); } @@ -633,13 +634,13 @@ impl Syscall { let proc = ProcessManager::current_pcb(); // Copy path to kernel space to avoid some security issues let mut new_path = String::from(""); - if path.len() > 0 { + if !path.is_empty() { let cwd = match path.as_bytes()[0] { b'/' => String::from("/"), _ => proc.basic().cwd(), }; - let mut cwd_vec: Vec<_> = cwd.split("/").filter(|&x| x != "").collect(); - let path_split = path.split("/").filter(|&x| x != ""); + let mut cwd_vec: Vec<_> = cwd.split('/').filter(|&x| !x.is_empty()).collect(); + let path_split = path.split('/').filter(|&x| !x.is_empty()); for seg in path_split { if seg == ".." { cwd_vec.pop(); @@ -651,10 +652,10 @@ impl Syscall { } //proc.basic().set_path(String::from("")); for seg in cwd_vec { - new_path.push_str("/"); + new_path.push('/'); new_path.push_str(seg); } - if new_path == "" { + if new_path.is_empty() { new_path = String::from("/"); } } @@ -667,7 +668,7 @@ impl Syscall { }; let metadata = inode.metadata()?; if metadata.file_type == FileType::Dir { - proc.basic_mut().set_cwd(String::from(new_path)); + proc.basic_mut().set_cwd(new_path); return Ok(0); } else { return Err(SystemError::ENOTDIR); @@ -915,7 +916,7 @@ impl Syscall { let filename_from = check_and_clone_cstr(filename_from, Some(MAX_PATHLEN)).unwrap(); let filename_to = check_and_clone_cstr(filename_to, Some(MAX_PATHLEN)).unwrap(); // 文件名过长 - if filename_from.len() > MAX_PATHLEN as usize || filename_to.len() > MAX_PATHLEN as usize { + if filename_from.len() > MAX_PATHLEN || filename_to.len() > MAX_PATHLEN { return Err(SystemError::ENAMETOOLONG); } @@ -988,7 +989,7 @@ impl Syscall { let new_exists = fd_table_guard.get_file_by_fd(newfd).is_some(); if new_exists { // close newfd - if let Err(_) = fd_table_guard.drop_fd(newfd) { + if fd_table_guard.drop_fd(newfd).is_err() { // An I/O error occurred while attempting to close fildes2. return Err(SystemError::EIO); } @@ -1145,7 +1146,7 @@ impl Syscall { let mut kstat = PosixKstat::new(); // 获取文件信息 let metadata = file.lock().metadata()?; - kstat.size = metadata.size as i64; + kstat.size = metadata.size; kstat.dev_id = metadata.dev_id as u64; kstat.inode = metadata.inode_id.into() as u64; kstat.blcok_size = metadata.blk_size as i64; @@ -1290,8 +1291,8 @@ impl Syscall { StxAttributes::STATX_ATTR_AUTOMOUNT | StxAttributes::STATX_ATTR_DAX; tmp.stx_dev_major = metadata.dev_id as u32; tmp.stx_dev_minor = metadata.dev_id as u32; // - tmp.stx_rdev_major = metadata.raw_dev.data() as u32; - tmp.stx_rdev_minor = metadata.raw_dev.data() as u32; + tmp.stx_rdev_major = metadata.raw_dev.data(); + tmp.stx_rdev_minor = metadata.raw_dev.data(); } if mask.contains(PosixStatxMask::STATX_MNT_ID) { tmp.stx_mnt_id = 0; @@ -1357,8 +1358,7 @@ impl Syscall { // IoVecs会进行用户态检验 let mut iovecs = unsafe { IoVecs::from_user(iov as *const IoVec, count, true) }?; - let mut data = Vec::new(); - data.resize(iovecs.0.iter().map(|x| x.len()).sum(), 0); + let mut data = vec![0; iovecs.0.iter().map(|x| x.len()).sum()]; let len = Self::read(fd, &mut data)?; @@ -1377,7 +1377,7 @@ impl Syscall { let path = path.as_str().trim(); let mut user_buf = UserBufferWriter::new(user_buf, buf_size, true)?; - let (inode, path) = user_path_at(&ProcessManager::current_pcb(), dirfd, &path)?; + let (inode, path) = user_path_at(&ProcessManager::current_pcb(), dirfd, path)?; let inode = inode.lookup(path.as_str())?; if inode.metadata()?.file_type != FileType::SymLink { @@ -1481,7 +1481,7 @@ impl Syscall { let filesystemtype = producefs!(FSMAKER, filesystemtype)?; - return Vcore::do_mount(filesystemtype, (format!("{target}")).as_str()); + return Vcore::do_mount(filesystemtype, target.to_string().as_str()); } // 想法:可以在VFS中实现一个文件系统分发器,流程如下: diff --git a/kernel/src/include/bindings/mod.rs b/kernel/src/include/bindings/mod.rs index 90c70dcc..ee999761 100644 --- a/kernel/src/include/bindings/mod.rs +++ b/kernel/src/include/bindings/mod.rs @@ -1 +1,2 @@ +#[allow(clippy::module_inception)] pub mod bindings; diff --git a/kernel/src/init/init.rs b/kernel/src/init/init.rs index 0156787e..b7c84d5c 100644 --- a/kernel/src/init/init.rs +++ b/kernel/src/init/init.rs @@ -30,7 +30,7 @@ use crate::{ /// 前面可能会有一个架构相关的函数 pub fn start_kernel() -> ! { // 进入内核后,中断应该是关闭的 - assert_eq!(CurrentIrqArch::is_irq_enabled(), false); + assert!(!CurrentIrqArch::is_irq_enabled()); do_start_kernel(); diff --git a/kernel/src/init/initial_kthread.rs b/kernel/src/init/initial_kthread.rs index 12d8ab0d..517a8763 100644 --- a/kernel/src/init/initial_kthread.rs +++ b/kernel/src/init/initial_kthread.rs @@ -11,7 +11,7 @@ use crate::{ filesystem::vfs::core::mount_root_fs, kdebug, kerror, net::net_core::net_init, - process::{kthread::KernelThreadMechanism, process::stdio_init}, + process::{kthread::KernelThreadMechanism, stdio::stdio_init}, smp::smp_init, }; @@ -24,7 +24,7 @@ pub fn initial_kernel_thread() -> i32 { switch_to_user(); - loop {} + unreachable!(); } fn kernel_init() -> Result<(), SystemError> { diff --git a/kernel/src/init/mod.rs b/kernel/src/init/mod.rs index ffe7c37f..c67a9001 100644 --- a/kernel/src/init/mod.rs +++ b/kernel/src/init/mod.rs @@ -6,7 +6,7 @@ use crate::{ libs::rwlock::RwLock, mm::{PhysAddr, VirtAddr}, }; - +#[allow(clippy::module_inception)] pub mod init; pub mod initcall; pub mod initial_kthread; @@ -77,7 +77,7 @@ impl BootParams { break; } } - let pos = pos.unwrap_or_else(|| self.boot_command_line.len() - 1) as isize; + let pos = pos.unwrap_or(self.boot_command_line.len() - 1) as isize; let avail = self.boot_command_line.len() as isize - pos - 1; if avail <= 0 { diff --git a/kernel/src/ipc/pipe.rs b/kernel/src/ipc/pipe.rs index 5e227cc1..5965510c 100644 --- a/kernel/src/ipc/pipe.rs +++ b/kernel/src/ipc/pipe.rs @@ -107,8 +107,8 @@ impl LockedPipeInode { valid_cnt: 0, read_pos: 0, write_pos: 0, - read_wait_queue: WaitQueue::INIT, - write_wait_queue: WaitQueue::INIT, + read_wait_queue: WaitQueue::default(), + write_wait_queue: WaitQueue::default(), data: [0; PIPE_BUFF_SIZE], metadata: Metadata { @@ -232,9 +232,9 @@ impl IndexNode for LockedPipeInode { .write_wait_queue .wakeup(Some(ProcessState::Blocked(true))); - let pollflag = EPollEventType::from_bits_truncate(inode.poll(&data)? as u32); + let pollflag = EPollEventType::from_bits_truncate(inode.poll(data)? as u32); // 唤醒epoll中等待的进程 - EventPoll::wakeup_epoll(&mut inode.epitems, pollflag)?; + EventPoll::wakeup_epoll(&inode.epitems, pollflag)?; //返回读取的字节数 return Ok(num); @@ -329,8 +329,9 @@ impl IndexNode for LockedPipeInode { let mut inode = self.0.lock(); - // TODO: 如果已经没有读端存在了,则向写端进程发送SIGPIPE信号 - if inode.reader == 0 {} + if inode.reader == 0 { + // TODO: 如果已经没有读端存在了,则向写端进程发送SIGPIPE信号 + } // 如果管道空间不够 @@ -384,9 +385,9 @@ impl IndexNode for LockedPipeInode { .read_wait_queue .wakeup(Some(ProcessState::Blocked(true))); - let pollflag = EPollEventType::from_bits_truncate(inode.poll(&data)? as u32); + let pollflag = EPollEventType::from_bits_truncate(inode.poll(data)? as u32); // 唤醒epoll中等待的进程 - EventPoll::wakeup_epoll(&mut inode.epitems, pollflag)?; + EventPoll::wakeup_epoll(&inode.epitems, pollflag)?; // 返回写入的字节数 return Ok(len); diff --git a/kernel/src/ipc/signal.rs b/kernel/src/ipc/signal.rs index 212981fc..873b3fcf 100644 --- a/kernel/src/ipc/signal.rs +++ b/kernel/src/ipc/signal.rs @@ -100,7 +100,7 @@ impl Signal { self.complete_signal(pcb.clone(), pt); } // 如果不是实时信号的话,同一时刻信号队列里只会有一个待处理的信号,如果重复接收就不做处理 - else if !self.is_rt_signal() && pending.queue().find(self.clone()).0.is_some() { + else if !self.is_rt_signal() && pending.queue().find(*self).0.is_some() { return Ok(0); } else { // TODO signalfd_notify 完善 signalfd 机制 @@ -108,12 +108,12 @@ impl Signal { let new_sig_info = match info { Some(siginfo) => { // 已经显式指定了siginfo,则直接使用它。 - (*siginfo).clone() + *siginfo } None => { // 不需要显示指定siginfo,因此设置为默认值 SigInfo::new( - self.clone(), + *self, 0, SigCode::User, SigType::Kill(ProcessManager::current_pcb().pid()), @@ -127,7 +127,7 @@ impl Signal { .q .push(new_sig_info); - if pt == PidType::PGID || pt == PidType::SID {} + // if pt == PidType::PGID || pt == PidType::SID {} self.complete_signal(pcb.clone(), pt); } compiler_fence(core::sync::atomic::Ordering::SeqCst); @@ -139,6 +139,7 @@ impl Signal { /// @param sig 信号 /// @param pcb 目标pcb /// @param pt siginfo结构体中,pid字段代表的含义 + #[allow(clippy::if_same_then_else)] fn complete_signal(&self, pcb: Arc, pt: PidType) { // kdebug!("complete_signal"); @@ -158,7 +159,7 @@ impl Signal { pcb.sig_info_mut() .sig_pending_mut() .signal_mut() - .insert(self.clone().into()); + .insert((*self).into()); target_pcb = Some(pcb.clone()); } else if pt == PidType::PID { /* @@ -189,11 +190,7 @@ impl Signal { #[inline] fn wants_signal(&self, pcb: Arc) -> bool { // 如果改进程屏蔽了这个signal,则不能接收 - if pcb - .sig_info_irqsave() - .sig_block() - .contains(self.clone().into()) - { + if pcb.sig_info_irqsave().sig_block().contains((*self).into()) { return false; } @@ -206,18 +203,14 @@ impl Signal { return true; } let state = pcb.sched_info().inner_lock_read_irqsave().state(); - if state.is_blocked() && (state.is_blocked_interruptable() == false) { + if state.is_blocked() && (!state.is_blocked_interruptable()) { return false; } // todo: 检查目标进程是否正在一个cpu上执行,如果是,则返回true,否则继续检查下一项 // 检查目标进程是否有信号正在等待处理,如果是,则返回false,否则返回true - if pcb.sig_info_irqsave().sig_pending().signal().bits() == 0 { - return true; - } else { - return false; - } + return pcb.sig_info_irqsave().sig_pending().signal().bits() == 0; } /// @brief 判断signal的处理是否可能使得整个进程组退出 @@ -225,7 +218,7 @@ impl Signal { #[allow(dead_code)] #[inline] fn sig_fatal(&self, pcb: Arc) -> bool { - let action = pcb.sig_struct().handlers[self.clone() as usize - 1].action(); + let action = pcb.sig_struct().handlers[*self as usize - 1].action(); // 如果handler是空,采用默认函数,signal处理可能会导致进程退出。 match action { SigactionType::SaHandler(handler) => handler.is_sig_default(), @@ -274,7 +267,7 @@ impl Signal { { return true; } - return !pcb.sig_struct().handlers[self.clone() as usize - 1].is_ignore(); + return !pcb.sig_struct().handlers[*self as usize - 1].is_ignore(); //TODO 仿照 linux 中的prepare signal完善逻辑,linux 中还会根据例如当前进程状态(Existing)进行判断,现在的信号能否发出就只是根据 ignored 来判断 } @@ -321,12 +314,10 @@ fn signal_wake_up(pcb: Arc, _guard: SpinLockGuard, force_default: bool) for sigaction in actions.iter_mut() { if force_default || !sigaction.is_ignore() { - sigaction.set_action(SigactionType::SaHandler(SaHandlerType::SigDefault)); + sigaction.set_action(SigactionType::SaHandler(SaHandlerType::Default)); } // 清除flags中,除了DFL和IGN以外的所有标志 sigaction.set_restorer(None); @@ -376,9 +367,8 @@ pub(super) fn do_sigaction( // 保存原有的 sigaction let old_act: Option<&mut Sigaction> = { - if old_act.is_some() { - let oa = old_act.unwrap(); - *(oa) = (*action).clone(); + if let Some(oa) = old_act { + *(oa) = *action; Some(oa) } else { None @@ -386,8 +376,7 @@ pub(super) fn do_sigaction( }; // 清除所有的脏的sa_flags位(也就是清除那些未使用的) let act = { - if act.is_some() { - let ac = act.unwrap(); + if let Some(ac) = act { *ac.flags_mut() &= SigFlags::SA_ALL; Some(ac) } else { @@ -395,15 +384,14 @@ pub(super) fn do_sigaction( } }; - if old_act.is_some() { - *old_act.unwrap().flags_mut() &= SigFlags::SA_ALL; + if let Some(act) = old_act { + *act.flags_mut() &= SigFlags::SA_ALL; } - if act.is_some() { - let ac = act.unwrap(); + if let Some(ac) = act { // 将act.sa_mask的SIGKILL SIGSTOP的屏蔽清除 ac.mask_mut() - .remove(SigSet::from(Signal::SIGKILL.into()) | SigSet::from(Signal::SIGSTOP.into())); + .remove(>::into(Signal::SIGKILL) | Signal::SIGSTOP.into()); // 将新的sigaction拷贝到进程的action中 *action = *ac; @@ -430,7 +418,9 @@ pub(super) fn do_sigaction( /// /// - `new_set` 新的屏蔽信号bitmap的值 pub fn set_current_sig_blocked(new_set: &mut SigSet) { - new_set.remove(SigSet::from(Signal::SIGKILL.into()) | SigSet::from(Signal::SIGSTOP.into())); + let to_remove: SigSet = + >::into(Signal::SIGKILL) | Signal::SIGSTOP.into(); + new_set.remove(to_remove); //TODO 把这个散装函数用 sigsetops 替换掉 let pcb = ProcessManager::current_pcb(); diff --git a/kernel/src/ipc/signal_types.rs b/kernel/src/ipc/signal_types.rs index 21e12f01..33f1ec5e 100644 --- a/kernel/src/ipc/signal_types.rs +++ b/kernel/src/ipc/signal_types.rs @@ -68,14 +68,14 @@ pub struct InnerSignalStruct { pub cnt: AtomicI64, /// 如果对应linux,这部分会有一个引用计数,但是没发现在哪里有用到需要计算引用的地方,因此 /// 暂时删掉,不然这个Arc会导致其他地方的代码十分丑陋 - pub handlers: [Sigaction; MAX_SIG_NUM as usize], + pub handlers: [Sigaction; MAX_SIG_NUM], } impl SignalStruct { #[inline(never)] pub fn new() -> Self { Self { - inner: Box::new(InnerSignalStruct::default()), + inner: Box::::default(), } } } @@ -98,7 +98,7 @@ impl Default for InnerSignalStruct { fn default() -> Self { Self { cnt: Default::default(), - handlers: [Sigaction::default(); MAX_SIG_NUM as usize], + handlers: [Sigaction::default(); MAX_SIG_NUM], } } } @@ -123,32 +123,32 @@ impl SigactionType { /// /// [`SigIgnore`]: SaHandlerType::SigIgnore pub fn is_ignore(&self) -> bool { - return matches!(self, Self::SaHandler(SaHandlerType::SigIgnore)); + return matches!(self, Self::SaHandler(SaHandlerType::Ignore)); } /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigCustomized(_))`]. /// /// [`SigCustomized`]: SaHandlerType::SigCustomized(_) pub fn is_customized(&self) -> bool { - return matches!(self, Self::SaHandler(SaHandlerType::SigCustomized(_))); + return matches!(self, Self::SaHandler(SaHandlerType::Customized(_))); } } #[derive(Debug, Copy, Clone)] #[allow(dead_code)] pub enum SaHandlerType { - SigError, // 暂时没有用上 - SigDefault, - SigIgnore, - SigCustomized(VirtAddr), + Error, // 暂时没有用上 + Default, + Ignore, + Customized(VirtAddr), } -impl Into for SaHandlerType { - fn into(self) -> usize { - match self { - Self::SigError => 2 as usize, - Self::SigIgnore => 1 as usize, - Self::SigDefault => 0 as usize, - Self::SigCustomized(handler) => handler.data(), +impl From for usize { + fn from(value: SaHandlerType) -> Self { + match value { + SaHandlerType::Error => 2, + SaHandlerType::Ignore => 1, + SaHandlerType::Default => 0, + SaHandlerType::Customized(handler) => handler.data(), } } } @@ -158,21 +158,21 @@ impl SaHandlerType { /// /// [`SigDefault`]: SaHandlerType::SigDefault pub fn is_sig_default(&self) -> bool { - matches!(self, Self::SigDefault) + matches!(self, Self::Default) } /// Returns `true` if the sa handler type is [`SigIgnore`]. /// /// [`SigIgnore`]: SaHandlerType::SigIgnore pub fn is_sig_ignore(&self) -> bool { - matches!(self, Self::SigIgnore) + matches!(self, Self::Ignore) } /// Returns `true` if the sa handler type is [`SigError`]. /// /// [`SigError`]: SaHandlerType::SigError pub fn is_sig_error(&self) -> bool { - matches!(self, Self::SigError) + matches!(self, Self::Error) } } @@ -190,7 +190,7 @@ pub struct Sigaction { impl Default for Sigaction { fn default() -> Self { Self { - action: SigactionType::SaHandler(SaHandlerType::SigDefault), + action: SigactionType::SaHandler(SaHandlerType::Default), flags: Default::default(), mask: Default::default(), restorer: Default::default(), @@ -260,7 +260,7 @@ impl Sigaction { /// 默认信号处理程序占位符(用于在sighand结构体中的action数组中占位) pub const DEFAULT_SIGACTION: Sigaction = Sigaction { - action: SigactionType::SaHandler(SaHandlerType::SigDefault), + action: SigactionType::SaHandler(SaHandlerType::Default), flags: SigFlags::empty(), mask: SigSet::from_bits_truncate(0), restorer: None, @@ -268,7 +268,7 @@ impl Sigaction { /// 默认的“忽略信号”的sigaction pub const DEFAULT_SIGACTION_IGNORE: Sigaction = Sigaction { - action: SigactionType::SaHandler(SaHandlerType::SigIgnore), + action: SigactionType::SaHandler(SaHandlerType::Ignore), flags: SigFlags::empty(), mask: SigSet::from_bits_truncate(0), restorer: None, @@ -353,21 +353,12 @@ impl SigInfo { } } -#[derive(Debug)] +#[derive(Debug, Default)] pub struct SigPending { signal: SigSet, queue: SigQueue, } -impl Default for SigPending { - fn default() -> Self { - SigPending { - signal: SigSet::default(), - queue: SigQueue::default(), - } - } -} - impl SigPending { /// 判断是否有待处理的信号 pub fn has_pending(&self) -> bool { @@ -425,8 +416,8 @@ impl SigPending { self.signal_mut().remove(sig.into()); } - if info.is_some() { - return info.unwrap(); + if let Some(info) = info { + return info; } else { // 信号不在sigqueue中,这意味着当前信号是来自快速路径,因此直接把siginfo设置为0即可。 let mut ret = SigInfo::new(sig, 0, SigCode::User, SigType::Kill(Pid::from(0))); @@ -442,13 +433,12 @@ impl SigPending { // 获取下一个要处理的信号的编号 let sig = self.next_signal(sig_mask); - let info: Option; - if sig != Signal::INVALID { + let info: Option = if sig != Signal::INVALID { // 如果下一个要处理的信号是合法的,则收集其siginfo - info = Some(self.collect_signal(sig)); + Some(self.collect_signal(sig)) } else { - info = None; - } + None + }; // 当一个进程具有多个线程之后,在这里需要重新计算线程的flag中的TIF_SIGPENDING位 // recalc_sigpending(); @@ -463,7 +453,7 @@ impl SigPending { } /// @brief 进程接收到的信号的队列 -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct SigQueue { pub q: Vec, } @@ -536,14 +526,6 @@ impl SigQueue { } } -impl Default for SigQueue { - fn default() -> Self { - Self { - q: Default::default(), - } - } -} - /// /// 定义了不同架构下实现 Signal 要实现的接口 /// diff --git a/kernel/src/ipc/syscall.rs b/kernel/src/ipc/syscall.rs index 9d712f5a..9b907745 100644 --- a/kernel/src/ipc/syscall.rs +++ b/kernel/src/ipc/syscall.rs @@ -130,13 +130,13 @@ impl Syscall { let input_sighandler = unsafe { (*act).handler as u64 }; match input_sighandler { USER_SIG_DFL => { - new_ka = Sigaction::DEFAULT_SIGACTION.clone(); + new_ka = Sigaction::DEFAULT_SIGACTION; *new_ka.flags_mut() = unsafe { (*act).flags }; new_ka.set_restorer(None); } USER_SIG_IGN => { - new_ka = Sigaction::DEFAULT_SIGACTION_IGNORE.clone(); + new_ka = Sigaction::DEFAULT_SIGACTION_IGNORE; *new_ka.flags_mut() = unsafe { (*act).flags }; new_ka.set_restorer(None); @@ -145,7 +145,7 @@ impl Syscall { // 从用户空间获得sigaction结构体 // TODO mask是default还是用户空间传入 new_ka = Sigaction::new( - SigactionType::SaHandler(SaHandlerType::SigCustomized(unsafe { + SigactionType::SaHandler(SaHandlerType::Customized(unsafe { VirtAddr::new((*act).handler as usize) })), unsafe { (*act).flags }, @@ -171,7 +171,7 @@ impl Syscall { *new_ka.mask_mut() = mask; } - let sig = Signal::from(sig as i32); + let sig = Signal::from(sig); // 如果给出的信号值不合法 if sig == Signal::INVALID { return Err(SystemError::EINVAL); @@ -199,10 +199,9 @@ impl Syscall { return Err(SystemError::EFAULT); } - let sigaction_handler: VirtAddr; - sigaction_handler = match old_sigaction.action() { + let sigaction_handler = match old_sigaction.action() { SigactionType::SaHandler(handler) => { - if let SaHandlerType::SigCustomized(hand) = handler { + if let SaHandlerType::Customized(hand) = handler { hand } else if handler.is_sig_ignore() { VirtAddr::new(USER_SIG_IGN as usize) diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 4fabac30..778f00c3 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -25,19 +25,18 @@ #![cfg_attr(target_os = "none", no_std)] // clippy的配置 #![deny(clippy::all)] +#![allow(clippy::bad_bit_mask)] // DragonOS允许在函数中使用return语句(尤其是长函数时,我们推荐这么做) #![allow(clippy::let_and_return)] #![allow(clippy::needless_pass_by_ref_mut)] #![allow(clippy::needless_return)] +#![allow(clippy::single_char_pattern)] #![allow(clippy::upper_case_acronyms)] #[cfg(test)] #[macro_use] extern crate std; -#[allow(non_upper_case_globals)] -#[allow(non_camel_case_types)] -#[allow(non_snake_case)] use core::panic::PanicInfo; /// 导出x86_64架构相关的代码,命名为arch模块 diff --git a/kernel/src/libs/align.rs b/kernel/src/libs/align.rs index 4303dd61..4beee8aa 100644 --- a/kernel/src/libs/align.rs +++ b/kernel/src/libs/align.rs @@ -117,6 +117,10 @@ impl Clone for AlignedBox /// 一个用于表明某个类型是安全的用于零初始化的 trait /// /// 该 trait 用于表明某个类型是安全的用于零初始化的,即该类型的所有位都可以被初始化为 0 而不会出现未定义行为。 +/// +/// # Safety +/// +/// 该 trait 是 unsafe 的,因为它要求实现者保证该类型的所有位都可以被初始化为 0 而不会出现未定义行为。 pub unsafe trait SafeForZero {} unsafe impl SafeForZero for [u8; NUM] {} diff --git a/kernel/src/libs/elf.rs b/kernel/src/libs/elf.rs index c27cb4b7..2cb4f7e3 100644 --- a/kernel/src/libs/elf.rs +++ b/kernel/src/libs/elf.rs @@ -194,6 +194,7 @@ impl ElfLoader { /// ## 返回值 /// /// - `Ok((VirtAddr, bool))`:如果成功加载,则bool值为true,否则为false. VirtAddr为加载的地址 + #[allow(clippy::too_many_arguments)] fn load_elf_segment( &self, user_vm_guard: &mut RwLockWriteGuard<'_, InnerAddressSpace>, @@ -501,7 +502,7 @@ impl ElfLoader { } impl BinaryLoader for ElfLoader { - fn probe(self: &'static Self, param: &ExecParam, buf: &[u8]) -> Result<(), ExecError> { + fn probe(&'static self, param: &ExecParam, buf: &[u8]) -> Result<(), ExecError> { // let elf_bytes = // ElfBytes::::minimal_parse(buf).map_err(|_| ExecError::NotExecutable)?; @@ -518,7 +519,7 @@ impl BinaryLoader for ElfLoader { } fn load( - self: &'static Self, + &'static self, param: &mut ExecParam, head_buf: &[u8], ) -> Result { @@ -546,7 +547,7 @@ impl BinaryLoader for ElfLoader { let interpreter: Option = None; for seg in phdr_table { if seg.p_type == PT_GNU_PROPERTY { - _gnu_property_data = Some(seg.clone()); + _gnu_property_data = Some(seg); continue; } if seg.p_type != PT_INTERP { @@ -659,6 +660,7 @@ impl BinaryLoader for ElfLoader { let vaddr = VirtAddr::new(seg_to_load.p_vaddr.try_into().unwrap()); + #[allow(clippy::if_same_then_else)] if !first_pt_load { elf_map_flags.insert(MapFlags::MAP_FIXED_NOREPLACE); } else if elf_type == ElfType::Executable { @@ -743,10 +745,10 @@ impl BinaryLoader for ElfLoader { } let p_vaddr = VirtAddr::new(seg_to_load.p_vaddr as usize); - if (seg_to_load.p_flags & elf::abi::PF_X) != 0 { - if start_code.is_none() || start_code.as_ref().unwrap() > &p_vaddr { - start_code = Some(p_vaddr); - } + if (seg_to_load.p_flags & elf::abi::PF_X) != 0 + && (start_code.is_none() || start_code.as_ref().unwrap() > &p_vaddr) + { + start_code = Some(p_vaddr); } if start_data.is_none() @@ -796,11 +798,7 @@ impl BinaryLoader for ElfLoader { } // kdebug!("elf load: phdr_vaddr={phdr_vaddr:?}"); let program_entrypoint = VirtAddr::new(ehdr.e_entry as usize + load_bias); - let phdr_vaddr = if phdr_vaddr.is_some() { - Some(phdr_vaddr.unwrap() + load_bias) - } else { - None - }; + let phdr_vaddr = phdr_vaddr.map(|phdr_vaddr| phdr_vaddr + load_bias); elf_bss += load_bias; elf_brk += load_bias; diff --git a/kernel/src/libs/futex/futex.rs b/kernel/src/libs/futex/futex.rs index 1c0b0c54..a09f509b 100644 --- a/kernel/src/libs/futex/futex.rs +++ b/kernel/src/libs/futex/futex.rs @@ -69,7 +69,7 @@ impl FutexHashBucket { /// 进入该函数前,需要关中断 #[inline(always)] pub fn sleep_no_sched(&mut self, futex_q: Arc) -> Result<(), SystemError> { - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); self.chain.push_back(futex_q); ProcessManager::mark_sleep(true)?; @@ -193,7 +193,7 @@ impl PartialEq for PrivateKey { .address_space .as_ref() .unwrap_or(&Weak::default()) - .ptr_eq(&other.address_space.as_ref().unwrap_or(&Weak::default())) + .ptr_eq(other.address_space.as_ref().unwrap_or(&Weak::default())) && self.address == other.address; } } @@ -261,9 +261,7 @@ impl Futex { let pcb = ProcessManager::current_pcb(); // 创建超时计时器任务 let mut timer = None; - if !abs_time.is_none() { - let time = abs_time.unwrap(); - + if let Some(time) = abs_time { let wakeup_helper = WakeUpHelper::new(pcb.clone()); let sec = time.tv_sec; @@ -299,8 +297,8 @@ impl Futex { Some(bucket_mut) => { if !bucket_mut.contains(&futex_q) { // 取消定时器任务 - if timer.is_some() { - timer.unwrap().cancel(); + if let Some(timer) = timer { + timer.cancel(); } return Ok(0); } @@ -309,20 +307,18 @@ impl Futex { } None => { // 取消定时器任务 - if timer.is_some() { - timer.unwrap().cancel(); + if let Some(timer) = timer { + timer.cancel(); } return Ok(0); } }; // 如果是超时唤醒,则返回错误 - if timer.is_some() { - if timer.clone().unwrap().timeout() { - bucket_mut.remove(futex_q); + if timer.is_some() && timer.clone().unwrap().timeout() { + bucket_mut.remove(futex_q); - return Err(SystemError::ETIMEDOUT); - } + return Err(SystemError::ETIMEDOUT); } // TODO: 如果没有挂起的信号,则重新判断是否满足wait要求,重新进入wait @@ -334,12 +330,12 @@ impl Futex { // 需要处理信号然后重启futex系统调用 // 取消定时器任务 - if timer.is_some() { - let timer = timer.unwrap(); + if let Some(timer) = timer { if !timer.timeout() { timer.cancel(); } } + Ok(0) } @@ -412,7 +408,7 @@ impl Futex { return Err(SystemError::EINVAL); } - if likely(!cmpval.is_none()) { + if likely(cmpval.is_some()) { let uval_reader = UserBufferReader::new(uaddr1.as_ptr::(), core::mem::size_of::(), true)?; let curval = uval_reader.read_one_from_user::(0)?; @@ -505,7 +501,7 @@ impl Futex { // 计算相对页的偏移量 let offset = address & (MMArch::PAGE_SIZE - 1); // 判断内存对齐 - if !(uaddr.data() & (core::mem::size_of::() - 1) == 0) { + if uaddr.data() & (core::mem::size_of::() - 1) != 0 { return Err(SystemError::EINVAL); } @@ -555,16 +551,14 @@ impl Futex { let mut oparg = sign_extend32((encoded_op & 0x00fff000) >> 12, 11); let cmparg = sign_extend32(encoded_op & 0x00000fff, 11); - if encoded_op & (FutexOP::FUTEX_OP_OPARG_SHIFT.bits() << 28) != 0 { - if oparg > 31 { - kwarn!( - "futex_wake_op: pid:{} tries to shift op by {}; fix this program", - ProcessManager::current_pcb().pid().data(), - oparg - ); + if (encoded_op & (FutexOP::FUTEX_OP_OPARG_SHIFT.bits() << 28) != 0) && oparg > 31 { + kwarn!( + "futex_wake_op: pid:{} tries to shift op by {}; fix this program", + ProcessManager::current_pcb().pid().data(), + oparg + ); - oparg &= 31; - } + oparg &= 31; } // TODO: 这个汇编似乎是有问题的,目前不好测试 diff --git a/kernel/src/libs/futex/mod.rs b/kernel/src/libs/futex/mod.rs index b8a5b7b9..70c7440b 100644 --- a/kernel/src/libs/futex/mod.rs +++ b/kernel/src/libs/futex/mod.rs @@ -1,3 +1,4 @@ pub mod constant; +#[allow(clippy::module_inception)] pub mod futex; pub mod syscall; diff --git a/kernel/src/libs/keyboard_parser.rs b/kernel/src/libs/keyboard_parser.rs index 2d149eb9..90271d81 100644 --- a/kernel/src/libs/keyboard_parser.rs +++ b/kernel/src/libs/keyboard_parser.rs @@ -13,11 +13,11 @@ pub const TYPE1_KEYCODE_FLAG_BREAK: u8 = 0x80; // 用于判断按键是否被按 #[derive(Debug, PartialEq, Eq)] #[allow(dead_code)] pub enum KeyFlag { - NoneFlag = 0 as u8, - PauseBreak = 1 as u8, - PrintScreenPress = 2 as u8, - PrintScreenRelease = 4 as u8, - OtherKey = 8 as u8, // 除了上面两个按键以外的功能按键(不包括下面的第三类按键) + NoneFlag = 0_u8, + PauseBreak = 1_u8, + PrintScreenPress = 2_u8, + PrintScreenRelease = 4_u8, + OtherKey = 8_u8, // 除了上面两个按键以外的功能按键(不包括下面的第三类按键) } /// @brief A FSM to parse type one keyboard scan code @@ -117,13 +117,11 @@ impl TypeOneFSMState { }; if scancode != PAUSE_BREAK_SCAN_CODE[i as usize] { return self.handle_type3(scancode, scancode_status); + } else if i == 5 { + // 所有Pause Break扫描码都被清除 + return TypeOneFSMState::Start; } else { - if i == 5 { - // 所有Pause Break扫描码都被清除 - return TypeOneFSMState::Start; - } else { - return TypeOneFSMState::PauseBreak(i + 1); - } + return TypeOneFSMState::PauseBreak(i + 1); } } @@ -244,7 +242,7 @@ impl TypeOneFSMState { // 数字小键盘的 / 符号 scancode_status.kp_forward_slash = true; - let ch = '/' as u8; + let ch = b'/'; Self::emit(ch); } 0xb5 => { @@ -252,7 +250,7 @@ impl TypeOneFSMState { } 0x1c => { scancode_status.kp_enter = true; - Self::emit('\n' as u8); + Self::emit(b'\n'); } 0x9c => { scancode_status.kp_enter = false; @@ -266,7 +264,7 @@ impl TypeOneFSMState { fn handle_type3(&self, scancode: u8, scancode_status: &mut ScanCodeStatus) -> TypeOneFSMState { // 判断按键是被按下还是抬起 - let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK as u8)) > 0 { + let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK)) > 0 { false //up } else { true //down @@ -307,7 +305,7 @@ impl TypeOneFSMState { key = KeyFlag::NoneFlag; } _ => { - if flag_make == false { + if !flag_make { // kdebug!("in type3 ch is {:#x}\n",ch); key = KeyFlag::NoneFlag; } @@ -319,14 +317,12 @@ impl TypeOneFSMState { col = true; } - if scancode_status.caps_lock { - if index >= 0x10 && index <= 0x19 { - col = !col; - } else if index >= 0x1e && index <= 0x26 { - col = !col; - } else if index >= 0x2c && index <= 0x32 { - col = !col; - } + if scancode_status.caps_lock + && ((0x10..=0x19).contains(&index) + || (0x1e..=0x26).contains(&index) + || (0x2c..=0x32).contains(&index)) + { + col = !col; } let mut ch = TYPE1_KEY_CODE_MAPTABLE[col as usize + 2 * index as usize]; @@ -373,14 +369,12 @@ impl TypeOneFSMState { } if scancode != PRTSC_SCAN_CODE[i as usize] { return self.handle_type3(scancode, scancode_status); + } else if i == 3 { + // 成功解析出PrtscPress + return TypeOneFSMState::Start; } else { - if i == 3 { - // 成功解析出PrtscPress - return TypeOneFSMState::Start; - } else { - // 继续解析 - return TypeOneFSMState::PrtscPress(i + 1); - } + // 继续解析 + return TypeOneFSMState::PrtscPress(i + 1); } } @@ -400,14 +394,12 @@ impl TypeOneFSMState { } if scancode != PRTSC_SCAN_CODE[i as usize] { return self.handle_type3(scancode, scancode_status); + } else if i == 3 { + // 成功解析出PrtscRelease + return TypeOneFSMState::Start; } else { - if i == 3 { - // 成功解析出PrtscRelease - return TypeOneFSMState::Start; - } else { - // 继续解析 - return TypeOneFSMState::PrtscRelease(i + 1); - } + // 继续解析 + return TypeOneFSMState::PrtscRelease(i + 1); } } } @@ -479,51 +471,44 @@ impl ScanCodeStatus { const TYPE1_KEY_CODE_MAPTABLE: [u8; 256] = [ /*0x00*/ 0, 0, /*0x01*/ 0, 0, // ESC - /*0x02*/ '1' as u8, '!' as u8, /*0x03*/ '2' as u8, '@' as u8, - /*0x04*/ '3' as u8, '#' as u8, /*0x05*/ '4' as u8, '$' as u8, - /*0x06*/ '5' as u8, '%' as u8, /*0x07*/ '6' as u8, '^' as u8, - /*0x08*/ '7' as u8, '&' as u8, /*0x09*/ '8' as u8, '*' as u8, - /*0x0a*/ '9' as u8, '(' as u8, /*0x0b*/ '0' as u8, ')' as u8, - /*0x0c*/ '-' as u8, '_' as u8, /*0x0d*/ '=' as u8, '+' as u8, - /*0x0e \b */ 8 as u8, 8 as u8, // BACKSPACE - /*0x0f*/ '\t' as u8, '\t' as u8, // TAB + /*0x02*/ b'1', b'!', /*0x03*/ b'2', b'@', /*0x04*/ b'3', b'#', + /*0x05*/ b'4', b'$', /*0x06*/ b'5', b'%', /*0x07*/ b'6', b'^', + /*0x08*/ b'7', b'&', /*0x09*/ b'8', b'*', /*0x0a*/ b'9', b'(', + /*0x0b*/ b'0', b')', /*0x0c*/ b'-', b'_', /*0x0d*/ b'=', b'+', + /*0x0e \b */ 8, 8, // BACKSPACE + /*0x0f*/ b'\t', b'\t', // TAB ////////////////////////character/////////////////////////// - /*0x10*/ 'q' as u8, - 'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8, /*0x12*/ 'e' as u8, 'E' as u8, - /*0x13*/ 'r' as u8, 'R' as u8, /*0x14*/ 't' as u8, 'T' as u8, - /*0x15*/ 'y' as u8, 'Y' as u8, /*0x16*/ 'u' as u8, 'U' as u8, - /*0x17*/ 'i' as u8, 'I' as u8, /*0x18*/ 'o' as u8, 'O' as u8, - /*0x19*/ 'p' as u8, 'P' as u8, + /*0x10*/ b'q', b'Q', + /*0x11*/ b'w', b'W', /*0x12*/ b'e', b'E', /*0x13*/ b'r', b'R', + /*0x14*/ b't', b'T', /*0x15*/ b'y', b'Y', /*0x16*/ b'u', b'U', + /*0x17*/ b'i', b'I', /*0x18*/ b'o', b'O', /*0x19*/ b'p', b'P', ////////////////////////character/////////////////////////// - /*0x1a*/ '[' as u8, - '{' as u8, /*0x1b*/ ']' as u8, '}' as u8, /*0x1c*/ '\n' as u8, - '\n' as u8, // ENTER + /*0x1a*/ b'[', b'{', + /*0x1b*/ b']', b'}', /*0x1c*/ b'\n', b'\n', // ENTER /*0x1d*/ 0x1d, 0x1d, // CTRL Left ////////////////////////character/////////////////////////// - /*0x1e*/ 'a' as u8, - 'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8, /*0x20*/ 'd' as u8, 'D' as u8, - /*0x21*/ 'f' as u8, 'F' as u8, /*0x22*/ 'g' as u8, 'G' as u8, - /*0x23*/ 'h' as u8, 'H' as u8, /*0x24*/ 'j' as u8, 'J' as u8, - /*0x25*/ 'k' as u8, 'K' as u8, /*0x26*/ 'l' as u8, 'L' as u8, + /*0x1e*/ b'a', b'A', + /*0x1f*/ b's', b'S', /*0x20*/ b'd', b'D', /*0x21*/ b'f', b'F', + /*0x22*/ b'g', b'G', /*0x23*/ b'h', b'H', /*0x24*/ b'j', b'J', + /*0x25*/ b'k', b'K', /*0x26*/ b'l', b'L', ////////////////////////character/////////////////////////// - /*0x27*/ ';' as u8, - ':' as u8, /*0x28*/ '\'' as u8, '"' as u8, /*0x29*/ '`' as u8, '~' as u8, - /*0x2a*/ 0x2a, 0x2a, // SHIFT Left - /*0x2b*/ '\\' as u8, '|' as u8, + /*0x27*/ b';', b':', + /*0x28*/ b'\'', b'"', /*0x29*/ b'`', b'~', /*0x2a*/ 0x2a, + 0x2a, // SHIFT Left + /*0x2b*/ b'\\', b'|', ////////////////////////character/////////////////////////// - /*0x2c*/ 'z' as u8, - 'Z' as u8, /*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8, - /*0x2f*/ 'v' as u8, 'V' as u8, /*0x30*/ 'b' as u8, 'B' as u8, - /*0x31*/ 'n' as u8, 'N' as u8, /*0x32*/ 'm' as u8, 'M' as u8, + /*0x2c*/ b'z', b'Z', + /*0x2d*/ b'x', b'X', /*0x2e*/ b'c', b'C', /*0x2f*/ b'v', b'V', + /*0x30*/ b'b', b'B', /*0x31*/ b'n', b'N', /*0x32*/ b'm', b'M', ////////////////////////character/////////////////////////// - /*0x33*/ ',' as u8, - '<' as u8, /*0x34*/ '.' as u8, '>' as u8, /*0x35*/ '/' as u8, '?' as u8, - /*0x36*/ 0x36, 0x36, // SHIFT Right - /*0x37*/ '*' as u8, '*' as u8, /*0x38*/ 0x38, 0x38, // ALT Left - /*0x39*/ ' ' as u8, ' ' as u8, /*0x3a*/ 0, 0, // CAPS LOCK + /*0x33*/ b',', b'<', + /*0x34*/ b'.', b'>', /*0x35*/ b'/', b'?', /*0x36*/ 0x36, + 0x36, // SHIFT Right + /*0x37*/ b'*', b'*', /*0x38*/ 0x38, 0x38, // ALT Left + /*0x39*/ b' ', b' ', /*0x3a*/ 0, 0, // CAPS LOCK /*0x3b*/ 0, 0, // F1 /*0x3c*/ 0, 0, // F2 /*0x3d*/ 0, 0, // F3 @@ -536,19 +521,19 @@ const TYPE1_KEY_CODE_MAPTABLE: [u8; 256] = [ /*0x44*/ 0, 0, // F10 /*0x45*/ 0, 0, // NUM LOCK /*0x46*/ 0, 0, // SCROLL LOCK - /*0x47*/ '7' as u8, 0, /*PAD HONE*/ - /*0x48*/ '8' as u8, 0, /*PAD UP*/ - /*0x49*/ '9' as u8, 0, /*PAD PAGEUP*/ - /*0x4a*/ '-' as u8, 0, /*PAD MINUS*/ - /*0x4b*/ '4' as u8, 0, /*PAD LEFT*/ - /*0x4c*/ '5' as u8, 0, /*PAD MID*/ - /*0x4d*/ '6' as u8, 0, /*PAD RIGHT*/ - /*0x4e*/ '+' as u8, 0, /*PAD PLUS*/ - /*0x4f*/ '1' as u8, 0, /*PAD END*/ - /*0x50*/ '2' as u8, 0, /*PAD DOWN*/ - /*0x51*/ '3' as u8, 0, /*PAD PAGEDOWN*/ - /*0x52*/ '0' as u8, 0, /*PAD INS*/ - /*0x53*/ '.' as u8, 0, /*PAD DOT*/ + /*0x47*/ b'7', 0, /*PAD HONE*/ + /*0x48*/ b'8', 0, /*PAD UP*/ + /*0x49*/ b'9', 0, /*PAD PAGEUP*/ + /*0x4a*/ b'-', 0, /*PAD MINUS*/ + /*0x4b*/ b'4', 0, /*PAD LEFT*/ + /*0x4c*/ b'5', 0, /*PAD MID*/ + /*0x4d*/ b'6', 0, /*PAD RIGHT*/ + /*0x4e*/ b'+', 0, /*PAD PLUS*/ + /*0x4f*/ b'1', 0, /*PAD END*/ + /*0x50*/ b'2', 0, /*PAD DOWN*/ + /*0x51*/ b'3', 0, /*PAD PAGEDOWN*/ + /*0x52*/ b'0', 0, /*PAD INS*/ + /*0x53*/ b'.', 0, /*PAD DOT*/ /*0x54*/ 0, 0, /*0x55*/ 0, 0, /*0x56*/ 0, 0, /*0x57*/ 0, 0, // F11 /*0x58*/ 0, 0, // F12 /*0x59*/ 0, 0, /*0x5a*/ 0, 0, /*0x5b*/ 0, 0, /*0x5c*/ 0, 0, diff --git a/kernel/src/libs/lib_ui/screen_manager.rs b/kernel/src/libs/lib_ui/screen_manager.rs index 2a384f3e..0640cdba 100644 --- a/kernel/src/libs/lib_ui/screen_manager.rs +++ b/kernel/src/libs/lib_ui/screen_manager.rs @@ -72,7 +72,7 @@ impl ScmBufferInfo { /// /// - `Result` 创建成功返回新的帧缓冲区结构体,创建失败返回错误码 pub fn new(mut buf_type: ScmBufferFlag) -> Result { - if unlikely(SCM_DOUBLE_BUFFER_ENABLED.load(Ordering::SeqCst) == false) { + if unlikely(!SCM_DOUBLE_BUFFER_ENABLED.load(Ordering::SeqCst)) { let mut device_buffer = video_refresh_manager().device_buffer().clone(); buf_type.remove(ScmBufferFlag::SCM_BF_DB); buf_type.insert(ScmBufferFlag::SCM_BF_FB); @@ -143,16 +143,10 @@ impl ScmBufferInfo { } pub fn is_double_buffer(&self) -> bool { - match &self.buf { - ScmBuffer::DoubleBuffer(_) => true, - _ => false, - } + matches!(&self.buf, ScmBuffer::DoubleBuffer(_)) } pub fn is_device_buffer(&self) -> bool { - match &self.buf { - ScmBuffer::DeviceBuffer(_) => true, - _ => false, - } + matches!(&self.buf, ScmBuffer::DeviceBuffer(_)) } pub fn copy_from_nonoverlapping(&mut self, src: &ScmBufferInfo) { @@ -301,7 +295,7 @@ pub fn scm_framework_enable(framework: Arc) -> Result for LineId { LineId::new(self.0 - rhs) } } - -impl Into for LineId { - fn into(self) -> i32 { - self.0.clone() +impl From for i32 { + fn from(value: LineId) -> Self { + value.0 } } -impl Into for LineId { - fn into(self) -> u32 { - self.0.clone() as u32 +impl From for u32 { + fn from(value: LineId) -> Self { + value.0 as u32 } } -impl Into for LineId { - fn into(self) -> usize { - self.0.clone() as usize +impl From for usize { + fn from(value: LineId) -> Self { + value.0 as usize } } impl Sub for LineId { @@ -220,19 +219,19 @@ impl Sub for LineIndex { } } -impl Into for LineIndex { - fn into(self) -> i32 { - self.0.clone() +impl From for i32 { + fn from(val: LineIndex) -> Self { + val.0 } } -impl Into for LineIndex { - fn into(self) -> u32 { - self.0.clone() as u32 +impl From for u32 { + fn from(value: LineIndex) -> Self { + value.0 as u32 } } -impl Into for LineIndex { - fn into(self) -> usize { - self.0.clone() as usize +impl From for usize { + fn from(value: LineIndex) -> Self { + value.0 as usize } } #[derive(Copy, Clone, Debug)] @@ -260,24 +259,24 @@ impl From for FontColor { return Self(value & 0x00ffffff); } } -impl Into for FontColor { - fn into(self) -> usize { - self.0.clone() as usize +impl From for usize { + fn from(value: FontColor) -> Self { + value.0 as usize } } -impl Into for FontColor { - fn into(self) -> u32 { - self.0.clone() +impl From for u32 { + fn from(value: FontColor) -> Self { + value.0 } } -impl Into for FontColor { - fn into(self) -> u16 { - self.0.clone() as u16 +impl From for u16 { + fn from(value: FontColor) -> Self { + value.0 as u16 } } -impl Into for FontColor { - fn into(self) -> u64 { - self.0.clone() as u64 +impl From for u64 { + fn from(value: FontColor) -> Self { + value.0 as u64 } } @@ -463,7 +462,7 @@ impl TextuiCharChromatic { } unsafe { - addr = (addr.offset(1)) as *mut u32; + addr = addr.offset(1); } } } @@ -776,14 +775,14 @@ impl TextuiWindow { if character == '\n' { // 换行时还需要输出\r send_to_default_serial8250_port(&[b'\r']); - if is_enable_window == true { + if is_enable_window { self.textui_new_line()?; } return Ok(()); } // 输出制表符 else if character == '\t' { - if is_enable_window == true { + if is_enable_window { if let TextuiVline::Chromatic(vline) = &self.vlines[>::into(self.vline_operating)] { @@ -798,7 +797,7 @@ impl TextuiWindow { } // 字符 '\x08' 代表 ASCII 码中的退格字符。它在输出中的作用是将光标向左移动一个位置,并在该位置上输出后续的字符,从而实现字符的删除或替换。 else if character == '\x08' { - if is_enable_window == true { + if is_enable_window { let mut tmp = LineIndex(0); if let TextuiVline::Chromatic(vline) = &mut self.vlines[>::into(self.vline_operating)] @@ -853,17 +852,15 @@ impl TextuiWindow { self.textui_refresh_vlines(self.top_vline, actual_line_sum)?; } } - } else { - if is_enable_window == true { - if let TextuiVline::Chromatic(vline) = - &self.vlines[>::into(self.vline_operating)] - { - if !vline.index.check(self.chars_per_line) { - self.textui_new_line()?; - } - - return self.true_textui_putchar_window(character, frcolor, bkcolor); + } else if is_enable_window { + if let TextuiVline::Chromatic(vline) = + &self.vlines[>::into(self.vline_operating)] + { + if !vline.index.check(self.chars_per_line) { + self.textui_new_line()?; } + + return self.true_textui_putchar_window(character, frcolor, bkcolor); } } @@ -902,7 +899,7 @@ impl TextUiFramework { default_window: Arc>, ) -> Self { let actual_line = - AtomicI32::new((&metadata.buf_info().height() / TEXTUI_CHAR_HEIGHT) as i32); + AtomicI32::new((metadata.buf_info().height() / TEXTUI_CHAR_HEIGHT) as i32); let inner = TextUiFramework { metadata: RwLock::new(metadata), window_list, @@ -1001,8 +998,7 @@ pub extern "C" fn rs_textui_putchar(character: u8, fr_color: u32, bk_color: u32) ); let port = TTY_PORTS[current_vcnum as usize].clone(); let tty = port.port_data().tty(); - if tty.is_some() { - let tty = tty.unwrap(); + if let Some(tty) = tty { send_to_default_serial8250_port(&[character]); return tty .write_without_serial(buf.as_bytes(), buf.len()) diff --git a/kernel/src/libs/lib_ui/textui_no_alloc.rs b/kernel/src/libs/lib_ui/textui_no_alloc.rs index 208690ce..e507fc8b 100644 --- a/kernel/src/libs/lib_ui/textui_no_alloc.rs +++ b/kernel/src/libs/lib_ui/textui_no_alloc.rs @@ -49,7 +49,7 @@ pub fn no_init_textui_putchar_window( if unlikely(character == '\n') { // 换行时还需要输出\r send_to_default_serial8250_port(&[b'\r']); - if is_put_to_window == true { + if is_put_to_window { NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); } @@ -57,7 +57,7 @@ pub fn no_init_textui_putchar_window( } // 输出制表符 else if character == '\t' { - if is_put_to_window == true { + if is_put_to_window { let char = TextuiCharChromatic::new(Some(' '), frcolor, bkcolor); //打印的空格数(注意将每行分成一个个表格,每个表格为8个字符) @@ -75,7 +75,7 @@ pub fn no_init_textui_putchar_window( } // 字符 '\x08' 代表 ASCII 码中的退格字符。它在输出中的作用是将光标向左移动一个位置,并在该位置上输出后续的字符,从而实现字符的删除或替换。 else if character == '\x08' { - if is_put_to_window == true { + if is_put_to_window { NO_ALLOC_OPERATIONS_INDEX.fetch_sub(1, Ordering::SeqCst); let op_char = NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst); if op_char >= 0 { @@ -98,24 +98,21 @@ pub fn no_init_textui_putchar_window( } } } - } else { - if is_put_to_window == true { - // 输出其他字符 - let char = TextuiCharChromatic::new(Some(character), frcolor, bkcolor); + } else if is_put_to_window { + // 输出其他字符 + let char = TextuiCharChromatic::new(Some(character), frcolor, bkcolor); - if NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) - == CHAR_PER_LINE.load(Ordering::SeqCst) - { - NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); - NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); - } - char.no_init_textui_render_chromatic( - LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), - LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), - ); - - NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); + if NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst) == CHAR_PER_LINE.load(Ordering::SeqCst) + { + NO_ALLOC_OPERATIONS_INDEX.store(0, Ordering::SeqCst); + NO_ALLOC_OPERATIONS_LINE.fetch_add(1, Ordering::SeqCst); } + char.no_init_textui_render_chromatic( + LineId::new(NO_ALLOC_OPERATIONS_LINE.load(Ordering::SeqCst)), + LineIndex::new(NO_ALLOC_OPERATIONS_INDEX.load(Ordering::SeqCst)), + ); + + NO_ALLOC_OPERATIONS_INDEX.fetch_add(1, Ordering::SeqCst); } return Ok(()); diff --git a/kernel/src/libs/lock_free_flags.rs b/kernel/src/libs/lock_free_flags.rs index 84c9dfb5..1e2fc282 100644 --- a/kernel/src/libs/lock_free_flags.rs +++ b/kernel/src/libs/lock_free_flags.rs @@ -19,6 +19,7 @@ impl LockFreeFlags { } } + #[allow(clippy::mut_from_ref)] pub fn get_mut(&self) -> &mut T { unsafe { (self.inner.get().as_ref().unwrap() as *const T as *mut T) diff --git a/kernel/src/libs/mutex.rs b/kernel/src/libs/mutex.rs index 2d92c99f..bbca06f8 100644 --- a/kernel/src/libs/mutex.rs +++ b/kernel/src/libs/mutex.rs @@ -64,8 +64,7 @@ impl Mutex { // 当前mutex已经上锁 if inner.is_locked { // 检查当前进程是否处于等待队列中,如果不在,就加到等待队列内 - if self.check_pid_in_wait_list(&inner, ProcessManager::current_pcb().pid()) == false - { + if !self.check_pid_in_wait_list(&inner, ProcessManager::current_pcb().pid()) { inner.wait_list.push_back(ProcessManager::current_pcb()); } diff --git a/kernel/src/libs/notifier.rs b/kernel/src/libs/notifier.rs index 22340b85..ea4dcdc7 100644 --- a/kernel/src/libs/notifier.rs +++ b/kernel/src/libs/notifier.rs @@ -38,7 +38,7 @@ impl NotifierChain { // 在 notifier chain中寻找第一个优先级比要插入块低的块 for b in self.0.iter() { // 判断之前是否已经注册过该节点 - if Arc::as_ptr(&block) == Arc::as_ptr(b) { + if Arc::ptr_eq(&block, b) { kwarn!( "notifier callback {:?} already registered", Arc::as_ptr(&block) @@ -65,7 +65,7 @@ impl NotifierChain { /// @brief 在通知链中取消注册节点 pub fn unregister(&mut self, block: Arc>) -> Result<(), SystemError> { - let remove = self.0.extract_if(|b| Arc::as_ptr(&block) == Arc::as_ptr(b)); + let remove = self.0.extract_if(|b| Arc::ptr_eq(&block, b)); match remove.count() { 0 => return Err(SystemError::ENOENT), _ => return Ok(()), @@ -107,6 +107,12 @@ impl NotifierChain { #[derive(Debug)] pub struct AtomicNotifierChain(SpinLock>); +impl Default for AtomicNotifierChain { + fn default() -> Self { + Self::new() + } +} + impl AtomicNotifierChain { pub fn new() -> Self { Self(SpinLock::new(NotifierChain::::new())) diff --git a/kernel/src/libs/printk.rs b/kernel/src/libs/printk.rs index ad2ae4cc..51ad8034 100644 --- a/kernel/src/libs/printk.rs +++ b/kernel/src/libs/printk.rs @@ -91,8 +91,7 @@ impl PrintkWriter { // tty已经初始化了之后才输出到屏幕 let port = TTY_PORTS[current_vcnum as usize].clone(); let tty = port.port_data().tty(); - if tty.is_some() { - let tty = tty.unwrap(); + if let Some(tty) = tty { let _ = tty.write(tty.core(), s.as_bytes(), s.len()); } else { let _ = textui_putstr(s, FontColor::WHITE, FontColor::BLACK); @@ -122,7 +121,7 @@ impl Logger { pub fn log(&self, log_level: usize, message: fmt::Arguments) { if unsafe { KMSG.is_some() } { let timestamp: TimeSpec = TimeSpec::now(); - let log_level = LogLevel::from(log_level.clone()); + let log_level = LogLevel::from(log_level); let log_message = LogMessage::new(timestamp, log_level, message.to_string()); diff --git a/kernel/src/libs/rbtree.rs b/kernel/src/libs/rbtree.rs index 5b7f35cb..e1203fab 100644 --- a/kernel/src/libs/rbtree.rs +++ b/kernel/src/libs/rbtree.rs @@ -17,6 +17,7 @@ use core::fmt::{self, Debug}; use core::iter::{FromIterator, IntoIterator}; use core::marker; use core::mem; +use core::mem::swap; use core::ops::Index; use core::ptr; @@ -63,7 +64,7 @@ struct NodePtr(*mut RBTreeNode); impl Clone for NodePtr { fn clone(&self) -> NodePtr { - NodePtr(self.0) + *self } } @@ -77,7 +78,7 @@ impl Ord for NodePtr { impl PartialOrd for NodePtr { fn partial_cmp(&self, other: &NodePtr) -> Option { - unsafe { Some((*self.0).key.cmp(&(*other.0).key)) } + Some(self.cmp(other)) } } @@ -158,7 +159,7 @@ impl NodePtr { #[inline] fn min_node(self) -> NodePtr { - let mut temp = self.clone(); + let mut temp = self; while !temp.left().is_null() { temp = temp.left(); } @@ -167,7 +168,7 @@ impl NodePtr { #[inline] fn max_node(self) -> NodePtr { - let mut temp = self.clone(); + let mut temp = self; while !temp.right().is_null() { temp = temp.right(); } @@ -239,7 +240,7 @@ impl NodePtr { if self.is_null() { return NodePtr::null(); } - unsafe { (*self.0).parent.clone() } + unsafe { (*self.0).parent } } #[inline] @@ -247,7 +248,7 @@ impl NodePtr { if self.is_null() { return NodePtr::null(); } - unsafe { (*self.0).left.clone() } + unsafe { (*self.0).left } } #[inline] @@ -255,7 +256,7 @@ impl NodePtr { if self.is_null() { return NodePtr::null(); } - unsafe { (*self.0).right.clone() } + unsafe { (*self.0).right } } #[inline] @@ -378,6 +379,7 @@ where /// This is a method to help us to get inner struct. impl RBTree { + #[allow(clippy::only_used_in_recursion)] fn tree_print(&self, node: NodePtr, direction: i32) { if node.is_null() { return; @@ -882,20 +884,20 @@ impl RBTree { node.set_right(temp.left()); if !temp.left().is_null() { - temp.left().set_parent(node.clone()); + temp.left().set_parent(node); } temp.set_parent(node.parent()); if node == self.root { - self.root = temp.clone(); + self.root = temp; } else if node == node.parent().left() { - node.parent().set_left(temp.clone()); + node.parent().set_left(temp); } else { - node.parent().set_right(temp.clone()); + node.parent().set_right(temp); } - temp.set_left(node.clone()); - node.set_parent(temp.clone()); + temp.set_left(node); + node.set_parent(temp); } /* @@ -917,20 +919,20 @@ impl RBTree { node.set_left(temp.right()); if !temp.right().is_null() { - temp.right().set_parent(node.clone()); + temp.right().set_parent(node); } temp.set_parent(node.parent()); if node == self.root { - self.root = temp.clone(); + self.root = temp; } else if node == node.parent().right() { - node.parent().set_right(temp.clone()); + node.parent().set_right(temp); } else { - node.parent().set_left(temp.clone()); + node.parent().set_left(temp); } - temp.set_right(node.clone()); - node.set_parent(temp.clone()); + temp.set_right(node); + node.set_parent(temp); } /// replace value if key exist, if not exist insert it. @@ -983,9 +985,7 @@ impl RBTree { // Case 2条件:叔叔是黑色,且当前节点是右孩子 if parent.right() == node { self.left_rotate(parent); - let temp = parent; - parent = node; - node = temp; + swap(&mut parent, &mut node); } // Case 3条件:叔叔是黑色,且当前节点是左孩子。 @@ -1006,9 +1006,7 @@ impl RBTree { // Case 2条件:叔叔是黑色,且当前节点是右孩子 if parent.left() == node { self.right_rotate(parent); - let temp = parent; - parent = node; - node = temp; + swap(&mut parent, &mut node); } // Case 3条件:叔叔是黑色,且当前节点是左孩子。 @@ -1029,7 +1027,7 @@ impl RBTree { while !x.is_null() { y = x; - match node.cmp(&&mut x) { + match node.cmp(&x) { Ordering::Less => { x = x.left(); } @@ -1043,7 +1041,7 @@ impl RBTree { if y.is_null() { self.root = node; } else { - match node.cmp(&&mut y) { + match node.cmp(&y) { Ordering::Less => { y.set_left(node); } @@ -1190,6 +1188,7 @@ impl RBTree { true } + #[allow(clippy::only_used_in_recursion)] #[inline] fn clear_recurse(&mut self, current: NodePtr) { if !current.is_null() { @@ -1309,12 +1308,10 @@ impl RBTree { let mut replace = node.right().min_node(); if node == self.root { self.root = replace; + } else if node.parent().left() == node { + node.parent().set_left(replace); } else { - if node.parent().left() == node { - node.parent().set_left(replace); - } else { - node.parent().set_right(replace); - } + node.parent().set_right(replace); } // child是"取代节点"的右孩子,也是需要"调整的节点"。 @@ -1360,12 +1357,10 @@ impl RBTree { if self.root == node { self.root = child + } else if parent.left() == node { + parent.set_left(child); } else { - if parent.left() == node { - parent.set_left(child); - } else { - parent.set_right(child); - } + parent.set_right(child); } if color == Color::Black { diff --git a/kernel/src/libs/rwlock.rs b/kernel/src/libs/rwlock.rs index 1bdfdb42..db5dc6c5 100644 --- a/kernel/src/libs/rwlock.rs +++ b/kernel/src/libs/rwlock.rs @@ -130,13 +130,12 @@ impl RwLock { fn inner_try_read(&self) -> Option> { let reader_value = self.current_reader(); //得到自增后的reader_value, 包括了尝试获得READER守卫的进程 - let value; - if reader_value.is_err() { - return None; //获取失败 + let value = if let Ok(rv) = reader_value { + rv } else { - value = reader_value.unwrap(); - } + return None; + }; //判断有没有writer和upgrader //注意, 若upgrader存在,已经存在的读者继续占有锁,但新读者不允许获得锁 diff --git a/kernel/src/libs/semaphore.rs b/kernel/src/libs/semaphore.rs index 8346468c..163c6dc4 100644 --- a/kernel/src/libs/semaphore.rs +++ b/kernel/src/libs/semaphore.rs @@ -24,7 +24,7 @@ impl Semaphore { if counter > 0 { Ok(Self { counter: AtomicI32::new(counter), - wait_queue: WaitQueue::INIT, + wait_queue: WaitQueue::default(), }) } else { return Err(SystemError::EOVERFLOW); diff --git a/kernel/src/libs/spinlock.rs b/kernel/src/libs/spinlock.rs index d6d92664..832e8ee6 100644 --- a/kernel/src/libs/spinlock.rs +++ b/kernel/src/libs/spinlock.rs @@ -71,8 +71,8 @@ impl SpinLock { pub fn lock(&self) -> SpinLockGuard { loop { let res = self.try_lock(); - if res.is_ok() { - return res.unwrap(); + if let Ok(res) = res { + return res; } spin_loop(); } diff --git a/kernel/src/libs/vec_cursor.rs b/kernel/src/libs/vec_cursor.rs index 17de7b13..f922df1e 100644 --- a/kernel/src/libs/vec_cursor.rs +++ b/kernel/src/libs/vec_cursor.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use core::mem::size_of; +use core::mem::{size_of, size_of_val}; use alloc::vec::Vec; use system_error::SystemError; @@ -19,7 +19,7 @@ pub struct VecCursor { impl VecCursor { /// @brief 新建一个游标 pub fn new(data: Vec) -> Self { - return Self { data: data, pos: 0 }; + return Self { data, pos: 0 }; } /// @brief 创建一个全0的cursor @@ -112,12 +112,12 @@ impl VecCursor { /// /// @param buf 目标u16数组 pub fn read_u16_into(&mut self, buf: &mut [u16]) -> Result<(), SystemError> { - if self.pos + buf.len() * size_of::() > self.data.len() * size_of::() { + if self.pos + size_of_val(buf) > self.data.len() * size_of::() { return Err(SystemError::E2BIG); } - for i in 0..buf.len() { - buf[i] = self.read_u16()?; + for item in buf.iter_mut() { + *item = self.read_u16()?; } return Ok(()); @@ -130,22 +130,15 @@ impl VecCursor { /// @return Ok(新的游标位置) 调整成功,返回新的游标位置 /// @return Err(SystemError::EOVERFLOW) 调整失败,游标超出正确的范围。(失败时游标位置不变) pub fn seek(&mut self, origin: SeekFrom) -> Result { - let pos: i64; - match origin { - SeekFrom::SeekSet(offset) => { - pos = offset; - } - SeekFrom::SeekCurrent(offset) => { - pos = self.pos as i64 + offset; - } - SeekFrom::SeekEnd(offset) => { - // 请注意,此处的offset应小于等于0,否则肯定是不合法的 - pos = self.data.len() as i64 + offset; - } + let pos = match origin { + SeekFrom::SeekSet(offset) => offset, + SeekFrom::SeekCurrent(offset) => self.pos as i64 + offset, + // 请注意,此处的offset应小于等于0,否则肯定是不合法的 + SeekFrom::SeekEnd(offset) => self.data.len() as i64 + offset, SeekFrom::Invalid => { return Err(SystemError::EINVAL); } - } + }; if pos < 0 || pos > self.data.len() as i64 { return Err(SystemError::EOVERFLOW); @@ -219,7 +212,7 @@ impl VecCursor { return Err(SystemError::E2BIG); } - self.data[self.pos..self.pos + buf.len()].copy_from_slice(&buf[..]); + self.data[self.pos..self.pos + buf.len()].copy_from_slice(buf); self.pos += buf.len(); return Ok(()); diff --git a/kernel/src/libs/wait_queue.rs b/kernel/src/libs/wait_queue.rs index cdb0cde7..826e0219 100644 --- a/kernel/src/libs/wait_queue.rs +++ b/kernel/src/libs/wait_queue.rs @@ -27,7 +27,9 @@ pub struct WaitQueue(SpinLock); #[allow(dead_code)] impl WaitQueue { - pub const INIT: WaitQueue = WaitQueue(SpinLock::new(InnerWaitQueue::INIT)); + pub const fn default() -> Self { + WaitQueue(SpinLock::new(InnerWaitQueue::INIT)) + } /// @brief 让当前进程在等待队列上进行等待,并且,允许被信号打断 pub fn sleep(&self) { @@ -77,7 +79,7 @@ impl WaitQueue { pub unsafe fn sleep_without_schedule(&self) { before_sleep_check(1); // 安全检查:确保当前处于中断禁止状态 - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); let mut guard: SpinLockGuard = self.0.lock(); ProcessManager::mark_sleep(true).unwrap_or_else(|e| { panic!("sleep error: {:?}", e); @@ -89,7 +91,7 @@ impl WaitQueue { pub unsafe fn sleep_without_schedule_uninterruptible(&self) { before_sleep_check(1); // 安全检查:确保当前处于中断禁止状态 - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); let mut guard: SpinLockGuard = self.0.lock(); ProcessManager::mark_sleep(false).unwrap_or_else(|e| { panic!("sleep error: {:?}", e); diff --git a/kernel/src/mm/allocator/buddy.rs b/kernel/src/mm/allocator/buddy.rs index ab249b26..deff4066 100644 --- a/kernel/src/mm/allocator/buddy.rs +++ b/kernel/src/mm/allocator/buddy.rs @@ -64,7 +64,7 @@ impl PageList { #[derive(Debug)] pub struct BuddyAllocator { // 存放每个阶的空闲“链表”的头部地址 - free_area: [PhysAddr; (MAX_ORDER - MIN_ORDER) as usize], + free_area: [PhysAddr; MAX_ORDER - MIN_ORDER], /// 总页数 total: PageFrameCount, phantom: PhantomData, @@ -81,8 +81,8 @@ impl BuddyAllocator { kdebug!("Free pages before init buddy: {:?}", initial_free_pages); kdebug!("Buddy entries: {}", Self::BUDDY_ENTRIES); - let mut free_area: [PhysAddr; (MAX_ORDER - MIN_ORDER) as usize] = - [PhysAddr::new(0); (MAX_ORDER - MIN_ORDER) as usize]; + let mut free_area: [PhysAddr; MAX_ORDER - MIN_ORDER] = + [PhysAddr::new(0); MAX_ORDER - MIN_ORDER]; // Buddy初始占用的空间从bump分配 for f in free_area.iter_mut() { @@ -157,11 +157,10 @@ impl BuddyAllocator { } } } - // 然后从高往低,把剩余的页面加入链表 let mut remain_bytes = remain_pages.data() * A::PAGE_SIZE; - assert!(remain_bytes < (1 << MAX_ORDER - 1)); + assert!(remain_bytes < (1 << MAX_ORDER) - 1); for i in (MIN_ORDER..MAX_ORDER).rev() { if remain_bytes >= (1 << i) { @@ -214,7 +213,7 @@ impl BuddyAllocator { /// free_area的下标 #[inline] fn order2index(order: u8) -> usize { - (order as usize - MIN_ORDER) as usize + order as usize - MIN_ORDER } /// 从空闲链表的开头,取出1个指定阶数的伙伴块,如果没有,则返回None @@ -239,7 +238,6 @@ impl BuddyAllocator { if !next_page_list_addr.is_null() { // 此时page_list已经没有空闲伙伴块了,又因为非唯一页,需要删除该page_list self.free_area[Self::order2index(spec_order)] = next_page_list_addr; - drop(page_list); // kdebug!("FREE: page_list_addr={:b}", page_list_addr.data()); unsafe { self.buddy_free(page_list_addr, MMArch::PAGE_SHIFT as u8); @@ -284,7 +282,7 @@ impl BuddyAllocator { if !page_list.next_page.is_null() { // 此时page_list已经没有空闲伙伴块了,又因为非唯一页,需要删除该page_list self.free_area[Self::order2index(spec_order)] = page_list.next_page; - drop(page_list); + let _ = page_list; unsafe { self.buddy_free(page_list_addr, MMArch::PAGE_SHIFT as u8) }; } else { Self::write_page(page_list_addr, page_list); @@ -303,7 +301,7 @@ impl BuddyAllocator { } return None; }; - let result: Option = alloc_in_specific_order(order as u8); + let result: Option = alloc_in_specific_order(order); // kdebug!("result={:?}", result); if result.is_some() { return result; @@ -352,7 +350,7 @@ impl BuddyAllocator { fn buddy_alloc(&mut self, count: PageFrameCount) -> Option<(PhysAddr, PageFrameCount)> { assert!(count.data().is_power_of_two()); // 计算需要分配的阶数 - let mut order = log2(count.data() as usize); + let mut order = log2(count.data()); if count.data() & ((1 << order) - 1) != 0 { order += 1; } @@ -426,79 +424,9 @@ impl BuddyAllocator { } // 如果没有找到伙伴块 - if buddy_entry_virt_vaddr.is_none() { - assert!( - page_list.entry_num <= Self::BUDDY_ENTRIES, - "buddy_free: page_list.entry_num > Self::BUDDY_ENTRIES" - ); - - // 当前第一个page_list没有空间了 - if first_page_list.entry_num == Self::BUDDY_ENTRIES { - // 如果当前order是最小的,那么就把这个块当作新的page_list使用 - let new_page_list_addr = if order == MIN_ORDER { - base - } else { - // 否则分配新的page_list - // 请注意,分配之后,有可能当前的entry_num会减1(伙伴块分裂),造成出现整个链表为null的entry数量为Self::BUDDY_ENTRIES+1的情况 - // 但是不影响,我们在后面插入链表项的时候,会处理这种情况,检查链表中的第2个页是否有空位 - self.buddy_alloc(PageFrameCount::new(1)) - .expect("buddy_alloc failed: no enough memory") - .0 - }; - - // 清空这个页面 - core::ptr::write_bytes( - A::phys_2_virt(new_page_list_addr) - .expect( - "Buddy free: failed to get virt address of [new_page_list_addr]", - ) - .as_ptr::(), - 0, - 1 << order, - ); - assert!( - first_page_list_paddr == self.free_area[Self::order2index(order as u8)] - ); - // 初始化新的page_list - let new_page_list = PageList::new(0, first_page_list_paddr); - Self::write_page(new_page_list_addr, new_page_list); - self.free_area[Self::order2index(order as u8)] = new_page_list_addr; - } - - // 由于上面可能更新了第一个链表页,因此需要重新获取这个值 - let first_page_list_paddr = self.free_area[Self::order2index(order as u8)]; - let first_page_list: PageList = Self::read_page(first_page_list_paddr); - - // 检查第二个page_list是否有空位 - let second_page_list = if first_page_list.next_page.is_null() { - None - } else { - Some(Self::read_page::>(first_page_list.next_page)) - }; - - let (paddr, mut page_list) = if let Some(second) = second_page_list { - // 第二个page_list有空位 - // 应当符合之前的假设:还有1个空位 - assert!(second.entry_num == Self::BUDDY_ENTRIES - 1); - - (first_page_list.next_page, second) - } else { - // 在第一个page list中分配 - (first_page_list_paddr, first_page_list) - }; - - // kdebug!("to write entry, page_list_base={paddr:?}, page_list.entry_num={}, value={base:?}", page_list.entry_num); - assert!(page_list.entry_num < Self::BUDDY_ENTRIES); - // 把要归还的块,写入到链表项中 - unsafe { A::write(Self::entry_virt_addr(paddr, page_list.entry_num), base) } - page_list.entry_num += 1; - Self::write_page(paddr, page_list); - return; - } else { + if let Some(buddy_entry_virt_addr) = buddy_entry_virt_vaddr { // 如果找到了伙伴块,合并,向上递归 - // 伙伴块所在的表项的虚拟地址 - let buddy_entry_virt_addr = buddy_entry_virt_vaddr.unwrap(); // 伙伴块所在的page_list的物理地址 let buddy_entry_page_list_paddr = buddy_entry_page_list_paddr.unwrap(); @@ -568,6 +496,74 @@ impl BuddyAllocator { page_list.entry_num -= 1; Self::write_page(page_list_paddr, page_list); } + } else { + assert!( + page_list.entry_num <= Self::BUDDY_ENTRIES, + "buddy_free: page_list.entry_num > Self::BUDDY_ENTRIES" + ); + + // 当前第一个page_list没有空间了 + if first_page_list.entry_num == Self::BUDDY_ENTRIES { + // 如果当前order是最小的,那么就把这个块当作新的page_list使用 + let new_page_list_addr = if order == MIN_ORDER { + base + } else { + // 否则分配新的page_list + // 请注意,分配之后,有可能当前的entry_num会减1(伙伴块分裂),造成出现整个链表为null的entry数量为Self::BUDDY_ENTRIES+1的情况 + // 但是不影响,我们在后面插入链表项的时候,会处理这种情况,检查链表中的第2个页是否有空位 + self.buddy_alloc(PageFrameCount::new(1)) + .expect("buddy_alloc failed: no enough memory") + .0 + }; + + // 清空这个页面 + core::ptr::write_bytes( + A::phys_2_virt(new_page_list_addr) + .expect( + "Buddy free: failed to get virt address of [new_page_list_addr]", + ) + .as_ptr::(), + 0, + 1 << order, + ); + assert!( + first_page_list_paddr == self.free_area[Self::order2index(order as u8)] + ); + // 初始化新的page_list + let new_page_list = PageList::new(0, first_page_list_paddr); + Self::write_page(new_page_list_addr, new_page_list); + self.free_area[Self::order2index(order as u8)] = new_page_list_addr; + } + + // 由于上面可能更新了第一个链表页,因此需要重新获取这个值 + let first_page_list_paddr = self.free_area[Self::order2index(order as u8)]; + let first_page_list: PageList = Self::read_page(first_page_list_paddr); + + // 检查第二个page_list是否有空位 + let second_page_list = if first_page_list.next_page.is_null() { + None + } else { + Some(Self::read_page::>(first_page_list.next_page)) + }; + + let (paddr, mut page_list) = if let Some(second) = second_page_list { + // 第二个page_list有空位 + // 应当符合之前的假设:还有1个空位 + assert!(second.entry_num == Self::BUDDY_ENTRIES - 1); + + (first_page_list.next_page, second) + } else { + // 在第一个page list中分配 + (first_page_list_paddr, first_page_list) + }; + + // kdebug!("to write entry, page_list_base={paddr:?}, page_list.entry_num={}, value={base:?}", page_list.entry_num); + assert!(page_list.entry_num < Self::BUDDY_ENTRIES); + // 把要归还的块,写入到链表项中 + unsafe { A::write(Self::entry_virt_addr(paddr, page_list.entry_num), base) } + page_list.entry_num += 1; + Self::write_page(paddr, page_list); + return; } base = min(base, buddy_addr); order += 1; @@ -597,7 +593,7 @@ impl FrameAllocator for BuddyAllocator { if unlikely(!count.data().is_power_of_two()) { kwarn!("buddy free: count is not power of two"); } - let mut order = log2(count.data() as usize); + let mut order = log2(count.data()); if count.data() & ((1 << order) - 1) != 0 { order += 1; } diff --git a/kernel/src/mm/allocator/bump.rs b/kernel/src/mm/allocator/bump.rs index f8df52b6..59e2c34f 100644 --- a/kernel/src/mm/allocator/bump.rs +++ b/kernel/src/mm/allocator/bump.rs @@ -57,7 +57,7 @@ impl BumpAllocator { let mut found_start = false; // 遍历所有的物理内存区域 for area in iter { - if found_start == false { + if !found_start { // 将area的base地址与PAGE_SIZE对齐,对齐时向上取整 // let area_base = (area.base.data() + MMA::PAGE_SHIFT) & !(MMA::PAGE_SHIFT); let area_base = area.area_base_aligned().data(); @@ -78,17 +78,15 @@ impl BumpAllocator { offset = (offset + (MMA::PAGE_SIZE - 1)) & !(MMA::PAGE_SIZE - 1); } // found - if offset + 1 * MMA::PAGE_SIZE <= area_end { + if offset + MMA::PAGE_SIZE <= area_end { ret_offset_aligned = offset - area.area_base_aligned().data(); found_start = true; } } - if found_start { - if area.area_base_aligned() < area.area_end_aligned() { - result_area[res_cnt] = area; - res_cnt += 1; - } + if found_start && area.area_base_aligned() < area.area_end_aligned() { + result_area[res_cnt] = area; + res_cnt += 1; } } @@ -114,7 +112,10 @@ impl BumpAllocator { PageMapper::::current(PageTableKind::Kernel, BumpAllocator::::new(0)); for p in iter { - if let None = mapper.translate(MMA::phys_2_virt(p.phys_address()).unwrap()) { + if mapper + .translate(MMA::phys_2_virt(p.phys_address()).unwrap()) + .is_none() + { let vaddr = MMA::phys_2_virt(p.phys_address()).unwrap(); pseudo_map_phys(vaddr, p.phys_address(), PageFrameCount::new(1)); } diff --git a/kernel/src/mm/allocator/kernel_allocator.rs b/kernel/src/mm/allocator/kernel_allocator.rs index b1bc31a0..ac64d0fd 100644 --- a/kernel/src/mm/allocator/kernel_allocator.rs +++ b/kernel/src/mm/allocator/kernel_allocator.rs @@ -61,8 +61,8 @@ impl LocalAlloc for KernelAllocator { unsafe fn local_alloc(&self, layout: Layout) -> *mut u8 { return self .alloc_in_buddy(layout) - .map(|x| x.as_mut_ptr() as *mut u8) - .unwrap_or(core::ptr::null_mut() as *mut u8); + .map(|x| x.as_mut_ptr()) + .unwrap_or(core::ptr::null_mut()); } unsafe fn local_alloc_zeroed(&self, layout: Layout) -> *mut u8 { @@ -73,7 +73,7 @@ impl LocalAlloc for KernelAllocator { core::ptr::write_bytes(ptr, 0, x.len()); ptr }) - .unwrap_or(core::ptr::null_mut() as *mut u8); + .unwrap_or(core::ptr::null_mut()); } unsafe fn local_dealloc(&self, ptr: *mut u8, layout: Layout) { @@ -86,11 +86,7 @@ unsafe impl GlobalAlloc for KernelAllocator { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { let r = self.local_alloc_zeroed(layout); mm_debug_log( - klog_types::AllocatorLogType::Alloc(AllocLogItem::new( - layout.clone(), - Some(r as usize), - None, - )), + klog_types::AllocatorLogType::Alloc(AllocLogItem::new(layout, Some(r as usize), None)), klog_types::LogSource::Buddy, ); @@ -104,7 +100,7 @@ unsafe impl GlobalAlloc for KernelAllocator { mm_debug_log( klog_types::AllocatorLogType::AllocZeroed(AllocLogItem::new( - layout.clone(), + layout, Some(r as usize), None, )), @@ -116,11 +112,7 @@ unsafe impl GlobalAlloc for KernelAllocator { unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { mm_debug_log( - klog_types::AllocatorLogType::Free(AllocLogItem::new( - layout.clone(), - Some(ptr as usize), - None, - )), + klog_types::AllocatorLogType::Free(AllocLogItem::new(layout, Some(ptr as usize), None)), klog_types::LogSource::Buddy, ); diff --git a/kernel/src/mm/allocator/slab.rs b/kernel/src/mm/allocator/slab.rs index 7b461b0b..5adea79a 100644 --- a/kernel/src/mm/allocator/slab.rs +++ b/kernel/src/mm/allocator/slab.rs @@ -17,7 +17,7 @@ impl Slab { pub unsafe fn new(start_addr: usize, slab_size: usize, block_size: usize) -> Slab { let blocks_num = slab_size / block_size; return Slab { - block_size: block_size, + block_size, free_block_list: FreeBlockList::new(start_addr, block_size, blocks_num), }; } @@ -106,7 +106,7 @@ impl FreeBlockList { impl Drop for FreeBlockList { fn drop(&mut self) { - while let Some(_) = self.pop() {} + while self.pop().is_some() {} } } diff --git a/kernel/src/mm/c_adapter.rs b/kernel/src/mm/c_adapter.rs index 2fd534c9..35ac24de 100644 --- a/kernel/src/mm/c_adapter.rs +++ b/kernel/src/mm/c_adapter.rs @@ -82,8 +82,6 @@ fn do_kmalloc(size: usize, _zero: bool) -> usize { let (ptr, len, cap) = space.into_raw_parts(); if !ptr.is_null() { let vaddr = VirtAddr::new(ptr as usize); - let len = len as usize; - let cap = cap as usize; let mut guard = C_ALLOCATION_MAP.lock(); if unlikely(guard.contains_key(&vaddr)) { drop(guard); @@ -139,8 +137,8 @@ unsafe extern "C" fn rs_mmio_create( ) -> i32 { // kdebug!("mmio_create"); let r = mmio_pool().create_mmio(size as usize); - if r.is_err() { - return r.unwrap_err().to_posix_errno(); + if let Err(e) = r { + return e.to_posix_errno(); } let space_guard = r.unwrap(); *res_vaddr = space_guard.vaddr().data() as u64; diff --git a/kernel/src/mm/early_ioremap.rs b/kernel/src/mm/early_ioremap.rs index 3a25e284..225002b9 100644 --- a/kernel/src/mm/early_ioremap.rs +++ b/kernel/src/mm/early_ioremap.rs @@ -78,7 +78,7 @@ impl EarlyIoRemap { size: usize, read_only: bool, ) -> Result<(VirtAddr, usize), SystemError> { - if phys.check_aligned(MMArch::PAGE_SIZE) == false { + if !phys.check_aligned(MMArch::PAGE_SIZE) { return Err(SystemError::EINVAL); } @@ -175,7 +175,7 @@ impl EarlyIoRemap { let idx = idx.ok_or(SystemError::EINVAL)?; - let vaddr = Self::idx_to_virt(idx as usize); + let vaddr = Self::idx_to_virt(idx); let count = PageFrameCount::from_bytes(slot_guard[idx].size as usize).unwrap(); // 取消映射 diff --git a/kernel/src/mm/memblock.rs b/kernel/src/mm/memblock.rs index a36dc73d..ff75c711 100644 --- a/kernel/src/mm/memblock.rs +++ b/kernel/src/mm/memblock.rs @@ -360,7 +360,7 @@ impl MemBlockManager { flags: MemoryAreaAttr, ) -> Result<(), SystemError> { let rsvd_base = PhysAddr::new(page_align_down(base.data())); - size = page_align_up((size as usize) + base.data() - rsvd_base.data()); + size = page_align_up(size + base.data() - rsvd_base.data()); base = rsvd_base; let mut inner = self.inner.lock(); @@ -489,18 +489,16 @@ impl<'a> Iterator for MemBlockIter<'a> { fn next(&mut self) -> Option { while self.index < self.inner.initial_memory_regions_num { - if self.usable_only { - if self.inner.initial_memory_regions[self.index] + if self.usable_only + && !self.inner.initial_memory_regions[self.index] .flags .is_empty() - == false - { - self.index += 1; - if self.index >= self.inner.initial_memory_regions_num { - return None; - } - continue; + { + self.index += 1; + if self.index >= self.inner.initial_memory_regions_num { + return None; } + continue; } break; } @@ -515,6 +513,7 @@ impl<'a> Iterator for MemBlockIter<'a> { bitflags! { /// 内存区域属性 + #[allow(clippy::bad_bit_mask)] pub struct MemoryAreaAttr: u32 { /// No special request const NONE = 0x0; diff --git a/kernel/src/mm/mmio_buddy.rs b/kernel/src/mm/mmio_buddy.rs index 276b7c74..94037f61 100644 --- a/kernel/src/mm/mmio_buddy.rs +++ b/kernel/src/mm/mmio_buddy.rs @@ -164,7 +164,7 @@ impl MmioBuddyMemPool { list_guard: &mut SpinLockGuard, ) -> Result { // 申请范围错误 - if exp < MMIO_BUDDY_MIN_EXP || exp > MMIO_BUDDY_MAX_EXP { + if !(MMIO_BUDDY_MIN_EXP..=MMIO_BUDDY_MAX_EXP).contains(&exp) { kdebug!("query_addr_region: exp wrong"); return Err(MmioResult::WRONGEXP); } @@ -175,7 +175,7 @@ impl MmioBuddyMemPool { // 将大的内存块依次分成小块内存,直到能够满足exp大小,即将exp+1分成两块exp for e in exp + 1..MMIO_BUDDY_MAX_EXP + 1 { let pop_list: &mut SpinLockGuard = - &mut self.free_regions[exp2index(e) as usize].lock(); + &mut self.free_regions[exp2index(e)].lock(); if pop_list.num_free == 0 { continue; } @@ -187,7 +187,7 @@ impl MmioBuddyMemPool { if e2 != exp + 1 { // 要将分裂后的内存块插入到更小的链表中 let low_list_guard: &mut SpinLockGuard = - &mut self.free_regions[exp2index(e2 - 1) as usize].lock(); + &mut self.free_regions[exp2index(e2 - 1)].lock(); self.split_block(region, e2, low_list_guard); } else { // 由于exp对应的链表list_guard已经被锁住了 不能再加锁 @@ -201,13 +201,12 @@ impl MmioBuddyMemPool { } } } else { - match self.pop_block(&mut self.free_regions[exp2index(e2) as usize].lock()) - { + match self.pop_block(&mut self.free_regions[exp2index(e2)].lock()) { Ok(region) => { if e2 != exp + 1 { // 要将分裂后的内存块插入到更小的链表中 let low_list_guard: &mut SpinLockGuard = - &mut self.free_regions[exp2index(e2 - 1) as usize].lock(); + &mut self.free_regions[exp2index(e2 - 1)].lock(); self.split_block(region, e2, low_list_guard); } else { // 由于exp对应的链表list_guard已经被锁住了 不能再加锁 @@ -251,7 +250,7 @@ impl MmioBuddyMemPool { if e != exp - 1 { match self.merge_all_exp( exp, - &mut self.free_regions[exp2index(exp) as usize].lock(), + &mut self.free_regions[exp2index(exp)].lock(), &mut self.free_regions[exp2index(exp + 1)].lock(), ) { Ok(_) => continue, @@ -263,7 +262,7 @@ impl MmioBuddyMemPool { } else { match self.merge_all_exp( exp, - &mut self.free_regions[exp2index(exp) as usize].lock(), + &mut self.free_regions[exp2index(exp)].lock(), list_guard, ) { Ok(_) => continue, @@ -346,7 +345,7 @@ impl MmioBuddyMemPool { exp: u32, list_guard: &mut SpinLockGuard, ) -> Result { - if list_guard.list.len() == 0 { + if list_guard.list.is_empty() { return Err(MmioResult::ISEMPTY); } else { //计算伙伴块的地址 @@ -559,7 +558,7 @@ impl MmioBuddyMemPool { // 归还到buddy mmio_pool() - .give_back_block(vaddr, length.trailing_zeros() as u32) + .give_back_block(vaddr, length.trailing_zeros()) .unwrap_or_else(|err| { panic!("MMIO release failed: self: {self:?}, err msg: {:?}", err); }); @@ -585,7 +584,7 @@ impl MmioBuddyAddrRegion { } /// @brief 空闲页数组结构体 -#[derive(Debug)] +#[derive(Debug, Default)] pub struct MmioFreeRegionList { /// 存储mmio_buddy的地址链表 list: LinkedList, @@ -600,14 +599,6 @@ impl MmioFreeRegionList { }; } } -impl Default for MmioFreeRegionList { - fn default() -> Self { - MmioFreeRegionList { - list: Default::default(), - num_free: 0, - } - } -} /// @brief 将内存对象大小的幂转换成内存池中的数组的下标 /// diff --git a/kernel/src/mm/mod.rs b/kernel/src/mm/mod.rs index bd6acb7e..d3b5f671 100644 --- a/kernel/src/mm/mod.rs +++ b/kernel/src/mm/mod.rs @@ -37,6 +37,7 @@ static mut __IDLE_PROCESS_ADDRESS_SPACE: Option> = None; bitflags! { /// Virtual memory flags + #[allow(clippy::bad_bit_mask)] pub struct VmFlags:u32{ const VM_NONE = 0x00000000; @@ -280,11 +281,7 @@ impl VirtAddr { /// @brief 判断虚拟地址是否在用户空间 #[inline(always)] pub fn check_user(&self) -> bool { - if self < &MMArch::USER_END_VADDR { - return true; - } else { - return false; - } + return self < &MMArch::USER_END_VADDR; } #[inline(always)] @@ -720,7 +717,7 @@ impl VirtRegion { impl PartialOrd for VirtRegion { fn partial_cmp(&self, other: &Self) -> Option { - return self.start.partial_cmp(&other.start); + Some(self.cmp(other)) } } diff --git a/kernel/src/mm/no_init.rs b/kernel/src/mm/no_init.rs index 54c5ae77..855a8676 100644 --- a/kernel/src/mm/no_init.rs +++ b/kernel/src/mm/no_init.rs @@ -86,7 +86,7 @@ impl EarlyIoRemapPages { let offset = addr.data() - start_vaddr; let index = offset / MMArch::PAGE_SIZE; if index < Self::EARLY_REMAP_PAGES_NUM { - assert_eq!(self.bmp.get(index).unwrap(), true); + assert!(self.bmp.get(index).unwrap()); self.bmp.set(index, false); } } @@ -203,9 +203,9 @@ pub unsafe fn pseudo_unmap_phys(vaddr: VirtAddr, count: PageFrameCount) { for i in 0..count.data() { let vaddr = vaddr + i * MMArch::PAGE_SIZE; - mapper.unmap_phys(vaddr, true).map(|(_, _, flusher)| { + if let Some((_, _, flusher)) = mapper.unmap_phys(vaddr, true) { flusher.ignore(); - }); + }; } mapper.make_current(); diff --git a/kernel/src/mm/page.rs b/kernel/src/mm/page.rs index 0e8033fc..8edc4e70 100644 --- a/kernel/src/mm/page.rs +++ b/kernel/src/mm/page.rs @@ -293,7 +293,7 @@ impl PageFlags { #[inline(always)] pub const unsafe fn from_data(data: usize) -> Self { return Self { - data: data, + data, phantom: PhantomData, }; } @@ -624,7 +624,7 @@ impl PageMapper { if table.level() == 0 { // todo: 检查是否已经映射 // 现在不检查的原因是,刚刚启动系统时,内核会映射一些页。 - if table.entry_mapped(i)? == true { + if table.entry_mapped(i)? { kwarn!("Page {:?} already mapped", virt); } @@ -752,8 +752,8 @@ impl PageMapper { return None; } - let mut table = self.table(); - return unmap_phys_inner(virt, &mut table, unmap_parents, self.allocator_mut()) + let table = self.table(); + return unmap_phys_inner(virt, &table, unmap_parents, self.allocator_mut()) .map(|(paddr, flags)| (paddr, flags, PageFlush::::new(virt))); } @@ -805,9 +805,9 @@ unsafe fn unmap_phys_inner( return Some((entry.address().ok()?, entry.flags())); } - let mut subtable = table.next_level_table(i)?; + let subtable = table.next_level_table(i)?; // 递归地取消映射 - let result = unmap_phys_inner(vaddr, &mut subtable, unmap_parents, allocator)?; + let result = unmap_phys_inner(vaddr, &subtable, unmap_parents, allocator)?; // TODO: This is a bad idea for architectures where the kernel mappings are done in the process tables, // as these mappings may become out of sync diff --git a/kernel/src/mm/percpu.rs b/kernel/src/mm/percpu.rs index 1f7766c1..58757727 100644 --- a/kernel/src/mm/percpu.rs +++ b/kernel/src/mm/percpu.rs @@ -14,7 +14,7 @@ use crate::{ /// /// todo: 待smp模块重构后,从smp模块获取CPU数量。 /// 目前由于smp模块初始化时机较晚,导致大部分内核模块无法在早期初始化PerCpu变量。 -const CPU_NUM: AtomicU32 = AtomicU32::new(PerCpu::MAX_CPU_NUM); +static CPU_NUM_ATOMIC: AtomicU32 = AtomicU32::new(PerCpu::MAX_CPU_NUM); #[derive(Debug)] pub struct PerCpu; @@ -32,13 +32,14 @@ impl PerCpu { /// 该函数会调用`smp_get_total_cpu()`获取CPU数量,然后将其存储在`CPU_NUM`中。 #[allow(dead_code)] pub fn init() { - if CPU_NUM.load(core::sync::atomic::Ordering::SeqCst) != 0 { + let cpu_num: &AtomicU32 = &CPU_NUM_ATOMIC; + if cpu_num.load(core::sync::atomic::Ordering::SeqCst) != 0 { panic!("PerCpu::init() called twice"); } let cpus = smp_cpu_manager().present_cpus_count(); assert!(cpus > 0, "PerCpu::init(): present_cpus_count() returned 0"); - CPU_NUM.store(cpus, core::sync::atomic::Ordering::SeqCst); + CPU_NUM_ATOMIC.store(cpus, core::sync::atomic::Ordering::SeqCst); } } @@ -65,7 +66,7 @@ impl PerCpuVar { /// /// - `data` - 每个CPU的数据的初始值。 传入的Vec的长度必须等于CPU的数量,否则返回None。 pub fn new(data: Vec) -> Option { - let cpu_num = CPU_NUM.load(core::sync::atomic::Ordering::SeqCst); + let cpu_num = CPU_NUM_ATOMIC.load(core::sync::atomic::Ordering::SeqCst); if cpu_num == 0 { panic!("PerCpu::init() not called"); } @@ -87,6 +88,7 @@ impl PerCpuVar { &self.inner[cpu_id.data() as usize] } + #[allow(clippy::mut_from_ref)] pub fn get_mut(&self) -> &mut T { let cpu_id = smp_get_processor_id(); unsafe { @@ -98,6 +100,7 @@ impl PerCpuVar { &self.inner[cpu_id.data() as usize] } + #[allow(clippy::mut_from_ref)] pub unsafe fn force_get_mut(&self, cpu_id: ProcessorId) -> &mut T { &mut (self as *const Self as *mut Self).as_mut().unwrap().inner[cpu_id.data() as usize] } diff --git a/kernel/src/mm/syscall.rs b/kernel/src/mm/syscall.rs index 13b1e72c..e9b9066c 100644 --- a/kernel/src/mm/syscall.rs +++ b/kernel/src/mm/syscall.rs @@ -113,23 +113,23 @@ impl From for VmFlags { } } -impl Into for VmFlags { - fn into(self) -> MapFlags { +impl From for MapFlags { + fn from(value: VmFlags) -> Self { let mut map_flags = MapFlags::MAP_NONE; - if self.contains(VmFlags::VM_GROWSDOWN) { + if value.contains(VmFlags::VM_GROWSDOWN) { map_flags |= MapFlags::MAP_GROWSDOWN; } - if self.contains(VmFlags::VM_LOCKED) { + if value.contains(VmFlags::VM_LOCKED) { map_flags |= MapFlags::MAP_LOCKED; } - if self.contains(VmFlags::VM_SYNC) { + if value.contains(VmFlags::VM_SYNC) { map_flags |= MapFlags::MAP_SYNC; } - if self.contains(VmFlags::VM_MAYSHARE) { + if value.contains(VmFlags::VM_MAYSHARE) { map_flags |= MapFlags::MAP_SHARED; } @@ -137,19 +137,19 @@ impl Into for VmFlags { } } -impl Into for VmFlags { - fn into(self) -> ProtFlags { +impl From for ProtFlags { + fn from(value: VmFlags) -> Self { let mut prot_flags = ProtFlags::PROT_NONE; - if self.contains(VmFlags::VM_READ) { + if value.contains(VmFlags::VM_READ) { prot_flags |= ProtFlags::PROT_READ; } - if self.contains(VmFlags::VM_WRITE) { + if value.contains(VmFlags::VM_WRITE) { prot_flags |= ProtFlags::PROT_WRITE; } - if self.contains(VmFlags::VM_EXEC) { + if value.contains(VmFlags::VM_EXEC) { prot_flags |= ProtFlags::PROT_EXEC; } @@ -302,7 +302,7 @@ impl Syscall { return Err(SystemError::EINVAL); } let vma = vma.unwrap(); - let vm_flags = vma.lock().vm_flags().clone(); + let vm_flags = *vma.lock().vm_flags(); // 暂时不支持巨页映射 if vm_flags.contains(VmFlags::VM_HUGETLB) { diff --git a/kernel/src/mm/ucontext.rs b/kernel/src/mm/ucontext.rs index 352caedf..a44f3162 100644 --- a/kernel/src/mm/ucontext.rs +++ b/kernel/src/mm/ucontext.rs @@ -178,7 +178,7 @@ impl InnerAddressSpace { let new_vma = VMA::zeroed( VirtPageFrame::new(vma_guard.region.start()), PageFrameCount::new(vma_guard.region.size() / MMArch::PAGE_SIZE), - vma_guard.vm_flags().clone(), + *vma_guard.vm_flags(), tmp_flags, &mut new_guard.user_mapper.utable, (), @@ -287,7 +287,7 @@ impl InnerAddressSpace { prot_flags, map_flags, move |page, count, flags, mapper, flusher| { - Ok(VMA::zeroed(page, count, vm_flags, flags, mapper, flusher)?) + VMA::zeroed(page, count, vm_flags, flags, mapper, flusher) }, )?; @@ -434,9 +434,7 @@ impl InnerAddressSpace { UserBufferWriter::new(new_page_vaddr.data() as *mut u8, new_len, true)?; let new_buf: &mut [u8] = new_buffer_writer.buffer(0)?; let len = old_buf.len().min(new_buf.len()); - for i in 0..len { - new_buf[i] = old_buf[i]; - } + new_buf[..len].copy_from_slice(&old_buf[..len]); return Ok(new_page_vaddr); } @@ -466,16 +464,16 @@ impl InnerAddressSpace { let r = r.lock().region; let r = self.mappings.remove_vma(&r).unwrap(); let intersection = r.lock().region().intersect(&to_unmap).unwrap(); - let (before, r, after) = r.extract(intersection).unwrap(); + let split_result = r.extract(intersection).unwrap(); // TODO: 当引入后备页映射后,这里需要增加通知文件的逻辑 - if let Some(before) = before { + if let Some(before) = split_result.prev { // 如果前面有VMA,则需要将前面的VMA重新插入到地址空间的VMA列表中 self.mappings.insert_vma(before); } - if let Some(after) = after { + if let Some(after) = split_result.after { // 如果后面有VMA,则需要将后面的VMA重新插入到地址空间的VMA列表中 self.mappings.insert_vma(after); } @@ -517,16 +515,16 @@ impl InnerAddressSpace { for r in regions { // kdebug!("mprotect: r: {:?}", r); - let r = r.lock().region().clone(); + let r = *r.lock().region(); let r = self.mappings.remove_vma(&r).unwrap(); let intersection = r.lock().region().intersect(®ion).unwrap(); - let (before, r, after) = r.extract(intersection).expect("Failed to extract VMA"); + let split_result = r.extract(intersection).expect("Failed to extract VMA"); - if let Some(before) = before { + if let Some(before) = split_result.prev { self.mappings.insert_vma(before); } - if let Some(after) = after { + if let Some(after) = split_result.after { self.mappings.insert_vma(after); } @@ -625,7 +623,7 @@ impl InnerAddressSpace { let new_brk = if incr > 0 { self.brk + incr as usize } else { - self.brk - (incr.abs() as usize) + self.brk - incr.unsigned_abs() }; let new_brk = VirtAddr::new(page_align_up(new_brk.data())); @@ -707,7 +705,7 @@ impl UserMappings { let r = self .vmas .iter() - .filter(move |v| !v.lock().region.intersect(&request).is_none()) + .filter(move |v| v.lock().region.intersect(&request).is_some()) .cloned(); return r; } @@ -829,7 +827,7 @@ impl UserMappings { /// 在当前进程的映射关系中,插入一个新的VMA。 pub fn insert_vma(&mut self, vma: Arc) { - let region = vma.lock().region.clone(); + let region = vma.lock().region; // 要求插入的地址范围必须是空闲的,也就是说,当前进程的地址空间中,不能有任何与之重叠的VMA。 assert!(self.conflicts(region).next().is_none()); self.reserve_hole(®ion); @@ -963,14 +961,7 @@ impl LockedVMA { /// 1. 前面的VMA,如果没有则为None /// 2. 中间的VMA,也就是传入的Region /// 3. 后面的VMA,如果没有则为None - pub fn extract( - &self, - region: VirtRegion, - ) -> Option<( - Option>, - Arc, - Option>, - )> { + pub fn extract(&self, region: VirtRegion) -> Option { assert!(region.start().check_aligned(MMArch::PAGE_SIZE)); assert!(region.end().check_aligned(MMArch::PAGE_SIZE)); @@ -990,7 +981,11 @@ impl LockedVMA { let intersect: VirtRegion = intersect.unwrap(); if unlikely(intersect == guard.region) { // 如果当前VMA完全包含region,则直接返回当前VMA - return Some((None, guard.self_ref.upgrade().unwrap(), None)); + return Some(VMASplitResult::new( + None, + guard.self_ref.upgrade().unwrap(), + None, + )); } } @@ -1014,7 +1009,32 @@ impl LockedVMA { // TODO: 重新设置before、after这两个VMA里面的物理页的anon_vma - return Some((before, guard.self_ref.upgrade().unwrap(), after)); + return Some(VMASplitResult::new( + before, + guard.self_ref.upgrade().unwrap(), + after, + )); + } +} + +/// VMA切分结果 +pub struct VMASplitResult { + pub prev: Option>, + pub middle: Arc, + pub after: Option>, +} + +impl VMASplitResult { + pub fn new( + prev: Option>, + middle: Arc, + post: Option>, + ) -> Self { + Self { + prev, + middle, + after: post, + } } } @@ -1293,7 +1313,7 @@ impl Eq for VMA {} impl PartialOrd for VMA { fn partial_cmp(&self, other: &Self) -> Option { - return self.region.partial_cmp(&other.region); + Some(self.cmp(other)) } } diff --git a/kernel/src/net/event_poll/mod.rs b/kernel/src/net/event_poll/mod.rs index 6c37c09b..8e30117c 100644 --- a/kernel/src/net/event_poll/mod.rs +++ b/kernel/src/net/event_poll/mod.rs @@ -56,7 +56,7 @@ impl EventPoll { pub const ADD_EPOLLITEM: u32 = 0x7965; pub fn new() -> Self { Self { - epoll_wq: WaitQueue::INIT, + epoll_wq: WaitQueue::default(), ep_items: RBTree::new(), ready_list: LinkedList::new(), shutdown: AtomicBool::new(false), @@ -65,6 +65,12 @@ impl EventPoll { } } +impl Default for EventPoll { + fn default() -> Self { + Self::new() + } +} + /// EpollItem表示的是Epoll所真正管理的对象 /// 每当用户向Epoll添加描述符时都会注册一个新的EpollItem,EpollItem携带了一些被监听的描述符的必要信息 #[derive(Debug)] @@ -285,7 +291,7 @@ impl EventPoll { .ok_or(SystemError::EBADF)?; // 检查是否允许 EPOLLWAKEUP - if op != EPollCtlOption::EpollCtlDel { + if op != EPollCtlOption::Del { epds.events &= !EPollEventType::EPOLLWAKEUP.bits(); } @@ -298,14 +304,14 @@ impl EventPoll { return Err(SystemError::EINVAL); } - if op != EPollCtlOption::EpollCtlDel && events.contains(EPollEventType::EPOLLEXCLUSIVE) { + if op != EPollCtlOption::Del && events.contains(EPollEventType::EPOLLEXCLUSIVE) { // epoll独占模式下不允许EpollCtlMod - if op == EPollCtlOption::EpollCtlMod { + if op == EPollCtlOption::Mod { return Err(SystemError::EINVAL); } // 不支持嵌套的独占唤醒 - if op == EPollCtlOption::EpollCtlAdd && Self::is_epoll_file(&dst_file) + if op == EPollCtlOption::Add && Self::is_epoll_file(&dst_file) || !events .difference(EPollEventType::EPOLLEXCLUSIVE_OK_BITS) .is_empty() @@ -329,7 +335,7 @@ impl EventPoll { } }; - if op == EPollCtlOption::EpollCtlAdd { + if op == EPollCtlOption::Add { // TODO: 循环检查是否为epoll嵌套epoll的情况,如果是则需要检测其深度 // 这里是需要一种检测算法的,但是目前未考虑epoll嵌套epoll的情况,所以暂时未实现 // Linux算法:https://code.dragonos.org.cn/xref/linux-6.1.9/fs/eventpoll.c?r=&mo=56953&fi=2057#2133 @@ -340,7 +346,7 @@ impl EventPoll { let ep_item = epoll_guard.ep_items.get(&fd); match op { - EPollCtlOption::EpollCtlAdd => { + EPollCtlOption::Add => { // 如果已经存在,则返回错误 if ep_item.is_some() { return Err(SystemError::EEXIST); @@ -354,7 +360,7 @@ impl EventPoll { )); Self::ep_insert(&mut epoll_guard, dst_file, epitem)?; } - EPollCtlOption::EpollCtlDel => { + EPollCtlOption::Del => { // 不存在则返回错误 if ep_item.is_none() { return Err(SystemError::ENOENT); @@ -362,7 +368,7 @@ impl EventPoll { // 删除 Self::ep_remove(&mut epoll_guard, fd, Some(dst_file))?; } - EPollCtlOption::EpollCtlMod => { + EPollCtlOption::Mod => { // 不存在则返回错误 if ep_item.is_none() { return Err(SystemError::ENOENT); @@ -372,7 +378,7 @@ impl EventPoll { epds.events |= EPollEventType::EPOLLERR.bits() | EPollEventType::EPOLLHUP.bits(); - Self::ep_modify(&mut epoll_guard, ep_item, &epds)?; + Self::ep_modify(&mut epoll_guard, ep_item, epds)?; } } } @@ -409,14 +415,12 @@ impl EventPoll { if let FilePrivateData::EPoll(epoll_data) = &ep_file.lock_irqsave().private_data { epolldata = Some(epoll_data.clone()) } - if epolldata.is_some() { - let epoll_data = epolldata.unwrap(); + if let Some(epoll_data) = epolldata { let epoll = epoll_data.epoll.clone(); let epoll_guard = epoll.0.lock_irqsave(); let mut timeout = false; - if timespec.is_some() { - let timespec = timespec.unwrap(); + if let Some(timespec) = timespec { if !(timespec.tv_sec > 0 || timespec.tv_nsec > 0) { // 非阻塞情况 timeout = true; @@ -471,8 +475,7 @@ impl EventPoll { // 还未等待到事件发生,则睡眠 // 注册定时器 let mut timer = None; - if timespec.is_some() { - let timespec = timespec.unwrap(); + if let Some(timespec) = timespec { let handle = WakeUpHelper::new(current_pcb.clone()); let jiffies = next_n_us_timer_jiffies( (timespec.tv_sec * 1000000 + timespec.tv_nsec / 1000) as u64, @@ -487,13 +490,13 @@ impl EventPoll { sched(); // 被唤醒后,检查是否有事件可读 available = epoll.0.lock_irqsave().ep_events_available(); - if timer.is_some() { - if timer.as_ref().unwrap().timeout() { + if let Some(timer) = timer { + if timer.as_ref().timeout() { // 超时 timeout = true; } else { // 未超时,则取消计时器 - timer.unwrap().cancel(); + timer.cancel(); } } } @@ -598,11 +601,9 @@ impl EventPoll { } let test_poll = dst_file.lock_irqsave().poll(); - if test_poll.is_err() { - if test_poll.unwrap_err() == SystemError::EOPNOTSUPP_OR_ENOTSUP { - // 如果目标文件不支持poll - return Err(SystemError::ENOSYS); - } + if test_poll.is_err() && test_poll.unwrap_err() == SystemError::EOPNOTSUPP_OR_ENOTSUP { + // 如果目标文件不支持poll + return Err(SystemError::ENOSYS); } epoll_guard.ep_items.insert(epitem.fd, epitem.clone()); @@ -632,8 +633,7 @@ impl EventPoll { fd: i32, dst_file: Option>>, ) -> Result<(), SystemError> { - if dst_file.is_some() { - let dst_file = dst_file.unwrap(); + if let Some(dst_file) = dst_file { let mut file_guard = dst_file.lock_irqsave(); file_guard.remove_epoll(epoll.self_ref.as_ref().unwrap())?; @@ -785,19 +785,19 @@ impl EPollEvent { #[derive(Debug, PartialEq)] pub enum EPollCtlOption { /// 注册新的文件描述符到epfd - EpollCtlAdd, + Add, /// 将对应的文件描述符从epfd中删除 - EpollCtlDel, + Del, /// 修改已经注册的文件描述符的监听事件 - EpollCtlMod, + Mod, } impl EPollCtlOption { pub fn from_op_num(op: usize) -> Result { match op { - 1 => Ok(Self::EpollCtlAdd), - 2 => Ok(Self::EpollCtlDel), - 3 => Ok(Self::EpollCtlMod), + 1 => Ok(Self::Add), + 2 => Ok(Self::Del), + 3 => Ok(Self::Mod), _ => Err(SystemError::EINVAL), } } diff --git a/kernel/src/net/event_poll/syscall.rs b/kernel/src/net/event_poll/syscall.rs index 35b6ed36..5063161c 100644 --- a/kernel/src/net/event_poll/syscall.rs +++ b/kernel/src/net/event_poll/syscall.rs @@ -66,7 +66,7 @@ impl Syscall { pub fn epoll_ctl(epfd: i32, op: usize, fd: i32, event: VirtAddr) -> Result { let op = EPollCtlOption::from_op_num(op)?; let mut epds = EPollEvent::default(); - if op != EPollCtlOption::EpollCtlDel { + if op != EPollCtlOption::Del { // 不为EpollCtlDel时不允许传入空指针 if event.is_null() { return Err(SystemError::EFAULT); @@ -93,10 +93,10 @@ impl Syscall { epoll_event: VirtAddr, max_events: i32, timespec: i32, - mut sigmask: &mut SigSet, + sigmask: &mut SigSet, ) -> Result { // 设置屏蔽的信号 - set_current_sig_blocked(&mut sigmask); + set_current_sig_blocked(sigmask); let wait_ret = Self::epoll_wait(epfd, epoll_event, max_events, timespec); diff --git a/kernel/src/net/mod.rs b/kernel/src/net/mod.rs index e33b2320..a288fdaa 100644 --- a/kernel/src/net/mod.rs +++ b/kernel/src/net/mod.rs @@ -124,9 +124,9 @@ impl From for Protocol { } } -impl Into for Protocol { - fn into(self) -> u8 { - match self { +impl From for u8 { + fn from(value: Protocol) -> Self { + match value { Protocol::HopByHop => 0x00, Protocol::Icmp => 0x01, Protocol::Igmp => 0x02, diff --git a/kernel/src/net/net_core.rs b/kernel/src/net/net_core.rs index b4d6dd23..b485bb28 100644 --- a/kernel/src/net/net_core.rs +++ b/kernel/src/net/net_core.rs @@ -85,8 +85,7 @@ fn dhcp_query() -> Result<(), SystemError> { .add_default_ipv4_route(router) .unwrap(); let cidr = net_face.inner_iface().lock().ip_addrs().first().cloned(); - if cidr.is_some() { - let cidr = cidr.unwrap(); + if let Some(cidr) = cidr { kinfo!("Successfully allocated ip by Dhcpv4! Ip:{}", cidr); return Ok(()); } @@ -231,7 +230,7 @@ fn send_event(sockets: &smoltcp::iface::SocketSet) -> Result<(), SystemError> { let mut handle_guard = HANDLE_MAP.write_irqsave(); let handle_item = handle_guard.get_mut(&handle).unwrap(); EventPoll::wakeup_epoll( - &mut handle_item.epitems, + &handle_item.epitems, EPollEventType::from_bits_truncate(events as u32), )?; // crate::kdebug!( diff --git a/kernel/src/net/socket/mod.rs b/kernel/src/net/socket/mod.rs index 0425966b..8ae1be23 100644 --- a/kernel/src/net/socket/mod.rs +++ b/kernel/src/net/socket/mod.rs @@ -314,7 +314,7 @@ impl IndexNode for SocketInode { // 最后一次关闭,需要释放 let mut socket = self.0.lock_irqsave(); - if socket.metadata().unwrap().socket_type == SocketType::SeqpacketSocket { + if socket.metadata().unwrap().socket_type == SocketType::Seqpacket { return Ok(()); } @@ -398,7 +398,7 @@ pub struct SocketHandleItem { } impl SocketHandleItem { - pub fn new(socket: &Box) -> Self { + pub fn new(socket: &dyn Socket) -> Self { Self { metadata: socket.metadata().unwrap(), shutdown_type: RwLock::new(ShutdownType::empty()), @@ -407,7 +407,7 @@ impl SocketHandleItem { } } - pub fn from_socket(socket: &Box) -> Self { + pub fn from_socket(socket: &A) -> Self { Self { metadata: socket.metadata().unwrap(), shutdown_type: RwLock::new(ShutdownType::empty()), @@ -434,7 +434,7 @@ impl SocketHandleItem { } pub fn shutdown_type(&self) -> ShutdownType { - self.shutdown_type.read().clone() + *self.shutdown_type.read() } pub fn shutdown_type_writer(&mut self) -> RwLockWriteGuard { @@ -496,18 +496,18 @@ impl PortManager { if EPHEMERAL_PORT == 65535 { EPHEMERAL_PORT = 49152; } else { - EPHEMERAL_PORT = EPHEMERAL_PORT + 1; + EPHEMERAL_PORT += 1; } port = EPHEMERAL_PORT; } // 使用 ListenTable 检查端口是否被占用 let listen_table_guard = match socket_type { - SocketType::UdpSocket => self.udp_port_table.lock(), - SocketType::TcpSocket => self.tcp_port_table.lock(), + SocketType::Udp => self.udp_port_table.lock(), + SocketType::Tcp => self.tcp_port_table.lock(), _ => panic!("{:?} cann't get a port", socket_type), }; - if let None = listen_table_guard.get(&port) { + if listen_table_guard.get(&port).is_none() { drop(listen_table_guard); return Ok(port); } @@ -527,8 +527,8 @@ impl PortManager { ) -> Result<(), SystemError> { if port > 0 { let mut listen_table_guard = match socket_type { - SocketType::UdpSocket => self.udp_port_table.lock(), - SocketType::TcpSocket => self.tcp_port_table.lock(), + SocketType::Udp => self.udp_port_table.lock(), + SocketType::Tcp => self.tcp_port_table.lock(), _ => panic!("{:?} cann't bind a port", socket_type), }; match listen_table_guard.get(&port) { @@ -543,8 +543,8 @@ impl PortManager { /// @brief 在对应的端口记录表中将端口和 socket 解绑 pub fn unbind_port(&self, socket_type: SocketType, port: u16) -> Result<(), SystemError> { let mut listen_table_guard = match socket_type { - SocketType::UdpSocket => self.udp_port_table.lock(), - SocketType::TcpSocket => self.tcp_port_table.lock(), + SocketType::Udp => self.udp_port_table.lock(), + SocketType::Tcp => self.tcp_port_table.lock(), _ => return Ok(()), }; listen_table_guard.remove(&port); @@ -584,13 +584,13 @@ impl Drop for GlobalSocketHandle { #[derive(Debug, Clone, Copy, PartialEq)] pub enum SocketType { /// 原始的socket - RawSocket, + Raw, /// 用于Tcp通信的 Socket - TcpSocket, + Tcp, /// 用于Udp通信的 Socket - UdpSocket, + Udp, /// 用于进程间通信的 Socket - SeqpacketSocket, + Seqpacket, } bitflags! { @@ -750,7 +750,7 @@ impl TryFrom for AddressFamily { type Error = SystemError; fn try_from(x: u16) -> Result { use num_traits::FromPrimitive; - return ::from_u16(x).ok_or_else(|| SystemError::EINVAL); + return ::from_u16(x).ok_or(SystemError::EINVAL); } } @@ -770,7 +770,7 @@ impl TryFrom for PosixSocketType { type Error = SystemError; fn try_from(x: u8) -> Result { use num_traits::FromPrimitive; - return ::from_u8(x).ok_or_else(|| SystemError::EINVAL); + return ::from_u8(x).ok_or(SystemError::EINVAL); } } diff --git a/kernel/src/net/socket/sockets.rs b/kernel/src/net/socket/sockets.rs index 9a1bf7d0..83d4fabd 100644 --- a/kernel/src/net/socket/sockets.rs +++ b/kernel/src/net/socket/sockets.rs @@ -71,7 +71,7 @@ impl RawSocket { GlobalSocketHandle::new(SOCKET_SET.lock_irqsave().add(socket)); let metadata = SocketMetadata::new( - SocketType::RawSocket, + SocketType::Raw, Self::DEFAULT_RX_BUF_SIZE, Self::DEFAULT_TX_BUF_SIZE, Self::DEFAULT_METADATA_BUF_SIZE, @@ -177,7 +177,7 @@ impl Socket for RawSocket { packet.set_dst_addr(ipv4_dst); // 设置ipv4 header的protocol字段 - packet.set_next_header(socket.ip_protocol().into()); + packet.set_next_header(socket.ip_protocol()); // 获取IP数据包的负载字段 let payload: &mut [u8] = packet.payload_mut(); @@ -260,7 +260,7 @@ impl UdpSocket { GlobalSocketHandle::new(SOCKET_SET.lock_irqsave().add(socket)); let metadata = SocketMetadata::new( - SocketType::UdpSocket, + SocketType::Udp, Self::DEFAULT_RX_BUF_SIZE, Self::DEFAULT_TX_BUF_SIZE, Self::DEFAULT_METADATA_BUF_SIZE, @@ -371,7 +371,7 @@ impl Socket for UdpSocket { // kdebug!("is open()={}", socket.is_open()); if socket.can_send() { // kdebug!("udp write: can send"); - match socket.send_slice(&buf, *remote_endpoint) { + match socket.send_slice(buf, *remote_endpoint) { Ok(()) => { // kdebug!("udp write: send ok"); drop(socket_set_guard); @@ -505,7 +505,7 @@ impl TcpSocket { GlobalSocketHandle::new(SOCKET_SET.lock_irqsave().add(socket)); let metadata = SocketMetadata::new( - SocketType::TcpSocket, + SocketType::Tcp, Self::DEFAULT_RX_BUF_SIZE, Self::DEFAULT_TX_BUF_SIZE, Self::DEFAULT_METADATA_BUF_SIZE, @@ -687,7 +687,7 @@ impl Socket for TcpSocket { let mut inner_iface = iface.inner_iface().lock(); // kdebug!("to connect: {ip:?}"); - match socket.connect(&mut inner_iface.context(), ip, temp_port) { + match socket.connect(inner_iface.context(), ip, temp_port) { Ok(()) => { // avoid deadlock drop(inner_iface); @@ -816,7 +816,7 @@ impl Socket for TcpSocket { } let metadata = SocketMetadata::new( - SocketType::TcpSocket, + SocketType::Tcp, Self::DEFAULT_TX_BUF_SIZE, Self::DEFAULT_RX_BUF_SIZE, Self::DEFAULT_METADATA_BUF_SIZE, @@ -836,7 +836,7 @@ impl Socket for TcpSocket { let item = handle_guard.remove(&old_handle.0).unwrap(); // 按照smoltcp行为,将新的handle绑定到原来的item handle_guard.insert(new_handle.0, item); - let new_item = SocketHandleItem::from_socket(&new_socket); + let new_item = SocketHandleItem::from_socket(new_socket.as_ref()); // 插入新的item handle_guard.insert(old_handle.0, new_item); @@ -859,8 +859,7 @@ impl Socket for TcpSocket { } fn endpoint(&self) -> Option { - let mut result: Option = - self.local_endpoint.clone().map(|x| Endpoint::Ip(Some(x))); + let mut result: Option = self.local_endpoint.map(|x| Endpoint::Ip(Some(x))); if result.is_none() { let sockets = SOCKET_SET.lock_irqsave(); @@ -914,7 +913,7 @@ impl SeqpacketSocket { let buffer = Vec::with_capacity(Self::DEFAULT_BUF_SIZE); let metadata = SocketMetadata::new( - SocketType::SeqpacketSocket, + SocketType::Seqpacket, Self::DEFAULT_BUF_SIZE, 0, Self::DEFAULT_METADATA_BUF_SIZE, diff --git a/kernel/src/net/syscall.rs b/kernel/src/net/syscall.rs index 01a3d660..bfbe430a 100644 --- a/kernel/src/net/syscall.rs +++ b/kernel/src/net/syscall.rs @@ -43,7 +43,7 @@ impl Syscall { let socket = new_socket(address_family, socket_type, protocol)?; - let handle_item = SocketHandleItem::new(&socket); + let handle_item = SocketHandleItem::new(socket.as_ref()); HANDLE_MAP .write_irqsave() .insert(socket.socket_handle(), handle_item); @@ -156,7 +156,6 @@ impl Syscall { return Ok(0); } PosixSocketOption::SO_RCVBUF => { - let optval = optval as *mut u32; // 返回默认的接收缓冲区大小 unsafe { *optval = socket.metadata()?.rx_buf_size as u32; @@ -666,7 +665,7 @@ impl From for SockAddr { match value { Endpoint::Ip(ip_endpoint) => { // 未指定地址 - if let None = ip_endpoint { + if ip_endpoint.is_none() { return SockAddr { addr_ph: SockAddrPlaceholder { family: AddressFamily::Unspecified as u16, @@ -802,9 +801,9 @@ impl TryFrom for PosixIpProtocol { } } -impl Into for PosixIpProtocol { - fn into(self) -> u16 { - ::to_u16(&self).unwrap() +impl From for u16 { + fn from(value: PosixIpProtocol) -> Self { + ::to_u16(&value).unwrap() } } @@ -923,9 +922,9 @@ impl TryFrom for PosixSocketOption { } } -impl Into for PosixSocketOption { - fn into(self) -> i32 { - ::to_i32(&self).unwrap() +impl From for i32 { + fn from(value: PosixSocketOption) -> Self { + ::to_i32(&value).unwrap() } } @@ -1012,8 +1011,8 @@ impl TryFrom for PosixTcpSocketOptions { } } -impl Into for PosixTcpSocketOptions { - fn into(self) -> i32 { - ::to_i32(&self).unwrap() +impl From for i32 { + fn from(val: PosixTcpSocketOptions) -> Self { + ::to_i32(&val).unwrap() } } diff --git a/kernel/src/process/exec.rs b/kernel/src/process/exec.rs index 3e3b3a4c..943a8b1e 100644 --- a/kernel/src/process/exec.rs +++ b/kernel/src/process/exec.rs @@ -21,10 +21,10 @@ const BINARY_LOADERS: [&'static dyn BinaryLoader; 1] = [&ELF_LOADER]; pub trait BinaryLoader: 'static + Debug { /// 检查二进制文件是否为当前加载器支持的格式 - fn probe(self: &'static Self, param: &ExecParam, buf: &[u8]) -> Result<(), ExecError>; + fn probe(&'static self, param: &ExecParam, buf: &[u8]) -> Result<(), ExecError>; fn load( - self: &'static Self, + &'static self, param: &mut ExecParam, head_buf: &[u8], ) -> Result; @@ -68,14 +68,13 @@ pub enum ExecError { BadAddress(Option), Other(String), } - -impl Into for ExecError { - fn into(self) -> SystemError { - match self { +impl From for SystemError { + fn from(val: ExecError) -> Self { + match val { ExecError::NotExecutable => SystemError::ENOEXEC, - ExecError::WrongArchitecture => SystemError::EOPNOTSUPP_OR_ENOTSUP, + ExecError::WrongArchitecture => SystemError::ENOEXEC, ExecError::PermissionDenied => SystemError::EACCES, - ExecError::NotSupported => SystemError::EOPNOTSUPP_OR_ENOTSUP, + ExecError::NotSupported => SystemError::ENOSYS, ExecError::ParseError => SystemError::ENOEXEC, ExecError::OutOfMemory => SystemError::ENOMEM, ExecError::InvalidParemeter => SystemError::EINVAL, @@ -269,7 +268,7 @@ impl ProcInitInfo { fn push_slice(&self, ustack: &mut UserStack, slice: &[T]) -> Result<(), SystemError> { let mut sp = ustack.sp(); - sp -= slice.len() * core::mem::size_of::(); + sp -= core::mem::size_of_val(slice); sp -= sp.data() % core::mem::align_of::(); unsafe { core::slice::from_raw_parts_mut(sp.data() as *mut T, slice.len()) } diff --git a/kernel/src/process/exit.rs b/kernel/src/process/exit.rs index 31f4e365..84bd011a 100644 --- a/kernel/src/process/exit.rs +++ b/kernel/src/process/exit.rs @@ -120,11 +120,10 @@ fn do_wait(kwo: &mut KernelWaitOption) -> Result { if !kwo.options.contains(WaitOption::WNOHANG) { retval = Err(SystemError::ERESTARTSYS); - if ProcessManager::current_pcb() + if !ProcessManager::current_pcb() .sig_info_irqsave() .sig_pending() .has_pending() - == false { // todo: 增加子进程退出的回调后,这里可以直接等待在自身的child_wait等待队列上。 continue; @@ -141,8 +140,8 @@ fn do_wait(kwo: &mut KernelWaitOption) -> Result { // 获取weak引用,以便于在do_waitpid中能正常drop pcb let child_weak = Arc::downgrade(&child_pcb); let r = do_waitpid(child_pcb, kwo); - if r.is_some() { - return r.unwrap(); + if let Some(r) = r { + return r; } else { child_weak.upgrade().unwrap().wait_queue.sleep(); } @@ -158,8 +157,8 @@ fn do_wait(kwo: &mut KernelWaitOption) -> Result { if state.is_exited() { kwo.ret_status = state.exit_code().unwrap() as i32; drop(pcb); - unsafe { ProcessManager::release(pid.clone()) }; - return Ok(pid.clone().into()); + unsafe { ProcessManager::release(*pid) }; + return Ok((*pid).into()); } else { unsafe { pcb.wait_queue.sleep_without_schedule() }; } diff --git a/kernel/src/process/fork.rs b/kernel/src/process/fork.rs index 67caceb1..7618847e 100644 --- a/kernel/src/process/fork.rs +++ b/kernel/src/process/fork.rs @@ -203,7 +203,7 @@ impl ProcessManager { if clone_flags.contains(CloneFlags::CLONE_VM) { new_pcb.flags().insert(ProcessFlags::VFORK); } - *new_pcb.flags.get_mut() = ProcessManager::current_pcb().flags().clone(); + *new_pcb.flags.get_mut() = *ProcessManager::current_pcb().flags(); return Ok(()); } @@ -282,8 +282,7 @@ impl ProcessManager { } if clone_flags.contains(CloneFlags::CLONE_SIGHAND) { - (*new_pcb.sig_struct_irqsave()).handlers = - current_pcb.sig_struct_irqsave().handlers.clone(); + new_pcb.sig_struct_irqsave().handlers = current_pcb.sig_struct_irqsave().handlers; } return Ok(()); } @@ -336,10 +335,10 @@ impl ProcessManager { // 如果新进程使用不同的 pid 或 namespace, // 则不允许它与分叉任务共享线程组。 - if clone_flags.contains(CloneFlags::CLONE_THREAD) { - if clone_flags.contains(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWPID) { - return Err(SystemError::EINVAL); - } + if clone_flags.contains(CloneFlags::CLONE_THREAD) + && clone_flags.contains(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWPID) + { + return Err(SystemError::EINVAL); // TODO: 判断新进程与当前进程namespace是否相同,不同则返回错误 } @@ -390,7 +389,7 @@ impl ProcessManager { } // 拷贝标志位 - Self::copy_flags(&clone_flags, &pcb).unwrap_or_else(|e| { + Self::copy_flags(&clone_flags, pcb).unwrap_or_else(|e| { panic!( "fork: Failed to copy flags from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", current_pcb.pid(), pcb.pid(), e @@ -398,7 +397,7 @@ impl ProcessManager { }); // 拷贝用户地址空间 - Self::copy_mm(&clone_flags, ¤t_pcb, &pcb).unwrap_or_else(|e| { + Self::copy_mm(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { panic!( "fork: Failed to copy mm from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", current_pcb.pid(), pcb.pid(), e @@ -406,7 +405,7 @@ impl ProcessManager { }); // 拷贝文件描述符表 - Self::copy_files(&clone_flags, ¤t_pcb, &pcb).unwrap_or_else(|e| { + Self::copy_files(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { panic!( "fork: Failed to copy files from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", current_pcb.pid(), pcb.pid(), e @@ -414,15 +413,15 @@ impl ProcessManager { }); // 拷贝信号相关数据 - Self::copy_sighand(&clone_flags, ¤t_pcb, &pcb).map_err(|e| { + Self::copy_sighand(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { panic!( "fork: Failed to copy sighand from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", current_pcb.pid(), pcb.pid(), e ) - })?; + }); // 拷贝线程 - Self::copy_thread(¤t_pcb, &pcb, clone_args,¤t_trapframe).unwrap_or_else(|e| { + Self::copy_thread(current_pcb, pcb, clone_args,current_trapframe).unwrap_or_else(|e| { panic!( "fork: Failed to copy thread from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", current_pcb.pid(), pcb.pid(), e @@ -438,7 +437,7 @@ impl ProcessManager { (*ptr).tgid = current_pcb.tgid; } } else { - pcb.thread.write_irqsave().group_leader = Arc::downgrade(&pcb); + pcb.thread.write_irqsave().group_leader = Arc::downgrade(pcb); unsafe { let ptr = pcb.as_ref() as *const ProcessControlBlock as *mut ProcessControlBlock; (*ptr).tgid = pcb.tgid; @@ -468,7 +467,7 @@ impl ProcessManager { } } else { // 新创建的进程,设置其父进程为当前进程 - *pcb.real_parent_pcb.write_irqsave() = Arc::downgrade(¤t_pcb); + *pcb.real_parent_pcb.write_irqsave() = Arc::downgrade(current_pcb); pcb.exit_signal .store(clone_args.exit_signal, Ordering::SeqCst); } diff --git a/kernel/src/process/idle.rs b/kernel/src/process/idle.rs index 3dda583b..70a0b3aa 100644 --- a/kernel/src/process/idle.rs +++ b/kernel/src/process/idle.rs @@ -47,7 +47,7 @@ impl ProcessManager { }) }; - let idle_pcb = ProcessControlBlock::new_idle(i as u32, kstack); + let idle_pcb = ProcessControlBlock::new_idle(i, kstack); assert!(idle_pcb.basic().user_vm().is_none()); unsafe { diff --git a/kernel/src/process/kthread.rs b/kernel/src/process/kthread.rs index bb1a8b8c..4bf9c1e9 100644 --- a/kernel/src/process/kthread.rs +++ b/kernel/src/process/kthread.rs @@ -85,6 +85,7 @@ impl KernelThreadPcbPrivate { /// /// 对于非原始类型的参数,需要使用Box包装 #[allow(dead_code)] +#[allow(clippy::type_complexity)] pub enum KernelThreadClosure { UsizeClosure((Box i32 + Send + Sync>, usize)), StaticUsizeClosure((&'static fn(usize) -> i32, usize)), @@ -355,7 +356,7 @@ impl KernelThreadMechanism { ) -> Option> { let pcb = Self::create(func, name)?; ProcessManager::wakeup(&pcb) - .expect(format!("Failed to wakeup kthread: {:?}", pcb.pid()).as_str()); + .unwrap_or_else(|_| panic!("Failed to wakeup kthread: {:?}", pcb.pid())); return Some(pcb); } diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index f9d75af5..065b5a23 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -65,9 +65,10 @@ pub mod fork; pub mod idle; pub mod kthread; pub mod pid; -pub mod process; pub mod resource; +pub mod stdio; pub mod syscall; +pub mod utils; /// 系统中所有进程的pcb static ALL_PROCESS: SpinLock>>> = SpinLock::new(None); @@ -259,9 +260,8 @@ impl ProcessManager { /// - 进入当前函数之前,必须关闭中断 /// - 进入当前函数之后必须保证逻辑的正确性,避免被重复加入调度队列 pub fn mark_sleep(interruptable: bool) -> Result<(), SystemError> { - assert_eq!( - CurrentIrqArch::is_irq_enabled(), - false, + assert!( + !CurrentIrqArch::is_irq_enabled(), "interrupt must be disabled before enter ProcessManager::mark_sleep()" ); @@ -284,9 +284,8 @@ impl ProcessManager { /// - 进入当前函数之前,不能持有sched_info的锁 /// - 进入当前函数之前,必须关闭中断 pub fn mark_stop() -> Result<(), SystemError> { - assert_eq!( - CurrentIrqArch::is_irq_enabled(), - false, + assert!( + !CurrentIrqArch::is_irq_enabled(), "interrupt must be disabled before enter ProcessManager::mark_stop()" ); @@ -338,6 +337,7 @@ impl ProcessManager { // 关中断 unsafe { CurrentIrqArch::interrupt_disable() }; let pcb = ProcessManager::current_pcb(); + let pid = pcb.pid(); pcb.sched_info .inner_lock_write_irqsave() .set_state(ProcessState::Exited(exit_code)); @@ -368,7 +368,11 @@ impl ProcessManager { unsafe { CurrentIrqArch::interrupt_enable() }; sched(); - loop {} + kerror!("pid {pid:?} exited but sched again!"); + #[allow(clippy::empty_loop)] + loop { + spin_loop(); + } } pub unsafe fn release(pid: Pid) { @@ -426,8 +430,6 @@ impl ProcessManager { let cpu_id = pcb.sched_info().on_cpu(); if let Some(cpu_id) = cpu_id { - let cpu_id = cpu_id; - if pcb.pid() == CPU_EXECUTING.get(cpu_id) { kick_cpu(cpu_id).expect("ProcessManager::kick(): Failed to kick cpu"); } @@ -450,8 +452,8 @@ pub unsafe extern "C" fn switch_finish_hook() { int_like!(Pid, AtomicPid, usize, AtomicUsize); -impl Pid { - pub fn to_string(&self) -> String { +impl ToString for Pid { + fn to_string(&self) -> String { self.0.to_string() } } @@ -623,7 +625,7 @@ impl ProcessControlBlock { let ppcb: Weak = ProcessManager::find(ppid) .map(|p| Arc::downgrade(&p)) - .unwrap_or_else(|| Weak::new()); + .unwrap_or_default(); let pcb = Self { pid, @@ -642,7 +644,7 @@ impl ProcessControlBlock { parent_pcb: RwLock::new(ppcb.clone()), real_parent_pcb: RwLock::new(ppcb), children: RwLock::new(Vec::new()), - wait_queue: WaitQueue::INIT, + wait_queue: WaitQueue::default(), thread: RwLock::new(ThreadInfo::new()), }; @@ -1192,7 +1194,7 @@ impl KernelStack { /// /// 仅仅用于BSP启动时,为idle进程构造内核栈。其他时候使用这个函数,很可能造成错误! pub unsafe fn from_existed(base: VirtAddr) -> Result { - if base.is_null() || base.check_aligned(Self::ALIGN) == false { + if base.is_null() || !base.check_aligned(Self::ALIGN) { return Err(SystemError::EFAULT); } @@ -1273,7 +1275,7 @@ impl KernelStack { impl Drop for KernelStack { fn drop(&mut self) { - if !self.stack.is_none() { + if self.stack.is_some() { let ptr = self.stack.as_ref().unwrap().as_ptr() as *const *const ProcessControlBlock; if unsafe { !(*ptr).is_null() } { let pcb_ptr: Weak = unsafe { Weak::from_raw(*ptr) }; diff --git a/kernel/src/process/process.rs b/kernel/src/process/stdio.rs similarity index 77% rename from kernel/src/process/process.rs rename to kernel/src/process/stdio.rs index b09bc945..50014508 100644 --- a/kernel/src/process/process.rs +++ b/kernel/src/process/stdio.rs @@ -8,22 +8,6 @@ use crate::{ process::{Pid, ProcessManager}, }; -use super::{ProcessFlags, __PROCESS_MANAGEMENT_INIT_DONE}; - -pub fn current_pcb_flags() -> ProcessFlags { - if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } { - return ProcessFlags::empty(); - } - return ProcessManager::current_pcb().flags().clone(); -} - -pub fn current_pcb_preempt_count() -> usize { - if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } { - return 0; - } - return ProcessManager::current_pcb().preempt_count(); -} - /// @brief 初始化pid=1的进程的stdio pub fn stdio_init() -> Result<(), SystemError> { if ProcessManager::current_pcb().pid() != Pid(1) { diff --git a/kernel/src/process/utils.rs b/kernel/src/process/utils.rs new file mode 100644 index 00000000..ff853b9a --- /dev/null +++ b/kernel/src/process/utils.rs @@ -0,0 +1,17 @@ +use crate::process::ProcessManager; + +use super::{ProcessFlags, __PROCESS_MANAGEMENT_INIT_DONE}; + +pub fn current_pcb_flags() -> ProcessFlags { + if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } { + return ProcessFlags::empty(); + } + return *ProcessManager::current_pcb().flags(); +} + +pub fn current_pcb_preempt_count() -> usize { + if unsafe { !__PROCESS_MANAGEMENT_INIT_DONE } { + return 0; + } + return ProcessManager::current_pcb().preempt_count(); +} diff --git a/kernel/src/sched/cfs.rs b/kernel/src/sched/cfs.rs index aaa7a3b3..2aa33ad6 100644 --- a/kernel/src/sched/cfs.rs +++ b/kernel/src/sched/cfs.rs @@ -211,7 +211,7 @@ impl Scheduler for SchedulerCFS { /// @brief 在当前cpu上进行调度。 /// 请注意,进入该函数之前,需要关中断 fn sched(&mut self) -> Option> { - assert!(CurrentIrqArch::is_irq_enabled() == false); + assert!(!CurrentIrqArch::is_irq_enabled()); ProcessManager::current_pcb() .flags() diff --git a/kernel/src/sched/completion.rs b/kernel/src/sched/completion.rs index 9cb67297..d88ee6fb 100644 --- a/kernel/src/sched/completion.rs +++ b/kernel/src/sched/completion.rs @@ -1,4 +1,5 @@ #![allow(dead_code)] + use system_error::SystemError; use crate::{ @@ -91,7 +92,7 @@ impl Completion { pub fn complete(&self) { let mut inner = self.inner.lock_irqsave(); if inner.done != COMPLETE_ALL { - inner.done += 1; + inner.done = inner.done.saturating_add(1); } inner.wait_queue.wakeup(None); // 脱离生命周期,自动释放guard @@ -148,7 +149,7 @@ impl InnerCompletion { pub const fn new() -> Self { Self { done: 0, - wait_queue: WaitQueue::INIT, + wait_queue: WaitQueue::default(), } } } diff --git a/kernel/src/sched/rt.rs b/kernel/src/sched/rt.rs index 1a4017e8..54c53cf7 100644 --- a/kernel/src/sched/rt.rs +++ b/kernel/src/sched/rt.rs @@ -117,9 +117,7 @@ impl SchedulerRT { } // 为每个cpu核心创建负载统计队列 for _ in 0..PerCpu::MAX_CPU_NUM { - result - .load_list - .push(Box::leak(Box::new(LinkedList::new()))); + result.load_list.push(Box::leak(Box::default())); } return result; } @@ -144,7 +142,7 @@ impl SchedulerRT { for prio in 0..SchedulerRT::MAX_RT_PRIO { sum += self.cpu_queue[cpu_id.data() as usize][prio as usize].get_rt_queue_size(); } - return sum as usize; + return sum; } #[allow(dead_code)] @@ -205,7 +203,7 @@ impl Scheduler for SchedulerRT { // 判断这个进程时间片是否耗尽,若耗尽则将其时间片赋初值然后入队 if proc.sched_info().rt_time_slice() <= 0 { proc.sched_info() - .set_rt_time_slice(SchedulerRT::RR_TIMESLICE as isize); + .set_rt_time_slice(SchedulerRT::RR_TIMESLICE); proc.flags().insert(ProcessFlags::NEED_SCHEDULE); sched_enqueue(proc, false); } diff --git a/kernel/src/sched/syscall.rs b/kernel/src/sched/syscall.rs index 06da798d..5456d94b 100644 --- a/kernel/src/sched/syscall.rs +++ b/kernel/src/sched/syscall.rs @@ -21,8 +21,7 @@ impl Syscall { // 根据调度结果统一进行切换 let pcb = do_sched(); - if pcb.is_some() { - let next_pcb = pcb.unwrap(); + if let Some(next_pcb) = pcb { let current_pcb = ProcessManager::current_pcb(); // kdebug!("sched: current_pcb: {:?}, next_pcb: {:?}\n", current_pcb, next_pcb); if current_pcb.pid() != next_pcb.pid() { diff --git a/kernel/src/smp/cpu/mod.rs b/kernel/src/smp/cpu/mod.rs index c9d2cce0..df846718 100644 --- a/kernel/src/smp/cpu/mod.rs +++ b/kernel/src/smp/cpu/mod.rs @@ -163,6 +163,7 @@ impl SmpCpuManager { unsafe { self.cpuhp_state.force_get(cpu_id) } } + #[allow(clippy::mut_from_ref)] fn cpuhp_state_mut(&self, cpu_id: ProcessorId) -> &mut CpuHpCpuState { unsafe { self.cpuhp_state.force_get_mut(cpu_id) } } diff --git a/kernel/src/smp/init.rs b/kernel/src/smp/init.rs index 7f2aaa3c..68911612 100644 --- a/kernel/src/smp/init.rs +++ b/kernel/src/smp/init.rs @@ -8,7 +8,7 @@ use crate::{ #[inline(never)] pub fn smp_ap_start_stage2() -> ! { - assert_eq!(CurrentIrqArch::is_irq_enabled(), false); + assert!(!CurrentIrqArch::is_irq_enabled()); smp_cpu_manager().complete_ap_thread(true); diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 4464b846..b174b741 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -144,7 +144,7 @@ impl Syscall { let fd = args[0] as i32; let buf_vaddr = args[1]; let len = args[2]; - let from_user = frame.from_user(); + let from_user = frame.is_from_user(); let mut user_buffer_writer = UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?; @@ -155,7 +155,7 @@ impl Syscall { let fd = args[0] as i32; let buf_vaddr = args[1]; let len = args[2]; - let from_user = frame.from_user(); + let from_user = frame.is_from_user(); let user_buffer_reader = UserBufferReader::new(buf_vaddr as *const u8, len, from_user)?; @@ -178,7 +178,7 @@ impl Syscall { let offset = args[3]; let mut user_buffer_writer = - UserBufferWriter::new(buf_vaddr as *mut u8, len, frame.from_user())?; + UserBufferWriter::new(buf_vaddr as *mut u8, len, frame.is_from_user())?; let buf = user_buffer_writer.buffer(0)?; Self::pread(fd, buf, len, offset) } @@ -190,7 +190,7 @@ impl Syscall { let offset = args[3]; let user_buffer_reader = - UserBufferReader::new(buf_vaddr as *const u8, len, frame.from_user())?; + UserBufferReader::new(buf_vaddr as *const u8, len, frame.is_from_user())?; let buf = user_buffer_reader.read_from_user(0)?; Self::pwrite(fd, buf, len, offset) @@ -233,7 +233,7 @@ impl Syscall { let len = args[2]; let virt_addr: VirtAddr = VirtAddr::new(buf_vaddr); // 判断缓冲区是否来自用户态,进行权限校验 - let res = if frame.from_user() && verify_area(virt_addr, len as usize).is_err() { + let res = if frame.is_from_user() && verify_area(virt_addr, len).is_err() { // 来自用户态,而buffer在内核态,这样的操作不被允许 Err(SystemError::EPERM) } else if buf_vaddr == 0 { @@ -256,8 +256,8 @@ impl Syscall { let virt_argv_ptr = VirtAddr::new(argv_ptr); let virt_env_ptr = VirtAddr::new(env_ptr); // 权限校验 - if frame.from_user() - && (verify_area(virt_path_ptr, MAX_PATHLEN as usize).is_err() + if frame.is_from_user() + && (verify_area(virt_path_ptr, MAX_PATHLEN).is_err() || verify_area(virt_argv_ptr, PAGE_4K_SIZE as usize).is_err()) || verify_area(virt_env_ptr, PAGE_4K_SIZE as usize).is_err() { @@ -299,10 +299,9 @@ impl Syscall { let rem = args[1] as *mut TimeSpec; let virt_req = VirtAddr::new(req as usize); let virt_rem = VirtAddr::new(rem as usize); - if frame.from_user() - && (verify_area(virt_req, core::mem::size_of::() as usize).is_err() - || verify_area(virt_rem, core::mem::size_of::() as usize) - .is_err()) + if frame.is_from_user() + && (verify_area(virt_req, core::mem::size_of::()).is_err() + || verify_area(virt_rem, core::mem::size_of::()).is_err()) { Err(SystemError::EFAULT) } else { @@ -376,12 +375,12 @@ impl Syscall { let sig = args[0] as c_int; let act = args[1]; let old_act = args[2]; - Self::sigaction(sig, act, old_act, frame.from_user()) + Self::sigaction(sig, act, old_act, frame.is_from_user()) } SYS_GETPID => Self::getpid().map(|pid| pid.into()), - SYS_SCHED => Self::sched(frame.from_user()), + SYS_SCHED => Self::sched(frame.is_from_user()), SYS_DUP => { let oldfd: i32 = args[0] as c_int; Self::dup(oldfd) @@ -397,10 +396,10 @@ impl Syscall { SYS_SOCKET => Self::socket(args[0], args[1], args[2]), SYS_SETSOCKOPT => { let optval = args[3] as *const u8; - let optlen = args[4] as usize; + let optlen = args[4]; let virt_optval = VirtAddr::new(optval as usize); // 验证optval的地址是否合法 - if verify_area(virt_optval, optlen as usize).is_err() { + if verify_area(virt_optval, optlen).is_err() { // 地址空间超出了用户空间的范围,不合法 Err(SystemError::EFAULT) } else { @@ -421,15 +420,15 @@ impl Syscall { } // 验证optlen的地址是否合法 - if verify_area(virt_optlen, core::mem::size_of::() as usize).is_err() { + if verify_area(virt_optlen, core::mem::size_of::()).is_err() { // 地址空间超出了用户空间的范围,不合法 return Err(SystemError::EFAULT); } return Ok(()); }; let r = security_check(); - if r.is_err() { - Err(r.unwrap_err()) + if let Err(e) = r { + Err(e) } else { Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32) } @@ -437,10 +436,10 @@ impl Syscall { SYS_CONNECT => { let addr = args[1] as *const SockAddr; - let addrlen = args[2] as usize; + let addrlen = args[2]; let virt_addr = VirtAddr::new(addr as usize); // 验证addr的地址是否合法 - if verify_area(virt_addr, addrlen as usize).is_err() { + if verify_area(virt_addr, addrlen).is_err() { // 地址空间超出了用户空间的范围,不合法 Err(SystemError::EFAULT) } else { @@ -449,10 +448,10 @@ impl Syscall { } SYS_BIND => { let addr = args[1] as *const SockAddr; - let addrlen = args[2] as usize; + let addrlen = args[2]; let virt_addr = VirtAddr::new(addr as usize); // 验证addr的地址是否合法 - if verify_area(virt_addr, addrlen as usize).is_err() { + if verify_area(virt_addr, addrlen).is_err() { // 地址空间超出了用户空间的范围,不合法 Err(SystemError::EFAULT) } else { @@ -462,17 +461,14 @@ impl Syscall { SYS_SENDTO => { let buf = args[1] as *const u8; - let len = args[2] as usize; + let len = args[2]; let flags = args[3] as u32; let addr = args[4] as *const SockAddr; - let addrlen = args[5] as usize; + let addrlen = args[5]; let virt_buf = VirtAddr::new(buf as usize); let virt_addr = VirtAddr::new(addr as usize); // 验证buf的地址是否合法 - if verify_area(virt_buf, len as usize).is_err() { - // 地址空间超出了用户空间的范围,不合法 - Err(SystemError::EFAULT) - } else if verify_area(virt_addr, addrlen as usize).is_err() { + if verify_area(virt_buf, len).is_err() || verify_area(virt_addr, addrlen).is_err() { // 地址空间超出了用户空间的范围,不合法 Err(SystemError::EFAULT) } else { @@ -483,7 +479,7 @@ impl Syscall { SYS_RECVFROM => { let buf = args[1] as *mut u8; - let len = args[2] as usize; + let len = args[2]; let flags = args[3] as u32; let addr = args[4] as *mut SockAddr; let addrlen = args[5] as *mut usize; @@ -510,8 +506,8 @@ impl Syscall { return Ok(()); }; let r = security_check(); - if r.is_err() { - Err(r.unwrap_err()) + if let Err(e) = r { + Err(e) } else { let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) }; Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32) @@ -522,8 +518,11 @@ impl Syscall { let msg = args[1] as *mut MsgHdr; let flags = args[2] as u32; - let mut user_buffer_writer = - UserBufferWriter::new(msg, core::mem::size_of::(), frame.from_user())?; + let mut user_buffer_writer = UserBufferWriter::new( + msg, + core::mem::size_of::(), + frame.is_from_user(), + )?; let buffer = user_buffer_writer.buffer::(0)?; let msg = &mut buffer[0]; @@ -604,8 +603,8 @@ impl Syscall { return Ok(()); }; let r = security_check(); - if r.is_err() { - Err(r.unwrap_err()) + if let Err(e) = r { + Err(e) } else { let buf = unsafe { core::slice::from_raw_parts_mut(buf, size) }; Self::getcwd(buf).map(|ptr| ptr.data()) @@ -617,7 +616,7 @@ impl Syscall { SYS_GETPPID => Self::getppid().map(|pid| pid.into()), SYS_FSTAT => { let fd = args[0] as i32; - let kstat = args[1] as *mut PosixKstat; + let kstat: *mut PosixKstat = args[1] as *mut PosixKstat; let vaddr = VirtAddr::new(kstat as usize); // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分 // TODO 应该将用了c版本的verify_area都改为rust的verify_area @@ -784,7 +783,7 @@ impl Syscall { let mut user_buffer_writer = UserBufferWriter::new( args[3] as *mut c_int, core::mem::size_of::<[c_int; 2]>(), - frame.from_user(), + frame.is_from_user(), )?; let fds = user_buffer_writer.buffer::(0)?; Self::socketpair(args[0], args[1], args[2], fds) @@ -833,7 +832,7 @@ impl Syscall { let syslog_action_type = args[0]; let buf_vaddr = args[1]; let len = args[2]; - let from_user = frame.from_user(); + let from_user = frame.is_from_user(); let mut user_buffer_writer = UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?; diff --git a/kernel/src/syscall/user_access.rs b/kernel/src/syscall/user_access.rs index 8dcfe4ab..66493156 100644 --- a/kernel/src/syscall/user_access.rs +++ b/kernel/src/syscall/user_access.rs @@ -49,7 +49,7 @@ pub unsafe fn copy_from_user(dst: &mut [u8], src: VirtAddr) -> Result UserBufferReader<'a> { /// @return 返回用户空间数据的切片(对单个结构体就返回长度为一的切片) /// pub fn read_from_user(&self, offset: usize) -> Result<&[T], SystemError> { - return self.convert_with_offset(&self.buffer, offset); + return self.convert_with_offset(self.buffer, offset); } /// 从用户空间读取一个指定偏移量的数据(到变量中) /// @@ -190,7 +190,7 @@ impl<'a> UserBufferReader<'a> { /// @return 返回用户空间数据的引用 /// pub fn read_one_from_user(&self, offset: usize) -> Result<&T, SystemError> { - return self.convert_one_with_offset(&self.buffer, offset); + return self.convert_one_with_offset(self.buffer, offset); } /// 从用户空间拷贝数据(到指定地址中) @@ -203,7 +203,7 @@ impl<'a> UserBufferReader<'a> { dst: &mut [T], offset: usize, ) -> Result { - let data = self.convert_with_offset(&self.buffer, offset)?; + let data = self.convert_with_offset(self.buffer, offset)?; dst.copy_from_slice(data); return Ok(dst.len()); } @@ -218,7 +218,7 @@ impl<'a> UserBufferReader<'a> { dst: &mut T, offset: usize, ) -> Result<(), SystemError> { - let data = self.convert_one_with_offset::(&self.buffer, offset)?; + let data = self.convert_one_with_offset::(self.buffer, offset)?; dst.clone_from(data); return Ok(()); } @@ -229,9 +229,8 @@ impl<'a> UserBufferReader<'a> { /// /// - `offset`:字节偏移量 pub fn buffer(&self, offset: usize) -> Result<&[T], SystemError> { - Ok(self - .convert_with_offset::(self.buffer, offset) - .map_err(|_| SystemError::EINVAL)?) + self.convert_with_offset::(self.buffer, offset) + .map_err(|_| SystemError::EINVAL) } fn convert_with_offset(&self, src: &[u8], offset: usize) -> Result<&[T], SystemError> { @@ -297,7 +296,7 @@ impl<'a> UserBufferWriter<'a> { offset: usize, ) -> Result { let dst = Self::convert_with_offset(self.buffer, offset)?; - dst.copy_from_slice(&src); + dst.copy_from_slice(src); return Ok(src.len()); } @@ -318,7 +317,7 @@ impl<'a> UserBufferWriter<'a> { } pub fn buffer(&'a mut self, offset: usize) -> Result<&mut [T], SystemError> { - Ok(Self::convert_with_offset::(self.buffer, offset).map_err(|_| SystemError::EINVAL)?) + Self::convert_with_offset::(self.buffer, offset).map_err(|_| SystemError::EINVAL) } fn convert_with_offset(src: &mut [u8], offset: usize) -> Result<&mut [T], SystemError> {