undiisr.S: save/restore upper half of %eflags
[people/mdeck/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         pushw   %fs
25         pushw   %gs
26         pushfl
27         pushal
28
29         /* Set up our segment registers */
30         movw    %cs:rm_ds, %ax
31         movw    %ax, %ds
32
33         /* Check that we have an UNDI entry point */
34         cmpw    $0, undinet_entry_point
35         je      chain
36         
37         /* Issue UNDI API call */
38         movw    %ax, %es
39         movw    $undinet_params, %di
40         movw    $PXENV_UNDI_ISR, %bx
41         movw    $PXENV_UNDI_ISR_IN_START, funcflag
42         pushw   %es
43         pushw   %di
44         pushw   %bx
45         lcall   *undinet_entry_point
46         cli     /* Just in case */
47         addw    $6, %sp
48         cmpw    $PXENV_UNDI_ISR_OUT_OURS, funcflag
49         jne     eoi
50         
51 trig:   /* Record interrupt occurence */
52         incb    undiisr_trigger_count
53
54 eoi:    /* Send EOI */
55         movb    $ICR_EOI_NON_SPECIFIC, %al
56         cmpb    $IRQ_PIC_CUTOFF, undiisr_irq
57         jb      1f
58         outb    %al, $PIC2_ICR
59 1:      outb    %al, $PIC1_ICR
60         jmp     exit
61         
62 chain:  /* Chain to next handler */
63         pushfw
64         lcall   *undiisr_next_handler
65         
66 exit:   /* Restore registers and return */
67         popal
68         popfl
69         popw    %gs
70         popw    %fs
71         popw    %es
72         popw    %ds
73         iret
74
75         .section ".data16"
76 undinet_params:
77 status:                 .word   0
78 funcflag:               .word   0
79 bufferlength:           .word   0
80 framelength:            .word   0
81 frameheaderlength:      .word   0
82 frame:                  .word   0, 0
83 prottype:               .byte   0
84 pkttype:                .byte   0