|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86emul: correct and extend IDT entry checks
>>> On 06.12.16 at 14:36, <andrew.cooper3@xxxxxxxxxx> wrote:
> On 06/12/16 11:23, Jan Beulich wrote:
>> In order to pre-determine whether a fault will occur upon software
>> interrupt injection, it is not sufficient to just check P and DPL. Do
>> at least all the checks on the IDT entry itself, and in particular do
>> the #NP check last. The checks for the new CS (and perhaps SS) are left
>> out for now, though.
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxxx>
>
> However, I would like to confirm the GP/NP ordering with an XTF test.
> Given the number of times this has gone wrong in the past, it would be
> best not to take chances.
So would you prefer me to wait with committing this until you have
that test in place?
>> --- a/xen/arch/x86/x86_emulate/x86_emulate.c
>> +++ b/xen/arch/x86/x86_emulate/x86_emulate.c
>> @@ -1663,7 +1663,7 @@ static int inject_swint(enum x86_swint_t
>> if ( !in_realmode(ctxt, ops) )
>> {
>> unsigned int idte_size, idte_offset;
>> - struct { uint32_t a, b, c, d; } idte;
>> + struct { uint32_t a, b, c, d; } idte = {};
>> int lm = in_longmode(ctxt, ops);
>>
>> if ( lm < 0 )
>> @@ -1708,12 +1708,27 @@ static int inject_swint(enum x86_swint_t
>> return rc;
>> }
>>
>> - /* Is this entry present? */
>> - if ( !(idte.b & (1u << 15)) )
>> + /* This must be an interrupt, trap, or task gate. */
>> +#ifdef __XEN__
>> + switch ( (idte.b >> 8) & 0x1f )
>> {
>> - fault_type = EXC_NP;
>> + case SYS_DESC_irq_gate:
>> + case SYS_DESC_trap_gate:
>> + break;
>> + case SYS_DESC_irq_gate16:
>> + case SYS_DESC_trap_gate16:
>> + case SYS_DESC_task_gate:
>> + if ( !lm )
>> + break;
>> + /* fall through */
>> + default:
>> goto raise_exn;
>> }
>> +#endif
>> +
>> + /* The 64-bit high half's type must be zero. */
>> + if ( idte.d & 0x1f00 )
>> + goto raise_exn;
>
> It's rather odd to have the 64bit check outside of the #if __XEN__.
> Then again, the test harness won't enter this function due to the lack
> of x86_seg_idtr, so perhaps it doesn't matter.
Well, the conditional is there just to prevent a build failure (due to
the missing SYS_DESC_* definitions). Once we've found a reasonable
way to make those arch definitions re-usable, that conditional could
go away.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |