Skip to content

Commit

Permalink
UNDI ISR: save and restore 32-bit registers
Browse files Browse the repository at this point in the history
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 committed Feb 11, 2008
1 parent 428c634 commit 621c288
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 621c288

Please sign in to comment.