]> git.ipfire.org Git - people/ms/linux.git/commitdiff
KVM: arm64: Handle host stage-2 faults from 32-bit EL0
authorWill Deacon <will@kernel.org>
Wed, 27 Apr 2022 17:13:32 +0000 (18:13 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 27 Apr 2022 20:54:30 +0000 (21:54 +0100)
When pKVM is enabled, host memory accesses are translated by an identity
mapping at stage-2, which is populated lazily in response to synchronous
exceptions from 64-bit EL1 and EL0.

Extend this handling to cover exceptions originating from 32-bit EL0 as
well. Although these are very unlikely to occur in practice, as the
kernel typically ensures that user pages are initialised before mapping
them in, drivers could still map previously untouched device pages into
userspace and expect things to work rather than panic the system.

Cc: Quentin Perret <qperret@google.com>
Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220427171332.13635-1-will@kernel.org
arch/arm64/kvm/hyp/nvhe/host.S

index 3d613e721a75d00b8e253574e632277b01c3d4b8..727c979b2b69b4607677067e5703ea7ce7f14401 100644 (file)
@@ -198,15 +198,15 @@ SYM_CODE_START(__kvm_hyp_host_vector)
        invalid_host_el2_vect                   // FIQ EL2h
        invalid_host_el2_vect                   // Error EL2h
 
-       host_el1_sync_vect                      // Synchronous 64-bit EL1
-       invalid_host_el1_vect                   // IRQ 64-bit EL1
-       invalid_host_el1_vect                   // FIQ 64-bit EL1
-       invalid_host_el1_vect                   // Error 64-bit EL1
-
-       invalid_host_el1_vect                   // Synchronous 32-bit EL1
-       invalid_host_el1_vect                   // IRQ 32-bit EL1
-       invalid_host_el1_vect                   // FIQ 32-bit EL1
-       invalid_host_el1_vect                   // Error 32-bit EL1
+       host_el1_sync_vect                      // Synchronous 64-bit EL1/EL0
+       invalid_host_el1_vect                   // IRQ 64-bit EL1/EL0
+       invalid_host_el1_vect                   // FIQ 64-bit EL1/EL0
+       invalid_host_el1_vect                   // Error 64-bit EL1/EL0
+
+       host_el1_sync_vect                      // Synchronous 32-bit EL1/EL0
+       invalid_host_el1_vect                   // IRQ 32-bit EL1/EL0
+       invalid_host_el1_vect                   // FIQ 32-bit EL1/EL0
+       invalid_host_el1_vect                   // Error 32-bit EL1/EL0
 SYM_CODE_END(__kvm_hyp_host_vector)
 
 /*