From: cdall@cs.columbia.edu (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 24/32] arm64: KVM: 32bit GP register access
Date: Sun, 12 May 2013 11:51:30 -0700 [thread overview]
Message-ID: <20130512184536.GA58092@ubuntu> (raw)
In-Reply-To: <20130511094336.GA56525@MacBook-Pro.local>
On Sat, May 11, 2013 at 10:43:37AM +0100, Catalin Marinas wrote:
> On Sat, May 11, 2013 at 01:36:30AM +0100, Christoffer Dall wrote:
> > On Tue, May 07, 2013 at 05:33:03PM +0100, Catalin Marinas wrote:
> > > On Tue, May 07, 2013 at 05:28:00PM +0100, Marc Zyngier wrote:
> > > > On 02/05/13 17:09, Catalin Marinas wrote:
> > > > > BTW, on arch/arm it looks like this is used when you get a data abort
> > > > > with PC as the destination register and you inject a prefetch abort in
> > > > > this case. Why isn't this a normal data abort? Once you get the
> > > > > information, you load it into PC but first you need to sort out the data
> > > > > abort (unless I don't understand how the kvm_inject_pabt works).
> > > >
> > > > Indeed, it should be a data abort, as we correctly fetched the
> > > > instruction. Now, I wonder why we even bother trying to catch this case.
> > > > Fetching PC from MMIO looks quite silly, but I don't think anything
> > > > really forbids it in the architecture.
> > >
> > > It's not forbidden and you should just treat it as any other data abort,
> > > no need to check whether the register is PC. If you do the PC adjustment
> > > further down in that function it will be overridden by the instruction
> > > emulation anyway. There is no optimisation in checking for PC since such
> > > fault is very unlikely in sane code anyway.
> > >
> > The reason is simply that it is most likely because of a bug that this
> > happens, and we would rather catch such an error in a meaningful way
> > than let this go crazy and have users track it down for a long time.
>
> It is probably a bug but it is a valid code sequence (and Peter even
> gave an example).
>
> > Especially, this was relevant when we did io instruction decoding and we
> > wanted to catch potential bugs in that when it was development code.
> >
> > That all being said, we can remove the check. I don't think, however,
> > that it being an unlikely thing is a good argument: if we remove the
> > check we need to make sure that the VM does whatever the architecture
> > dictates, which I assume is to not skip the MMIO instruction and support
> > setting the PC to the value returned from an I/O emulation device in
> > QEMU.
> >
> > I think the scenario sounds crazy and is more than anything a sign of a
> > bug somewhere, and whether it should be a PABT or a DABT is a judgement
> > call, but I chose a PABT because the thing that's weird is jumping to an
> > I/O address, it's not that the memory address for the load is
> > problematic.
>
> I think that's where things get confused. You are reading from an I/O
> location with the destination being the PC and it is trapped by KVM.
> This has nothing to do with PABT, it's purely a DABT on the I/O access.
> You should emulate it and store the result in the PC. If the value
> loaded in PC is wrong, you will get a subsequent PABT in the guest but
> you must not translate the DABT on I/O memory (which would be generated
> even if the destination is not PC) into a PABT which confuses the guest
> further. By doing this you try to convince the guest that it really
> branched to the I/O address (since you raise the PABT with the DFAR
> value) when it simply tried to load an address from I/O and branch to
> this new address.
>
> IOW, these two are equivalent regarding PC:
>
> ldr pc, [r0] @ r0 is an I/O address
>
> and
>
> ldr r1, [r0] @ r0 is an I/O address
> mov pc, r1
>
> In the second scenario, you don't raise a PABT on the first instruction.
> You may raise one on the second if PC is invalid but that's different
> and most likely it will be a guest-only thing.
>
> So for DABT emulation, checking whether the destination register is PC
> is simply a minimal optimisation (if at all) of that case to avoid
> storing the PC twice. Injecting PABT when you get a DABT is a bug. You
> already catch PABT on I/O address in kvm_handle_guest_abort() and
> correctly inject PABT into guest.
>
Yeah, I got a little confused on the jump to an I/O address and load
the PC from an I/O address distinction, thanks for waking me up.
I will send out a patch that should address this issue by correctly
loading the value into the PC (and not inject a DABT). Note that I
don't plan on doing any explicit checking for a case where the VM does
something like:
ldrb pc, [r0] @ r0 is an I/O address
Because I assume that this is either an undefined instruction or the
behavior is unpredictable as per the architecture anyway, and we should
never get there unless we have a bug in our decoding implementation,
which I doubt at this point.
-Christoffer
next prev parent reply other threads:[~2013-05-12 18:51 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
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 [this message]
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=20130512184536.GA58092@ubuntu \
--to=cdall@cs.columbia.edu \
--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).