version 1.3, 2020/05/08 21:43:54 |
version 1.4, 2022/09/07 00:40:19 |
Line 162 struct pic softintr_pic = { |
|
Line 162 struct pic softintr_pic = { |
|
void |
void |
x86_intr_calculatemasks(struct cpu_info *ci) |
x86_intr_calculatemasks(struct cpu_info *ci) |
{ |
{ |
int irq, level, unusedirqs, intrlevel[MAX_INTR_SOURCES]; |
uint64_t unusedirqs, intrlevel[MAX_INTR_SOURCES]; |
|
int irq, level; |
struct intrhand *q; |
struct intrhand *q; |
|
|
/* First, figure out which levels each IRQ uses. */ |
/* First, figure out which levels each IRQ uses. */ |
unusedirqs = 0xffffffff; |
unusedirqs = UINT64_MAX; |
for (irq = 0; irq < MAX_INTR_SOURCES; irq++) { |
for (irq = 0; irq < MAX_INTR_SOURCES; irq++) { |
int levels = 0; |
int levels = 0; |
|
|
Line 175 x86_intr_calculatemasks(struct cpu_info |
|
Line 176 x86_intr_calculatemasks(struct cpu_info |
|
continue; |
continue; |
} |
} |
for (q = ci->ci_isources[irq]->is_handlers; q; q = q->ih_next) |
for (q = ci->ci_isources[irq]->is_handlers; q; q = q->ih_next) |
levels |= 1U << q->ih_level; |
levels |= 1 << q->ih_level; |
intrlevel[irq] = levels; |
intrlevel[irq] = levels; |
if (levels) |
if (levels) |
unusedirqs &= ~(1U << irq); |
unusedirqs &= ~(1ULL << irq); |
} |
} |
|
|
/* Then figure out which IRQs use each level. */ |
/* Then figure out which IRQs use each level. */ |
for (level = 0; level < NIPL; level++) { |
for (level = 0; level < NIPL; level++) { |
int irqs = 0; |
uint64_t irqs = 0; |
for (irq = 0; irq < MAX_INTR_SOURCES; irq++) |
for (irq = 0; irq < MAX_INTR_SOURCES; irq++) |
if (intrlevel[irq] & (1U << level)) |
if (intrlevel[irq] & (1ULL << level)) |
irqs |= 1U << irq; |
irqs |= 1ULL << irq; |
ci->ci_imask[level] = irqs | unusedirqs; |
ci->ci_imask[level] = irqs | unusedirqs; |
} |
} |
|
|