diff options
author | Mark Rutland <mark.rutland@arm.com> | 2015-11-16 08:58:29 -0500 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2015-11-24 12:20:58 -0500 |
commit | fbb4574ce9a37e15a9872860bf202f2be5bdf6c4 (patch) | |
tree | a5f5dd9d9e55a6fb3c4ba74ebca1d0dfb22303a7 /arch/arm64/kvm | |
parent | 1d7a4e313abbc7200982e5a68121483a3aa32295 (diff) |
arm64: kvm: report original PAR_EL1 upon panic
If we call __kvm_hyp_panic while a guest context is active, we call
__restore_sysregs before acquiring the system register values for the
panic, in the process throwing away the PAR_EL1 value at the point of
the panic.
This patch modifies __kvm_hyp_panic to stash the PAR_EL1 value prior to
restoring host register values, enabling us to report the original
values at the point of the panic.
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
Diffstat (limited to 'arch/arm64/kvm')
-rw-r--r-- | arch/arm64/kvm/hyp.S | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index ce70817a9223..86c289832272 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
@@ -864,6 +864,10 @@ ENTRY(__kvm_flush_vm_context) | |||
864 | ENDPROC(__kvm_flush_vm_context) | 864 | ENDPROC(__kvm_flush_vm_context) |
865 | 865 | ||
866 | __kvm_hyp_panic: | 866 | __kvm_hyp_panic: |
867 | // Stash PAR_EL1 before corrupting it in __restore_sysregs | ||
868 | mrs x0, par_el1 | ||
869 | push x0, xzr | ||
870 | |||
867 | // Guess the context by looking at VTTBR: | 871 | // Guess the context by looking at VTTBR: |
868 | // If zero, then we're already a host. | 872 | // If zero, then we're already a host. |
869 | // Otherwise restore a minimal host context before panicing. | 873 | // Otherwise restore a minimal host context before panicing. |
@@ -898,7 +902,7 @@ __kvm_hyp_panic: | |||
898 | mrs x3, esr_el2 | 902 | mrs x3, esr_el2 |
899 | mrs x4, far_el2 | 903 | mrs x4, far_el2 |
900 | mrs x5, hpfar_el2 | 904 | mrs x5, hpfar_el2 |
901 | mrs x6, par_el1 | 905 | pop x6, xzr // active context PAR_EL1 |
902 | mrs x7, tpidr_el2 | 906 | mrs x7, tpidr_el2 |
903 | 907 | ||
904 | mov lr, #(PSR_F_BIT | PSR_I_BIT | PSR_A_BIT | PSR_D_BIT |\ | 908 | mov lr, #(PSR_F_BIT | PSR_I_BIT | PSR_A_BIT | PSR_D_BIT |\ |