| From foo@baz Wed Nov 21 19:20:53 CET 2018 |
| From: David Long <dave.long@linaro.org> |
| Date: Wed, 7 Nov 2018 11:43:52 -0500 |
| Subject: ARM: KVM: Add SMCCC_ARCH_WORKAROUND_1 fast handling |
| To: stable@vger.kernel.org, Russell King - ARM Linux <linux@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Tony Lindgren <tony@atomide.com>, Marc Zyngier <marc.zyngier@arm.com>, Mark Rutland <mark.rutland@arm.com> |
| Cc: Greg KH <gregkh@linuxfoundation.org>, Mark Brown <broonie@kernel.org> |
| Message-ID: <20181107164402.9380-15-dave.long@linaro.org> |
| |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| |
| Commit b800acfc70d9fb81fbd6df70f2cf5e20f70023d0 upstream. |
| |
| We want SMCCC_ARCH_WORKAROUND_1 to be fast. As fast as possible. |
| So let's intercept it as early as we can by testing for the |
| function call number as soon as we've identified a HVC call |
| coming from the guest. |
| |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Boot-tested-by: Tony Lindgren <tony@atomide.com> |
| Reviewed-by: Tony Lindgren <tony@atomide.com> |
| Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: David A. Long <dave.long@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/kvm/hyp/hyp-entry.S | 17 ++++++++++++++++- |
| 1 file changed, 16 insertions(+), 1 deletion(-) |
| |
| --- a/arch/arm/kvm/hyp/hyp-entry.S |
| +++ b/arch/arm/kvm/hyp/hyp-entry.S |
| @@ -16,6 +16,7 @@ |
| * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| */ |
| |
| +#include <linux/arm-smccc.h> |
| #include <linux/linkage.h> |
| #include <asm/kvm_arm.h> |
| #include <asm/kvm_asm.h> |
| @@ -202,7 +203,7 @@ hyp_hvc: |
| lsr r2, r2, #16 |
| and r2, r2, #0xff |
| cmp r2, #0 |
| - bne guest_trap @ Guest called HVC |
| + bne guest_hvc_trap @ Guest called HVC |
| |
| /* |
| * Getting here means host called HVC, we shift parameters and branch |
| @@ -235,6 +236,20 @@ THUMB( orr lr, #1) |
| pop {r2, lr} |
| 1: eret |
| |
| +guest_hvc_trap: |
| + movw r2, #:lower16:ARM_SMCCC_ARCH_WORKAROUND_1 |
| + movt r2, #:upper16:ARM_SMCCC_ARCH_WORKAROUND_1 |
| + ldr r0, [sp] @ Guest's r0 |
| + teq r0, r2 |
| + bne guest_trap |
| + add sp, sp, #12 |
| + @ Returns: |
| + @ r0 = 0 |
| + @ r1 = HSR value (perfectly predictable) |
| + @ r2 = ARM_SMCCC_ARCH_WORKAROUND_1 |
| + mov r0, #0 |
| + eret |
| + |
| guest_trap: |
| load_vcpu r0 @ Load VCPU pointer to r0 |
| |