On 26.02.2025 14:37, Andrew Cooper wrote:
> On 26/02/2025 12:39 pm, Jan Beulich wrote:
>> On 24.02.2025 17:05, Andrew Cooper wrote:
>>> --- /dev/null
>>> +++ b/xen/arch/x86/include/asm/gen-idt.h
>>> @@ -0,0 +1,121 @@
>>> +/*
>>> + * Generator for IDT entries.
>>> + *
>>> + * Caller to provide GEN(vector, symbol, dpl, autogen) macro
>>> + *
>>> + * Symbols are 'entry_0xYY' if there is no better name available.  Regular
>>> + * handlers set autogen=1, while manual (autogen=0) require the symbol to 
>>> be
>>> + * implemented somewhere else.
>>> + */
>> Doesn't this need something for Eclair to spot the deliberate absence of a
>> header guard?
> 
> Eclair doesn't complain, although I'm not entirely sure why.
> 
>>> +#define DPL0 0
>>> +#define DPL1 1
>>> +#define DPL3 3
>>> +
>>> +#define manual 0
>>> +#define autogen 1
>>> +
>>> +#define GEN16(i) \
>>> +    GEN(0x ## i ## 0, entry_0x ## i ## 0, DPL0, autogen) \
>>> +    GEN(0x ## i ## 1, entry_0x ## i ## 1, DPL0, autogen) \
>>> +    GEN(0x ## i ## 2, entry_0x ## i ## 2, DPL0, autogen) \
>>> +    GEN(0x ## i ## 3, entry_0x ## i ## 3, DPL0, autogen) \
>>> +    GEN(0x ## i ## 4, entry_0x ## i ## 4, DPL0, autogen) \
>>> +    GEN(0x ## i ## 5, entry_0x ## i ## 5, DPL0, autogen) \
>>> +    GEN(0x ## i ## 6, entry_0x ## i ## 6, DPL0, autogen) \
>>> +    GEN(0x ## i ## 7, entry_0x ## i ## 7, DPL0, autogen) \
>>> +    GEN(0x ## i ## 8, entry_0x ## i ## 8, DPL0, autogen) \
>>> +    GEN(0x ## i ## 9, entry_0x ## i ## 9, DPL0, autogen) \
>>> +    GEN(0x ## i ## a, entry_0x ## i ## a, DPL0, autogen) \
>>> +    GEN(0x ## i ## b, entry_0x ## i ## b, DPL0, autogen) \
>>> +    GEN(0x ## i ## c, entry_0x ## i ## c, DPL0, autogen) \
>>> +    GEN(0x ## i ## d, entry_0x ## i ## d, DPL0, autogen) \
>>> +    GEN(0x ## i ## e, entry_0x ## i ## e, DPL0, autogen) \
>>> +    GEN(0x ## i ## f, entry_0x ## i ## f, DPL0, autogen)
>>> +
>>> +
>>> +GEN(0x00, entry_DE,         DPL0, manual)
>>> +GEN(0x01, entry_DB,         DPL0, manual)
>>> +GEN(0x02, entry_NMI,        DPL0, manual)
>>> +GEN(0x03, entry_BP,         DPL3, manual)
>>> +GEN(0x04, entry_OF,         DPL3, manual)
>> Would this better be
>>
>> #ifdef CONFIG_PV32
>> GEN(0x04, entry_OF,         DPL3, manual)
>> #else
>> GEN(0x04, entry_0x04,       DPL0, autogen)
>> #endif
>>
>> ? (Not necessarily in this patch, but in principle.)
> 
> No.  INTO can still be used in compatibility mode segment.

Oh, of course.

> Furthermore, for any exception we know about, we want a manual one to
> avoid the error-code realignment logic where possible.

Why would that not apply to Co-processor Segment Overrun then?

>>> --- /dev/null
>>> +++ b/xen/arch/x86/include/asm/gen-idt.lds.h
>>> @@ -0,0 +1,27 @@
>>> +/*
>>> + * Linker file fragment to help format the IDT correctly
>>> + *
>>> + * The IDT, having grown compatibly since the 16 bit days, has the 
>>> entrypoint
>>> + * address field split into 3.  x86 ELF lacks the @lo/@hi/etc relocation 
>>> forms
>>> + * commonly found in other architectures for accessing a part of a resolved
>>> + * symbol address.
>>> + *
>>> + * However, the linker can perform the necessary calculations and provide 
>>> them
>>> + * under new symbol names.  We use this to generate the low and next 16 
>>> bits
>>> + * of the address for each handler.
>>> + *
>>> + * The upper 32 bits are always a constant as Xen's .text/data/rodata sits 
>>> in
>>> + * a single aligned 1G range, so do not need calculating in this manner.
>>> + */
>>> +#ifndef X86_IDT_GEN_LDS_H
>>> +#define X86_IDT_GEN_LDS_H
>>> +
>>> +#define GEN(vec, sym, dpl, auto)                                        \
>>> +    PROVIDE_HIDDEN(IDT_ ## sym ## _ADDR1 = ABSOLUTE(((sym) & 0xffff))); \
>>> +    PROVIDE_HIDDEN(IDT_ ## sym ## _ADDR2 = ABSOLUTE(((sym >> 16) & 
>>> 0xffff)));
>> Not sure if Eclair gets to see this at all, but maybe better parenthesize
>> sym also in the latter instance?
> 
> Oh, yes.
> 
>> As to the final semicolon - ideally this would be on the use sites of GEN(),
>> for things to look more C-ish. Yet I won't insist, as gen-idt.h ends up
>> looking sufficiently uniform for this to not be a major concern.
> 
> I'm afraid it's necessary (and too in entry stubs).
> 
> It's the GEN16() macro, which expands 16x GEN() on the same line.

Right, as said - the semicolons would need putting after every GEN() invocation,
including in GEN16() (with the final one likely excluded, for the semicolon then
to appear on its use site).

> I could drop the GEN16() macro and do everything longhand, but I suspect
> you'd like that even less.

Indeed.

Jan

Reply via email to