From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752470AbbEFQXu (ORCPT ); Wed, 6 May 2015 12:23:50 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:35253 "EHLO socrates.bennee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751591AbbEFQXo (ORCPT ); Wed, 6 May 2015 12:23:44 -0400 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com, peter.maydell@linaro.org, agraf@suse.de, drjones@redhat.com, pbonzini@redhat.com, zhichao.huang@linaro.org Cc: jan.kiszka@siemens.com, dahi@linux.vnet.ibm.com, r65777@freescale.com, bp@suse.de, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Gleb Natapov , Russell King , Catalin Marinas , Will Deacon , Ard Biesheuvel , Richard Weinberger , Andre Przywara , Lorenzo Pieralisi , linux-kernel@vger.kernel.org (open list) Subject: [PATCH v3 05/12] KVM: arm: introduce kvm_arm_init/setup/clear_debug Date: Wed, 6 May 2015 17:23:20 +0100 Message-Id: <1430929407-3487-6-git-send-email-alex.bennee@linaro.org> X-Mailer: git-send-email 2.3.5 In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: alex.bennee@linaro.org X-SA-Exim-Scanned: No (on socrates.bennee.com); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a precursor for later patches which will need to do more to setup debug state before entering the hyp.S switch code. The existing functionality for setting mdcr_el2 has been moved out of hyp.S and now uses the value kept in vcpu->arch.mdcr_el2. As the assembler used to previously mask and preserve MDCR_EL2.HPMN I've had to add a mechanism to save the value of mdcr_el2 as a per-cpu variable during the initialisation code. The kernel never sets this number so we are assuming the bootcode has set up the correct value here. This also moves the conditional setting of the TDA bit from the hyp code into the C code which is currently used for the lazy debug register context switch code. Signed-off-by: Alex Bennée --- v3 - rename fns from arch->arm - preserve MDCR_EL2.HPMN setting - re-word some of the comments - fix some minor grammar nits - merge setting of mdcr_el2 - introduce trap_debug flag - move setup/clear within the irq lock section create mode 100644 arch/arm64/kvm/debug.c diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index d71607c..746c0c69 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h @@ -236,4 +236,8 @@ static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} +static inline void kvm_arm_init_debug(void) {} +static inline void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) {} +static inline void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) {} + #endif /* __ARM_KVM_HOST_H__ */ diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 52a1d4d38..4a274e1 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -570,6 +570,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) continue; } + kvm_arm_setup_debug(vcpu); + /************************************************************** * Enter the guest */ @@ -582,7 +584,10 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) vcpu->mode = OUTSIDE_GUEST_MODE; kvm_guest_exit(); trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); - /* + + kvm_arm_clear_debug(vcpu); + + /* * We may have taken a host interrupt in HYP mode (ie * while executing the guest). This interrupt is still * pending, as we haven't serviced it yet! @@ -930,6 +935,8 @@ static void cpu_init_hyp_mode(void *dummy) vector_ptr = (unsigned long)__kvm_hyp_vector; __cpu_init_hyp_mode(boot_pgd_ptr, pgd_ptr, hyp_stack_ptr, vector_ptr); + + kvm_arm_init_debug(); } static int hyp_init_cpu_notify(struct notifier_block *self, diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h index 4f7310f..d6b507e 100644 --- a/arch/arm64/include/asm/kvm_asm.h +++ b/arch/arm64/include/asm/kvm_asm.h @@ -137,6 +137,8 @@ extern char __restore_vgic_v2_state[]; extern char __save_vgic_v3_state[]; extern char __restore_vgic_v3_state[]; +extern u32 __kvm_get_mdcr_el2(void); + #endif #endif /* __ARM_KVM_ASM_H__ */ diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f0f58c9..7cb99b5 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -103,6 +103,7 @@ struct kvm_vcpu_arch { /* HYP configuration */ u64 hcr_el2; + u32 mdcr_el2; /* Exception Information */ struct kvm_vcpu_fault_info fault; @@ -250,4 +251,8 @@ static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} +void kvm_arm_init_debug(void); +void kvm_arm_setup_debug(struct kvm_vcpu *vcpu); +void kvm_arm_clear_debug(struct kvm_vcpu *vcpu); + #endif /* __ARM64_KVM_HOST_H__ */ diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index da675cc..dfb25a2 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -117,6 +117,7 @@ int main(void) DEFINE(VCPU_HPFAR_EL2, offsetof(struct kvm_vcpu, arch.fault.hpfar_el2)); DEFINE(VCPU_DEBUG_FLAGS, offsetof(struct kvm_vcpu, arch.debug_flags)); DEFINE(VCPU_HCR_EL2, offsetof(struct kvm_vcpu, arch.hcr_el2)); + DEFINE(VCPU_MDCR_EL2, offsetof(struct kvm_vcpu, arch.mdcr_el2)); DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines)); DEFINE(VCPU_HOST_CONTEXT, offsetof(struct kvm_vcpu, arch.host_cpu_context)); DEFINE(VCPU_TIMER_CNTV_CTL, offsetof(struct kvm_vcpu, arch.timer_cpu.cntv_ctl)); diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile index d5904f8..90e3f39 100644 --- a/arch/arm64/kvm/Makefile +++ b/arch/arm64/kvm/Makefile @@ -17,7 +17,7 @@ kvm-$(CONFIG_KVM_ARM_HOST) += $(ARM)/psci.o $(ARM)/perf.o kvm-$(CONFIG_KVM_ARM_HOST) += emulate.o inject_fault.o regmap.o kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o -kvm-$(CONFIG_KVM_ARM_HOST) += guest.o reset.o sys_regs.o sys_regs_generic_v8.o +kvm-$(CONFIG_KVM_ARM_HOST) += guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic.o kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v2.o diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c new file mode 100644 index 0000000..b1f8731 --- /dev/null +++ b/arch/arm64/kvm/debug.c @@ -0,0 +1,83 @@ +/* + * Debug and Guest Debug support + * + * Copyright (C) 2015 - Linaro Ltd + * Author: Alex Bennée + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include + +static DEFINE_PER_CPU(u32, mdcr_el2); + +/** + * kvm_arm_init_debug - grab what we need for debug + * + * Currently the sole task of this function is to retrieve the initial + * value of mdcr_el2 so we can preserve MDCR_EL2.HPMN which has + * presumably been set-up by some knowledgeable bootcode. + * + * It is called once per-cpu during CPU hyp initialisation. + */ + +void kvm_arm_init_debug(void) +{ + __this_cpu_write(mdcr_el2, kvm_call_hyp(__kvm_get_mdcr_el2)); +} + + +/** + * kvm_arm_setup_debug - set up debug related stuff + * + * @vcpu: the vcpu pointer + * + * This is called before each entry into the hypervisor to setup any + * debug related registers. Currently this just ensures we will trap + * access to: + * - Performance monitors (MDCR_EL2_TPM/MDCR_EL2_TPMCR) + * - Debug ROM Address (MDCR_EL2_TDRA) + * - Power down debug registers (MDCR_EL2_TDOSA) + * + * Additionally, KVM only traps guest accesses to the debug registers if + * the guest is not actively using them (see the KVM_ARM64_DEBUG_DIRTY + * flag on vcpu->arch.debug_flags). Since the guest must not interfere + * with the hardware state when debugging the guest, we must ensure that + * trapping is enabled whenever we are debugging the guest using the + * debug registers. + */ + +void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) +{ + bool trap_debug = !(vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY); + + vcpu->arch.mdcr_el2 = __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK; + vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM | + MDCR_EL2_TPMCR | + MDCR_EL2_TDRA | + MDCR_EL2_TDOSA); + + /* Trap on access to debug registers? */ + if (trap_debug) + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA; + else + vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDA; + +} + +void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) +{ + /* Nothing to do yet */ +} diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index 5befd01..15159aa 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S @@ -768,17 +768,8 @@ mov x2, #(1 << 15) // Trap CP15 Cr=15 msr hstr_el2, x2 - mrs x2, mdcr_el2 - and x2, x2, #MDCR_EL2_HPMN_MASK - orr x2, x2, #(MDCR_EL2_TPM | MDCR_EL2_TPMCR) - orr x2, x2, #(MDCR_EL2_TDRA | MDCR_EL2_TDOSA) - - // Check for KVM_ARM64_DEBUG_DIRTY, and set debug to trap - // if not dirty. - ldr x3, [x0, #VCPU_DEBUG_FLAGS] - tbnz x3, #KVM_ARM64_DEBUG_DIRTY_SHIFT, 1f - orr x2, x2, #MDCR_EL2_TDA -1: + // Monitor Debug Config - see kvm_arch_setup_debug() + ldr x2, [x0, #VCPU_MDCR_EL2] msr mdcr_el2, x2 .endm @@ -1295,4 +1286,10 @@ ENTRY(__kvm_hyp_vector) ventry el1_error_invalid // Error 32-bit EL1 ENDPROC(__kvm_hyp_vector) + +ENTRY(__kvm_get_mdcr_el2) + mrs x0, mdcr_el2 + ret +ENDPROC(__kvm_get_mdcr_el2) + .popsection -- 2.3.5 From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Subject: [PATCH v3 05/12] KVM: arm: introduce kvm_arm_init/setup/clear_debug Date: Wed, 6 May 2015 17:23:20 +0100 Message-ID: <1430929407-3487-6-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: Lorenzo Pieralisi , Russell King , Richard Weinberger , Ard Biesheuvel , Gleb Natapov , jan.kiszka@siemens.com, Will Deacon , open list , dahi@linux.vnet.ibm.com, Andre Przywara , Catalin Marinas , r65777@freescale.com, bp@suse.de To: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com, peter.maydell@linaro.org, agraf@suse.de, drjones@redhat.com, pbonzini@redhat.com, zhichao.huang@linaro.org Return-path: In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu List-Id: kvm.vger.kernel.org VGhpcyBpcyBhIHByZWN1cnNvciBmb3IgbGF0ZXIgcGF0Y2hlcyB3aGljaCB3aWxsIG5lZWQgdG8g ZG8gbW9yZSB0bwpzZXR1cCBkZWJ1ZyBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIGh5cC5TIHN3 aXRjaCBjb2RlLiBUaGUgZXhpc3RpbmcKZnVuY3Rpb25hbGl0eSBmb3Igc2V0dGluZyBtZGNyX2Vs MiBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgaHlwLlMgYW5kIG5vdwp1c2VzIHRoZSB2YWx1ZSBrZXB0 IGluIHZjcHUtPmFyY2gubWRjcl9lbDIuCgpBcyB0aGUgYXNzZW1ibGVyIHVzZWQgdG8gcHJldmlv dXNseSBtYXNrIGFuZCBwcmVzZXJ2ZSBNRENSX0VMMi5IUE1OIEkndmUKaGFkIHRvIGFkZCBhIG1l Y2hhbmlzbSB0byBzYXZlIHRoZSB2YWx1ZSBvZiBtZGNyX2VsMiBhcyBhIHBlci1jcHUKdmFyaWFi bGUgZHVyaW5nIHRoZSBpbml0aWFsaXNhdGlvbiBjb2RlLiBUaGUga2VybmVsIG5ldmVyIHNldHMg dGhpcwpudW1iZXIgc28gd2UgYXJlIGFzc3VtaW5nIHRoZSBib290Y29kZSBoYXMgc2V0IHVwIHRo ZSBjb3JyZWN0IHZhbHVlCmhlcmUuCgpUaGlzIGFsc28gbW92ZXMgdGhlIGNvbmRpdGlvbmFsIHNl dHRpbmcgb2YgdGhlIFREQSBiaXQgZnJvbSB0aGUgaHlwIGNvZGUKaW50byB0aGUgQyBjb2RlIHdo aWNoIGlzIGN1cnJlbnRseSB1c2VkIGZvciB0aGUgbGF6eSBkZWJ1ZyByZWdpc3Rlcgpjb250ZXh0 IHN3aXRjaCBjb2RlLgoKU2lnbmVkLW9mZi1ieTogQWxleCBCZW5uw6llIDxhbGV4LmJlbm5lZUBs aW5hcm8ub3JnPgoKLS0tCnYzCiAgLSByZW5hbWUgZm5zIGZyb20gYXJjaC0+YXJtCiAgLSBwcmVz ZXJ2ZSBNRENSX0VMMi5IUE1OIHNldHRpbmcKICAtIHJlLXdvcmQgc29tZSBvZiB0aGUgY29tbWVu dHMKICAtIGZpeCBzb21lIG1pbm9yIGdyYW1tYXIgbml0cwogIC0gbWVyZ2Ugc2V0dGluZyBvZiBt ZGNyX2VsMgogIC0gaW50cm9kdWNlIHRyYXBfZGVidWcgZmxhZwogIC0gbW92ZSBzZXR1cC9jbGVh ciB3aXRoaW4gdGhlIGlycSBsb2NrIHNlY3Rpb24KCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9h cm02NC9rdm0vZGVidWcuYwoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9o b3N0LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGQ3MTYwN2MuLjc0 NmMwYzY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBi L2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTIzNiw0ICsyMzYsOCBAQCBzdGF0 aWMgaW5saW5lIHZvaWQga3ZtX2FyY2hfc3luY19ldmVudHMoc3RydWN0IGt2bSAqa3ZtKSB7fQog c3RhdGljIGlubGluZSB2b2lkIGt2bV9hcmNoX3ZjcHVfdW5pbml0KHN0cnVjdCBrdm1fdmNwdSAq dmNwdSkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJjaF9zY2hlZF9pbihzdHJ1Y3Qga3Zt X3ZjcHUgKnZjcHUsIGludCBjcHUpIHt9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJtX2lu aXRfZGVidWcodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJtX3NldHVwX2RlYnVn KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJtX2Ns ZWFyX2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkge30KKwogI2VuZGlmIC8qIF9fQVJNX0tW TV9IT1NUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2FybS5jIGIvYXJjaC9hcm0v a3ZtL2FybS5jCmluZGV4IDUyYTFkNGQzOC4uNGEyNzRlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0v a3ZtL2FybS5jCisrKyBiL2FyY2gvYXJtL2t2bS9hcm0uYwpAQCAtNTcwLDYgKzU3MCw4IEBAIGlu dCBrdm1fYXJjaF92Y3B1X2lvY3RsX3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBr dm1fcnVuICpydW4pCiAJCQljb250aW51ZTsKIAkJfQogCisJCWt2bV9hcm1fc2V0dXBfZGVidWco dmNwdSk7CisKIAkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCiAJCSAqIEVudGVyIHRoZSBndWVzdAogCQkgKi8KQEAgLTU4Miw3 ICs1ODQsMTAgQEAgaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAq dmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKIAkJdmNwdS0+bW9kZSA9IE9VVFNJREVfR1VFU1Rf TU9ERTsKIAkJa3ZtX2d1ZXN0X2V4aXQoKTsKIAkJdHJhY2Vfa3ZtX2V4aXQoa3ZtX3ZjcHVfdHJh cF9nZXRfY2xhc3ModmNwdSksICp2Y3B1X3BjKHZjcHUpKTsKLQkJLyoKKworCQlrdm1fYXJtX2Ns ZWFyX2RlYnVnKHZjcHUpOworCisgICAgICAgICAgICAgICAgLyoKIAkJICogV2UgbWF5IGhhdmUg dGFrZW4gYSBob3N0IGludGVycnVwdCBpbiBIWVAgbW9kZSAoaWUKIAkJICogd2hpbGUgZXhlY3V0 aW5nIHRoZSBndWVzdCkuIFRoaXMgaW50ZXJydXB0IGlzIHN0aWxsCiAJCSAqIHBlbmRpbmcsIGFz IHdlIGhhdmVuJ3Qgc2VydmljZWQgaXQgeWV0IQpAQCAtOTMwLDYgKzkzNSw4IEBAIHN0YXRpYyB2 b2lkIGNwdV9pbml0X2h5cF9tb2RlKHZvaWQgKmR1bW15KQogCXZlY3Rvcl9wdHIgPSAodW5zaWdu ZWQgbG9uZylfX2t2bV9oeXBfdmVjdG9yOwogCiAJX19jcHVfaW5pdF9oeXBfbW9kZShib290X3Bn ZF9wdHIsIHBnZF9wdHIsIGh5cF9zdGFja19wdHIsIHZlY3Rvcl9wdHIpOworCisJa3ZtX2FybV9p bml0X2RlYnVnKCk7CiB9CiAKIHN0YXRpYyBpbnQgaHlwX2luaXRfY3B1X25vdGlmeShzdHJ1Y3Qg bm90aWZpZXJfYmxvY2sgKnNlbGYsCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNt L2t2bV9hc20uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FzbS5oCmluZGV4IDRmNzMx MGYuLmQ2YjUwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FzbS5o CisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FzbS5oCkBAIC0xMzcsNiArMTM3LDgg QEAgZXh0ZXJuIGNoYXIgX19yZXN0b3JlX3ZnaWNfdjJfc3RhdGVbXTsKIGV4dGVybiBjaGFyIF9f c2F2ZV92Z2ljX3YzX3N0YXRlW107CiBleHRlcm4gY2hhciBfX3Jlc3RvcmVfdmdpY192M19zdGF0 ZVtdOwogCitleHRlcm4gdTMyIF9fa3ZtX2dldF9tZGNyX2VsMih2b2lkKTsKKwogI2VuZGlmCiAK ICNlbmRpZiAvKiBfX0FSTV9LVk1fQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9p bmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5o CmluZGV4IGYwZjU4YzkuLjdjYjk5YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20va3ZtX2hvc3QuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAg LTEwMyw2ICsxMDMsNyBAQCBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7CiAKIAkvKiBIWVAgY29uZmln dXJhdGlvbiAqLwogCXU2NCBoY3JfZWwyOworCXUzMiBtZGNyX2VsMjsKIAogCS8qIEV4Y2VwdGlv biBJbmZvcm1hdGlvbiAqLwogCXN0cnVjdCBrdm1fdmNwdV9mYXVsdF9pbmZvIGZhdWx0OwpAQCAt MjUwLDQgKzI1MSw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJjaF9zeW5jX2V2ZW50cyhz dHJ1Y3Qga3ZtICprdm0pIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2FyY2hfdmNwdV91bmlu aXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7fQogc3RhdGljIGlubGluZSB2b2lkIGt2bV9hcmNo X3NjaGVkX2luKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGNwdSkge30KIAordm9pZCBrdm1f YXJtX2luaXRfZGVidWcodm9pZCk7Cit2b2lkIGt2bV9hcm1fc2V0dXBfZGVidWcoc3RydWN0IGt2 bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX2FybV9jbGVhcl9kZWJ1ZyhzdHJ1Y3Qga3ZtX3ZjcHUg KnZjcHUpOworCiAjZW5kaWYgLyogX19BUk02NF9LVk1fSE9TVF9IX18gKi8KZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20t b2Zmc2V0cy5jCmluZGV4IGRhNjc1Y2MuLmRmYjI1YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQv a2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMu YwpAQCAtMTE3LDYgKzExNyw3IEBAIGludCBtYWluKHZvaWQpCiAgIERFRklORShWQ1BVX0hQRkFS X0VMMiwJb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZhdWx0LmhwZmFyX2VsMikpOwog ICBERUZJTkUoVkNQVV9ERUJVR19GTEFHUywJb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNo LmRlYnVnX2ZsYWdzKSk7CiAgIERFRklORShWQ1BVX0hDUl9FTDIsCQlvZmZzZXRvZihzdHJ1Y3Qg a3ZtX3ZjcHUsIGFyY2guaGNyX2VsMikpOworICBERUZJTkUoVkNQVV9NRENSX0VMMiwJb2Zmc2V0 b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLm1kY3JfZWwyKSk7CiAgIERFRklORShWQ1BVX0lSUV9M SU5FUywJb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmlycV9saW5lcykpOwogICBERUZJ TkUoVkNQVV9IT1NUX0NPTlRFWFQsCW9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ob3N0 X2NwdV9jb250ZXh0KSk7CiAgIERFRklORShWQ1BVX1RJTUVSX0NOVFZfQ1RMLAlvZmZzZXRvZihz dHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudGltZXJfY3B1LmNudHZfY3RsKSk7CmRpZmYgLS1naXQgYS9h cmNoL2FybTY0L2t2bS9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCmluZGV4IGQ1 OTA0ZjguLjkwZTNmMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCisrKyBi L2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCkBAIC0xNyw3ICsxNyw3IEBAIGt2bS0kKENPTkZJR19L Vk1fQVJNX0hPU1QpICs9ICQoQVJNKS9wc2NpLm8gJChBUk0pL3BlcmYubwogCiBrdm0tJChDT05G SUdfS1ZNX0FSTV9IT1NUKSArPSBlbXVsYXRlLm8gaW5qZWN0X2ZhdWx0Lm8gcmVnbWFwLm8KIGt2 bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IGh5cC5vIGh5cC1pbml0Lm8gaGFuZGxlX2V4aXQu bwota3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gZ3Vlc3QubyByZXNldC5vIHN5c19yZWdz Lm8gc3lzX3JlZ3NfZ2VuZXJpY192OC5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBn dWVzdC5vIGRlYnVnLm8gcmVzZXQubyBzeXNfcmVncy5vIHN5c19yZWdzX2dlbmVyaWNfdjgubwog CiBrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL3ZnaWMubwoga3ZtLSQo Q09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS92Z2ljLXYyLm8KZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQva3ZtL2RlYnVnLmMgYi9hcmNoL2FybTY0L2t2bS9kZWJ1Zy5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjg3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9h cmNoL2FybTY0L2t2bS9kZWJ1Zy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBEZWJ1ZyBhbmQg R3Vlc3QgRGVidWcgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSAtIExpbmFybyBM dGQKKyAqIEF1dGhvcjogQWxleCBCZW5uw6llIDxhbGV4LmJlbm5lZUBsaW5hcm8ub3JnPgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3 dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+ CisKKyNpbmNsdWRlIDxhc20va3ZtX2FybS5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTMy LCBtZGNyX2VsMik7CisKKy8qKgorICoga3ZtX2FybV9pbml0X2RlYnVnIC0gZ3JhYiB3aGF0IHdl IG5lZWQgZm9yIGRlYnVnCisgKgorICogQ3VycmVudGx5IHRoZSBzb2xlIHRhc2sgb2YgdGhpcyBm dW5jdGlvbiBpcyB0byByZXRyaWV2ZSB0aGUgaW5pdGlhbAorICogdmFsdWUgb2YgbWRjcl9lbDIg c28gd2UgY2FuIHByZXNlcnZlIE1EQ1JfRUwyLkhQTU4gd2hpY2ggaGFzCisgKiBwcmVzdW1hYmx5 IGJlZW4gc2V0LXVwIGJ5IHNvbWUga25vd2xlZGdlYWJsZSBib290Y29kZS4KKyAqCisgKiBJdCBp cyBjYWxsZWQgb25jZSBwZXItY3B1IGR1cmluZyBDUFUgaHlwIGluaXRpYWxpc2F0aW9uLgorICov CisKK3ZvaWQga3ZtX2FybV9pbml0X2RlYnVnKHZvaWQpCit7CisJX190aGlzX2NwdV93cml0ZSht ZGNyX2VsMiwga3ZtX2NhbGxfaHlwKF9fa3ZtX2dldF9tZGNyX2VsMikpOworfQorCisKKy8qKgor ICoga3ZtX2FybV9zZXR1cF9kZWJ1ZyAtIHNldCB1cCBkZWJ1ZyByZWxhdGVkIHN0dWZmCisgKgor ICogQHZjcHU6CXRoZSB2Y3B1IHBvaW50ZXIKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUg ZWFjaCBlbnRyeSBpbnRvIHRoZSBoeXBlcnZpc29yIHRvIHNldHVwIGFueQorICogZGVidWcgcmVs YXRlZCByZWdpc3RlcnMuIEN1cnJlbnRseSB0aGlzIGp1c3QgZW5zdXJlcyB3ZSB3aWxsIHRyYXAK KyAqIGFjY2VzcyB0bzoKKyAqICAtIFBlcmZvcm1hbmNlIG1vbml0b3JzIChNRENSX0VMMl9UUE0v TURDUl9FTDJfVFBNQ1IpCisgKiAgLSBEZWJ1ZyBST00gQWRkcmVzcyAoTURDUl9FTDJfVERSQSkK KyAqICAtIFBvd2VyIGRvd24gZGVidWcgcmVnaXN0ZXJzIChNRENSX0VMMl9URE9TQSkKKyAqCisg KiBBZGRpdGlvbmFsbHksIEtWTSBvbmx5IHRyYXBzIGd1ZXN0IGFjY2Vzc2VzIHRvIHRoZSBkZWJ1 ZyByZWdpc3RlcnMgaWYKKyAqIHRoZSBndWVzdCBpcyBub3QgYWN0aXZlbHkgdXNpbmcgdGhlbSAo c2VlIHRoZSBLVk1fQVJNNjRfREVCVUdfRElSVFkKKyAqIGZsYWcgb24gdmNwdS0+YXJjaC5kZWJ1 Z19mbGFncykuICBTaW5jZSB0aGUgZ3Vlc3QgbXVzdCBub3QgaW50ZXJmZXJlCisgKiB3aXRoIHRo ZSBoYXJkd2FyZSBzdGF0ZSB3aGVuIGRlYnVnZ2luZyB0aGUgZ3Vlc3QsIHdlIG11c3QgZW5zdXJl IHRoYXQKKyAqIHRyYXBwaW5nIGlzIGVuYWJsZWQgd2hlbmV2ZXIgd2UgYXJlIGRlYnVnZ2luZyB0 aGUgZ3Vlc3QgdXNpbmcgdGhlCisgKiBkZWJ1ZyByZWdpc3RlcnMuCisgKi8KKwordm9pZCBrdm1f YXJtX3NldHVwX2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlib29sIHRyYXBfZGVi dWcgPSAhKHZjcHUtPmFyY2guZGVidWdfZmxhZ3MgJiBLVk1fQVJNNjRfREVCVUdfRElSVFkpOwor CisJdmNwdS0+YXJjaC5tZGNyX2VsMiA9IF9fdGhpc19jcHVfcmVhZChtZGNyX2VsMikgJiBNRENS X0VMMl9IUE1OX01BU0s7CisJdmNwdS0+YXJjaC5tZGNyX2VsMiB8PSAoTURDUl9FTDJfVFBNIHwK KwkJCQlNRENSX0VMMl9UUE1DUiB8CisJCQkJTURDUl9FTDJfVERSQSB8CisJCQkJTURDUl9FTDJf VERPU0EpOworCisJLyogVHJhcCBvbiBhY2Nlc3MgdG8gZGVidWcgcmVnaXN0ZXJzPyAqLworCWlm ICh0cmFwX2RlYnVnKQorCQl2Y3B1LT5hcmNoLm1kY3JfZWwyIHw9IE1EQ1JfRUwyX1REQTsKKwll bHNlCisJCXZjcHUtPmFyY2gubWRjcl9lbDIgJj0gfk1EQ1JfRUwyX1REQTsKKworfQorCit2b2lk IGt2bV9hcm1fY2xlYXJfZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIE5vdGhp bmcgdG8gZG8geWV0ICovCit9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAuUyBiL2Fy Y2gvYXJtNjQva3ZtL2h5cC5TCmluZGV4IDViZWZkMDEuLjE1MTU5YWEgMTAwNjQ0Ci0tLSBhL2Fy Y2gvYXJtNjQva3ZtL2h5cC5TCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC5TCkBAIC03NjgsMTcg Kzc2OCw4IEBACiAJbW92CXgyLCAjKDEgPDwgMTUpCS8vIFRyYXAgQ1AxNSBDcj0xNQogCW1zcglo c3RyX2VsMiwgeDIKIAotCW1ycwl4MiwgbWRjcl9lbDIKLQlhbmQJeDIsIHgyLCAjTURDUl9FTDJf SFBNTl9NQVNLCi0Jb3JyCXgyLCB4MiwgIyhNRENSX0VMMl9UUE0gfCBNRENSX0VMMl9UUE1DUikK LQlvcnIJeDIsIHgyLCAjKE1EQ1JfRUwyX1REUkEgfCBNRENSX0VMMl9URE9TQSkKLQotCS8vIENo ZWNrIGZvciBLVk1fQVJNNjRfREVCVUdfRElSVFksIGFuZCBzZXQgZGVidWcgdG8gdHJhcAotCS8v IGlmIG5vdCBkaXJ0eS4KLQlsZHIJeDMsIFt4MCwgI1ZDUFVfREVCVUdfRkxBR1NdCi0JdGJuegl4 MywgI0tWTV9BUk02NF9ERUJVR19ESVJUWV9TSElGVCwgMWYKLQlvcnIJeDIsIHgyLCAgI01EQ1Jf RUwyX1REQQotMToKKwkvLyBNb25pdG9yIERlYnVnIENvbmZpZyAtIHNlZSBrdm1fYXJjaF9zZXR1 cF9kZWJ1ZygpCisJbGRyCXgyLCBbeDAsICNWQ1BVX01EQ1JfRUwyXQogCW1zcgltZGNyX2VsMiwg eDIKIC5lbmRtCiAKQEAgLTEyOTUsNCArMTI4NiwxMCBAQCBFTlRSWShfX2t2bV9oeXBfdmVjdG9y KQogCXZlbnRyeQllbDFfZXJyb3JfaW52YWxpZAkJLy8gRXJyb3IgMzItYml0IEVMMQogRU5EUFJP QyhfX2t2bV9oeXBfdmVjdG9yKQogCisKK0VOVFJZKF9fa3ZtX2dldF9tZGNyX2VsMikKKwltcnMJ eDAsIG1kY3JfZWwyCisJcmV0CitFTkRQUk9DKF9fa3ZtX2dldF9tZGNyX2VsMikKKwogCS5wb3Bz ZWN0aW9uCi0tIAoyLjMuNQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18Ka3ZtYXJtIG1haWxpbmcgbGlzdAprdm1hcm1AbGlzdHMuY3MuY29sdW1iaWEuZWR1 Cmh0dHBzOi8vbGlzdHMuY3MuY29sdW1iaWEuZWR1L21haWxtYW4vbGlzdGluZm8va3ZtYXJtCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: alex.bennee@linaro.org (=?UTF-8?q?Alex=20Benn=C3=A9e?=) Date: Wed, 6 May 2015 17:23:20 +0100 Subject: [PATCH v3 05/12] KVM: arm: introduce kvm_arm_init/setup/clear_debug In-Reply-To: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> References: <1430929407-3487-1-git-send-email-alex.bennee@linaro.org> Message-ID: <1430929407-3487-6-git-send-email-alex.bennee@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org This is a precursor for later patches which will need to do more to setup debug state before entering the hyp.S switch code. The existing functionality for setting mdcr_el2 has been moved out of hyp.S and now uses the value kept in vcpu->arch.mdcr_el2. As the assembler used to previously mask and preserve MDCR_EL2.HPMN I've had to add a mechanism to save the value of mdcr_el2 as a per-cpu variable during the initialisation code. The kernel never sets this number so we are assuming the bootcode has set up the correct value here. This also moves the conditional setting of the TDA bit from the hyp code into the C code which is currently used for the lazy debug register context switch code. Signed-off-by: Alex Benn?e --- v3 - rename fns from arch->arm - preserve MDCR_EL2.HPMN setting - re-word some of the comments - fix some minor grammar nits - merge setting of mdcr_el2 - introduce trap_debug flag - move setup/clear within the irq lock section create mode 100644 arch/arm64/kvm/debug.c diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index d71607c..746c0c69 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h @@ -236,4 +236,8 @@ static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} +static inline void kvm_arm_init_debug(void) {} +static inline void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) {} +static inline void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) {} + #endif /* __ARM_KVM_HOST_H__ */ diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 52a1d4d38..4a274e1 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -570,6 +570,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) continue; } + kvm_arm_setup_debug(vcpu); + /************************************************************** * Enter the guest */ @@ -582,7 +584,10 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) vcpu->mode = OUTSIDE_GUEST_MODE; kvm_guest_exit(); trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); - /* + + kvm_arm_clear_debug(vcpu); + + /* * We may have taken a host interrupt in HYP mode (ie * while executing the guest). This interrupt is still * pending, as we haven't serviced it yet! @@ -930,6 +935,8 @@ static void cpu_init_hyp_mode(void *dummy) vector_ptr = (unsigned long)__kvm_hyp_vector; __cpu_init_hyp_mode(boot_pgd_ptr, pgd_ptr, hyp_stack_ptr, vector_ptr); + + kvm_arm_init_debug(); } static int hyp_init_cpu_notify(struct notifier_block *self, diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h index 4f7310f..d6b507e 100644 --- a/arch/arm64/include/asm/kvm_asm.h +++ b/arch/arm64/include/asm/kvm_asm.h @@ -137,6 +137,8 @@ extern char __restore_vgic_v2_state[]; extern char __save_vgic_v3_state[]; extern char __restore_vgic_v3_state[]; +extern u32 __kvm_get_mdcr_el2(void); + #endif #endif /* __ARM_KVM_ASM_H__ */ diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index f0f58c9..7cb99b5 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -103,6 +103,7 @@ struct kvm_vcpu_arch { /* HYP configuration */ u64 hcr_el2; + u32 mdcr_el2; /* Exception Information */ struct kvm_vcpu_fault_info fault; @@ -250,4 +251,8 @@ static inline void kvm_arch_sync_events(struct kvm *kvm) {} static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {} static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} +void kvm_arm_init_debug(void); +void kvm_arm_setup_debug(struct kvm_vcpu *vcpu); +void kvm_arm_clear_debug(struct kvm_vcpu *vcpu); + #endif /* __ARM64_KVM_HOST_H__ */ diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index da675cc..dfb25a2 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -117,6 +117,7 @@ int main(void) DEFINE(VCPU_HPFAR_EL2, offsetof(struct kvm_vcpu, arch.fault.hpfar_el2)); DEFINE(VCPU_DEBUG_FLAGS, offsetof(struct kvm_vcpu, arch.debug_flags)); DEFINE(VCPU_HCR_EL2, offsetof(struct kvm_vcpu, arch.hcr_el2)); + DEFINE(VCPU_MDCR_EL2, offsetof(struct kvm_vcpu, arch.mdcr_el2)); DEFINE(VCPU_IRQ_LINES, offsetof(struct kvm_vcpu, arch.irq_lines)); DEFINE(VCPU_HOST_CONTEXT, offsetof(struct kvm_vcpu, arch.host_cpu_context)); DEFINE(VCPU_TIMER_CNTV_CTL, offsetof(struct kvm_vcpu, arch.timer_cpu.cntv_ctl)); diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile index d5904f8..90e3f39 100644 --- a/arch/arm64/kvm/Makefile +++ b/arch/arm64/kvm/Makefile @@ -17,7 +17,7 @@ kvm-$(CONFIG_KVM_ARM_HOST) += $(ARM)/psci.o $(ARM)/perf.o kvm-$(CONFIG_KVM_ARM_HOST) += emulate.o inject_fault.o regmap.o kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o -kvm-$(CONFIG_KVM_ARM_HOST) += guest.o reset.o sys_regs.o sys_regs_generic_v8.o +kvm-$(CONFIG_KVM_ARM_HOST) += guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic.o kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic-v2.o diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c new file mode 100644 index 0000000..b1f8731 --- /dev/null +++ b/arch/arm64/kvm/debug.c @@ -0,0 +1,83 @@ +/* + * Debug and Guest Debug support + * + * Copyright (C) 2015 - Linaro Ltd + * Author: Alex Benn?e + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include + +static DEFINE_PER_CPU(u32, mdcr_el2); + +/** + * kvm_arm_init_debug - grab what we need for debug + * + * Currently the sole task of this function is to retrieve the initial + * value of mdcr_el2 so we can preserve MDCR_EL2.HPMN which has + * presumably been set-up by some knowledgeable bootcode. + * + * It is called once per-cpu during CPU hyp initialisation. + */ + +void kvm_arm_init_debug(void) +{ + __this_cpu_write(mdcr_el2, kvm_call_hyp(__kvm_get_mdcr_el2)); +} + + +/** + * kvm_arm_setup_debug - set up debug related stuff + * + * @vcpu: the vcpu pointer + * + * This is called before each entry into the hypervisor to setup any + * debug related registers. Currently this just ensures we will trap + * access to: + * - Performance monitors (MDCR_EL2_TPM/MDCR_EL2_TPMCR) + * - Debug ROM Address (MDCR_EL2_TDRA) + * - Power down debug registers (MDCR_EL2_TDOSA) + * + * Additionally, KVM only traps guest accesses to the debug registers if + * the guest is not actively using them (see the KVM_ARM64_DEBUG_DIRTY + * flag on vcpu->arch.debug_flags). Since the guest must not interfere + * with the hardware state when debugging the guest, we must ensure that + * trapping is enabled whenever we are debugging the guest using the + * debug registers. + */ + +void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) +{ + bool trap_debug = !(vcpu->arch.debug_flags & KVM_ARM64_DEBUG_DIRTY); + + vcpu->arch.mdcr_el2 = __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK; + vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM | + MDCR_EL2_TPMCR | + MDCR_EL2_TDRA | + MDCR_EL2_TDOSA); + + /* Trap on access to debug registers? */ + if (trap_debug) + vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA; + else + vcpu->arch.mdcr_el2 &= ~MDCR_EL2_TDA; + +} + +void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) +{ + /* Nothing to do yet */ +} diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index 5befd01..15159aa 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S @@ -768,17 +768,8 @@ mov x2, #(1 << 15) // Trap CP15 Cr=15 msr hstr_el2, x2 - mrs x2, mdcr_el2 - and x2, x2, #MDCR_EL2_HPMN_MASK - orr x2, x2, #(MDCR_EL2_TPM | MDCR_EL2_TPMCR) - orr x2, x2, #(MDCR_EL2_TDRA | MDCR_EL2_TDOSA) - - // Check for KVM_ARM64_DEBUG_DIRTY, and set debug to trap - // if not dirty. - ldr x3, [x0, #VCPU_DEBUG_FLAGS] - tbnz x3, #KVM_ARM64_DEBUG_DIRTY_SHIFT, 1f - orr x2, x2, #MDCR_EL2_TDA -1: + // Monitor Debug Config - see kvm_arch_setup_debug() + ldr x2, [x0, #VCPU_MDCR_EL2] msr mdcr_el2, x2 .endm @@ -1295,4 +1286,10 @@ ENTRY(__kvm_hyp_vector) ventry el1_error_invalid // Error 32-bit EL1 ENDPROC(__kvm_hyp_vector) + +ENTRY(__kvm_get_mdcr_el2) + mrs x0, mdcr_el2 + ret +ENDPROC(__kvm_get_mdcr_el2) + .popsection -- 2.3.5