linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 07/32] arm64: KVM: fault injection into a guest
Date: Wed, 24 Apr 2013 11:04:06 +0100	[thread overview]
Message-ID: <5177AE16.6080509@arm.com> (raw)
In-Reply-To: <20130423225758.GB20569@gmail.com>

On 23/04/13 23:57, Christoffer Dall wrote:
> On Mon, Apr 08, 2013 at 05:17:09PM +0100, Marc Zyngier wrote:
>> Implement the injection of a fault (undefined, data abort or
>> prefetch abort) into a 64bit guest.
>>
>> Reviewed-by: Christopher Covington <cov@codeaurora.org>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> ---
>>  arch/arm64/kvm/inject_fault.c | 118 ++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 118 insertions(+)
>>  create mode 100644 arch/arm64/kvm/inject_fault.c
>>
>> diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
>> new file mode 100644
>> index 0000000..2ff3b78
>> --- /dev/null
>> +++ b/arch/arm64/kvm/inject_fault.c
>> @@ -0,0 +1,118 @@
>> +/*
>> + * Fault injection for 64bit guests.
>> + *
>> + * Copyright (C) 2012,2013 - ARM Ltd
>> + * Author: Marc Zyngier <marc.zyngier@arm.com>
>> + *
>> + * Based on arch/arm/kvm/emulate.c
>> + * Copyright (C) 2012 - Virtual Open Systems and Columbia University
>> + * Author: Christoffer Dall <c.dall@virtualopensystems.com>
>> + *
>> + * 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 <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +#include <linux/kvm_host.h>
>> +#include <asm/kvm_emulate.h>
>> +#include <asm/esr.h>
>> +
>> +static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr)
>> +{
>> +	unsigned long cpsr = *vcpu_cpsr(vcpu);
>> +	int is_aarch32;
>> +	u32 esr = 0;
>> +
>> +	is_aarch32 = vcpu_mode_is_32bit(vcpu);
>> +
>> +	*vcpu_spsr(vcpu) = cpsr;
>> +	*vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu);
>> +
>> +	*vcpu_cpsr(vcpu) = PSR_MODE_EL1h | PSR_A_BIT | PSR_F_BIT | PSR_I_BIT;
>> +	*vcpu_pc(vcpu) = vcpu_sys_reg(vcpu, VBAR_EL1) + 0x200;
> 
> consider a define for the 0x200?

Yeah, I think Will already mentioned this.

>> +
>> +	vcpu_sys_reg(vcpu, FAR_EL1) = addr;
>> +
>> +	/*
>> +	 * Build an {i,d}abort, depending on the level and the
>> +	 * instruction set. Report an external synchronous abort.
>> +	 */
>> +	if (kvm_vcpu_trap_il_is32bit(vcpu))
>> +		esr |= ESR_EL1_IL;
>> +
>> +	if (is_aarch32 || (cpsr & PSR_MODE_MASK) == PSR_MODE_EL0t)
>> +		esr |= (ESR_EL1_EC_IABT_EL0 << ESR_EL1_EC_SHIFT);
>> +	else
>> +		esr |= (ESR_EL1_EC_IABT_EL1 << ESR_EL1_EC_SHIFT);
> 
> why is it assumed that the abort must come from EL0 if the vcpu is in
> aarch32 mode?

We're injecting a fault into a VM that runs with a 64bit EL1. So if we
end-up faulting in 32bit code, it must come from EL0.

>> +
>> +	if (!is_iabt)
>> +		esr |= ESR_EL1_EC_DABT_EL0;
> 
> this is slightly confusing unless you actually look at the definitions
> and realize that or'ing on that extra bit works both in i- and d-abt
> cases.

Blame Christopher for that, he came up with the idea... ;-)

