From efd322091d66bf019ac5f13d52f13535e5e4dc68 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 10 Jul 2007 17:08:32 +0100 Subject: [PATCH] Set up %ds *before* testing a value in our data segment (d'oh!). Always send EOI; do not chain to BIOS's default interrupt handler. They are just too unpredictable; at least VMware's seems to kill the machine if you go anywhere near it. Disable interrupts after return from PXENV_UNDI_ISR, just in case some dumb PXE stack enables them. --- src/arch/i386/drivers/net/undiisr.S | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/arch/i386/drivers/net/undiisr.S b/src/arch/i386/drivers/net/undiisr.S index f0b61932..24630148 100644 --- a/src/arch/i386/drivers/net/undiisr.S +++ b/src/arch/i386/drivers/net/undiisr.S @@ -23,14 +23,17 @@ undiisr: pushw %es pusha + /* 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 + pushw %ds + popw %es movw $undinet_params, %di movw $PXENV_UNDI_ISR, %bx movw $PXENV_UNDI_ISR_IN_START, funcflag @@ -38,13 +41,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