|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/2] x86/vlapic: Fix handling of writes to APIC_ESR
On 28.11.2024 01:47, Andrew Cooper wrote:
> Xen currently presents APIC_ESR to guests as a simple read/write register.
>
> This is incorrect. The SDM states:
>
> The ESR is a write/read register. Before attempt to read from the ESR,
> software should first write to it. (The value written does not affect the
> values read subsequently; only zero may be written in x2APIC mode.) This
> write clears any previously logged errors and updates the ESR with any
> errors detected since the last write to the ESR. This write also rearms the
> APIC error interrupt triggering mechanism.
>
> Introduce a new pending_esr field in hvm_hw_lapic. Update vlapic_error() to
> accumulate errors here, and extend vlapic_reg_write() to discard the written
> value, and instead transfer pending_esr into APIC_ESR. Reads are still as
> before.
>
> Importantly, this means that guests no longer destroys the ESR value it's
> looking for in the LVTERR handler when following the SDM instructions.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
No Fixes: tag presumably because the issue had been there forever?
> ---
> Slightly RFC. This collides with Alejandro's patch which adds the apic_id
> field to hvm_hw_lapic too. However, this is a far more obvious backport
> candidate.
>
> lapic_check_hidden() might in principle want to audit this field, but it's not
> clear what to check. While prior Xen will never have produced it in the
> migration stream, Intel APIC-V will set APIC_ESR_ILLREGA above and beyond what
> Xen will currently emulate.
The ESR really is an 8-bit value (in a 32-bit register), so checking the
upper bits may be necessary. Plus ...
> --- a/xen/include/public/arch-x86/hvm/save.h
> +++ b/xen/include/public/arch-x86/hvm/save.h
> @@ -394,6 +394,7 @@ struct hvm_hw_lapic {
> uint32_t disabled; /* VLAPIC_xx_DISABLED */
> uint32_t timer_divisor;
> uint64_t tdt_msr;
> + uint32_t pending_esr;
> };
... I think you need to make padding explicit here, and then check that
to be zero.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |