From 6950b29dc8edc2f2b0d17cc04a445031543dffc6 Mon Sep 17 00:00:00 2001 From: moce0627 <491745115@qq.com> Date: Thu, 2 Mar 2023 19:04:14 +0800 Subject: [PATCH] clippy & fmt: cargo fmt; use clippy to fix redundant clone --- Makefile | 6 ++--- src/arch/aarch64/interrupt.rs | 4 +-- src/arch/aarch64/mmu.rs | 4 +-- src/arch/aarch64/smmu.rs | 8 +++--- src/arch/aarch64/start_qemu.S | 1 + src/arch/aarch64/vcpu.rs | 16 ++++------- src/arch/aarch64/vgic.rs | 50 +++++++++++++++++------------------ src/config/config.rs | 4 +-- src/config/mod.rs | 4 +-- src/config/pi4_def.rs | 4 +-- src/device/device_tree.rs | 2 -- src/device/emu.rs | 2 +- src/device/virtio/blk.rs | 12 ++++----- src/device/virtio/console.rs | 4 +-- src/device/virtio/dev.rs | 4 +-- src/device/virtio/mediated.rs | 2 +- src/device/virtio/mmio.rs | 6 ++--- src/device/virtio/net.rs | 6 ++--- src/kernel/async_task.rs | 6 ++--- src/kernel/hvc.rs | 8 +++--- src/kernel/interrupt.rs | 6 ++--- src/kernel/iommu.rs | 2 +- src/kernel/ivc.rs | 2 +- src/kernel/live_update.rs | 16 +++++------ src/kernel/migrate.rs | 2 +- src/kernel/sched/sched_rr.rs | 11 ++++++-- src/kernel/vcpu.rs | 8 +++--- src/lib/mod.rs | 2 +- src/lib/unilib.rs | 16 ++++++----- src/main.rs | 2 +- src/vmm/init.rs | 4 +-- src/vmm/manager.rs | 7 +---- 32 files changed, 113 insertions(+), 118 deletions(-) diff --git a/Makefile b/Makefile index 662cab5..ee1b509 100644 --- a/Makefile +++ b/Makefile @@ -59,15 +59,15 @@ QEMU_NETWORK_OPTIONS = -netdev user,id=n0,hostfwd=tcp::5555-:22 -device virtio-n QEMU_DISK_OPTIONS = -drive file=${DISK},if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.25 -run: +run: qemu_debug ${QEMU} ${QEMU_COMMON_OPTIONS} ${QEMU_SERIAL_OPTIONS} ${QEMU_NETWORK_OPTIONS} ${QEMU_DISK_OPTIONS} \ -kernel target/aarch64-qemu/debug/${IMAGE}.bin -run_release: +run_release: qemu_release ${QEMU} ${QEMU_COMMON_OPTIONS} ${QEMU_SERIAL_OPTIONS} ${QEMU_NETWORK_OPTIONS} ${QEMU_DISK_OPTIONS} \ -kernel target/aarch64-qemu/release/${IMAGE}.bin -debug: +debug: qemu_debug ${QEMU} ${QEMU_COMMON_OPTIONS} ${QEMU_SERIAL_OPTIONS} ${QEMU_NETWORK_OPTIONS} ${QEMU_DISK_OPTIONS} \ -kernel target/aarch64-qemu/debug/${IMAGE}.bin \ -s -S diff --git a/src/arch/aarch64/interrupt.rs b/src/arch/aarch64/interrupt.rs index 596aefd..8b0a940 100644 --- a/src/arch/aarch64/interrupt.rs +++ b/src/arch/aarch64/interrupt.rs @@ -56,7 +56,7 @@ pub fn interrupt_arch_ipi_send(cpu_id: usize, ipi_id: usize) { } pub fn interrupt_arch_vm_register(vm: Vm, id: usize) { - super::vgic_set_hw_int(vm.clone(), id); + super::vgic_set_hw_int(vm, id); } pub fn interrupt_arch_vm_inject(vm: Vm, vcpu: Vcpu, int_id: usize) { @@ -65,7 +65,7 @@ pub fn interrupt_arch_vm_inject(vm: Vm, vcpu: Vcpu, int_id: usize) { // restore_vcpu_gic(current_cpu().active_vcpu.clone(), vcpu.clone()); if let Some(cur_vcpu) = current_cpu().active_vcpu.clone() { if cur_vcpu.vm_id() == vcpu.vm_id() { - vgic.inject(vcpu.clone(), int_id); + vgic.inject(vcpu, int_id); return; } } diff --git a/src/arch/aarch64/mmu.rs b/src/arch/aarch64/mmu.rs index ed14b9e..9bde820 100644 --- a/src/arch/aarch64/mmu.rs +++ b/src/arch/aarch64/mmu.rs @@ -12,11 +12,8 @@ use core::arch::global_asm; use tock_registers::*; use tock_registers::interfaces::*; -use crate::arch::pt_lvl2_idx; use crate::board::PLAT_DESC; use crate::lib::memset_safe; -#[cfg(feature = "pi4")] -use crate::arch::LVL2_SHIFT; use super::interface::*; @@ -148,6 +145,7 @@ pub extern "C" fn pt_populate(lvl1_pt: &mut PageTables, lvl2_pt: &mut PageTables #[cfg(feature = "tx2")] { + use crate::arch::pt_lvl2_idx; for i in 0..PLATFORM_PHYSICAL_LIMIT_GB { let output_addr = i << LVL1_SHIFT; lvl1_pt.lvl1[i] = if output_addr >= PLAT_DESC.mem_desc.base { diff --git a/src/arch/aarch64/smmu.rs b/src/arch/aarch64/smmu.rs index fe1088c..67e87f1 100644 --- a/src/arch/aarch64/smmu.rs +++ b/src/arch/aarch64/smmu.rs @@ -376,10 +376,10 @@ impl SmmuV2 { println!( concat!( - "SMMU info:\n", - " page size {:#x}, num pages {}, context base {:#x}\n", - " stream matching with {} register groups\n", - " {} context banks ({} stage-2 only)" + "SMMU info:\n", + " page size {:#x}, num pages {}, context base {:#x}\n", + " stream matching with {} register groups\n", + " {} context banks ({} stage-2 only)" ), page_size, num_pages, context_base, smr_num, context_bank_num, stage2_context_bank_num, ); diff --git a/src/arch/aarch64/start_qemu.S b/src/arch/aarch64/start_qemu.S index f2a4213..9351b9a 100644 --- a/src/arch/aarch64/start_qemu.S +++ b/src/arch/aarch64/start_qemu.S @@ -47,6 +47,7 @@ _start: adrp x1, boot_stack mov x2, (4096 * 2) mul x3, x0, x2 + add x1, x1, x2 add x1, x1, x3 mov sp, x1 diff --git a/src/arch/aarch64/vcpu.rs b/src/arch/aarch64/vcpu.rs index c359d1c..69e3a99 100644 --- a/src/arch/aarch64/vcpu.rs +++ b/src/arch/aarch64/vcpu.rs @@ -19,9 +19,7 @@ pub fn vcpu_arch_init(vm: Vm, vcpu: Vcpu) { let mut vcpu_inner = vcpu.inner.lock(); match config.os_type { VmType::VmTOs => { - vcpu_inner - .vcpu_ctx - .set_argument(config.device_tree_load_ipa()); + vcpu_inner.vcpu_ctx.set_argument(config.device_tree_load_ipa()); } _ => { let arg = &config.memory_region()[0]; @@ -29,12 +27,8 @@ pub fn vcpu_arch_init(vm: Vm, vcpu: Vcpu) { } } - vcpu_inner - .vcpu_ctx - .set_exception_pc(config.kernel_entry_point()); - vcpu_inner.vcpu_ctx.spsr = (SPSR_EL1::M::EL1h - + SPSR_EL1::I::Masked - + SPSR_EL1::F::Masked - + SPSR_EL1::A::Masked - + SPSR_EL1::D::Masked).value; + vcpu_inner.vcpu_ctx.set_exception_pc(config.kernel_entry_point()); + vcpu_inner.vcpu_ctx.spsr = + (SPSR_EL1::M::EL1h + SPSR_EL1::I::Masked + SPSR_EL1::F::Masked + SPSR_EL1::A::Masked + SPSR_EL1::D::Masked) + .value; } diff --git a/src/arch/aarch64/vgic.rs b/src/arch/aarch64/vgic.rs index f99b868..1c0c84f 100644 --- a/src/arch/aarch64/vgic.rs +++ b/src/arch/aarch64/vgic.rs @@ -269,7 +269,7 @@ impl VgicInt { fn set_owner(&self, owner: Vcpu) { let mut vgic_int = self.inner.lock(); - vgic_int.owner = Some(owner.clone()); + vgic_int.owner = Some(owner); } fn clear_owner(&self) { @@ -880,7 +880,7 @@ impl Vgic { } } - self.update_int_list(vcpu.clone(), interrupt.clone()); + self.update_int_list(vcpu, interrupt.clone()); if (interrupt.state().to_num() & 1 != 0) && interrupt.enabled() { // println!("remove_lr: interrupt_state {}", interrupt.state().to_num()); @@ -959,12 +959,12 @@ impl Vgic { match lr_ind { Some(idx) => { - self.write_lr(vcpu.clone(), interrupt.clone(), idx); + self.write_lr(vcpu, interrupt, idx); return true; } None => { // turn on maintenance interrupts - if vgic_get_state(interrupt.clone()) & 1 != 0 { + if vgic_get_state(interrupt) & 1 != 0 { let hcr = GICH.hcr(); GICH.set_hcr(hcr | (1 << 3)); } @@ -1057,7 +1057,7 @@ impl Vgic { // } GICH.set_lr(lr_ind, lr as u32); - self.update_int_list(vcpu.clone(), interrupt.clone()); + self.update_int_list(vcpu, interrupt); } fn route(&self, vcpu: Vcpu, interrupt: VgicInt) { @@ -1085,7 +1085,7 @@ impl Vgic { int_id: interrupt.id(), val: 0, }; - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt); ipi_intra_broadcast_msg(active_vm().unwrap(), IpiType::IpiTIntc, IpiInnerMsg::Initc(ipi_msg)); } } @@ -1109,7 +1109,7 @@ impl Vgic { GICD.set_enable(interrupt.id() as usize, en); } } - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); } else { let int_phys_id = interrupt.owner_phys_id().unwrap(); let vcpu_vm_id = vcpu.vm_id(); @@ -1136,13 +1136,13 @@ impl Vgic { } fn get_enable(&self, vcpu: Vcpu, int_id: usize) -> bool { - self.get_int(vcpu.clone(), int_id).unwrap().enabled() + self.get_int(vcpu, int_id).unwrap().enabled() } fn set_pend(&self, vcpu: Vcpu, int_id: usize, pend: bool) { // TODO: sgi_get_pend ? if bit_extract(int_id, 0, 10) < GIC_SGIS_NUM { - self.sgi_set_pend(vcpu.clone(), int_id, pend); + self.sgi_set_pend(vcpu, int_id, pend); return; } @@ -1167,7 +1167,7 @@ impl Vgic { GICD.set_state(vgic_int_id, if state == 1 { 2 } else { state }) } self.route(vcpu.clone(), interrupt.clone()); - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); drop(interrupt_lock); } else { let vm_id = vcpu.vm_id(); @@ -1222,7 +1222,7 @@ impl Vgic { GICD.set_state(vgic_int_id, if state == 1 { 2 } else { state }) } self.route(vcpu.clone(), interrupt.clone()); - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); } else { let vm_id = vcpu.vm_id(); @@ -1253,7 +1253,7 @@ impl Vgic { if interrupt.hw() { GICD.set_icfgr(interrupt.id() as usize, cfg); } - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); } else { let m = IpiInitcMessage { event: InitcEvent::VgicdSetCfg, @@ -1280,7 +1280,7 @@ impl Vgic { } fn get_icfgr(&self, vcpu: Vcpu, int_id: usize) -> u8 { - let interrupt_option = self.get_int(vcpu.clone(), int_id); + let interrupt_option = self.get_int(vcpu, int_id); if let Some(interrupt) = interrupt_option { return interrupt.cfg(); } else { @@ -1328,7 +1328,7 @@ impl Vgic { println!("inactive"); } _ => { - self.add_lr(vcpu.clone(), interrupt.clone()); + self.add_lr(vcpu, interrupt.clone()); } } } @@ -1358,7 +1358,7 @@ impl Vgic { GICD.set_prio(interrupt.id() as usize, prio); } } - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); } else { let vm_id = vcpu.vm_id(); @@ -1385,7 +1385,7 @@ impl Vgic { } fn get_prio(&self, vcpu: Vcpu, int_id: usize) -> u8 { - let interrupt_option = self.get_int(vcpu.clone(), int_id); + let interrupt_option = self.get_int(vcpu, int_id); return interrupt_option.unwrap().prio(); } @@ -1409,7 +1409,7 @@ impl Vgic { self.route(vcpu.clone(), interrupt.clone()); } } - vgic_int_yield_owner(vcpu.clone(), interrupt.clone()); + vgic_int_yield_owner(vcpu, interrupt.clone()); } else { let vm_id = vcpu.vm_id(); let m = IpiInitcMessage { @@ -1435,7 +1435,7 @@ impl Vgic { } fn get_trgt(&self, vcpu: Vcpu, int_id: usize) -> u8 { - let interrupt_option = self.get_int(vcpu.clone(), int_id); + let interrupt_option = self.get_int(vcpu, int_id); return interrupt_option.unwrap().targets(); } @@ -1449,10 +1449,10 @@ impl Vgic { interrupt.set_state(IrqState::IrqSPend); self.update_int_list(vcpu.clone(), interrupt.clone()); interrupt.set_in_lr(false); - self.route(vcpu.clone(), interrupt.clone()); + self.route(vcpu, interrupt.clone()); drop(interrupt_lock); } else { - self.set_pend(vcpu.clone(), int_id, true); + self.set_pend(vcpu, int_id, true); } } } @@ -1788,7 +1788,7 @@ impl Vgic { // println!("addr {:x}, sgir trglst flt {}, vtrgt {}", emu_ctx.address, sgir_trglstflt, bit_extract(val, 16, 8)); match sgir_trglstflt { 0 => { - trgtlist = vgic_target_translate(vm.clone(), bit_extract(val, 16, 8) as u32, true) as usize; + trgtlist = vgic_target_translate(vm, bit_extract(val, 16, 8) as u32, true) as usize; } 1 => { trgtlist = active_vm_ncpu() & !(1 << current_cpu().id); @@ -2043,7 +2043,7 @@ impl Vgic { GICD.set_act(int.id() as usize, false); } else { if int.state().to_num() & 1 != 0 { - self.add_lr(vcpu.clone(), int.clone()); + self.add_lr(vcpu, int); } } } @@ -2140,7 +2140,7 @@ fn vgic_get_state(interrupt: VgicInt) -> usize { } fn vgic_int_yield_owner(vcpu: Vcpu, interrupt: VgicInt) { - if !vgic_owns(vcpu.clone(), interrupt.clone()) { + if !vgic_owns(vcpu, interrupt.clone()) { return; } if gic_is_priv(interrupt.id() as usize) || interrupt.in_lr() { @@ -2187,7 +2187,7 @@ fn vgic_int_get_owner(vcpu: Vcpu, interrupt: VgicInt) -> bool { owner_vm_id == vcpu_vm_id && owner_vcpu_id == vcpu_id } None => { - interrupt.set_owner(vcpu.clone()); + interrupt.set_owner(vcpu); true } } @@ -2466,7 +2466,7 @@ pub fn vgic_ipi_handler(msg: &IpiMessage) { } } } - save_vcpu_gic(current_cpu().active_vcpu.clone(), trgt_vcpu.clone()); + save_vcpu_gic(current_cpu().active_vcpu.clone(), trgt_vcpu); } pub fn emu_intc_init(vm: Vm, emu_dev_id: usize) { diff --git a/src/config/config.rs b/src/config/config.rs index 68ec0d7..272584b 100644 --- a/src/config/config.rs +++ b/src/config/config.rs @@ -654,7 +654,7 @@ pub fn vm_cfg_add_vm(config_ipa: usize) -> Result { ); println!(" VM name is [{:?}]", new_vm_cfg.name.clone().unwrap()); - println!(" cmdline is [{:?}]", new_vm_cfg.cmdline.clone()); + println!(" cmdline is [{:?}]", new_vm_cfg.cmdline); println!(" ramdisk is [0x{:x}]", new_vm_cfg.ramdisk_load_ipa()); vm_cfg_add_vm_entry(new_vm_cfg) } @@ -753,7 +753,7 @@ pub fn vm_cfg_add_emu_dev( ), vmid, emu_cfg_list.len(), - name_str.clone().trim_end_matches(char::from(0)), + name_str.trim_end_matches(char::from(0)), cfg_list, base_ipa, length, diff --git a/src/config/mod.rs b/src/config/mod.rs index 90b4c4d..d47a9aa 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -19,11 +19,11 @@ pub use self::qemu_def::*; pub use self::tx2_def::*; mod config; -#[cfg(feature = "static-config")] -mod vm_def; #[cfg(feature = "pi4")] mod pi4_def; #[cfg(feature = "qemu")] mod qemu_def; #[cfg(feature = "tx2")] mod tx2_def; +#[cfg(feature = "static-config")] +mod vm_def; diff --git a/src/config/pi4_def.rs b/src/config/pi4_def.rs index 63e15e1..eba107a 100644 --- a/src/config/pi4_def.rs +++ b/src/config/pi4_def.rs @@ -17,7 +17,7 @@ use spin::Mutex; use crate::board::*; use crate::config::vm_cfg_add_vm_entry; use crate::device::EmuDeviceType; -use crate::kernel::{HVC_IRQ, INTERRUPT_IRQ_GUEST_TIMER, VmType}; +use crate::kernel::VmType; use super::{ PassthroughRegion, vm_cfg_set_config_name, VmConfigEntry, VmCpuConfig, VMDtbDevConfigList, VmEmulatedDeviceConfig, @@ -196,5 +196,5 @@ pub fn mvm_config_init() { vm_pt_dev_confg: Arc::new(Mutex::new(pt_dev_config)), vm_dtb_devs: Arc::new(Mutex::new(VMDtbDevConfigList::default())), }; - vm_cfg_add_vm_entry(mvm_config_entry); + let _ = vm_cfg_add_vm_entry(mvm_config_entry); } diff --git a/src/device/device_tree.rs b/src/device/device_tree.rs index 31483af..cd77db7 100644 --- a/src/device/device_tree.rs +++ b/src/device/device_tree.rs @@ -12,8 +12,6 @@ use alloc::vec::Vec; use vm_fdt::{Error, FdtWriter, FdtWriterResult}; -#[cfg(feature = "pi4")] -use crate::arch::PAGE_SIZE; use crate::config::{DtbDevType, VmDtbDevConfig}; use crate::config::VmConfigEntry; use crate::device::EmuDeviceType; diff --git a/src/device/emu.rs b/src/device/emu.rs index 45b60a0..215bc6a 100644 --- a/src/device/emu.rs +++ b/src/device/emu.rs @@ -39,7 +39,7 @@ impl EmuDevs { match self { EmuDevs::Vgic(vgic) => { if let EmuDevs::Vgic(src_vgic) = src_dev { - vgic.save_vgic(src_vgic.clone()); + vgic.save_vgic(src_vgic); } else { println!("EmuDevs::migrate_save: illegal src dev type for vgic"); } diff --git a/src/device/virtio/blk.rs b/src/device/virtio/blk.rs index 8f35dea..47584c5 100644 --- a/src/device/virtio/blk.rs +++ b/src/device/virtio/blk.rs @@ -508,8 +508,8 @@ pub fn virtio_mediated_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> let task = AsyncTask::new( AsyncTaskData::AsyncIpiTask(IpiMediatedMsg { src_id: vm.id(), - vq: vq.clone(), - blk: blk.clone(), + vq: vq, + blk: blk, }), vm.id(), async_ipi_req, @@ -577,7 +577,7 @@ pub fn virtio_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> bool { next_desc_idx, vq.desc_flags(next_desc_idx) ); - blk.notify(vm.clone()); + blk.notify(vm); // vq.notify(dev.int_id(), vm.clone()); return false; } @@ -599,7 +599,7 @@ pub fn virtio_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> bool { req_node.req_type, vq.desc_flags(next_desc_idx) ); - blk.notify(vm.clone()); + blk.notify(vm); // vq.notify(dev.int_id(), vm.clone()); return false; } @@ -620,7 +620,7 @@ pub fn virtio_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> bool { /*state handler*/ if !vq.desc_is_writable(next_desc_idx) { println!("Failed to get virt blk queue desc status, idx = {}", next_desc_idx); - blk.notify(vm.clone()); + blk.notify(vm); // vq.notify(dev.int_id(), vm.clone()); return false; } @@ -658,7 +658,7 @@ pub fn virtio_blk_notify_handler(vq: Virtq, blk: VirtioMmio, vm: Vm) -> bool { if vq.avail_flags() == 0 && process_count > 0 && !req.mediated() { println!("virtio blk notify"); - blk.notify(vm.clone()); + blk.notify(vm); // vq.notify(dev.int_id(), vm.clone()); } diff --git a/src/device/virtio/console.rs b/src/device/virtio/console.rs index 7b834b4..fde7912 100644 --- a/src/device/virtio/console.rs +++ b/src/device/virtio/console.rs @@ -218,7 +218,7 @@ pub fn virtio_console_notify_handler(vq: Virtq, console: VirtioMmio, vm: Vm) -> return false; } - console.notify(vm.clone()); + console.notify(vm); // vq.notify(dev.int_id(), vm.clone()); true @@ -337,7 +337,7 @@ fn virtio_console_recv(trgt_vmid: u16, trgt_console_ipa: u64, tx_iov: VirtioIov, return false; } - console.notify(trgt_vm.clone()); + console.notify(trgt_vm); // rx_vq.notify(console.dev().int_id(), trgt_vm.clone()); true } diff --git a/src/device/virtio/dev.rs b/src/device/virtio/dev.rs index e1139e1..501f72f 100644 --- a/src/device/virtio/dev.rs +++ b/src/device/virtio/dev.rs @@ -168,8 +168,8 @@ impl VirtDev { pub fn is_net(&self) -> bool { let inner = self.inner.lock(); match &inner.desc { - DevDesc::NetDesc(_) => { true } - _ => { false } + DevDesc::NetDesc(_) => true, + _ => false, } } diff --git a/src/device/virtio/mediated.rs b/src/device/virtio/mediated.rs index 0f8be6e..6d6ab75 100644 --- a/src/device/virtio/mediated.rs +++ b/src/device/virtio/mediated.rs @@ -170,7 +170,7 @@ pub fn mediated_dev_append(_class_id: usize, mmio_ipa: usize) -> Result bool || offset == VIRTIO_MMIO_STATUS { // println!("in virtio_mmio_prologue_access"); - virtio_mmio_prologue_access(mmio.clone(), emu_ctx, offset, write); + virtio_mmio_prologue_access(mmio, emu_ctx, offset, write); } else if VIRTIO_MMIO_QUEUE_SEL <= offset && offset <= VIRTIO_MMIO_QUEUE_USED_HIGH { // println!("in virtio_mmio_queue_access"); - virtio_mmio_queue_access(mmio.clone(), emu_ctx, offset, write); + virtio_mmio_queue_access(mmio, emu_ctx, offset, write); } else if VIRTIO_MMIO_CONFIG_GENERATION <= offset && offset <= VIRTIO_MMIO_REGS_END { // println!("in virtio_mmio_cfg_access"); - virtio_mmio_cfg_access(mmio.clone(), emu_ctx, offset, write); + virtio_mmio_cfg_access(mmio, emu_ctx, offset, write); } else { println!( "emu_virtio_mmio_handler: regs wrong {}, address 0x{:x}, offset 0x{:x}", diff --git a/src/device/virtio/net.rs b/src/device/virtio/net.rs index 862406c..1df1053 100644 --- a/src/device/virtio/net.rs +++ b/src/device/virtio/net.rs @@ -268,7 +268,7 @@ pub fn virtio_net_handle_ctrl(vq: Virtq, nic: VirtioMmio, vm: Vm) -> bool { } next_desc_idx_opt = vq.pop_avail_desc_idx(vq.avail_idx()); } - nic.notify(vm.clone()); + nic.notify(vm); true } @@ -336,7 +336,7 @@ pub fn virtio_net_notify_handler(vq: Virtq, nic: VirtioMmio, vm: Vm) -> bool { return false; } - nic.notify(vm.clone()); + nic.notify(vm); // vq.notify(dev.int_id(), vm.clone()); let mut trgt_vmid = 0; while vms_to_notify > 0 { @@ -617,7 +617,7 @@ fn ethernet_send_to(vmid: usize, tx_iov: VirtioIov, len: usize) -> bool { println!("B: vm0 virtio net write vm1 memory in 0x{:x}", used_addr); } vm_if_set_mem_map_bit(vm.clone(), used_addr); - vm_if_set_mem_map_bit(vm.clone(), used_addr + PAGE_SIZE); + vm_if_set_mem_map_bit(vm, used_addr + PAGE_SIZE); } if !rx_vq.update_used_ring(len as u32, desc_idx_header as u32) { return false; diff --git a/src/kernel/async_task.rs b/src/kernel/async_task.rs index 02c47ac..789f4f4 100644 --- a/src/kernel/async_task.rs +++ b/src/kernel/async_task.rs @@ -282,7 +282,7 @@ pub fn async_ipi_req() { } else { // add_task_ipi_count(); // send IPI to target cpu, and the target will invoke `mediated_ipi_handler` - ipi_send_msg(0, IpiType::IpiTMediatedDev, IpiInnerMsg::MediatedMsg(msg.clone())); + ipi_send_msg(0, IpiType::IpiTMediatedDev, IpiInnerMsg::MediatedMsg(msg)); } } _ => {} @@ -464,13 +464,13 @@ pub fn finish_async_task(ipi: bool) { update_used_info(args.vq.clone(), task.src_vmid); let src_vm = vm(task.src_vmid).unwrap(); - args.dev.notify(src_vm.clone()); + args.dev.notify(src_vm); } AsyncTaskData::AsyncIpiTask(_) => {} AsyncTaskData::AsyncNoneTask(args) => { update_used_info(args.vq.clone(), task.src_vmid); let src_vm = vm(task.src_vmid).unwrap(); - args.dev.notify(src_vm.clone()); + args.dev.notify(src_vm); } } } diff --git a/src/kernel/hvc.rs b/src/kernel/hvc.rs index 32dd1c1..9bd2505 100644 --- a/src/kernel/hvc.rs +++ b/src/kernel/hvc.rs @@ -21,9 +21,9 @@ use crate::kernel::{ active_vm, active_vm_id, current_cpu, DIRTY_MEM_THRESHOLD, interrupt_vm_inject, ipi_register, ipi_send_msg, IpiHvcMsg, IpiInnerMsg, IpiMessage, IpiType, ivc_update_mq, map_migrate_vm_mem, mem_heap_region_reserve, migrate_finish_ipi_handler, migrate_ready, Scheduler, send_migrate_memcpy_msg, unmap_migrate_vm_mem, - UPDATE_IMG_BASE_ADDR, update_request, vcpu_idle, VgicMigData, VirtioMmioData, vm, vm_if_copy_mem_map, - vm_if_dirty_mem_map, vm_if_get_cpu_id, vm_if_ivc_arg, vm_if_ivc_arg_ptr, vm_if_mem_map_dirty_sum, - vm_if_mem_map_page_num, vm_if_set_ivc_arg_ptr, VM_NUM_MAX, VMData, + UPDATE_IMG_BASE_ADDR, update_request, vcpu_idle, vm, vm_if_copy_mem_map, vm_if_dirty_mem_map, vm_if_get_cpu_id, + vm_if_ivc_arg, vm_if_ivc_arg_ptr, vm_if_mem_map_dirty_sum, vm_if_mem_map_page_num, vm_if_set_ivc_arg_ptr, + VM_NUM_MAX, VMData, }; use crate::lib::{func_barrier, memcpy_safe, round_up, set_barrier_num, trace}; use crate::lib::unilib::*; @@ -542,7 +542,7 @@ pub fn hvc_guest_notify(vm_id: usize) { ); } Some(vcpu) => { - interrupt_vm_inject(vm.clone(), vcpu.clone(), HVC_IRQ, 0); + interrupt_vm_inject(vm, vcpu, HVC_IRQ, 0); } }; } diff --git a/src/kernel/interrupt.rs b/src/kernel/interrupt.rs index aec758f..9805ea4 100644 --- a/src/kernel/interrupt.rs +++ b/src/kernel/interrupt.rs @@ -185,7 +185,7 @@ pub fn interrupt_handler(int_id: usize, src: usize) -> bool { if let Some(vcpu) = ¤t_cpu().active_vcpu { if let Some(active_vm) = vcpu.vm() { if active_vm.has_interrupt(int_id) { - interrupt_vm_inject(active_vm.clone(), vcpu.clone(), int_id, src); + interrupt_vm_inject(active_vm, vcpu.clone(), int_id, src); // if current_cpu().id == 1 { // println!("GICH_MISR {:x}", GICH.misr()); // println!("GICH_HCR {:x}", GICH.hcr()); @@ -211,7 +211,7 @@ pub fn interrupt_handler(int_id: usize, src: usize) -> bool { return true; } - interrupt_vm_inject(vm.clone(), vcpu.clone(), int_id, src); + interrupt_vm_inject(vm, vcpu.clone(), int_id, src); return false; } } @@ -238,7 +238,7 @@ pub fn interrupt_inject_ipi_handler(msg: &IpiMessage) { panic!("inject int {} to illegal cpu {}", int_id, current_cpu().id); } Some(vcpu) => { - interrupt_vm_inject(vcpu.vm().unwrap(), vcpu.clone(), int_id, 0); + interrupt_vm_inject(vcpu.vm().unwrap(), vcpu, int_id, 0); } } } diff --git a/src/kernel/iommu.rs b/src/kernel/iommu.rs index 0df3aac..fe6a1df 100644 --- a/src/kernel/iommu.rs +++ b/src/kernel/iommu.rs @@ -22,7 +22,7 @@ pub fn iommu_init() { pub fn iommmu_vm_init(vm: Vm) -> bool { if cfg!(feature = "tx2") { - return smmu_vm_init(vm.clone()); + return smmu_vm_init(vm); } else { println!("Platform not support IOMMU"); return false; diff --git a/src/kernel/ivc.rs b/src/kernel/ivc.rs index 8858215..790b85d 100644 --- a/src/kernel/ivc.rs +++ b/src/kernel/ivc.rs @@ -25,7 +25,7 @@ pub fn ivc_update_mq(receive_ipa: usize, cfg_ipa: usize) -> bool { let vm = active_vm().unwrap(); let vm_id = vm.id(); let receive_pa = vm_ipa2pa(vm.clone(), receive_ipa); - let cfg_pa = vm_ipa2pa(vm.clone(), cfg_ipa); + let cfg_pa = vm_ipa2pa(vm, cfg_ipa); if receive_pa == 0 { println!("ivc_update_mq: invalid receive_pa"); diff --git a/src/kernel/live_update.rs b/src/kernel/live_update.rs index cf2f512..790290b 100644 --- a/src/kernel/live_update.rs +++ b/src/kernel/live_update.rs @@ -40,7 +40,7 @@ use crate::kernel::{ SchedulerUpdate, SHARE_MEM_LIST, timer_irq_handler, UsedInfo, Vcpu, VCPU_LIST, VcpuInner, vm, Vm, VM_IF_LIST, vm_ipa2pa, VM_LIST, VM_NUM_MAX, VM_REGION, VmInterface, VmRegion, logger_init, }; -use crate::lib::{barrier, BitAlloc256, BitMap, FlexBitmap, time_current_us}; +use crate::lib::{BitAlloc256, BitMap, FlexBitmap, time_current_us}; use crate::mm::{heap_init, PageFrame}; use crate::vmm::vmm_ipi_handler; @@ -775,10 +775,9 @@ pub fn vm_list_update(src_vm_list: &Mutex>) { (net.vq(0).unwrap().avail()), vm_ipa2pa(vm.clone(), net.vq(0).unwrap().avail_addr()) ); - println!( - "VirtioNet save handler {:x}", - unsafe { *(&virtio_net_notify_handler as *const _ as *const usize) } - ); + println!("VirtioNet save handler {:x}", unsafe { + *(&virtio_net_notify_handler as *const _ as *const usize) + }); mmio.save_mmio(net.clone(), Some(virtio_net_notify_handler)); EmuDevs::VirtioNet(mmio) } @@ -796,10 +795,9 @@ pub fn vm_list_update(src_vm_list: &Mutex>) { (console.vq(0).unwrap().avail()), vm_ipa2pa(vm.clone(), console.vq(0).unwrap().avail_addr()) ); - println!( - "VirtioConsole save handler {:x}", - unsafe { *(&virtio_console_notify_handler as *const _ as *const usize) } - ); + println!("VirtioConsole save handler {:x}", unsafe { + *(&virtio_console_notify_handler as *const _ as *const usize) + }); mmio.save_mmio(console.clone(), Some(virtio_console_notify_handler)); EmuDevs::VirtioConsole(mmio) } diff --git a/src/kernel/migrate.rs b/src/kernel/migrate.rs index e4478ce..a476bfc 100644 --- a/src/kernel/migrate.rs +++ b/src/kernel/migrate.rs @@ -243,7 +243,7 @@ pub struct ConsoleDescData { pub fn migrate_ready(vmid: usize) { if vm_if_mem_map_cache(vmid).is_none() { let trgt_vm = vm(vmid).unwrap(); - map_migrate_vm_mem(trgt_vm.clone(), get_share_mem(MIGRATE_SEND)); + map_migrate_vm_mem(trgt_vm, get_share_mem(MIGRATE_SEND)); match mem_pages_alloc(vm_if_mem_map_page_num(vmid)) { Ok(pf) => { active_vm().unwrap().pt_map_range( diff --git a/src/kernel/sched/sched_rr.rs b/src/kernel/sched/sched_rr.rs index b268508..d3377b9 100644 --- a/src/kernel/sched/sched_rr.rs +++ b/src/kernel/sched/sched_rr.rs @@ -136,14 +136,21 @@ impl SchedulerUpdate for SchedulerRR { new_rr.base_slice = src_rr.base_slice; let active_vcpu = if src_rr.active_idx < src_rr.queue.len() { - println!("Core[{}] is some, active_idx {}, addr {:x}", current_cpu().id, src_rr.active_idx, unsafe { *(&new_rr.queue[src_rr.active_idx].clone() as *const _ as *const usize) }); + println!( + "Core[{}] is some, active_idx {}, addr {:x}", + current_cpu().id, + src_rr.active_idx, + unsafe { *(&new_rr.queue[src_rr.active_idx].clone() as *const _ as *const usize) } + ); Some(new_rr.queue[src_rr.active_idx].clone()) } else { println!("Core[{}] is none", current_cpu().id); None }; if active_vcpu.is_some() { - println!("core[{}] update active_vcpu addr {:x}", current_cpu().id, unsafe { *(&active_vcpu.clone().unwrap() as *const _ as *const usize) }); + println!("core[{}] update active_vcpu addr {:x}", current_cpu().id, unsafe { + *(&active_vcpu.clone().unwrap() as *const _ as *const usize) + }); } current_cpu().set_active_vcpu(active_vcpu); new_rr diff --git a/src/kernel/vcpu.rs b/src/kernel/vcpu.rs index 76e01d9..3cd2330 100644 --- a/src/kernel/vcpu.rs +++ b/src/kernel/vcpu.rs @@ -49,7 +49,7 @@ impl Vcpu { inner.id = vcpu_id; inner.phys_id = 0; drop(inner); - crate::arch::vcpu_arch_init(vm.clone(), self.clone()); + crate::arch::vcpu_arch_init(vm, self.clone()); self.reset_context(); } @@ -472,7 +472,7 @@ pub fn vcpu_alloc() -> Option { let val = Vcpu::default(); vcpu_list.push(val.clone()); - Some(val.clone()) + Some(val) } pub fn vcpu_remove(vcpu: Vcpu) { @@ -498,14 +498,14 @@ pub fn vcpu_idle(_vcpu: Vcpu) -> ! { pub fn vcpu_run(announce: bool) -> ! { { let vcpu = current_cpu().active_vcpu.clone().unwrap(); - let vm = vcpu.vm().unwrap().clone(); + let vm = vcpu.vm().unwrap(); current_cpu().cpu_state = CpuState::CpuRun; vm_if_set_state(active_vm_id(), super::VmState::VmActive); vcpu.context_vm_restore(); if announce { - crate::device::virtio_net_announce(vm.clone()); + crate::device::virtio_net_announce(vm); } // tlb_invalidate_guest_all(); // for i in 0..vm.mem_region_num() { diff --git a/src/lib/mod.rs b/src/lib/mod.rs index 1b0fbba..fa2d5eb 100644 --- a/src/lib/mod.rs +++ b/src/lib/mod.rs @@ -24,5 +24,5 @@ mod cache; mod print; mod string; mod time; +pub mod unilib; mod util; -pub mod unilib; \ No newline at end of file diff --git a/src/lib/unilib.rs b/src/lib/unilib.rs index f946095..359973a 100644 --- a/src/lib/unilib.rs +++ b/src/lib/unilib.rs @@ -10,7 +10,7 @@ /** * This module is used to forward the unilib request from Unishyper to MVM. - * Note: + * Note: * Currently it's a synchronous process, which means it's unefficient. * In the case of 1-to-1 CPU partion strategy, I don't think it's a problem. * But for different Unishypers runs on one single CPU, stucking in EL2 may cause a big efficiency problem, @@ -119,7 +119,11 @@ impl UnilibFS { fn loop_for_response(&self) -> usize { loop { if self.flag() != 0 { - println!("unilib operation finished, flag {}, value {}", self.flag(), self.value()); + println!( + "unilib operation finished, flag {}, value {}", + self.flag(), + self.value() + ); break self.value(); } sleep(1); @@ -182,7 +186,7 @@ pub fn unilib_fs_append(mmio_ipa: usize) -> Result { let vm = active_vm().unwrap(); let mmio_pa = vm_ipa2pa(vm.clone(), mmio_ipa); let unilib_fs = UnilibFS { base_addr: mmio_pa }; - let buf_pa = vm_ipa2pa(vm.clone(), unilib_fs.buf_ipa()); + let buf_pa = vm_ipa2pa(vm, unilib_fs.buf_ipa()); println!( "unilib_fs_append: VM[{}] fs_mmio_ipa 0x{:x}, buf ipa 0x{:x}, buf_pa 0x{:x}", unilib_fs.vm_id(), @@ -223,7 +227,7 @@ pub fn unilib_fs_open(path_start_ipa: usize, path_length: usize, flags: usize) - // println!( // "VM[{}] unilib fs open path_ipa: {:x}, path_length {}, flags {}", // vm_id, path_start_ipa, path_length, flags - // ); + // ); // Get fs_cfg struct according to vm_id. let fs_list_lock = UNILIB_FS_LIST.lock(); let fs_cfg = match fs_list_lock.get(&vm_id) { @@ -350,7 +354,7 @@ pub fn unilib_fs_read(fd: usize, buf_ipa: usize, len: usize) -> Result Result