Stop secondary VMs from accessing GIC system registers.
Bug: 132960440
Change-Id: I2505afe9e885406a5b91811ff1a3451fa3a34393
diff --git a/src/arch/aarch64/hypervisor/exceptions.S b/src/arch/aarch64/hypervisor/exceptions.S
index ea17ffa..9acd240 100644
--- a/src/arch/aarch64/hypervisor/exceptions.S
+++ b/src/arch/aarch64/hypervisor/exceptions.S
@@ -312,6 +312,15 @@
mrs x28, vttbr_el2
str x28, [x1, #VCPU_LAZY + 16 * 14]
+ /* Save GIC registers. */
+#if GIC_VERSION == 3 || GIC_VERSION == 4
+ /* Offset is too large, so start from a new base. */
+ add x2, x1, #VCPU_GIC
+
+ mrs x3, ich_hcr_el2
+ str x3, [x2, #16 * 0]
+#endif
+
/*
* Save floating point registers.
*
@@ -382,7 +391,7 @@
ldp q24, q25, [x2, #32 * 12]
ldp q26, q27, [x2, #32 * 13]
ldp q28, q29, [x2, #32 * 14]
- /* Offest becomes too large, so move the base. */
+ /* Offset becomes too large, so move the base. */
ldp q30, q31, [x2, #32 * 15]!
ldp x3, x4, [x2, #32 * 1]
msr fpsr, x3
@@ -458,6 +467,15 @@
ldr x28, [x0, #VCPU_LAZY + 16 * 14]
msr vttbr_el2, x28
+ /* Restore GIC registers. */
+#if GIC_VERSION == 3 || GIC_VERSION == 4
+ /* Offset is too large, so start from a new base. */
+ add x2, x0, #VCPU_GIC
+
+ ldr x3, [x2, #16 * 0]
+ msr ich_hcr_el2, x3
+#endif
+
/* Restore non-volatile registers. */
ldp x19, x20, [x0, #VCPU_REGS + 8 * 19]
ldp x21, x22, [x0, #VCPU_REGS + 8 * 21]