Hi,
While looking at the KVM code, I realised that our exception injection handling isn't quite right, as it generates the target PSTATE/CPSR from scratch, and doesn't handle all bits which need to be (conditionally) cleared or set upon taking an exception.
The first two patches address this for injecting exceptions into AArch64 and AArch32 contexts respectively. I've tried to organise the code so that it can easily be audited against the ARM ARM, and/or extended in future if/when new bits are added to the SPSRs.
While writing the AArch32 portion I also realised that on an AArch64 host we don't correctly synthesize the SPSR_{abt,und} seen by the guest, as we copy the value of SPSR_EL2, and the layouts of those SPSRs differ. The third patch addresses this by explicitly moving bits into the SPSR_{abt,und} layout.
I'd appreciate any testing people could offer, especially for AArch32 guests and/or AArch32 hosts, which I'm currently ill equipped to test. Ideally we'd have some unit tests for this.
These issues don't seem to upset contemporary guests, but they do mean that KVM isn't providing an architecturally compliant environment in all cases, which is liable to cause issues in future. Given that, and that the patches are fairly self-contained, I've marked all three patches for stable.
All three patches can be found on my kvm/exception-state branch [1].
Since v1 [2]: * Fix host_spsr_to_spsr32() bit preservation * Fix SPAN polarity; tested with a modified arm64 guest * Fix DIT preservation on 32-bit hosts * Add Alex's Reviewed-by to patch 3
Thanks, Mark.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=kvm/ex...
Mark Rutland (3): KVM: arm64: correct PSTATE on exception entry KVM: arm/arm64: correct CPSR on exception entry KVM: arm/arm64: correct AArch32 SPSR on exception entry
arch/arm/include/asm/kvm_emulate.h | 17 +++++ arch/arm64/include/asm/kvm_emulate.h | 32 ++++++++++ arch/arm64/include/asm/ptrace.h | 1 + arch/arm64/include/uapi/asm/ptrace.h | 1 + arch/arm64/kvm/inject_fault.c | 70 +++++++++++++++++++-- virt/kvm/arm/aarch32.c | 117 +++++++++++++++++++++++++++++++---- 6 files changed, 220 insertions(+), 18 deletions(-)