@@ -102,6 +102,15 @@ Extension to the GICv3 interrupt controller to support MSI.
Status: Experimental
+### ARM/Partial Emulation
+
+Enable partial emulation of registers, otherwise considered unimplemented,
+that would normally trigger a fault injection.
+
+ Status: Supported, with caveats
+
+Only the following system registers are security supported:
+
### ARM Scalable Vector Extension (SVE/SVE2)
Arm64 domains can use Scalable Vector Extension (SVE/SVE2).
@@ -1942,6 +1942,17 @@ This option is ignored in **pv-shim** mode.
> Default: `on`
+### partial-emulation (arm)
+> `= <boolean>`
+
+> Default: `false`
+
+Flag to enable or disable partial emulation of system/coprocessor registers.
+Only effective if CONFIG_PARTIAL_EMULATION is enabled.
+
+**WARNING: Enabling this option might result in unwanted/non-spec compliant
+behavior.**
+
### pci
= List of [ serr=<bool>, perr=<bool> ]
@@ -234,6 +234,15 @@ config STATIC_EVTCHN
This option enables establishing static event channel communication
between domains on a dom0less system (domU-domU as well as domU-dom0).
+config PARTIAL_EMULATION
+ bool "Enable partial emulation of system/coprocessor registers"
+ default y
+ help
+ This option enables partial emulation of registers to prevent possible
+ guests crashing when accessing registers which are not optional but have
+ not been emulated to their complete functionality. Enabling this might
+ result in unwanted/non-spec compliant behavior.
+
endmenu
menu "ARM errata workaround via the alternative framework"
@@ -10,6 +10,12 @@
# include <asm/arm64/traps.h>
#endif
+#ifdef CONFIG_PARTIAL_EMULATION
+extern bool partial_emulation;
+#else
+#define partial_emulation false
+#endif
+
/*
* GUEST_BUG_ON is intended for checking that the guest state has not been
* corrupted in hardware and/or that the hardware behaves as we
@@ -42,6 +42,15 @@
#include <asm/vgic.h>
#include <asm/vtimer.h>
+/*
+ * partial_emulation: If true, partial emulation for system/coprocessor
+ * registers will be enabled.
+ */
+#ifdef CONFIG_PARTIAL_EMULATION
+bool __ro_after_init partial_emulation = false;
+boolean_param("partial-emulation", partial_emulation);
+#endif
+
/* The base of the stack must always be double-word aligned, which means
* that both the kernel half of struct cpu_user_regs (which is pushed in
* entry.S) and struct cpu_info (which lives at the bottom of a Xen