Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
UNDI ISR: save and restore 32-bit registers
As written, if the if the UNDI ISR call clobbers the upper halves of
any of the GPRs (which by convention it is permitted to do, and by
paranoia should be expected to do) then nothing in the interrupt
handler will recover the state.

Additionally, save/restore %fs and %gs out of sheer paranoia - it's a
cheap enough operation, and may prevent problems due to poorly written
UNDI stacks.
  • Loading branch information
H. Peter Anvin authored and Michael Brown committed Feb 11, 2008
1 parent f8a0b5f commit fc9f016
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions src/arch/i386/drivers/net/undiisr.S
Expand Up @@ -21,7 +21,9 @@ undiisr:
/* Preserve registers */
pushw %ds
pushw %es
pusha
pushw %fs
pushw %gs
pushal

/* Set up our segment registers */
movw %cs:rm_ds, %ax
Expand All @@ -32,8 +34,7 @@ undiisr:
je chain

/* Issue UNDI API call */
pushw %ds
popw %es
movw %ax, %es
movw $undinet_params, %di
movw $PXENV_UNDI_ISR, %bx
movw $PXENV_UNDI_ISR_IN_START, funcflag
Expand Down Expand Up @@ -62,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
Expand Down

0 comments on commit fc9f016

Please sign in to comment.