From 40641928967a95f4fb846d7ff4c508ccb2d4e92e Mon Sep 17 00:00:00 2001 From: Archana Shinde Date: Wed, 26 Apr 2023 22:01:03 -0700 Subject: [PATCH] env: Utilize arch specific functionality to get cpu details Have kata-env call architecture specific function to get cpu details instead of generic function to get cpu details that works only for certain architectures. The functionality for cpu details has been fully implemented for x86_64 and arm architectures, but needs to be implemented for s390 and powerpc. Signed-off-by: Archana Shinde --- src/tools/kata-ctl/src/arch/aarch64/mod.rs | 29 +++++++++++++++++++ .../kata-ctl/src/arch/powerpc64le/mod.rs | 9 ++++++ src/tools/kata-ctl/src/arch/s390x/mod.rs | 9 ++++++ src/tools/kata-ctl/src/arch/x86_64/mod.rs | 5 ++++ src/tools/kata-ctl/src/check.rs | 2 -- src/tools/kata-ctl/src/ops/env_ops.rs | 3 +- src/tools/kata-ctl/src/utils.rs | 4 +-- 7 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/tools/kata-ctl/src/arch/aarch64/mod.rs b/src/tools/kata-ctl/src/arch/aarch64/mod.rs index a6137856f..7eaf3ccb4 100644 --- a/src/tools/kata-ctl/src/arch/aarch64/mod.rs +++ b/src/tools/kata-ctl/src/arch/aarch64/mod.rs @@ -9,6 +9,7 @@ pub use arch_specific::*; mod arch_specific { use crate::check; use crate::types::*; + use crate::utils; use anyhow::Result; use std::path::Path; @@ -37,6 +38,34 @@ mod arch_specific { Ok(()) } + fn normalize_vendor(vendor: &str) -> String { + match vendor { + "0x41" => String::from("ARM Limited"), + _ => String::from("3rd Party Limited"), + } + } + + fn normalize_model(model: &str) -> String { + match model { + "8" => String::from("v8"), + "7" | "7M" | "?(12)" | "?(13)" | "?(14)" | "?(15)" | "?(16)" | "?(17)" => { + String::from("v7") + } + "6" | "6TEJ" => String::from("v6"), + "5" | "5T" | "5TE" | "5TEJ" => String::from("v5"), + "4" | "4T" => String::from("v4"), + "3" => String::from("v3"), + _ => String::from("unknown"), + } + } + + pub fn get_cpu_details() -> Result<(String, String)> { + let (vendor, model) = utils::get_generic_cpu_details(check::PROC_CPUINFO)?; + let norm_vendor = normalize_vendor(&vendor); + let norm_model = normalize_model(&model); + Ok((norm_vendor, norm_model)) + } + pub fn get_checks() -> Option<&'static [CheckItem<'static>]> { Some(CHECK_LIST) } diff --git a/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs b/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs index 8290dbb13..fc849c631 100644 --- a/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs +++ b/src/tools/kata-ctl/src/arch/powerpc64le/mod.rs @@ -9,6 +9,7 @@ pub use arch_specific::*; mod arch_specific { use crate::check; + use crate::utils; use anyhow::Result; pub const ARCH_CPU_VENDOR_FIELD: &str = ""; @@ -24,6 +25,14 @@ mod arch_specific { const PEF_SYS_FIRMWARE_DIR: &str = "/sys/firmware/ultravisor/"; + pub fn get_cpu_details() -> Result<(String, String)> { + utils::get_generic_cpu_details(check::PROC_CPUINFO) + + // TODO: In case of error from get_generic_cpu_details, implement functionality + // to get cpu details specific to powerpc architecture similar + // to the goloang implementation of function getCPUDetails() + } + pub fn available_guest_protection() -> Result { if !Uid::effective().is_root() { return Err(check::ProtectionError::NoPerms); diff --git a/src/tools/kata-ctl/src/arch/s390x/mod.rs b/src/tools/kata-ctl/src/arch/s390x/mod.rs index 7a9940dcf..929e79c92 100644 --- a/src/tools/kata-ctl/src/arch/s390x/mod.rs +++ b/src/tools/kata-ctl/src/arch/s390x/mod.rs @@ -10,6 +10,7 @@ pub use arch_specific::*; mod arch_specific { use crate::check; use crate::types::*; + use crate::utils; use anyhow::{anyhow, Result}; use nix::unistd::Uid; use std::collections::HashMap; @@ -144,6 +145,14 @@ mod arch_specific { Ok(false) } + pub fn get_cpu_details() -> Result<(String, String)> { + utils::get_generic_cpu_details(check::PROC_CPUINFO) + + // TODO: In case of error from get_generic_cpu_details, implement functionality + // to get cpu details specific to s390x architecture similar + // to the goloang implementation of function getS390xCPUDetails() + } + #[allow(dead_code)] // Guest protection is not supported on ARM64. pub fn available_guest_protection() -> Result { diff --git a/src/tools/kata-ctl/src/arch/x86_64/mod.rs b/src/tools/kata-ctl/src/arch/x86_64/mod.rs index 026312624..deafff94f 100644 --- a/src/tools/kata-ctl/src/arch/x86_64/mod.rs +++ b/src/tools/kata-ctl/src/arch/x86_64/mod.rs @@ -12,6 +12,7 @@ mod arch_specific { use crate::check; use crate::check::{GuestProtection, ProtectionError}; use crate::types::*; + use crate::utils; use anyhow::{anyhow, Result}; use nix::unistd::Uid; use std::fs; @@ -109,6 +110,10 @@ mod arch_specific { Ok(cpu_flags) } + pub fn get_cpu_details() -> Result<(String, String)> { + utils::get_generic_cpu_details(check::PROC_CPUINFO) + } + pub const TDX_SYS_FIRMWARE_DIR: &str = "/sys/firmware/tdx_seam/"; pub const TDX_CPU_FLAG: &str = "tdx"; pub const SEV_KVM_PARAMETER_PATH: &str = "/sys/module/kvm_amd/parameters/sev"; diff --git a/src/tools/kata-ctl/src/check.rs b/src/tools/kata-ctl/src/check.rs index bd5406bb8..8f21f6fab 100644 --- a/src/tools/kata-ctl/src/check.rs +++ b/src/tools/kata-ctl/src/check.rs @@ -47,7 +47,6 @@ pub const GENERIC_CPU_MODEL_FIELD: &str = "model name"; #[allow(dead_code)] pub const PROC_CPUINFO: &str = "/proc/cpuinfo"; -#[cfg(any(target_arch = "s390x", target_arch = "x86_64"))] fn read_file_contents(file_path: &str) -> Result { let contents = std::fs::read_to_string(file_path)?; Ok(contents) @@ -55,7 +54,6 @@ fn read_file_contents(file_path: &str) -> Result { // get_single_cpu_info returns the contents of the first cpu from // the specified cpuinfo file by parsing based on a specified delimiter -#[cfg(any(target_arch = "s390x", target_arch = "x86_64"))] pub fn get_single_cpu_info(cpu_info_file: &str, substring: &str) -> Result { let contents = read_file_contents(cpu_info_file)?; diff --git a/src/tools/kata-ctl/src/ops/env_ops.rs b/src/tools/kata-ctl/src/ops/env_ops.rs index de8970ad0..05602e479 100644 --- a/src/tools/kata-ctl/src/ops/env_ops.rs +++ b/src/tools/kata-ctl/src/ops/env_ops.rs @@ -7,7 +7,6 @@ use crate::arch::arch_specific; use crate::args::EnvArgument; -use crate::check; use crate::ops::version; use crate::utils; use kata_types::config::TomlConfig; @@ -232,7 +231,7 @@ fn get_host_info() -> Result { let host_kernel_version = utils::get_kernel_version(utils::PROC_VERSION_FILE)?; let (host_distro_name, host_distro_version) = utils::get_distro_details(utils::OS_RELEASE, utils::OS_RELEASE_CLR)?; - let (cpu_vendor, cpu_model) = utils::get_generic_cpu_details(check::PROC_CPUINFO)?; + let (cpu_vendor, cpu_model) = arch_specific::get_cpu_details()?; let host_distro = DistroInfo { name: host_distro_name, diff --git a/src/tools/kata-ctl/src/utils.rs b/src/tools/kata-ctl/src/utils.rs index 371b5165d..a5ab39d08 100644 --- a/src/tools/kata-ctl/src/utils.rs +++ b/src/tools/kata-ctl/src/utils.rs @@ -5,9 +5,7 @@ #![allow(dead_code)] -#[cfg(any(target_arch = "s390x", target_arch = "x86_64"))] use crate::arch::arch_specific; -#[cfg(any(target_arch = "s390x", target_arch = "x86_64"))] use crate::check::get_single_cpu_info; use anyhow::{anyhow, Context, Result}; @@ -106,7 +104,7 @@ pub fn get_distro_details(os_release: &str, os_release_clr: &str) -> Result<(Str Ok((name, version)) } -#[cfg(any(target_arch = "s390x", target_arch = "x86_64"))] +#[cfg(any(target_arch = "s390x", target_arch = "x86_64", target_arch = "aarch64"))] pub fn get_generic_cpu_details(cpu_info_file: &str) -> Result<(String, String)> { let cpu_info = get_single_cpu_info(cpu_info_file, "\n\n")?; let lines = cpu_info.lines();