Protect ISR against failure to unhook.
[people/lynusvaz/gpxe.git] / src / arch / i386 / drivers / net / undiisr.S
1 #define PXENV_UNDI_ISR 0x0014
2 #define PXENV_UNDI_ISR_IN_START 1
3 #define PXENV_UNDI_ISR_OUT_OURS 0
4 #define PXENV_UNDI_ISR_OUT_NOT_OURS 1
5
6 #define IRQ_PIC_CUTOFF 8
7 #define ICR_EOI_NON_SPECIFIC 0x20
8 #define PIC1_ICR 0x20
9 #define PIC2_ICR 0xa0
10         
11         .text
12         .arch i386
13         .section ".text16", "ax", @progbits
14         .section ".data16", "aw", @progbits
15         .code16
16
17         .section ".text16"
18         .globl undiisr
19 undiisr:
20         
21         /* Preserve registers */
22         pushw   %ds
23         pushw   %es
24         pusha
25
26         /* Check that we have an UNDI entry point */
27         cmpw    $0, undinet_entry_point
28         je      chain
29         
30         /* Issue UNDI API call */
31         movw    %cs:rm_ds, %ax
32         movw    %ax, %ds
33         movw    %ax, %es
34         movw    $undinet_params, %di
35         movw    $PXENV_UNDI_ISR, %bx
36         movw    $PXENV_UNDI_ISR_IN_START, funcflag
37         pushw   %es
38         pushw   %di
39         pushw   %bx
40         lcall   *undinet_entry_point
41         addw    $6, %sp
42         cmpw    $PXENV_UNDI_ISR_OUT_OURS, funcflag
43         jne     chain
44         
45 ack:    /* Record interrupt occurence */
46         incb    undiisr_trigger_count
47         /* Send EOI */
48         movb    $ICR_EOI_NON_SPECIFIC, %al
49         cmpb    $IRQ_PIC_CUTOFF, undiisr_irq
50         jb      1f
51         outb    %al, $PIC2_ICR
52 1:      outb    %al, $PIC1_ICR
53         jmp     exit
54         
55 chain:  /* Chain to next handler */
56         pushfw
57         lcall   *undiisr_next_handler
58         
59 exit:   /* Restore registers and return */
60         popa
61         popw    %es
62         popw    %ds
63         iret
64
65         .section ".data16"
66 undinet_params:
67 status:                 .word   0
68 funcflag:               .word   0
69 bufferlength:           .word   0
70 framelength:            .word   0
71 frameheaderlength:      .word   0
72 frame:                  .word   0, 0
73 prottype:               .byte   0
74 pkttype:                .byte   0