>> +
>> +	vcpu_sys_reg(vcpu, ESR_EL1) = esr | 0x10; /* External abort */
>> +}
>> +
>> +static void inject_undef64(struct kvm_vcpu *vcpu)
>> +{
>> +	unsigned long cpsr = *vcpu_cpsr(vcpu);
>> +	u32 esr = (ESR_EL1_EC_UNKNOWN << ESR_EL1_EC_SHIFT);
>> +
>> +	*vcpu_spsr(vcpu) = cpsr;
>> +	*vcpu_elr_el1(vcpu) = *vcpu_pc(vcpu);
>> +
>> +	*vcpu_cpsr(vcpu) = PSR_MODE_EL1h | PSR_F_BIT | PSR_I_BIT;
> 
> would it make sense to have a define for a common set of these bits or
> is this explicitly defined per exception type in the specs?

Maybe. Not sure that would be any clearer though...

	M.
-- 
Jazz is not dead. It just smells funny...

  reply	other threads:[~2013-04-24 10:04 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-08 16:17 [PATCH v3 00/32] Port of KVM to arm64 Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 01/32] arm64: add explicit symbols to ESR_EL1 decoding Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 02/32] arm64: KVM: define HYP and Stage-2 translation page flags Marc Zyngier
2013-04-10 14:07   ` Will Deacon
2013-04-12 15:22     ` Marc Zyngier
2013-04-26 17:01   ` Catalin Marinas
2013-04-26 17:11     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 03/32] arm64: KVM: HYP mode idmap support Marc Zyngier
2013-04-23 22:57   ` Christoffer Dall
2013-04-24  9:36     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 04/32] arm64: KVM: EL2 register definitions Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 05/32] arm64: KVM: system register definitions for 64bit guests Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 06/32] arm64: KVM: Basic ESR_EL2 helpers and vcpu register access Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 07/32] arm64: KVM: fault injection into a guest Marc Zyngier
2013-04-10 16:40   ` Will Deacon
2013-04-12 15:29     ` Marc Zyngier
2013-04-23 22:57   ` Christoffer Dall
2013-04-24 10:04     ` Marc Zyngier [this message]
2013-04-24 16:46       ` Christoffer Dall
2013-04-29 16:26   ` Catalin Marinas
2013-05-07 16:29     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 08/32] arm64: KVM: architecture specific MMU backend Marc Zyngier
2013-04-23 22:58   ` Christoffer Dall
2013-04-24 11:03     ` Marc Zyngier
2013-04-24 11:10       ` Will Deacon
2013-04-24 16:50         ` Christoffer Dall
2013-04-24 16:55       ` Christoffer Dall
2013-04-25 12:59         ` Marc Zyngier
2013-04-25 15:13           ` Christoffer Dall
2013-04-29 17:35   ` Catalin Marinas
2013-04-30 10:23     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 09/32] arm64: KVM: user space interface Marc Zyngier
2013-04-10 16:45   ` Will Deacon
2013-04-12 15:31     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 10/32] arm64: KVM: system register handling Marc Zyngier
2013-04-10 17:04   ` Will Deacon
2013-04-12 15:48     ` Marc Zyngier
2013-04-23 23:01   ` Christoffer Dall
2013-04-24 13:37     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 11/32] arm64: KVM: CPU specific system registers handling Marc Zyngier
2013-04-10 17:06   ` Will Deacon
2013-04-12 16:04     ` Marc Zyngier
2013-04-23 22:59       ` Christoffer Dall
2013-04-24  9:33         ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 12/32] arm64: KVM: virtual CPU reset Marc Zyngier
2013-04-10 17:07   ` Will Deacon
2013-04-12 16:04     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 13/32] arm64: KVM: kvm_arch and kvm_vcpu_arch definitions Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 14/32] arm64: KVM: MMIO access backend Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 15/32] arm64: KVM: guest one-reg interface Marc Zyngier
2013-04-10 17:13   ` Will Deacon
2013-04-12 16:35     ` Marc Zyngier
2013-04-23 22:59   ` Christoffer Dall
2013-04-24 11:27     ` Marc Zyngier
2013-04-24 17:05       ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 16/32] arm64: KVM: hypervisor initialization code Marc Zyngier
2013-05-02 11:03   ` Catalin Marinas
2013-05-02 13:28     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 17/32] arm64: KVM: HYP mode world switch implementation Marc Zyngier
2013-04-23 22:59   ` Christoffer Dall
2013-04-24 11:39     ` Marc Zyngier
2013-04-24 17:08       ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 18/32] arm64: KVM: Exit handling Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 19/32] arm64: KVM: Plug the VGIC Marc Zyngier
2013-04-23 23:00   ` Christoffer Dall
2013-04-24 11:43     ` Marc Zyngier
2013-05-02 14:38       ` Catalin Marinas
2013-04-08 16:17 ` [PATCH v3 20/32] arm64: KVM: Plug the arch timer Marc Zyngier
2013-04-23 23:00   ` Christoffer Dall
2013-04-24 11:43     ` Marc Zyngier
2013-05-02 15:31       ` Catalin Marinas
2013-04-08 16:17 ` [PATCH v3 21/32] arm64: KVM: PSCI implementation Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 22/32] arm64: KVM: Build system integration Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 23/32] arm64: KVM: define 32bit specific registers Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 24/32] arm64: KVM: 32bit GP register access Marc Zyngier
2013-04-23 23:00   ` Christoffer Dall
2013-04-24 13:06     ` Marc Zyngier
2013-04-24 17:09       ` Christoffer Dall
2013-05-02 16:09   ` Catalin Marinas
2013-05-07 16:28     ` Marc Zyngier
2013-05-07 16:33       ` Catalin Marinas
2013-05-11  0:36         ` Christoffer Dall
2013-05-11  7:51           ` Peter Maydell
2013-05-11  9:43           ` Catalin Marinas
2013-05-12 18:51             ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 25/32] arm64: KVM: 32bit conditional execution emulation Marc Zyngier
2013-04-23 23:00   ` Christoffer Dall
2013-04-24 13:13     ` Marc Zyngier
2013-04-24 17:11       ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 26/32] arm64: KVM: 32bit handling of coprocessor traps Marc Zyngier
2013-04-23 23:01   ` Christoffer Dall
2013-04-24 13:42     ` Marc Zyngier
2013-04-24 17:14       ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 27/32] arm64: KVM: CPU specific 32bit coprocessor access Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 28/32] arm64: KVM: 32bit specific register world switch Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 29/32] arm64: KVM: 32bit guest fault injection Marc Zyngier
2013-04-23 23:02   ` Christoffer Dall
2013-04-24 13:46     ` Marc Zyngier
2013-04-24 17:15       ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 30/32] arm64: KVM: enable initialization of a 32bit vcpu Marc Zyngier
2013-04-23 23:02   ` Christoffer Dall
2013-04-24 13:49     ` Marc Zyngier
2013-04-24 17:17       ` Christoffer Dall
2013-05-07 16:36         ` Marc Zyngier
2013-05-11  0:38           ` Christoffer Dall
2013-05-11  8:04             ` Peter Maydell
2013-05-11 16:26               ` Christoffer Dall
2013-05-11 16:31                 ` Peter Maydell
2013-05-13  9:01             ` Marc Zyngier
2013-05-13 15:46               ` Christoffer Dall
2013-04-08 16:17 ` [PATCH v3 31/32] arm64: KVM: userspace API documentation Marc Zyngier
2013-04-23 23:02   ` Christoffer Dall
2013-04-24 13:52     ` Marc Zyngier
2013-04-08 16:17 ` [PATCH v3 32/32] arm64: KVM: MAINTAINERS update Marc Zyngier
2013-04-23 23:04 ` [PATCH v3 00/32] Port of KVM to arm64 Christoffer Dall
2013-05-03 13:17 ` Catalin Marinas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5177AE16.6080509@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).