From 6aa5338ff6cb6c694c5f7584fdddc765b5e39d5a Mon Sep 17 00:00:00 2001 From: yyda Date: Mon, 10 Aug 2026 10:04:44 +0800 Subject: [PATCH] feat(x86_64): add hypercall to query ECAM base --- src/arch/aarch64/hypercall.rs | 4 ++++ src/arch/loongarch64/hypercall.rs | 4 ++++ src/arch/riscv64/hypercall.rs | 4 ++++ src/arch/x86_64/hypercall.rs | 12 ++++++++++++ src/hypercall/mod.rs | 2 ++ 5 files changed, 26 insertions(+) diff --git a/src/arch/aarch64/hypercall.rs b/src/arch/aarch64/hypercall.rs index d06be7a9e..0ed5c3e67 100644 --- a/src/arch/aarch64/hypercall.rs +++ b/src/arch/aarch64/hypercall.rs @@ -24,6 +24,10 @@ use crate::hypercall::HyperCallResult; use crate::zone::this_zone_id; impl<'a> HyperCall<'a> { + pub fn hv_get_ecam_base(&mut self, _ecam_base: *mut u64) -> HyperCallResult { + HyperCallResult::Ok(0) + } + pub fn hv_ivc_info(&mut self, ivc_info_ipa: u64) -> HyperCallResult { let zone_id = this_zone_id(); let zone = this_zone(); diff --git a/src/arch/loongarch64/hypercall.rs b/src/arch/loongarch64/hypercall.rs index 6b56282f4..53e46e88d 100644 --- a/src/arch/loongarch64/hypercall.rs +++ b/src/arch/loongarch64/hypercall.rs @@ -21,6 +21,10 @@ use crate::device::virtio_trampoline::MAX_DEVS; use crate::hypercall::HyperCall; use crate::hypercall::HyperCallResult; impl<'a> HyperCall<'a> { + pub fn hv_get_ecam_base(&mut self, _ecam_base: *mut u64) -> HyperCallResult { + HyperCallResult::Ok(0) + } + pub fn hv_ivc_info(&mut self, ivc_info_ipa: u64) -> HyperCallResult { warn!("hv_ivc_info is not implemented for LoongArch64"); HyperCallResult::Ok(0) diff --git a/src/arch/riscv64/hypercall.rs b/src/arch/riscv64/hypercall.rs index ab8f4a198..dac4a45cd 100644 --- a/src/arch/riscv64/hypercall.rs +++ b/src/arch/riscv64/hypercall.rs @@ -21,6 +21,10 @@ use crate::hypercall::HyperCall; use crate::hypercall::HyperCallResult; impl<'a> HyperCall<'a> { + pub fn hv_get_ecam_base(&mut self, _ecam_base: *mut u64) -> HyperCallResult { + HyperCallResult::Ok(0) + } + pub fn hv_ivc_info(&mut self, _ivc_info_ipa: u64) -> HyperCallResult { warn!("hv_ivc_info is not implemented for Risc-V"); HyperCallResult::Ok(0) diff --git a/src/arch/x86_64/hypercall.rs b/src/arch/x86_64/hypercall.rs index 69304786b..ff0cdfa14 100644 --- a/src/arch/x86_64/hypercall.rs +++ b/src/arch/x86_64/hypercall.rs @@ -25,6 +25,18 @@ use crate::{ use spin::RwLock; impl<'a> HyperCall<'a> { + pub fn hv_get_ecam_base(&mut self, ecam_base: *mut u64) -> HyperCallResult { + let ecam_base_pa = self.hv_get_real_pa(ecam_base as u64); + let base = crate::arch::acpi::root_get_config_space_info() + .map(|(base, _)| base as u64) + .unwrap_or(0); + unsafe { + *(ecam_base_pa as *mut u64) = base; + } + debug!("hvisor ecam base: {:#x}", base); + HyperCallResult::Ok(0) + } + pub fn hv_ivc_info(&mut self, ivc_info_ipa: u64) -> HyperCallResult { warn!("hv_ivc_info is not implemented for x86_64"); HyperCallResult::Ok(0) diff --git a/src/hypercall/mod.rs b/src/hypercall/mod.rs index 6ed59088f..0db51cb40 100644 --- a/src/hypercall/mod.rs +++ b/src/hypercall/mod.rs @@ -53,6 +53,7 @@ numeric_enum! { HvConfigCheck = 6, HvVirtioPCI = 7, HvZoneSetBootMode = 8, + HvGetEcamBase = 9, } } pub const SGI_IPI_ID: u64 = 7; @@ -105,6 +106,7 @@ impl<'a> HyperCall<'a> { HyperCallCode::HvConfigCheck => self.hv_zone_config_check(arg0 as *mut u64), HyperCallCode::HvVirtioPCI => self.hv_virtio_pci(arg0, arg1), HyperCallCode::HvZoneSetBootMode => self.hv_zone_set_boot_mode(arg0, arg1), + HyperCallCode::HvGetEcamBase => self.hv_get_ecam_base(arg0 as *mut u64), _ => { warn!("hypercall id={} unsupported!", code as u64); Ok(0)