mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
build: Consolidate "gdb" build feature into "guest_debug"
This simplifies the CI process but also logical with the existing functionality under "guest_debug" (dumping guest memory). Fixes: #4679 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
@@ -42,9 +42,6 @@ jobs:
|
|||||||
- name: Build (default features + tdx)
|
- name: Build (default features + tdx)
|
||||||
run: cargo rustc --locked --bin cloud-hypervisor --features "tdx" -- -D warnings
|
run: cargo rustc --locked --bin cloud-hypervisor --features "tdx" -- -D warnings
|
||||||
|
|
||||||
- name: Build (default features + gdb)
|
|
||||||
run: cargo rustc --locked --bin cloud-hypervisor --features "gdb" -- -D warnings
|
|
||||||
|
|
||||||
- name: Build (default features + guest_debug)
|
- name: Build (default features + guest_debug)
|
||||||
run: cargo rustc --locked --bin cloud-hypervisor --features "guest_debug" -- -D warnings
|
run: cargo rustc --locked --bin cloud-hypervisor --features "guest_debug" -- -D warnings
|
||||||
|
|
||||||
|
|||||||
@@ -62,13 +62,6 @@ jobs:
|
|||||||
command: clippy
|
command: clippy
|
||||||
args: --locked --all --all-targets --tests -- -D warnings
|
args: --locked --all --all-targets --tests -- -D warnings
|
||||||
|
|
||||||
- name: Clippy (default features + gdb)
|
|
||||||
uses: actions-rs/cargo@v1
|
|
||||||
with:
|
|
||||||
use-cross: ${{ matrix.target != 'x86_64-unknown-linux-gnu' }}
|
|
||||||
command: clippy
|
|
||||||
args: --locked --all --all-targets --tests --features "gdb" -- -D warnings
|
|
||||||
|
|
||||||
- name: Clippy (default features + guest_debug)
|
- name: Clippy (default features + guest_debug)
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ wait-timeout = "0.2.0"
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["kvm"]
|
default = ["kvm"]
|
||||||
gdb = ["vmm/gdb"]
|
|
||||||
guest_debug = ["vmm/guest_debug"]
|
guest_debug = ["vmm/guest_debug"]
|
||||||
kvm = ["vmm/kvm"]
|
kvm = ["vmm/kvm"]
|
||||||
mshv = ["vmm/mshv"]
|
mshv = ["vmm/mshv"]
|
||||||
|
|||||||
+3
-3
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
This feature allows remote guest debugging using GDB. Note that this feature is only supported on x86_64/KVM.
|
This feature allows remote guest debugging using GDB. Note that this feature is only supported on x86_64/KVM.
|
||||||
|
|
||||||
To enable debugging with GDB, build with the `gdb` feature enabled:
|
To enable debugging with GDB, build with the `guest_debug` feature enabled:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cargo build --features gdb
|
cargo build --features guest_debug
|
||||||
```
|
```
|
||||||
|
|
||||||
To use the `--gdb` option, specify the Unix Domain Socket with `--path` that Cloud Hypervisor will use to communicate with the host's GDB:
|
To use the `--gdb` option, specify the Unix Domain Socket with `--path` that Cloud Hypervisor will use to communicate with the host's GDB:
|
||||||
@@ -44,4 +44,4 @@ Continuing.
|
|||||||
|
|
||||||
Breakpoint 1, 0x00000000001121b7 in ?? ()
|
Breakpoint 1, 0x00000000001121b7 in ?? ()
|
||||||
(gdb)
|
(gdb)
|
||||||
```
|
```
|
||||||
|
|||||||
+11
-11
@@ -29,7 +29,7 @@ use vmm_sys_util::terminal::Terminal;
|
|||||||
enum Error {
|
enum Error {
|
||||||
#[error("Failed to create API EventFd: {0}")]
|
#[error("Failed to create API EventFd: {0}")]
|
||||||
CreateApiEventFd(#[source] std::io::Error),
|
CreateApiEventFd(#[source] std::io::Error),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Failed to create Debug EventFd: {0}")]
|
#[error("Failed to create Debug EventFd: {0}")]
|
||||||
CreateDebugEventFd(#[source] std::io::Error),
|
CreateDebugEventFd(#[source] std::io::Error),
|
||||||
#[error("Failed to open hypervisor interface (is hypervisor interface available?): {0}")]
|
#[error("Failed to open hypervisor interface (is hypervisor interface available?): {0}")]
|
||||||
@@ -58,10 +58,10 @@ enum Error {
|
|||||||
BareEventMonitor,
|
BareEventMonitor,
|
||||||
#[error("Error doing event monitor I/O: {0}")]
|
#[error("Error doing event monitor I/O: {0}")]
|
||||||
EventMonitorIo(std::io::Error),
|
EventMonitorIo(std::io::Error),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error parsing --gdb: {0}")]
|
#[error("Error parsing --gdb: {0}")]
|
||||||
ParsingGdb(option_parser::OptionParserError),
|
ParsingGdb(option_parser::OptionParserError),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error parsing --gdb: path required")]
|
#[error("Error parsing --gdb: path required")]
|
||||||
BareGdb,
|
BareGdb,
|
||||||
#[error("Error creating log file: {0}")]
|
#[error("Error creating log file: {0}")]
|
||||||
@@ -391,7 +391,7 @@ fn create_app<'a>(
|
|||||||
.group("vm-config"),
|
.group("vm-config"),
|
||||||
);
|
);
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let app = app.arg(
|
let app = app.arg(
|
||||||
Arg::new("gdb")
|
Arg::new("gdb")
|
||||||
.long("gdb")
|
.long("gdb")
|
||||||
@@ -528,7 +528,7 @@ fn start_vmm(cmd_arguments: ArgMatches) -> Result<Option<String>, Error> {
|
|||||||
|
|
||||||
let hypervisor = hypervisor::new().map_err(Error::CreateHypervisor)?;
|
let hypervisor = hypervisor::new().map_err(Error::CreateHypervisor)?;
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb_socket_path = if let Some(gdb_config) = cmd_arguments.value_of("gdb") {
|
let gdb_socket_path = if let Some(gdb_config) = cmd_arguments.value_of("gdb") {
|
||||||
let mut parser = OptionParser::new();
|
let mut parser = OptionParser::new();
|
||||||
parser.add("path");
|
parser.add("path");
|
||||||
@@ -542,9 +542,9 @@ fn start_vmm(cmd_arguments: ArgMatches) -> Result<Option<String>, Error> {
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let debug_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::CreateDebugEventFd)?;
|
let debug_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::CreateDebugEventFd)?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let vm_debug_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::CreateDebugEventFd)?;
|
let vm_debug_evt = EventFd::new(EFD_NONBLOCK).map_err(Error::CreateDebugEventFd)?;
|
||||||
|
|
||||||
let vmm_thread = vmm::start_vmm_thread(
|
let vmm_thread = vmm::start_vmm_thread(
|
||||||
@@ -554,11 +554,11 @@ fn start_vmm(cmd_arguments: ArgMatches) -> Result<Option<String>, Error> {
|
|||||||
api_evt.try_clone().unwrap(),
|
api_evt.try_clone().unwrap(),
|
||||||
http_sender,
|
http_sender,
|
||||||
api_request_receiver,
|
api_request_receiver,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb_socket_path,
|
gdb_socket_path,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt.try_clone().unwrap(),
|
debug_evt.try_clone().unwrap(),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt.try_clone().unwrap(),
|
vm_debug_evt.try_clone().unwrap(),
|
||||||
&seccomp_action,
|
&seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
@@ -730,7 +730,7 @@ mod unit_tests {
|
|||||||
sgx_epc: None,
|
sgx_epc: None,
|
||||||
numa: None,
|
numa: None,
|
||||||
watchdog: false,
|
watchdog: false,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb: false,
|
gdb: false,
|
||||||
platform: None,
|
platform: None,
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-2
@@ -6,8 +6,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
gdb = ["kvm", "gdbstub", "gdbstub_arch"]
|
guest_debug = ["kvm", "gdbstub", "gdbstub_arch"]
|
||||||
guest_debug = ["kvm"]
|
|
||||||
kvm = ["hypervisor/kvm", "vfio-ioctls/kvm", "vm-device/kvm", "pci/kvm"]
|
kvm = ["hypervisor/kvm", "vfio-ioctls/kvm", "vm-device/kvm", "pci/kvm"]
|
||||||
mshv = ["hypervisor/mshv", "vfio-ioctls/mshv", "vm-device/mshv", "pci/mshv"]
|
mshv = ["hypervisor/mshv", "vfio-ioctls/mshv", "vm-device/mshv", "pci/mshv"]
|
||||||
tdx = ["arch/tdx", "hypervisor/tdx"]
|
tdx = ["arch/tdx", "hypervisor/tdx"]
|
||||||
|
|||||||
+7
-7
@@ -379,7 +379,7 @@ pub struct VmParams<'a> {
|
|||||||
pub sgx_epc: Option<Vec<&'a str>>,
|
pub sgx_epc: Option<Vec<&'a str>>,
|
||||||
pub numa: Option<Vec<&'a str>>,
|
pub numa: Option<Vec<&'a str>>,
|
||||||
pub watchdog: bool,
|
pub watchdog: bool,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
pub gdb: bool,
|
pub gdb: bool,
|
||||||
pub platform: Option<&'a str>,
|
pub platform: Option<&'a str>,
|
||||||
}
|
}
|
||||||
@@ -411,7 +411,7 @@ impl<'a> VmParams<'a> {
|
|||||||
let numa: Option<Vec<&str>> = args.values_of("numa").map(|x| x.collect());
|
let numa: Option<Vec<&str>> = args.values_of("numa").map(|x| x.collect());
|
||||||
let watchdog = args.is_present("watchdog");
|
let watchdog = args.is_present("watchdog");
|
||||||
let platform = args.value_of("platform");
|
let platform = args.value_of("platform");
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb = args.is_present("gdb");
|
let gdb = args.is_present("gdb");
|
||||||
VmParams {
|
VmParams {
|
||||||
cpus,
|
cpus,
|
||||||
@@ -437,7 +437,7 @@ impl<'a> VmParams<'a> {
|
|||||||
sgx_epc,
|
sgx_epc,
|
||||||
numa,
|
numa,
|
||||||
watchdog,
|
watchdog,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb,
|
gdb,
|
||||||
platform,
|
platform,
|
||||||
}
|
}
|
||||||
@@ -2315,7 +2315,7 @@ pub struct VmConfig {
|
|||||||
pub numa: Option<Vec<NumaConfig>>,
|
pub numa: Option<Vec<NumaConfig>>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub watchdog: bool,
|
pub watchdog: bool,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
pub gdb: bool,
|
pub gdb: bool,
|
||||||
pub platform: Option<PlatformConfig>,
|
pub platform: Option<PlatformConfig>,
|
||||||
}
|
}
|
||||||
@@ -2703,7 +2703,7 @@ impl VmConfig {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb = vm_params.gdb;
|
let gdb = vm_params.gdb;
|
||||||
|
|
||||||
let mut config = VmConfig {
|
let mut config = VmConfig {
|
||||||
@@ -2730,7 +2730,7 @@ impl VmConfig {
|
|||||||
sgx_epc,
|
sgx_epc,
|
||||||
numa,
|
numa,
|
||||||
watchdog: vm_params.watchdog,
|
watchdog: vm_params.watchdog,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb,
|
gdb,
|
||||||
platform,
|
platform,
|
||||||
};
|
};
|
||||||
@@ -3340,7 +3340,7 @@ mod tests {
|
|||||||
sgx_epc: None,
|
sgx_epc: None,
|
||||||
numa: None,
|
numa: None,
|
||||||
watchdog: false,
|
watchdog: false,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb: false,
|
gdb: false,
|
||||||
platform: None,
|
platform: None,
|
||||||
};
|
};
|
||||||
|
|||||||
+22
-22
@@ -19,7 +19,7 @@ use crate::coredump::{
|
|||||||
NT_PRSTATUS,
|
NT_PRSTATUS,
|
||||||
};
|
};
|
||||||
use crate::device_manager::DeviceManager;
|
use crate::device_manager::DeviceManager;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use crate::gdb::{get_raw_tid, Debuggable, DebuggableError};
|
use crate::gdb::{get_raw_tid, Debuggable, DebuggableError};
|
||||||
use crate::memory_manager::MemoryManager;
|
use crate::memory_manager::MemoryManager;
|
||||||
use crate::seccomp_filters::{get_seccomp_filter, Thread};
|
use crate::seccomp_filters::{get_seccomp_filter, Thread};
|
||||||
@@ -29,18 +29,18 @@ use crate::GuestMemoryMmap;
|
|||||||
use crate::CPU_MANAGER_SNAPSHOT_ID;
|
use crate::CPU_MANAGER_SNAPSHOT_ID;
|
||||||
use acpi_tables::{aml, aml::Aml, sdt::Sdt};
|
use acpi_tables::{aml, aml::Aml, sdt::Sdt};
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
use arch::aarch64::regs;
|
use arch::aarch64::regs;
|
||||||
use arch::EntryPoint;
|
use arch::EntryPoint;
|
||||||
use arch::NumaNodes;
|
use arch::NumaNodes;
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
use devices::gic::Gic;
|
use devices::gic::Gic;
|
||||||
use devices::interrupt_controller::InterruptController;
|
use devices::interrupt_controller::InterruptController;
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
use gdbstub_arch::aarch64::reg::AArch64CoreRegs as CoreRegs;
|
use gdbstub_arch::aarch64::reg::AArch64CoreRegs as CoreRegs;
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
use gdbstub_arch::x86::reg::{X86SegmentRegs, X86_64CoreRegs as CoreRegs};
|
use gdbstub_arch::x86::reg::{X86SegmentRegs, X86_64CoreRegs as CoreRegs};
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
use hypervisor::aarch64::StandardRegisters;
|
use hypervisor::aarch64::StandardRegisters;
|
||||||
#[cfg(feature = "guest_debug")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use hypervisor::arch::x86::msr_index;
|
use hypervisor::arch::x86::msr_index;
|
||||||
@@ -48,7 +48,7 @@ use hypervisor::arch::x86::msr_index;
|
|||||||
use hypervisor::arch::x86::CpuIdEntry;
|
use hypervisor::arch::x86::CpuIdEntry;
|
||||||
#[cfg(feature = "guest_debug")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use hypervisor::arch::x86::MsrEntry;
|
use hypervisor::arch::x86::MsrEntry;
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
use hypervisor::arch::x86::{SpecialRegisters, StandardRegisters};
|
use hypervisor::arch::x86::{SpecialRegisters, StandardRegisters};
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
use hypervisor::kvm::kvm_bindings;
|
use hypervisor::kvm::kvm_bindings;
|
||||||
@@ -73,7 +73,7 @@ use tracer::trace_scoped;
|
|||||||
use vm_device::BusDevice;
|
use vm_device::BusDevice;
|
||||||
#[cfg(feature = "guest_debug")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use vm_memory::ByteValued;
|
use vm_memory::ByteValued;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use vm_memory::{Bytes, GuestAddressSpace};
|
use vm_memory::{Bytes, GuestAddressSpace};
|
||||||
use vm_memory::{GuestAddress, GuestMemoryAtomic};
|
use vm_memory::{GuestAddress, GuestMemoryAtomic};
|
||||||
use vm_migration::{
|
use vm_migration::{
|
||||||
@@ -83,7 +83,7 @@ use vm_migration::{
|
|||||||
use vmm_sys_util::eventfd::EventFd;
|
use vmm_sys_util::eventfd::EventFd;
|
||||||
use vmm_sys_util::signal::{register_signal_handler, SIGRTMIN};
|
use vmm_sys_util::signal::{register_signal_handler, SIGRTMIN};
|
||||||
|
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
/// Extract the specified bits of a 64-bit integer.
|
/// Extract the specified bits of a 64-bit integer.
|
||||||
/// For example, to extrace 2 bits from offset 1 (zero based) of `6u64`,
|
/// For example, to extrace 2 bits from offset 1 (zero based) of `6u64`,
|
||||||
/// following expression should return 3 (`0b11`):
|
/// following expression should return 3 (`0b11`):
|
||||||
@@ -154,11 +154,11 @@ pub enum Error {
|
|||||||
#[error("Error initializing PMU: {0}")]
|
#[error("Error initializing PMU: {0}")]
|
||||||
InitPmu(#[source] hypervisor::HypervisorCpuError),
|
InitPmu(#[source] hypervisor::HypervisorCpuError),
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error during CPU debug: {0}")]
|
#[error("Error during CPU debug: {0}")]
|
||||||
CpuDebug(#[source] hypervisor::HypervisorCpuError),
|
CpuDebug(#[source] hypervisor::HypervisorCpuError),
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error translating virtual address: {0}")]
|
#[error("Error translating virtual address: {0}")]
|
||||||
TranslateVirtualAddress(#[source] anyhow::Error),
|
TranslateVirtualAddress(#[source] anyhow::Error),
|
||||||
|
|
||||||
@@ -448,7 +448,7 @@ pub struct CpuManager {
|
|||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
#[cfg_attr(target_arch = "aarch64", allow(dead_code))]
|
#[cfg_attr(target_arch = "aarch64", allow(dead_code))]
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt: EventFd,
|
vm_debug_evt: EventFd,
|
||||||
vcpu_states: Vec<VcpuState>,
|
vcpu_states: Vec<VcpuState>,
|
||||||
selected_cpu: u8,
|
selected_cpu: u8,
|
||||||
@@ -601,7 +601,7 @@ impl CpuManager {
|
|||||||
vm: Arc<dyn hypervisor::Vm>,
|
vm: Arc<dyn hypervisor::Vm>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
seccomp_action: SeccompAction,
|
seccomp_action: SeccompAction,
|
||||||
vm_ops: Arc<dyn VmOps>,
|
vm_ops: Arc<dyn VmOps>,
|
||||||
@@ -723,7 +723,7 @@ impl CpuManager {
|
|||||||
vcpu_states,
|
vcpu_states,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
selected_cpu: 0,
|
selected_cpu: 0,
|
||||||
vcpus: Vec::with_capacity(usize::from(config.max_vcpus)),
|
vcpus: Vec::with_capacity(usize::from(config.max_vcpus)),
|
||||||
@@ -837,7 +837,7 @@ impl CpuManager {
|
|||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let reset_evt = self.reset_evt.try_clone().unwrap();
|
let reset_evt = self.reset_evt.try_clone().unwrap();
|
||||||
let exit_evt = self.exit_evt.try_clone().unwrap();
|
let exit_evt = self.exit_evt.try_clone().unwrap();
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let vm_debug_evt = self.vm_debug_evt.try_clone().unwrap();
|
let vm_debug_evt = self.vm_debug_evt.try_clone().unwrap();
|
||||||
let panic_exit_evt = self.exit_evt.try_clone().unwrap();
|
let panic_exit_evt = self.exit_evt.try_clone().unwrap();
|
||||||
let vcpu_kill_signalled = self.vcpus_kill_signalled.clone();
|
let vcpu_kill_signalled = self.vcpus_kill_signalled.clone();
|
||||||
@@ -974,7 +974,7 @@ impl CpuManager {
|
|||||||
#[cfg(feature = "kvm")]
|
#[cfg(feature = "kvm")]
|
||||||
VmExit::Debug => {
|
VmExit::Debug => {
|
||||||
info!("VmExit::Debug");
|
info!("VmExit::Debug");
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
{
|
{
|
||||||
vcpu_pause_signalled.store(true, Ordering::SeqCst);
|
vcpu_pause_signalled.store(true, Ordering::SeqCst);
|
||||||
let raw_tid = get_raw_tid(vcpu_id as usize);
|
let raw_tid = get_raw_tid(vcpu_id as usize);
|
||||||
@@ -1457,7 +1457,7 @@ impl CpuManager {
|
|||||||
pptt
|
pptt
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
fn get_regs(&self, cpu_id: u8) -> Result<StandardRegisters> {
|
fn get_regs(&self, cpu_id: u8) -> Result<StandardRegisters> {
|
||||||
self.vcpus[usize::from(cpu_id)]
|
self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -1467,7 +1467,7 @@ impl CpuManager {
|
|||||||
.map_err(Error::CpuDebug)
|
.map_err(Error::CpuDebug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
fn set_regs(&self, cpu_id: u8, regs: &StandardRegisters) -> Result<()> {
|
fn set_regs(&self, cpu_id: u8, regs: &StandardRegisters) -> Result<()> {
|
||||||
self.vcpus[usize::from(cpu_id)]
|
self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -1477,7 +1477,7 @@ impl CpuManager {
|
|||||||
.map_err(Error::CpuDebug)
|
.map_err(Error::CpuDebug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
fn get_sregs(&self, cpu_id: u8) -> Result<SpecialRegisters> {
|
fn get_sregs(&self, cpu_id: u8) -> Result<SpecialRegisters> {
|
||||||
self.vcpus[usize::from(cpu_id)]
|
self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -1487,7 +1487,7 @@ impl CpuManager {
|
|||||||
.map_err(Error::CpuDebug)
|
.map_err(Error::CpuDebug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
fn set_sregs(&self, cpu_id: u8, sregs: &SpecialRegisters) -> Result<()> {
|
fn set_sregs(&self, cpu_id: u8, sregs: &SpecialRegisters) -> Result<()> {
|
||||||
self.vcpus[usize::from(cpu_id)]
|
self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -1497,7 +1497,7 @@ impl CpuManager {
|
|||||||
.map_err(Error::CpuDebug)
|
.map_err(Error::CpuDebug)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
fn translate_gva(&self, cpu_id: u8, gva: u64) -> Result<u64> {
|
fn translate_gva(&self, cpu_id: u8, gva: u64) -> Result<u64> {
|
||||||
let (gpa, _) = self.vcpus[usize::from(cpu_id)]
|
let (gpa, _) = self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -1524,7 +1524,7 @@ impl CpuManager {
|
|||||||
/// - FEAT_LVA
|
/// - FEAT_LVA
|
||||||
/// - FEAT_LPA2
|
/// - FEAT_LPA2
|
||||||
///
|
///
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
fn translate_gva(&self, cpu_id: u8, gva: u64) -> Result<u64> {
|
fn translate_gva(&self, cpu_id: u8, gva: u64) -> Result<u64> {
|
||||||
let tcr_el1: u64 = self.vcpus[usize::from(cpu_id)]
|
let tcr_el1: u64 = self.vcpus[usize::from(cpu_id)]
|
||||||
.lock()
|
.lock()
|
||||||
@@ -2090,7 +2090,7 @@ impl Snapshottable for CpuManager {
|
|||||||
impl Transportable for CpuManager {}
|
impl Transportable for CpuManager {}
|
||||||
impl Migratable for CpuManager {}
|
impl Migratable for CpuManager {}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
impl Debuggable for CpuManager {
|
impl Debuggable for CpuManager {
|
||||||
#[cfg(feature = "kvm")]
|
#[cfg(feature = "kvm")]
|
||||||
fn set_guest_debug(
|
fn set_guest_debug(
|
||||||
|
|||||||
+36
-36
@@ -64,7 +64,7 @@ mod coredump;
|
|||||||
pub mod cpu;
|
pub mod cpu;
|
||||||
pub mod device_manager;
|
pub mod device_manager;
|
||||||
pub mod device_tree;
|
pub mod device_tree;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
mod gdb;
|
mod gdb;
|
||||||
pub mod interrupt;
|
pub mod interrupt;
|
||||||
pub mod memory_manager;
|
pub mod memory_manager;
|
||||||
@@ -154,17 +154,17 @@ pub enum Error {
|
|||||||
#[error("Error creation API server's socket {0:?}")]
|
#[error("Error creation API server's socket {0:?}")]
|
||||||
CreateApiServerSocket(#[source] io::Error),
|
CreateApiServerSocket(#[source] io::Error),
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Failed to start the GDB thread: {0}")]
|
#[error("Failed to start the GDB thread: {0}")]
|
||||||
GdbThreadSpawn(io::Error),
|
GdbThreadSpawn(io::Error),
|
||||||
|
|
||||||
/// GDB request receive error
|
/// GDB request receive error
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error receiving GDB request: {0}")]
|
#[error("Error receiving GDB request: {0}")]
|
||||||
GdbRequestRecv(#[source] RecvError),
|
GdbRequestRecv(#[source] RecvError),
|
||||||
|
|
||||||
/// GDB response send error
|
/// GDB response send error
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error sending GDB request: {0}")]
|
#[error("Error sending GDB request: {0}")]
|
||||||
GdbResponseSend(#[source] SendError<gdb::GdbResponse>),
|
GdbResponseSend(#[source] SendError<gdb::GdbResponse>),
|
||||||
|
|
||||||
@@ -266,19 +266,19 @@ pub fn start_vmm_thread(
|
|||||||
api_event: EventFd,
|
api_event: EventFd,
|
||||||
api_sender: Sender<ApiRequest>,
|
api_sender: Sender<ApiRequest>,
|
||||||
api_receiver: Receiver<ApiRequest>,
|
api_receiver: Receiver<ApiRequest>,
|
||||||
#[cfg(feature = "gdb")] debug_path: Option<PathBuf>,
|
#[cfg(feature = "guest_debug")] debug_path: Option<PathBuf>,
|
||||||
#[cfg(feature = "gdb")] debug_event: EventFd,
|
#[cfg(feature = "guest_debug")] debug_event: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_event: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_event: EventFd,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
) -> Result<thread::JoinHandle<Result<()>>> {
|
) -> Result<thread::JoinHandle<Result<()>>> {
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb_hw_breakpoints = hypervisor.get_guest_debug_hw_bps();
|
let gdb_hw_breakpoints = hypervisor.get_guest_debug_hw_bps();
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let (gdb_sender, gdb_receiver) = std::sync::mpsc::channel();
|
let (gdb_sender, gdb_receiver) = std::sync::mpsc::channel();
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb_debug_event = debug_event.try_clone().map_err(Error::EventFdClone)?;
|
let gdb_debug_event = debug_event.try_clone().map_err(Error::EventFdClone)?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let gdb_vm_debug_event = vm_debug_event.try_clone().map_err(Error::EventFdClone)?;
|
let gdb_vm_debug_event = vm_debug_event.try_clone().map_err(Error::EventFdClone)?;
|
||||||
|
|
||||||
let http_api_event = api_event.try_clone().map_err(Error::EventFdClone)?;
|
let http_api_event = api_event.try_clone().map_err(Error::EventFdClone)?;
|
||||||
@@ -303,9 +303,9 @@ pub fn start_vmm_thread(
|
|||||||
let mut vmm = Vmm::new(
|
let mut vmm = Vmm::new(
|
||||||
vmm_version.to_string(),
|
vmm_version.to_string(),
|
||||||
api_event,
|
api_event,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_event,
|
debug_event,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_event,
|
vm_debug_event,
|
||||||
vmm_seccomp_action,
|
vmm_seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
@@ -316,7 +316,7 @@ pub fn start_vmm_thread(
|
|||||||
|
|
||||||
vmm.control_loop(
|
vmm.control_loop(
|
||||||
Arc::new(api_receiver),
|
Arc::new(api_receiver),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
Arc::new(gdb_receiver),
|
Arc::new(gdb_receiver),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@@ -344,7 +344,7 @@ pub fn start_vmm_thread(
|
|||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
if let Some(debug_path) = debug_path {
|
if let Some(debug_path) = debug_path {
|
||||||
let target = gdb::GdbStub::new(
|
let target = gdb::GdbStub::new(
|
||||||
gdb_sender,
|
gdb_sender,
|
||||||
@@ -374,9 +374,9 @@ pub struct Vmm {
|
|||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
api_evt: EventFd,
|
api_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt: EventFd,
|
debug_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt: EventFd,
|
vm_debug_evt: EventFd,
|
||||||
version: String,
|
version: String,
|
||||||
vm: Option<Vm>,
|
vm: Option<Vm>,
|
||||||
@@ -462,8 +462,8 @@ impl Vmm {
|
|||||||
fn new(
|
fn new(
|
||||||
vmm_version: String,
|
vmm_version: String,
|
||||||
api_evt: EventFd,
|
api_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] debug_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
seccomp_action: SeccompAction,
|
seccomp_action: SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
@@ -488,7 +488,7 @@ impl Vmm {
|
|||||||
.add_event(&api_evt, EpollDispatch::Api)
|
.add_event(&api_evt, EpollDispatch::Api)
|
||||||
.map_err(Error::Epoll)?;
|
.map_err(Error::Epoll)?;
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
epoll
|
epoll
|
||||||
.add_event(&debug_evt, EpollDispatch::Debug)
|
.add_event(&debug_evt, EpollDispatch::Debug)
|
||||||
.map_err(Error::Epoll)?;
|
.map_err(Error::Epoll)?;
|
||||||
@@ -498,9 +498,9 @@ impl Vmm {
|
|||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
api_evt,
|
api_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt,
|
debug_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
version: vmm_version,
|
version: vmm_version,
|
||||||
vm: None,
|
vm: None,
|
||||||
@@ -537,7 +537,7 @@ impl Vmm {
|
|||||||
if self.vm.is_none() {
|
if self.vm.is_none() {
|
||||||
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let vm_debug_evt = self
|
let vm_debug_evt = self
|
||||||
.vm_debug_evt
|
.vm_debug_evt
|
||||||
.try_clone()
|
.try_clone()
|
||||||
@@ -552,7 +552,7 @@ impl Vmm {
|
|||||||
Arc::clone(vm_config),
|
Arc::clone(vm_config),
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
self.hypervisor.clone(),
|
self.hypervisor.clone(),
|
||||||
@@ -633,7 +633,7 @@ impl Vmm {
|
|||||||
|
|
||||||
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let debug_evt = self
|
let debug_evt = self
|
||||||
.vm_debug_evt
|
.vm_debug_evt
|
||||||
.try_clone()
|
.try_clone()
|
||||||
@@ -648,7 +648,7 @@ impl Vmm {
|
|||||||
vm_config,
|
vm_config,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt,
|
debug_evt,
|
||||||
Some(source_url),
|
Some(source_url),
|
||||||
restore_cfg.prefault,
|
restore_cfg.prefault,
|
||||||
@@ -702,7 +702,7 @@ impl Vmm {
|
|||||||
|
|
||||||
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let exit_evt = self.exit_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
let reset_evt = self.reset_evt.try_clone().map_err(VmError::EventFdClone)?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let debug_evt = self
|
let debug_evt = self
|
||||||
.vm_debug_evt
|
.vm_debug_evt
|
||||||
.try_clone()
|
.try_clone()
|
||||||
@@ -724,7 +724,7 @@ impl Vmm {
|
|||||||
config,
|
config,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt,
|
debug_evt,
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
self.hypervisor.clone(),
|
self.hypervisor.clone(),
|
||||||
@@ -1146,7 +1146,7 @@ impl Vmm {
|
|||||||
let reset_evt = self.reset_evt.try_clone().map_err(|e| {
|
let reset_evt = self.reset_evt.try_clone().map_err(|e| {
|
||||||
MigratableError::MigrateReceive(anyhow!("Error cloning reset EventFd: {}", e))
|
MigratableError::MigrateReceive(anyhow!("Error cloning reset EventFd: {}", e))
|
||||||
})?;
|
})?;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let debug_evt = self.vm_debug_evt.try_clone().map_err(|e| {
|
let debug_evt = self.vm_debug_evt.try_clone().map_err(|e| {
|
||||||
MigratableError::MigrateReceive(anyhow!("Error cloning debug EventFd: {}", e))
|
MigratableError::MigrateReceive(anyhow!("Error cloning debug EventFd: {}", e))
|
||||||
})?;
|
})?;
|
||||||
@@ -1159,7 +1159,7 @@ impl Vmm {
|
|||||||
self.vm_config.clone().unwrap(),
|
self.vm_config.clone().unwrap(),
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
debug_evt,
|
debug_evt,
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
self.hypervisor.clone(),
|
self.hypervisor.clone(),
|
||||||
@@ -1642,7 +1642,7 @@ impl Vmm {
|
|||||||
fn control_loop(
|
fn control_loop(
|
||||||
&mut self,
|
&mut self,
|
||||||
api_receiver: Arc<Receiver<ApiRequest>>,
|
api_receiver: Arc<Receiver<ApiRequest>>,
|
||||||
#[cfg(feature = "gdb")] gdb_receiver: Arc<Receiver<gdb::GdbRequest>>,
|
#[cfg(feature = "guest_debug")] gdb_receiver: Arc<Receiver<gdb::GdbRequest>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
const EPOLL_EVENTS_LEN: usize = 100;
|
const EPOLL_EVENTS_LEN: usize = 100;
|
||||||
|
|
||||||
@@ -1929,7 +1929,7 @@ impl Vmm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
EpollDispatch::Debug => {
|
EpollDispatch::Debug => {
|
||||||
// Consume the events.
|
// Consume the events.
|
||||||
for _ in 0..self.debug_evt.read().map_err(Error::EventFdRead)? {
|
for _ in 0..self.debug_evt.read().map_err(Error::EventFdRead)? {
|
||||||
@@ -1949,7 +1949,7 @@ impl Vmm {
|
|||||||
.map_err(Error::GdbResponseSend)?;
|
.map_err(Error::GdbResponseSend)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "gdb"))]
|
#[cfg(not(feature = "guest_debug"))]
|
||||||
EpollDispatch::Debug => {}
|
EpollDispatch::Debug => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1985,9 +1985,9 @@ mod unit_tests {
|
|||||||
Vmm::new(
|
Vmm::new(
|
||||||
"dummy".to_string(),
|
"dummy".to_string(),
|
||||||
EventFd::new(EFD_NONBLOCK).unwrap(),
|
EventFd::new(EFD_NONBLOCK).unwrap(),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
EventFd::new(EFD_NONBLOCK).unwrap(),
|
EventFd::new(EFD_NONBLOCK).unwrap(),
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
EventFd::new(EFD_NONBLOCK).unwrap(),
|
EventFd::new(EFD_NONBLOCK).unwrap(),
|
||||||
SeccompAction::Allow,
|
SeccompAction::Allow,
|
||||||
hypervisor::new().unwrap(),
|
hypervisor::new().unwrap(),
|
||||||
@@ -2056,7 +2056,7 @@ mod unit_tests {
|
|||||||
sgx_epc: None,
|
sgx_epc: None,
|
||||||
numa: None,
|
numa: None,
|
||||||
watchdog: false,
|
watchdog: false,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
gdb: false,
|
gdb: false,
|
||||||
platform: None,
|
platform: None,
|
||||||
}))
|
}))
|
||||||
|
|||||||
+16
-16
@@ -23,7 +23,7 @@ use crate::coredump::{
|
|||||||
use crate::cpu;
|
use crate::cpu;
|
||||||
use crate::device_manager::{Console, DeviceManager, DeviceManagerError, PtyPair};
|
use crate::device_manager::{Console, DeviceManager, DeviceManagerError, PtyPair};
|
||||||
use crate::device_tree::DeviceTree;
|
use crate::device_tree::DeviceTree;
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
use crate::gdb::{Debuggable, DebuggableError, GdbRequestPayload, GdbResponsePayload};
|
use crate::gdb::{Debuggable, DebuggableError, GdbRequestPayload, GdbResponsePayload};
|
||||||
use crate::memory_manager::{
|
use crate::memory_manager::{
|
||||||
Error as MemoryManagerError, MemoryManager, MemoryManagerSnapshotData,
|
Error as MemoryManagerError, MemoryManager, MemoryManagerSnapshotData,
|
||||||
@@ -51,9 +51,9 @@ use devices::gic::{Gic, GIC_V3_ITS_SNAPSHOT_ID};
|
|||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
use devices::interrupt_controller::{self, InterruptController};
|
use devices::interrupt_controller::{self, InterruptController};
|
||||||
use devices::AcpiNotificationFlags;
|
use devices::AcpiNotificationFlags;
|
||||||
#[cfg(all(target_arch = "aarch64", feature = "gdb"))]
|
#[cfg(all(target_arch = "aarch64", feature = "guest_debug"))]
|
||||||
use gdbstub_arch::aarch64::reg::AArch64CoreRegs as CoreRegs;
|
use gdbstub_arch::aarch64::reg::AArch64CoreRegs as CoreRegs;
|
||||||
#[cfg(all(target_arch = "x86_64", feature = "gdb"))]
|
#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
|
||||||
use gdbstub_arch::x86::reg::X86_64CoreRegs as CoreRegs;
|
use gdbstub_arch::x86::reg::X86_64CoreRegs as CoreRegs;
|
||||||
use hypervisor::{HypervisorVmError, VmOps};
|
use hypervisor::{HypervisorVmError, VmOps};
|
||||||
use linux_loader::cmdline::Cmdline;
|
use linux_loader::cmdline::Cmdline;
|
||||||
@@ -294,7 +294,7 @@ pub enum Error {
|
|||||||
#[error("Invalid TDX payload type")]
|
#[error("Invalid TDX payload type")]
|
||||||
InvalidPayloadType,
|
InvalidPayloadType,
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
#[error("Error debugging VM: {0:?}")]
|
#[error("Error debugging VM: {0:?}")]
|
||||||
Debug(DebuggableError),
|
Debug(DebuggableError),
|
||||||
|
|
||||||
@@ -494,7 +494,7 @@ impl Vm {
|
|||||||
vm: Arc<dyn hypervisor::Vm>,
|
vm: Arc<dyn hypervisor::Vm>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
activate_evt: EventFd,
|
activate_evt: EventFd,
|
||||||
@@ -528,9 +528,9 @@ impl Vm {
|
|||||||
#[cfg(not(feature = "tdx"))]
|
#[cfg(not(feature = "tdx"))]
|
||||||
let force_iommu = false;
|
let force_iommu = false;
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
let stop_on_boot = config.lock().unwrap().gdb;
|
let stop_on_boot = config.lock().unwrap().gdb;
|
||||||
#[cfg(not(feature = "gdb"))]
|
#[cfg(not(feature = "guest_debug"))]
|
||||||
let stop_on_boot = false;
|
let stop_on_boot = false;
|
||||||
|
|
||||||
let device_manager = DeviceManager::new(
|
let device_manager = DeviceManager::new(
|
||||||
@@ -576,7 +576,7 @@ impl Vm {
|
|||||||
vm.clone(),
|
vm.clone(),
|
||||||
exit_evt_clone,
|
exit_evt_clone,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
hypervisor.clone(),
|
hypervisor.clone(),
|
||||||
seccomp_action.clone(),
|
seccomp_action.clone(),
|
||||||
@@ -719,7 +719,7 @@ impl Vm {
|
|||||||
config: Arc<Mutex<VmConfig>>,
|
config: Arc<Mutex<VmConfig>>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
activate_evt: EventFd,
|
activate_evt: EventFd,
|
||||||
@@ -778,7 +778,7 @@ impl Vm {
|
|||||||
vm,
|
vm,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
@@ -804,7 +804,7 @@ impl Vm {
|
|||||||
vm_config: Arc<Mutex<VmConfig>>,
|
vm_config: Arc<Mutex<VmConfig>>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
source_url: Option<&str>,
|
source_url: Option<&str>,
|
||||||
prefault: bool,
|
prefault: bool,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
@@ -849,7 +849,7 @@ impl Vm {
|
|||||||
vm,
|
vm,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
@@ -864,7 +864,7 @@ impl Vm {
|
|||||||
config: Arc<Mutex<VmConfig>>,
|
config: Arc<Mutex<VmConfig>>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
#[cfg(feature = "gdb")] vm_debug_evt: EventFd,
|
#[cfg(feature = "guest_debug")] vm_debug_evt: EventFd,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
activate_evt: EventFd,
|
activate_evt: EventFd,
|
||||||
@@ -906,7 +906,7 @@ impl Vm {
|
|||||||
vm,
|
vm,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
vm_debug_evt,
|
vm_debug_evt,
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
@@ -2574,7 +2574,7 @@ impl Vm {
|
|||||||
self.memory_manager.lock().unwrap().snapshot_data()
|
self.memory_manager.lock().unwrap().snapshot_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
pub fn debug_request(
|
pub fn debug_request(
|
||||||
&mut self,
|
&mut self,
|
||||||
gdb_request: &GdbRequestPayload,
|
gdb_request: &GdbRequestPayload,
|
||||||
@@ -2991,7 +2991,7 @@ impl Migratable for Vm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gdb")]
|
#[cfg(feature = "guest_debug")]
|
||||||
impl Debuggable for Vm {
|
impl Debuggable for Vm {
|
||||||
fn set_guest_debug(
|
fn set_guest_debug(
|
||||||
&self,
|
&self,
|
||||||
|
|||||||
Reference in New Issue
Block a user