|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/vPIC: register only one ELCR handler instance
On 29.05.2023 10:39, Roger Pau Monné wrote:
> On Fri, May 26, 2023 at 09:35:04AM +0200, Jan Beulich wrote:
>> There's no point consuming two port-I/O slots. Even less so considering
>> that some real hardware permits both ports to be accessed in one go,
>> emulating of which requires there to be only a single instance.
>>
>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>
>> --- a/xen/arch/x86/hvm/vpic.c
>> +++ b/xen/arch/x86/hvm/vpic.c
>> @@ -377,25 +377,34 @@ static int cf_check vpic_intercept_elcr_
>> int dir, unsigned int port, unsigned int bytes, uint32_t *val)
>> {
>> struct hvm_hw_vpic *vpic;
>> - uint32_t data;
>> + unsigned int data, shift = 0;
>>
>> - BUG_ON(bytes != 1);
>> + BUG_ON(bytes > 2 - (port & 1));
>>
>> vpic = ¤t->domain->arch.hvm.vpic[port & 1];
>>
>> - if ( dir == IOREQ_WRITE )
>> - {
>> - /* Some IRs are always edge trig. Slave IR is always level trig. */
>> - data = *val & vpic_elcr_mask(vpic);
>> - if ( vpic->is_master )
>> - data |= 1 << 2;
>> - vpic->elcr = data;
>> - }
>> - else
>> - {
>> - /* Reader should not see hardcoded level-triggered slave IR. */
>> - *val = vpic->elcr & vpic_elcr_mask(vpic);
>> - }
>> + do {
>> + if ( dir == IOREQ_WRITE )
>> + {
>> + /* Some IRs are always edge trig. Slave IR is always level
>> trig. */
>> + data = (*val >> shift) & vpic_elcr_mask(vpic);
>> + if ( vpic->is_master )
>> + data |= 1 << 2;
>
> Not that you added this, but I'm confused. The spec I'm reading
> explicitly states that bits 0:2 are reserved and must be 0.
>
> Is this some quirk of the specific chipset we aim to emulate?
I don't think so. Note that upon reads the bit is masked out again.
Adding back further context, there's even a comment to this effect:
+ else
+ {
+ /* Reader should not see hardcoded level-triggered slave IR. */
+ data = vpic->elcr & vpic_elcr_mask(vpic);
The setting of the bit is solely for internal handling purposes,
aiui.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |