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