diff options
author | Michael Brown <mcb30@etherboot.org> | 2009-06-28 20:12:16 +0100 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2009-06-28 20:12:16 +0100 |
commit | ee1d315ac06d6fa0dcc95cbd54ee264e838d1b6b (patch) | |
tree | 60b212cb75dd60c0fa90cb879b1e7ba27624e954 | |
parent | 07b5be33413a23e150b84aed41881dfa056e41df (diff) | |
download | ipxe-ee1d315ac06d6fa0dcc95cbd54ee264e838d1b6b.tar.gz |
[pxe] Check for unhookable interrupts in PXENV_STOP_UNDI
PXENV_STOP_UNDI should return PXENV_STATUS_KEEP_UNDI if the UNDI
cannot be safely unloaded (e.g. due to interrupt vectors that could
not be unhooked).
-rw-r--r-- | src/arch/i386/interface/pxe/pxe_preboot.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/arch/i386/interface/pxe/pxe_preboot.c b/src/arch/i386/interface/pxe/pxe_preboot.c index 21461a5ab..3939c7bf5 100644 --- a/src/arch/i386/interface/pxe/pxe_preboot.c +++ b/src/arch/i386/interface/pxe/pxe_preboot.c @@ -37,6 +37,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <gpxe/init.h> #include <gpxe/if_ether.h> #include <basemem_packet.h> +#include <biosint.h> #include "pxe.h" #include "pxe_call.h" @@ -316,6 +317,14 @@ PXENV_EXIT_t pxenv_stop_undi ( struct s_PXENV_STOP_UNDI *stop_undi ) { /* Prepare for unload */ shutdown ( SHUTDOWN_BOOT ); + /* Check to see if we still have any hooked interrupts */ + if ( hooked_bios_interrupts != 0 ) { + DBG ( "PXENV_STOP_UNDI failed: %d interrupts still hooked\n", + hooked_bios_interrupts ); + stop_undi->Status = PXENV_STATUS_KEEP_UNDI; + return PXENV_EXIT_FAILURE; + } + stop_undi->Status = PXENV_STATUS_SUCCESS; return PXENV_EXIT_SUCCESS; } |