(vector & 0x1f)) & 1;
}
+static inline bool apic_tmr_read(unsigned int vector)
+{
+ return apic_read(APIC_TMR + (vector / 32 * 0x10)) & (1U << (vector % 32));
+}
+
static inline bool apic_irr_read(unsigned int vector)
{
return apic_read(APIC_IRR + (vector / 32 * 0x10)) & (1U << (vector % 32));
static void cf_check mask_and_ack_level_ioapic_irq(struct irq_desc *desc)
{
- unsigned long v;
- int i;
+ bool is_level;
irq_complete_move(desc);
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- i = desc->arch.vector;
- v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
+ is_level = apic_tmr_read(desc->arch.vector);
ack_APIC_irq();
!io_apic_level_ack_pending(desc->irq))
move_masked_irq(desc);
- if ( !(v & (1U << (i & 0x1f))) )
+ if ( !is_level )
{
spin_lock(&ioapic_lock);
__edge_IO_APIC_irq(desc->irq);
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- unsigned int v, i = desc->arch.vector;
+ unsigned int i = desc->arch.vector;
+ bool is_level;
/* Manually EOI the old vector if we are moving to the new */
if ( vector && i != vector )
eoi_IO_APIC_irq(desc);
- v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
+ is_level = apic_tmr_read(i);
end_nonmaskable_irq(desc, vector);
!io_apic_level_ack_pending(desc->irq) )
move_native_irq(desc);
- if ( !(v & (1U << (i & 0x1f))) )
+ if ( !is_level )
{
spin_lock(&ioapic_lock);
__mask_IO_APIC_irq(desc->irq);