From c1c1e5152a57d60999d48ea6b2188304360d3bfa Mon Sep 17 00:00:00 2001 From: wllenyj Date: Thu, 5 May 2022 16:24:45 +0800 Subject: [PATCH] dragonball: add kernel config. It is used for holding guest kernel configuration information. Fixes: #4257 Signed-off-by: Liu Jiang Signed-off-by: wllenyj Signed-off-by: Chao Wu --- src/dragonball/Cargo.toml | 1 + src/dragonball/src/vm/kernel_config.rs | 67 ++++++++++++++++++++++++++ src/dragonball/src/vm/mod.rs | 3 ++ 3 files changed, 71 insertions(+) create mode 100644 src/dragonball/src/vm/kernel_config.rs diff --git a/src/dragonball/Cargo.toml b/src/dragonball/Cargo.toml index 432a2e808..5171c3584 100644 --- a/src/dragonball/Cargo.toml +++ b/src/dragonball/Cargo.toml @@ -21,6 +21,7 @@ dbs-utils = "0.1.0" kvm-bindings = "0.5.0" kvm-ioctls = "0.11.0" libc = "0.2.39" +linux-loader = "0.4.0" log = "0.4.14" nix = "0.23.1" serde = "1.0.27" diff --git a/src/dragonball/src/vm/kernel_config.rs b/src/dragonball/src/vm/kernel_config.rs new file mode 100644 index 000000000..f266b48c4 --- /dev/null +++ b/src/dragonball/src/vm/kernel_config.rs @@ -0,0 +1,67 @@ +// Copyright (C) 2022 Alibaba Cloud. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +use std::fs::File; + +/// Structure to hold guest kernel configuration information. +pub struct KernelConfigInfo { + /// The descriptor to the kernel file. + kernel_file: File, + /// The descriptor to the initrd file, if there is one + initrd_file: Option, + /// The commandline for guest kernel. + cmdline: linux_loader::cmdline::Cmdline, +} + +impl KernelConfigInfo { + /// Create a KernelConfigInfo instance. + pub fn new( + kernel_file: File, + initrd_file: Option, + cmdline: linux_loader::cmdline::Cmdline, + ) -> Self { + KernelConfigInfo { + kernel_file, + initrd_file, + cmdline, + } + } + + /// Get a mutable reference to the kernel file. + pub fn kernel_file_mut(&mut self) -> &mut File { + &mut self.kernel_file + } + + /// Get a mutable reference to the initrd file. + pub fn initrd_file_mut(&mut self) -> Option<&mut File> { + self.initrd_file.as_mut() + } + + /// Get a shared reference to the guest kernel boot parameter object. + pub fn kernel_cmdline(&self) -> &linux_loader::cmdline::Cmdline { + &self.cmdline + } + + /// Get a mutable reference to the guest kernel boot parameter object. + pub fn kernel_cmdline_mut(&mut self) -> &mut linux_loader::cmdline::Cmdline { + &mut self.cmdline + } +} + +#[cfg(test)] +mod tests { + use super::*; + use vmm_sys_util::tempfile::TempFile; + + #[test] + fn test_kernel_config_info() { + let kernel = TempFile::new().unwrap(); + let initrd = TempFile::new().unwrap(); + let mut cmdline = linux_loader::cmdline::Cmdline::new(1024); + cmdline.insert_str("ro").unwrap(); + let mut info = KernelConfigInfo::new(kernel.into_file(), Some(initrd.into_file()), cmdline); + + assert_eq!(info.cmdline.as_str(), "ro"); + assert!(info.initrd_file_mut().is_some()); + } +} diff --git a/src/dragonball/src/vm/mod.rs b/src/dragonball/src/vm/mod.rs index c461b6a28..c1510308d 100644 --- a/src/dragonball/src/vm/mod.rs +++ b/src/dragonball/src/vm/mod.rs @@ -3,6 +3,9 @@ use serde_derive::{Deserialize, Serialize}; +mod kernel_config; +pub use self::kernel_config::KernelConfigInfo; + /// Configuration information for user defined NUMA nodes. #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct NumaRegionInfo {