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