From 942cf26b48c8b024a6fa7867bb0c8ae39bb1ae09 Mon Sep 17 00:00:00 2001 From: LoGin Date: Sun, 28 Apr 2024 16:49:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(riscv/process):=20=E6=8A=8Ariscv=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=97=B6=E9=92=9F=E8=8A=82=E6=8B=8D=E7=8E=87?= =?UTF-8?q?=E4=B8=8EHZ=E5=90=8C=E6=AD=A5=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=87=E6=8D=A2=E5=88=B0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=80=81=E7=9A=84=E6=97=B6=E5=80=99=E5=BF=98=E4=BA=86=E5=9C=A8?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E6=80=81=E5=85=B3=E4=B8=AD=E6=96=AD=E7=9A=84?= =?UTF-8?q?bug=20(#780)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/arch/riscv64/asm/csr.rs | 1 + kernel/src/arch/riscv64/cpu.rs | 3 ++- kernel/src/arch/riscv64/process/mod.rs | 15 ++------------- kernel/src/arch/riscv64/process/syscall.rs | 4 ++-- kernel/src/arch/riscv64/smp/mod.rs | 2 +- kernel/src/driver/acpi/pmtmr.rs | 7 ++++--- kernel/src/driver/clocksource/acpi_pm.rs | 4 ++++ kernel/src/driver/clocksource/timer_riscv.rs | 6 +++--- kernel/src/driver/disk/mod.rs | 1 + kernel/src/filesystem/vfs/core.rs | 7 ++++--- kernel/src/init/initial_kthread.rs | 2 +- 11 files changed, 25 insertions(+), 27 deletions(-) diff --git a/kernel/src/arch/riscv64/asm/csr.rs b/kernel/src/arch/riscv64/asm/csr.rs index 70bfa537f..405a2278b 100644 --- a/kernel/src/arch/riscv64/asm/csr.rs +++ b/kernel/src/arch/riscv64/asm/csr.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] pub const CSR_SSTATUS: usize = 0x100; pub const CSR_SSCRATCH: usize = 0x140; pub const CSR_SEPC: usize = 0x141; diff --git a/kernel/src/arch/riscv64/cpu.rs b/kernel/src/arch/riscv64/cpu.rs index 12293cca5..40c05d8b0 100644 --- a/kernel/src/arch/riscv64/cpu.rs +++ b/kernel/src/arch/riscv64/cpu.rs @@ -62,6 +62,7 @@ pub(super) struct LocalContext { pub user_sp: usize, } +#[allow(dead_code)] impl LocalContext { pub fn new(cpu: ProcessorId) -> Self { Self { @@ -131,7 +132,7 @@ pub(super) fn init_local_context() { } impl SmpCpuManager { - pub fn arch_init(boot_cpu: ProcessorId) { + pub fn arch_init(_boot_cpu: ProcessorId) { // todo: 读取所有可用的CPU } } diff --git a/kernel/src/arch/riscv64/process/mod.rs b/kernel/src/arch/riscv64/process/mod.rs index 460fd0167..32e699294 100644 --- a/kernel/src/arch/riscv64/process/mod.rs +++ b/kernel/src/arch/riscv64/process/mod.rs @@ -1,8 +1,4 @@ -use alloc::{ - string::String, - sync::{Arc, Weak}, - vec::Vec, -}; +use alloc::sync::{Arc, Weak}; use core::{ arch::asm, intrinsics::unlikely, @@ -28,7 +24,6 @@ use crate::{ PROCESS_SWITCH_RESULT, }, smp::cpu::ProcessorId, - syscall::Syscall, }; use super::{ @@ -61,12 +56,12 @@ pub unsafe fn arch_switch_to_user(trap_frame: TrapFrame) -> ! { let trap_frame_vaddr = VirtAddr::new( current_pcb.kernel_stack().stack_max_address().data() - core::mem::size_of::(), ); + let new_pc = VirtAddr::new(ret_from_exception as usize); let mut arch_guard = current_pcb.arch_info_irqsave(); arch_guard.ksp = trap_frame_vaddr.data(); - arch_guard.ra = new_pc.data(); drop(arch_guard); drop(current_pcb); @@ -315,12 +310,6 @@ unsafe extern "C" fn switch_to_inner(prev: *mut ArchPCBInfo, next: *mut ArchPCBI /// 在切换上下文完成后的钩子函数(必须在这里加一个跳转函数,否则会出现relocation truncated to fit: R_RISCV_JAL错误) unsafe extern "C" fn before_switch_finish_hook() { - let pcb = ProcessManager::current_pcb(); - // kdebug!( - // "before_switch_finish_hook, pid: {:?}, name: {:?}", - // pcb.pid(), - // pcb.basic().name() - // ); switch_finish_hook(); } diff --git a/kernel/src/arch/riscv64/process/syscall.rs b/kernel/src/arch/riscv64/process/syscall.rs index 323b06fff..0b446f41c 100644 --- a/kernel/src/arch/riscv64/process/syscall.rs +++ b/kernel/src/arch/riscv64/process/syscall.rs @@ -102,7 +102,6 @@ impl Syscall { regs.epc = load_result.entry_point().data(); regs.status.update_spp(SPP::User); regs.status.update_fs(FS::Clean); - regs.status.update_sie(true); regs.status.update_sum(true); drop(param); @@ -111,7 +110,8 @@ impl Syscall { } /// ## 用于控制和查询与体系结构相关的进程特定选项 - pub fn arch_prctl(option: usize, arg2: usize) -> Result { + #[allow(dead_code)] + pub fn arch_prctl(_option: usize, _arg2: usize) -> Result { unimplemented!("Syscall::arch_prctl") } } diff --git a/kernel/src/arch/riscv64/smp/mod.rs b/kernel/src/arch/riscv64/smp/mod.rs index f0ed87b60..a283b4502 100644 --- a/kernel/src/arch/riscv64/smp/mod.rs +++ b/kernel/src/arch/riscv64/smp/mod.rs @@ -17,7 +17,7 @@ impl SMPArch for RiscV64SMPArch { Ok(()) } - fn start_cpu(cpu_id: ProcessorId, hp_state: &CpuHpCpuState) -> Result<(), SystemError> { + fn start_cpu(_cpu_id: ProcessorId, _hp_state: &CpuHpCpuState) -> Result<(), SystemError> { kwarn!("RiscV64SMPArch::start_cpu() is not implemented"); Ok(()) } diff --git a/kernel/src/driver/acpi/pmtmr.rs b/kernel/src/driver/acpi/pmtmr.rs index 390f50dab..aec175376 100644 --- a/kernel/src/driver/acpi/pmtmr.rs +++ b/kernel/src/driver/acpi/pmtmr.rs @@ -1,6 +1,4 @@ -use crate::driver::clocksource::acpi_pm::{acpi_pm_read_verified, PMTMR_IO_PORT}; -use core::sync::atomic::Ordering; - +#[allow(dead_code)] pub const ACPI_PM_OVERRUN: u64 = 1 << 24; /// Number of PMTMR ticks expected during calibration run @@ -12,6 +10,8 @@ pub const ACPI_PM_MASK: u64 = 0xffffff; #[inline(always)] #[cfg(target_arch = "x86_64")] pub fn acpi_pm_read_early() -> u32 { + use crate::driver::clocksource::acpi_pm::{acpi_pm_read_verified, PMTMR_IO_PORT}; + use core::sync::atomic::Ordering; let port = unsafe { PMTMR_IO_PORT.load(Ordering::SeqCst) }; // 如果端口为零直接返回 @@ -25,6 +25,7 @@ pub fn acpi_pm_read_early() -> u32 { #[inline(always)] #[cfg(not(target_arch = "x86_64"))] +#[allow(dead_code)] pub fn acpi_pm_read_early() -> u32 { return 0; } diff --git a/kernel/src/driver/clocksource/acpi_pm.rs b/kernel/src/driver/clocksource/acpi_pm.rs index 9167d234e..00265698e 100644 --- a/kernel/src/driver/clocksource/acpi_pm.rs +++ b/kernel/src/driver/clocksource/acpi_pm.rs @@ -34,6 +34,7 @@ fn read_pmtmr() -> u32 { /// /// ## 返回值 /// - u32: 读取到的acpi_pmtmr值 +#[allow(dead_code)] pub fn acpi_pm_read_verified() -> u32 { let mut v2: u32; @@ -167,6 +168,7 @@ const PMTMR_EXPECTED_RATE: u64 = /// ## 返回值 /// - i32:如果为0则表示在预期范围内,否则不在 #[cfg(not(target_arch = "x86_64"))] +#[allow(dead_code)] fn verify_pmtmr_rate() -> bool { let mut count: u32 = 0; @@ -216,6 +218,8 @@ fn find_acpi_pm_clock() -> Result<(), SystemError> { /// # 初始化ACPI PM Timer作为系统时钟源 // #[unified_init(INITCALL_FS)] +#[inline(never)] +#[allow(dead_code)] pub fn init_acpi_pm_clocksource() -> Result<(), SystemError> { let acpi_pm = Acpipm::new(); unsafe { diff --git a/kernel/src/driver/clocksource/timer_riscv.rs b/kernel/src/driver/clocksource/timer_riscv.rs index cb0fd5458..9d522146f 100644 --- a/kernel/src/driver/clocksource/timer_riscv.rs +++ b/kernel/src/driver/clocksource/timer_riscv.rs @@ -19,7 +19,7 @@ use crate::{ mm::percpu::PerCpu, process::ProcessManager, smp::core::smp_get_processor_id, - time::TimeArch, + time::{clocksource::HZ, TimeArch}, }; pub struct RiscVSbiTimer; @@ -48,6 +48,7 @@ impl RiscVSbiTimer { unsafe { riscv::register::sie::set_stimer() }; } + #[allow(dead_code)] fn disable() { unsafe { riscv::register::sie::clear_stimer() }; } @@ -59,8 +60,7 @@ pub fn riscv_sbi_timer_init_local() { assert_eq!(CurrentIrqArch::is_irq_enabled(), false); if unsafe { INTERVAL_CNT } == 0 { - // todo: 将来正式实现时,需要除以HZ - let new = riscv_time_base_freq() / 3; + let new = riscv_time_base_freq() / HZ as usize; if new == 0 { panic!("riscv_sbi_timer_init: failed to get timebase-frequency"); } diff --git a/kernel/src/driver/disk/mod.rs b/kernel/src/driver/disk/mod.rs index a790baa55..1b980b0cc 100644 --- a/kernel/src/driver/disk/mod.rs +++ b/kernel/src/driver/disk/mod.rs @@ -1 +1,2 @@ +#[cfg(target_arch = "x86_64")] pub mod ahci; diff --git a/kernel/src/filesystem/vfs/core.rs b/kernel/src/filesystem/vfs/core.rs index eb84525d6..bc2d0ebba 100644 --- a/kernel/src/filesystem/vfs/core.rs +++ b/kernel/src/filesystem/vfs/core.rs @@ -1,10 +1,10 @@ use core::{hint::spin_loop, sync::atomic::Ordering}; -use alloc::{string::ToString, sync::Arc}; +use alloc::sync::Arc; use system_error::SystemError; use crate::{ - driver::{base::block::disk_info::Partition, disk::ahci}, + driver::base::block::disk_info::Partition, filesystem::{ devfs::devfs_init, fat::fs::FATFileSystem, @@ -116,7 +116,8 @@ fn migrate_virtual_filesystem(new_fs: Arc) -> Result<(), SystemE fn root_partition() -> Arc { #[cfg(target_arch = "x86_64")] { - return ahci::get_disks_by_name("ahci_disk_0".to_string()) + use alloc::string::ToString; + return crate::driver::disk::ahci::get_disks_by_name("ahci_disk_0".to_string()) .unwrap() .0 .lock() diff --git a/kernel/src/init/initial_kthread.rs b/kernel/src/init/initial_kthread.rs index c13fe2a4d..3ff270694 100644 --- a/kernel/src/init/initial_kthread.rs +++ b/kernel/src/init/initial_kthread.rs @@ -74,7 +74,6 @@ fn switch_to_user() -> ! { let mut trap_frame = TrapFrame::new(); // 逐个尝试运行init进程 - if try_to_run_init_process("/bin/dragonreach", &mut trap_frame).is_err() && try_to_run_init_process("/bin/init", &mut trap_frame).is_err() && try_to_run_init_process("/bin/sh", &mut trap_frame).is_err() @@ -83,6 +82,7 @@ fn switch_to_user() -> ! { } // 需要确保执行到这里之后,上面所有的资源都已经释放(比如arc之类的) + compiler_fence(Ordering::SeqCst); unsafe { arch_switch_to_user(trap_frame) }; }