UNDI ISR: save and restore 32-bit registers
[people/lynusvaz/gpxe.git] / src / arch / i386 / drivers / net / undiisr.S
index f0b6193..15e1a63 100644 (file)
@@ -21,15 +21,19 @@ undiisr:
        /* Preserve registers */
        pushw   %ds
        pushw   %es
-       pusha
+       pushw   %fs
+       pushw   %gs
+       pushal
+
+       /* Set up our segment registers */
+       movw    %cs:rm_ds, %ax
+       movw    %ax, %ds
 
        /* Check that we have an UNDI entry point */
        cmpw    $0, undinet_entry_point
        je      chain
        
        /* Issue UNDI API call */
-       movw    %cs:rm_ds, %ax
-       movw    %ax, %ds
        movw    %ax, %es
        movw    $undinet_params, %di
        movw    $PXENV_UNDI_ISR, %bx
@@ -38,13 +42,15 @@ undiisr:
        pushw   %di
        pushw   %bx
        lcall   *undinet_entry_point
+       cli     /* Just in case */
        addw    $6, %sp
        cmpw    $PXENV_UNDI_ISR_OUT_OURS, funcflag
-       jne     chain
+       jne     eoi
        
-ack:   /* Record interrupt occurence */
+trig:  /* Record interrupt occurence */
        incb    undiisr_trigger_count
-       /* Send EOI */
+
+eoi:   /* Send EOI */
        movb    $ICR_EOI_NON_SPECIFIC, %al
        cmpb    $IRQ_PIC_CUTOFF, undiisr_irq
        jb      1f
@@ -57,7 +63,9 @@ chain:        /* Chain to next handler */
        lcall   *undiisr_next_handler
        
 exit:  /* Restore registers and return */
-       popa
+       popal
+       popw    %gs
+       popw    %fs
        popw    %es
        popw    %ds
        iret