|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 20/23] x86/pv: Exception handling in FRED mode
On 01.09.2025 15:27, Andrew Cooper wrote:
> On 01/09/2025 1:57 pm, Jan Beulich wrote:
>> On 28.08.2025 17:04, Andrew Cooper wrote:
>>> --- a/xen/arch/x86/traps.c
>>> +++ b/xen/arch/x86/traps.c
>>> @@ -2265,9 +2265,83 @@ void asmlinkage check_ist_exit(const struct
>>> cpu_user_regs *regs, bool ist_exit)
>>>
>>> void asmlinkage entry_from_pv(struct cpu_user_regs *regs)
>>> {
>>> + struct fred_info *fi = cpu_regs_fred_info(regs);
>>> + uint8_t type = regs->fred_ss.type;
>>> + uint8_t vec = regs->fred_ss.vector;
>>> +
>>> /* Copy fred_ss.vector into entry_vector as IDT delivery would have
>>> done. */
>>> - regs->entry_vector = regs->fred_ss.vector;
>>> + regs->entry_vector = vec;
>>> +
>>> + if ( !IS_ENABLED(CONFIG_PV) )
>>> + goto fatal;
>>> +
>>> + /*
>>> + * First, handle the asynchronous or fatal events. These are either
>>> + * unrelated to the interrupted context, or may not have valid context
>>> + * recorded, and all have special rules on how/whether to re-enable
>>> IRQs.
>>> + */
>>> + switch ( type )
>>> + {
>>> + case X86_ET_EXT_INTR:
>>> + return do_IRQ(regs);
>>>
>>> + case X86_ET_NMI:
>>> + return do_nmi(regs);
>>> +
>>> + case X86_ET_HW_EXC:
>>> + switch ( vec )
>>> + {
>>> + case X86_EXC_DF: return do_double_fault(regs);
>>> + case X86_EXC_MC: return do_machine_check(regs);
>> Looking at patch 21, I came to wonder where it is that we're moving back to
>> SL0 in the #MC case (which may not be fatal), for ERETU to not fault.
>
> (Almost) any event taken in Ring3 enters Ring0 at SL0, even those with
> custom STK_LVLS configuration.
>
> See 5.1.2 Determining the New Values for Stack Level, RSP, and SSP
Oh, right - that's something I still need to properly settle in a corner of
my brain.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |