|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/5] x86/hvm: fix handling of accesses to partial r/o MMIO pages
On Mon, Apr 14, 2025 at 05:24:32PM +0200, Jan Beulich wrote:
> On 14.04.2025 15:53, Roger Pau Monné wrote:
> > On Mon, Apr 14, 2025 at 08:33:44AM +0200, Jan Beulich wrote:
> >> On 11.04.2025 12:54, Roger Pau Monne wrote:
> >>> @@ -1981,7 +2056,9 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned
> >>> long gla,
> >>> */
> >>> if ( (p2mt == p2m_mmio_dm) ||
> >>> (npfec.write_access &&
> >>> - (p2m_is_discard_write(p2mt) || (p2mt == p2m_ioreq_server))) )
> >>> + (p2m_is_discard_write(p2mt) || (p2mt == p2m_ioreq_server) ||
> >>> + /* MMIO entries can be r/o if the target mfn is in
> >>> mmio_ro_ranges. */
> >>> + (p2mt == p2m_mmio_direct))) )
> >>> {
> >>> if ( !handle_mmio_with_translation(gla, gfn, npfec) )
> >>> hvm_inject_hw_exception(X86_EXC_GP, 0);
> >>
> >> Aren't we handing too many things to handle_mmio_with_translation() this
> >> way? At the very least you're losing ...
> >>
> >>> @@ -2033,14 +2110,6 @@ int hvm_hap_nested_page_fault(paddr_t gpa,
> >>> unsigned long gla,
> >>> goto out_put_gfn;
> >>> }
> >>>
> >>> - if ( (p2mt == p2m_mmio_direct) && npfec.write_access &&
> >>> npfec.present &&
> >>
> >> ... the .present check.
> >
> > Isn't the p2mt == p2m_mmio_direct check already ensuring the entry is
> > present? Otherwise it's type would be p2m_invalid or p2m_mmio_dm?
>
> Yes (to the 1st question), it kind of is.
>
> > It did seem to me the other checks in this function already assume
> > that by having a valid type the entry is present.
>
> Except for the code above, where we decided to play safe. AT the very least
> if you drop such a check, please say a justifying word in the description.
I've added:
"As part of the fix r/o MMIO accesses are now handled by
handle_mmio_with_translation(), re-using the same logic that was used
for other read-only types part of p2m_is_discard_write(). The page
present check is dropped as type p2m_mmio_direct must have the
present bit set in the PTE."
Let me know if you think that's enough.
> >> I'm also concerned of e.g. VT-x'es APIC access MFN, which is
> >> p2m_mmio_direct.
> >
> > But that won't go into hvm_hap_nested_page_fault() when using
> > cpu_has_vmx_virtualize_apic_accesses (and thus having an APIC page
> > mapped as p2m_mmio_direct)?
> >
> > It would instead be an EXIT_REASON_APIC_ACCESS vmexit which is handled
> > differently?
>
> All true as long as things work as expected (potentially including the guest
> also behaving as expected). Also this was explicitly only an example I could
> readily think of. I'm simply wary of handle_mmio_with_translation() now
> getting things to handle it's not meant to ever see.
How was access to MMIO r/o regions supposed to be handled before
33c19df9a5a0 (~2015)? I see that setting r/o MMIO p2m entries was
added way before to p2m_type_to_flags() and ept_p2m_type_to_flags()
(~2010), yet I can't figure out how writes would be handled back then
that didn't result in a p2m fault and crashing of the domain.
I'm happy to look at other ways to handling this, but given there's
current logic for handling accesses to read-only regions in
hvm_hap_nested_page_fault() I think re-using that was the best way to
also handle accesses to MMIO read-only regions.
Arguably it would already be the case that for other reasons Xen would
need to emulate an instruction that accesses a read-only MMIO region?
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |