#include <machine/i8259.h>
#include <dev/isa/isareg.h>
.globl isa_strayintr
#define voidop(num)
#define INTRSTUB(name, num, early_ack, late_ack, mask, unmask, level_mask) \
KIDTVEC(resume_##name##num) ;\
push %ebx ;\
cli ;\
jmp 1f ;\
KIDTVEC(recurse_##name##num) ;\
pushfl ;\
pushl %cs ;\
pushl %esi ;\
subl $8,%esp ;\
movl %ebx,%esi ;\
INTRENTRY(recurse_##name##num) ;\
push %esi ;\
cli ;\
jmp 1f ;\
IDTVEC(intr_##name##num) ;\
subl $8,%esp ;\
INTRENTRY(intr_##name##num) ;\
mask(num) ;\
early_ack(num) ;\
incl uvmexp+V_INTR ;\
movl iminlevel + (num) * 4, %eax ;\
movl CPL,%ebx ;\
cmpl %eax,%ebx ;\
jae Xhold_##name##num;\
pushl %ebx ;\
1: ;\
movl imaxlevel + (num) * 4,%eax ;\
movl %eax,CPL ;\
sti ;\
movl intrhand + (num) * 4,%ebx ;\
testl %ebx,%ebx ;\
jz Xstray_##name##num ;\
STRAY_INITIALIZE ;\
incl CPUVAR(IDEPTH) ;\
7: movl %esp, %eax ;\
pushl %ebx ;\
pushl %eax ;\
call intr_handler ;\
addl $8, %esp ;\
STRAY_INTEGRATE ;\
orl %eax,%eax ;\
jz 5f ;\
addl $1,IH_COUNT(%ebx) ;\
adcl $0,IH_COUNT+4(%ebx) ;\
cmpl $0,intr_shared_edge ;\
jne 5f ;\
orl %eax,%eax ;\
jns 8f ;\
5: movl IH_NEXT(%ebx),%ebx ;\
testl %ebx,%ebx ;\
jnz 7b ;\
8: decl CPUVAR(IDEPTH) ;\
STRAY_TEST(name,num) ;\
6: unmask(num) ;\
late_ack(num) ;\
jmp Xdoreti ;\
KIDTVEC(stray_##name##num) ;\
pushl $num ;\
call isa_strayintr ;\
addl $4,%esp ;\
jmp 6b ;\
KIDTVEC(hold_##name##num) ;\
orb $IRQ_BIT(num),CPUVAR(IPENDING) + IRQ_BYTE(num) ;\
CLIDEBUG ;\
INTRFASTEXIT
#if defined(DIAGNOSTIC)
#define CLIDEBUG \
movl $0xfa,%esi
#else
#define CLIDEBUG
#endif
#if defined(DEBUG)
#define STRAY_INITIALIZE \
xorl %esi,%esi
#define STRAY_INTEGRATE \
orl %eax,%esi
#define STRAY_TEST(name,num) \
testl %esi,%esi ;\
jz Xstray_##name##num
#else
#define STRAY_INITIALIZE
#define STRAY_INTEGRATE
#define STRAY_TEST(name,num)
#endif
#define ICUADDR IO_ICU1
INTRSTUB(legacy,0, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,1, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,2, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,3, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,4, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,5, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,6, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,7, i8259_asm_ack1, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
#undef ICUADDR
#define ICUADDR IO_ICU2
INTRSTUB(legacy,8, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,9, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,10, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,11, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,12, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,13, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,14, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
INTRSTUB(legacy,15, i8259_asm_ack2, voidop, i8259_asm_mask, i8259_asm_unmask,
voidop)
.section .rodata
IDTVEC(intr)
.long Xintr_legacy0, Xintr_legacy1
.long Xintr_legacy2, Xintr_legacy3
.long Xintr_legacy4, Xintr_legacy5
.long Xintr_legacy6, Xintr_legacy7
.long Xintr_legacy8, Xintr_legacy9
.long Xintr_legacy10, Xintr_legacy11
.long Xintr_legacy12, Xintr_legacy13
.long Xintr_legacy14, Xintr_legacy15
IDTVEC(resume)
.long Xresume_legacy0, Xresume_legacy1
.long Xresume_legacy2, Xresume_legacy3
.long Xresume_legacy4, Xresume_legacy5
.long Xresume_legacy6, Xresume_legacy7
.long Xresume_legacy8, Xresume_legacy9
.long Xresume_legacy10, Xresume_legacy11
.long Xresume_legacy12, Xresume_legacy13
.long Xresume_legacy14, Xresume_legacy15
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long Xsofttty, Xsoftnet, Xsoftclock
.long 0, 0
IDTVEC(recurse)
.long Xrecurse_legacy0, Xrecurse_legacy1
.long Xrecurse_legacy2, Xrecurse_legacy3
.long Xrecurse_legacy4, Xrecurse_legacy5
.long Xrecurse_legacy6, Xrecurse_legacy7
.long Xrecurse_legacy8, Xrecurse_legacy9
.long Xrecurse_legacy10, Xrecurse_legacy11
.long Xrecurse_legacy12, Xrecurse_legacy13
.long Xrecurse_legacy14, Xrecurse_legacy15
.long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.long Xsofttty, Xsoftnet, Xsoftclock
.long 0, 0