From a675246c46fe78f82d230752c8731ae0f26bcf48 Mon Sep 17 00:00:00 2001 From: Debin Date: Tue, 26 Nov 2024 15:29:28 +0800 Subject: [PATCH 1/2] feat(vcpu): add support for emulating system registers - Add Aarch64EmuRegs implementation to vcpu.rs - Implement system register read and write handling in vm.rs - Update VM exit reason handling to include system register access --- src/vcpu.rs | 1 + src/vm.rs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/vcpu.rs b/src/vcpu.rs index 27fa2cc..afd9db0 100644 --- a/src/vcpu.rs +++ b/src/vcpu.rs @@ -22,6 +22,7 @@ cfg_if::cfg_if! { pub use arm_vcpu::Aarch64VCpu as AxArchVCpuImpl; pub use arm_vcpu::Aarch64PerCpu as AxVMArchPerCpuImpl; pub use arm_vcpu::Aarch64VCpuCreateConfig as AxVCpuCreateConfig; + pub use arm_vcpu::Aarch64EmuRegs as AxArchEmuRegs; pub use arm_vcpu::has_hardware_support; } } diff --git a/src/vm.rs b/src/vm.rs index c921868..b91272e 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -14,7 +14,7 @@ use axvcpu::{AxArchVCpu, AxVCpu, AxVCpuExitReason, AxVCpuHal}; use axaddrspace::{AddrSpace, GuestPhysAddr, HostPhysAddr, MappingFlags}; use crate::config::AxVMConfig; -use crate::vcpu::{AxArchVCpuImpl, AxVCpuCreateConfig}; +use crate::vcpu::{AxArchEmuRegs, AxArchVCpuImpl, AxVCpuCreateConfig}; use crate::{has_hardware_support, AxVMHal}; const VM_ASPACE_BASE: usize = 0x0; @@ -271,6 +271,23 @@ impl AxVM { .handle_mmio_write(*addr, (*width).into(), *data as usize); true } + AxVCpuExitReason::SysRegRead { addr, reg } => { + AxArchEmuRegs::::emu_register_handle_read( + (*addr).into(), + *reg, + vcpu.clone(), + ); + true + } + AxVCpuExitReason::SysRegWrite { addr, reg, value } => { + AxArchEmuRegs::::emu_register_handle_write( + (*addr).into(), + *reg, + *value, + vcpu.clone(), + ); + true + } AxVCpuExitReason::IoRead { port: _, width: _ } => true, AxVCpuExitReason::IoWrite { port: _, From 902d6def6372ace17d183b3f43617c53b09faa38 Mon Sep 17 00:00:00 2001 From: Debin Date: Wed, 27 Nov 2024 14:16:02 +0800 Subject: [PATCH 2/2] refactor(src/vm.rs): remove unused parameter in SysRegWrite handler - Remove 'reg' parameter from SysRegWrite exit reason handling - Update AxArchEmuRegs::emu_register_handle_write call to use only necessary parameters --- src/vm.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vm.rs b/src/vm.rs index b91272e..79e3bf7 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -279,10 +279,9 @@ impl AxVM { ); true } - AxVCpuExitReason::SysRegWrite { addr, reg, value } => { + AxVCpuExitReason::SysRegWrite { addr, value } => { AxArchEmuRegs::::emu_register_handle_write( (*addr).into(), - *reg, *value, vcpu.clone(), );