From: Dmytro Maluka <dmaluka@google.com>
To: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Xin Li <xin@zytor.com>, Chuanxiao Dong <chuanxiao.dong@intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Thomas Gleixner <tglx@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
x86@kernel.org, linux-kernel@vger.kernel.org,
Grzegorz Jaszczyk <jaszczyk@chromium.org>,
Vineeth Pillai <vineeth@bitbyteword.org>
Subject: Re: x86: missing FRED #PF event data?
Date: Wed, 12 Aug 2026 15:50:11 +0000 [thread overview]
Message-ID: <anyWM1ZXu70zCla9@google.com> (raw)
In-Reply-To: <anrG3Cdre23TUNs6@google.com>
On Tue, Aug 11, 2026 at 04:05:36PM +0900, Sergey Senozhatsky wrote:
> On (26/08/10 22:37), Xin Li wrote:
> > > On August 10, 2026 6:47:13 PM PDT, Sergey Senozhatsky <senozhatsky@chromium.org> wrote:
> > >> On (26/08/10 08:40), H. Peter Anvin wrote:
> > >>> On August 10, 2026 1:58:18 AM PDT, Sergey Senozhatsky <senozhatsky@chromium.org> wrote:
> > >>>> On (26/08/10 16:38), Sergey Senozhatsky wrote:
> > >>>>> [..]
> > >>>>>> All the crashes are reported as NULL ptr derefs, however, I believe this
> > >>>>>> is not exactly the case. In all crashes CR2 is 0x1000 aligned (we always
> > >>>>>> crash accessing first byte of a page). It seems that csum_partial() calls
> > >>>>>> load_unaligned_zeropad() and we hit what load_unaligned_zeropad() comment
> > >>>>>> describes as very unlikely) case: "word being a page-crosser and the
> > >>>>>> next page not being mapped"). So instead of reading 4 remaining bytes
> > >>>>>> of the page and zeroes for trailing 4 bytes, we panic(). It appears that
> > >>>>>> FRED #PF is set to 0 while CR2 points to a correct page address. I added
> > >>>>>> a simple printk to exc_page_fault:
> > >>>>>>
> > >>>>>> address = cpu_feature_enabled(X86_FEATURE_FRED) ? fred_event_data(regs) : read_cr2();
> > >>>>>> /* Fall back to CR2 if FRED event data was empty */
> > >>>>>> if (unlikely(!address)) {
> > >>>>>> address = read_cr2();
> > >>>>>> pr_err(":: fixed up address to %lx [[fred: %lx cr2: %lx]]\n", address, fred_event_data(regs), read_cr2());
> > >>>>>> }
> > >>>>>>
> > >>>>>> and got the following while running my tests (and well, we don't crash
> > >>>>>> anymore):
> > >>>>>>
> > >>>>>> [ 254.040223] :: fixed up address to ffff9c4d64af4000 [[fred: 0 cr2: ffff9c4d64af4000]]
> > >>>>>> ...
> > >>>>>> [ 1821.904563] :: fixed up address to ffff9c4e9dd0a000 [[fred: 0 cr2: ffff9c4e9dd0a000]]
> > >>>>>>
> > >>>>>> Does any of this make sense to you?
> > >>>>>
> > >>>>> I think the explanation is some pKVM shenanigans. Sorry for the noise.
> > >>>>
> > >>>> No, I think we are back at square one. I thought that maybe pKVM
> > >>>> was disabling FRED and that was causing issues. But I actually see
> > >>>> that both cpu_feature_enabled(X86_FEATURE_FRED) and (cr4 & X86_CR4_FRED)
> > >>>> claim FRED is enabled, yet fred #PF data is 0 while CR2 holds the correct
> > >>>> address.
> > >>>
> > >>> What is pKVM? Paravirtualized KVM?
> > >>
> > >> Protected KVM.
> > >>
> > >>> In that case, it is most likely pKVM not filling in the relevant fields
> > >>> in the FRED stack frame, which would be a very serious bug.
> > >>>
> > >>> I cannot think of any other way that that could possibly happen otherwise;
> > >>> on bare metal those fields are set by hardware and Linux only consumes them.
> > >>
> > >> I agree. I'll look at it from the pKVM side. I was not aware of pKVM
> > >> when I started this discussion, I found out about it later.
> > >
> > > If that code calls the FRED entry from KVM routine, that routine doesn't have support for setting event_data in upstream. This would be fixed if necessary.
> >
> > Per Sean, it’s “host” running in a VM, so it’s kind of like a filter
> > hypervisor you ever mentioned; part of the “host" running in non-root mode.
> >
> > So where is this page fault from? If it’s from non-root mode, does this
> > page fault cause a VM exit? If yes and pKVM forwards it to FRED entry, I
> > would guess it is exactly the case.
>
> Added Chuanxiao and Dmytro, folks please correct me.
>
> What I see: the page fault is happening in the non-root mode (native
> MMU?). I don't see a VM exit - I tried injecting FRED #PF data but
> exc_page_fault() still reads 0x00 FRED #PF data. What I also see is
> that... it seems to be a hybrid configurations. From what I can tell,
> guests have FRED enabled in CR4, while hypervisor has FRED disabled in
> CR4. So maybe this mix of FRED modes is what pushes empty FRED #PF frame?
>
> Sorry if I babbled complete nonsense. I'll happily hand it over to
> Chuanxiao and Dmytro at this point.
We already figured the problem out offline, let me describe it here for
posterity.
There is actually a VM exit. What is happening is: with our out-of-tree
pKVM-x86 patches, load_unaligned_zeropad() legitimately crosses a page
that is protected from the host by pKVM (i.e. unmapped in the host VM's
EPT page tables) yet still mapped in the host's own stage-1 page tables
(e.g. as a part of the kernel direct map). So this doesn't trigger a
native #PF within the host, it triggers an EPT violation, and then pKVM
synthesizes a #PF and injects it into the host VM to let
load_unaligned_zeropad() work seamlessly.
And basically hpa's guess is spot on: the problem is that for injecting
this #PF, pKVM is reusing KVM's vmx_inject_exception(), which doesn't
support the case when FRED is enabled in the guest and thus doesn't set
the event_data (not until Xin's patches [1] are merged). I've quickly
patched that up in [2].
As for the FRED setup in hypervisor vs host VM (which is rather
orthogonal to the above problem): indeed, FRED is disabled in the pKVM
hypervisor [3] while in the host VM it is kept enabled if it was
enabled before deprivileging [4], and the host VM "owns" FRED, i.e. all
FRED-related MSRs are passed-through to the host VM, and
VM_EXIT_SAVE_IA32_FRED and VM_EXIT_LOAD_IA32_FRED are *not* enabled for
the host VM. Please anyone let me know if such a setup is problematic in
any way.
[1] https://lore.kernel.org/kvm/20251026201911.505204-1-xin@zytor.com/
[2] https://android-review.googlesource.com/4225278
[3] https://android.googlesource.com/kernel/common/+/d13d0c68ee9106a26a20cbab4a653f0d8dd4691f/arch/x86/kvm/vmx/pkvm_init.c#909
[4] https://android.googlesource.com/kernel/common/+/d13d0c68ee9106a26a20cbab4a653f0d8dd4691f/arch/x86/kvm/vmx/pkvm_init.c#794
prev parent reply other threads:[~2026-08-12 15:50 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-10 6:49 Sergey Senozhatsky
2026-08-10 7:38 ` Sergey Senozhatsky
2026-08-10 8:58 ` Sergey Senozhatsky
2026-08-10 9:03 ` Peter Zijlstra
2026-08-10 9:09 ` Sergey Senozhatsky
2026-08-10 9:23 ` Peter Zijlstra
2026-08-10 13:51 ` Sean Christopherson
2026-08-10 14:47 ` Sergey Senozhatsky
2026-08-10 10:06 ` David Laight
2026-08-10 10:40 ` Sergey Senozhatsky
2026-08-10 15:40 ` H. Peter Anvin
2026-08-11 1:47 ` Sergey Senozhatsky
2026-08-11 3:11 ` H. Peter Anvin
2026-08-11 5:37 ` Xin Li
2026-08-11 7:05 ` Sergey Senozhatsky
2026-08-12 15:50 ` Dmytro Maluka [this message]
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=anyWM1ZXu70zCla9@google.com \
--to=dmaluka@google.com \
--cc=chuanxiao.dong@intel.com \
--cc=hpa@zytor.com \
--cc=jaszczyk@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=senozhatsky@chromium.org \
--cc=tglx@kernel.org \
--cc=vineeth@bitbyteword.org \
--cc=x86@kernel.org \
--cc=xin@zytor.com \
/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
all inboxes | Powered by JetHome®