@@ -822,6 +822,7 @@ Specify the bit width of the DMA heap.
### dom0
= List of [ pv | pvh, shadow=<bool>, verbose=<bool>,
+ crashconsole=<bool>,
cpuid-faulting=<bool>, msr-relaxed=<bool> ] (x86)
= List of [ sve=<integer> ] (Arm64)
@@ -855,6 +856,10 @@ Controls for how dom0 is constructed on x86 systems.
information during the dom0 build. It defaults to the compile time choice
of `CONFIG_VERBOSE_DEBUG`.
+* The `crashconsole` boolean instructs Xen to switch input console focus to
+ the hypervisor when dom0 shuts down and avoid performing dom0 domain
+ destruction. Should only be used for debugging purposes.
+
* The `cpuid-faulting` boolean is an interim option, is only applicable to
PV dom0, and defaults to true.
@@ -1491,6 +1496,15 @@ Specify whether guests are to be given access to physical port 80
(often used for debugging purposes), to override the DMI based
detection of systems known to misbehave upon accesses to that port.
+### hwdom_crashconsole
+> `= <boolean>`
+
+> Default: `false`
+
+The `hwdom_crashconsole` boolean instructs Xen to switch input console focus to
+the hypervisor when dom0 shuts down and avoid performing dom0 domain
+destruction. Should only be used for debugging purposes.
+
### idle_latency_factor (x86)
> `= <integer>`
@@ -286,6 +286,8 @@ int __init parse_arch_dom0_param(const char *s, const char *e)
opt_dom0_cpuid_faulting = val;
else if ( (val = parse_boolean("msr-relaxed", s, e)) >= 0 )
opt_dom0_msr_relaxed = val;
+ else if ( (val = parse_boolean("crashconsole", s, e)) >= 0 )
+ opt_hwdom_crashconsole = !!val;
else
return -EINVAL;
@@ -59,6 +59,13 @@ unsigned int xen_processor_pmbits = XEN_PROCESSOR_PM_PX;
bool opt_dom0_vcpus_pin;
boolean_param("dom0_vcpus_pin", opt_dom0_vcpus_pin);
+/*
+ * Hardware domain crash handler: if true, do not halt machine, but switch to
+ * Xen console for debugging.
+ */
+bool __ro_after_init opt_hwdom_crashconsole;
+boolean_param("hwdom_crashconsole", opt_hwdom_crashconsole);
+
/* Protect updates/reads (resp.) of domain_list and domain_hash. */
DEFINE_SPINLOCK(domlist_update_lock);
DEFINE_RCU_READ_LOCK(domlist_read_lock);
@@ -1162,7 +1169,12 @@ int domain_shutdown(struct domain *d, u8 reason)
reason = d->shutdown_code;
if ( is_hardware_domain(d) )
- hwdom_shutdown(reason);
+ {
+ if ( opt_hwdom_crashconsole )
+ console_set_owner(DOMID_XEN);
+ else
+ hwdom_shutdown(reason);
+ }
if ( d->is_shutting_down )
{
@@ -154,6 +154,7 @@ extern unsigned int xen_processor_pmbits;
extern bool opt_dom0_vcpus_pin;
extern cpumask_t dom0_cpus;
extern bool dom0_affinity_relaxed;
+extern bool opt_hwdom_crashconsole;
/* vnuma topology per domain. */
struct vnuma_info {