KVM: arm/arm64: Cleanup MMIO handling
Subsystems (3)
Marc Zyngier
maintainerPATCH 1/1 KVM: arm/arm64: Cleanup MMIO handling
Our MMIO handling is a bit odd, in the sense that it uses an intermediate per-vcpu structure to store the various decoded information that describe the access.
But the same information is readily available in the HSR/ESR_EL2 field, and we actually use this field to populate the structure.
Let's simplify the whole thing by getting rid of the superfluous structure and save a (tiny) bit of space in the vcpu structure.
--- arch/arm/include/asm/kvm_emulate.h | 5 +- arch/arm/include/asm/kvm_host.h | 9 +++- arch/arm/include/asm/kvm_mmio.h | 28 ----------- arch/arm64/include/asm/kvm_emulate.h | 3 +- arch/arm64/include/asm/kvm_host.h | 12 +++-- arch/arm64/include/asm/kvm_mmio.h | 27 ----------- virt/kvm/arm/mmio.c | 70 +++++++++------------------- virt/kvm/arm/mmu.c | 1 - 8 files changed, 41 insertions(+), 114 deletions(-) delete mode 100644 arch/arm/include/asm/kvm_mmio.h delete mode 100644 arch/arm64/include/asm/kvm_mmio.h
arch/arm/include/asm/kvm_emulate.h +2 -3
@@ -9,7 +9,6 @@#include <linux/kvm_host.h> #include <asm/kvm_asm.h> -#include <asm/kvm_mmio.h> #include <asm/kvm_arm.h> #include <asm/cputype.h>
@@ -220,7 +219,7 @@ static inline bool kvm_vcpu_dabt_is_cm(struct kvm_vcpu *vcpu) }/* Get Access Size from a data abort */ -static inline int kvm_vcpu_dabt_get_as (struct kvm_vcpu *vcpu) +static inline unsigned int kvm_vcpu_dabt_get_as (struct kvm_vcpu *vcpu) {switch ((kvm_vcpu_get_hsr (vcpu) >>22 ) &0x3 ) {case 0 :
@@ -231,7 +230,7 @@ static inline int kvm_vcpu_dabt_get_as(struct kvm_vcpu *vcpu)return 4 ;default :kvm_err ("Hardware is weird: SAS 0b11 is reserved\n" ); -return -EFAULT ; +return 4 ; } }
arch/arm/include/asm/kvm_host.h +8 -1
@@ -14,7 +14,6 @@#include <asm/cputype.h> #include <asm/kvm.h> #include <asm/kvm_asm.h> -#include <asm/kvm_mmio.h> #include <asm/fpstate.h> #include <kvm/arm_arch_timer.h>
@@ -300,6 +299,14 @@ int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,static inline void handle_exit_early (struct kvm_vcpu *vcpu,struct kvm_run *run,int exception_index) {} +/* MMIO helpers */ +void kvm_mmio_write_buf (void *buf,unsigned int len,unsigned long data); +unsigned long kvm_mmio_read_buf (const void *buf,unsigned int len); + +int kvm_handle_mmio_return (struct kvm_vcpu *vcpu,struct kvm_run *run); +int io_mem_abort (struct kvm_vcpu *vcpu,struct kvm_run *run, +phys_addr_t fault_ipa); +static inline void __cpu_init_hyp_mode (phys_addr_t pgd_ptr,unsigned long hyp_stack_ptr,unsigned long vector_ptr)
arch/arm/include/asm/kvm_mmio.h deleted +0 -28
@@ -1,28 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -* Copyright (C) 2012 - Virtual Open Systems and Columbia University -* Author: Christoffer Dall <[email protected]> -*/ - -#ifndef __ARM_KVM_MMIO_H__ -#define __ARM_KVM_MMIO_H__ - -#include <linux/kvm_host.h> -#include <asm/kvm_asm.h> -#include <asm/kvm_arm.h> - -struct kvm_decode { -unsigned long rt; -bool sign_extend; -/* Not used on 32-bit arm */ -bool sixty_four; -}; - -void kvm_mmio_write_buf (void *buf,unsigned int len,unsigned long data); -unsigned long kvm_mmio_read_buf (const void *buf,unsigned int len); - -int kvm_handle_mmio_return (struct kvm_vcpu *vcpu,struct kvm_run *run); -int io_mem_abort (struct kvm_vcpu *vcpu,struct kvm_run *run, -phys_addr_t fault_ipa); - -#endif /* __ARM_KVM_MMIO_H__ */
arch/arm64/include/asm/kvm_emulate.h +1 -2
@@ -17,7 +17,6 @@#include <asm/esr.h> #include <asm/kvm_arm.h> #include <asm/kvm_hyp.h> -#include <asm/kvm_mmio.h> #include <asm/ptrace.h> #include <asm/cputype.h> #include <asm/virt.h>
@@ -341,7 +340,7 @@ static inline bool kvm_vcpu_dabt_is_cm(const struct kvm_vcpu *vcpu)return !!(kvm_vcpu_get_hsr (vcpu) & ESR_ELx_CM); } -static inline int kvm_vcpu_dabt_get_as (const struct kvm_vcpu *vcpu) +static inline unsigned int kvm_vcpu_dabt_get_as (const struct kvm_vcpu *vcpu) {return 1 << ((kvm_vcpu_get_hsr (vcpu) & ESR_ELx_SAS) >> ESR_ELx_SAS_SHIFT); }
arch/arm64/include/asm/kvm_host.h +8 -4
@@ -24,7 +24,6 @@#include <asm/fpsimd.h> #include <asm/kvm.h> #include <asm/kvm_asm.h> -#include <asm/kvm_mmio.h> #include <asm/thread_info.h> #define __KVM_HAVE_ARCH_INTC_INITIALIZED
@@ -325,9 +324,6 @@ struct kvm_vcpu_arch {/* Don't run the guest (internal implementation need) */ bool pause; -/* IO related fields */ -struct kvm_decode mmio_decode; -/* Cache some mmu pages needed inside spinlock regions */ struct kvm_mmu_memory_cache mmu_page_cache;
@@ -491,6 +487,14 @@ int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,void handle_exit_early (struct kvm_vcpu *vcpu,struct kvm_run *run,int exception_index); +/* MMIO helpers */ +void kvm_mmio_write_buf (void *buf,unsigned int len,unsigned long data); +unsigned long kvm_mmio_read_buf (const void *buf,unsigned int len); + +int kvm_handle_mmio_return (struct kvm_vcpu *vcpu,struct kvm_run *run); +int io_mem_abort (struct kvm_vcpu *vcpu,struct kvm_run *run, +phys_addr_t fault_ipa); +int kvm_perf_init (void );int kvm_perf_teardown (void );
arch/arm64/include/asm/kvm_mmio.h deleted +0 -27
@@ -1,27 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -* Copyright (C) 2012 - Virtual Open Systems and Columbia University -* Author: Christoffer Dall <[email protected]> -*/ - -#ifndef __ARM64_KVM_MMIO_H__ -#define __ARM64_KVM_MMIO_H__ - -#include <linux/kvm_host.h> -#include <asm/kvm_arm.h> - -struct kvm_decode { -unsigned long rt; -bool sign_extend; -/* Witdth of the register accessed by the faulting instruction is 64-bits */ -bool sixty_four; -}; - -void kvm_mmio_write_buf (void *buf,unsigned int len,unsigned long data); -unsigned long kvm_mmio_read_buf (const void *buf,unsigned int len); - -int kvm_handle_mmio_return (struct kvm_vcpu *vcpu,struct kvm_run *run); -int io_mem_abort (struct kvm_vcpu *vcpu,struct kvm_run *run, -phys_addr_t fault_ipa); - -#endif /* __ARM64_KVM_MMIO_H__ */
virt/kvm/arm/mmio.c +22 -48
113 lines not on this page · raw message
virt/kvm/arm/mmu.c +0 -1
@@ -14,7 +14,6 @@#include <asm/cacheflush.h> #include <asm/kvm_arm.h> #include <asm/kvm_mmu.h> -#include <asm/kvm_mmio.h> #include <asm/kvm_ras.h> #include <asm/kvm_asm.h> #include <asm/kvm_emulate.h>
Signature · 6 lines
2.20.1 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
PATCH 1/1 KVM: arm: Fix build after MMIO cleanup
Looks like the mmio_decode field was accidentally left in on 32-bit:
In file included from /build/include/linux/kvm_host.h:36,
from /build/arch/arm/kernel/asm-offsets.c:15:arch/arm/include/asm/kvm_host.h:205:20: error: field 'mmio_decode' has incomplete type
--- arch/arm/include/asm/kvm_host.h | 3 --- 1 file changed, 3 deletions(-)
arch/arm/include/asm/kvm_host.h +0 -3
@@ -201,9 +201,6 @@ struct kvm_vcpu_arch {/* Don't run the guest (internal implementation need) */ bool pause; -/* IO related fields */ -struct kvm_decode mmio_decode; -/* Cache some mmu pages needed inside spinlock regions */ struct kvm_mmu_memory_cache mmu_page_cache;
Signature · 6 lines
2.20.1 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerRe: [PATCH] KVM: arm: Fix build after MMIO cleanup
Quoted 19 lines · Olof Johansson
Looks like the
mmio_decodefield was accidentally left in on 32-bit:In file included from /build/include/linux/kvm_host.h:36,
from /build/arch/arm/kernel/asm-offsets.c:15:arch/arm/include/asm/kvm_host.h:205:20: error: field 'mmio_decode' has incomplete typeFixes 480bfa6478c8 ("KVM: arm/arm64: Cleanup MMIO handling")Cc Marc Zyngier <[email protected]>Signed-off-by Olof Johansson <[email protected]>--- arch/arm/include/asm/kvm_host.h | 3 --- 1 file changed, 3 deletions(-)arch/arm/include/asm/kvm_host.h +0
-0
arch/arm/include/asm/kvm_host.h struct kvm_vcpu_arch { · line 205
Quoted 8 lines
arch/arm/include/asm/kvm_host.h +0
-3@@ -201,9 +201,6 @@ struct kvm_vcpu_arch {/* Don't run the guest (internal implementation need) */ bool pause; -/* IO related fields */ -struct kvm_decode mmio_decode; -/* Cache some mmu pages needed inside spinlock regions */ struct kvm_mmu_memory_cache mmu_page_cache;
Ouch. Thanks for that. I've squashed the fix in the original patch (which I didn't really intend to be in -next just yet - not quite sure what I did here).
M.
Signature · 5 lines
Jazz is not dead. It just smells funny... _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm