[pxe] Check for unhookable interrupts in PXENV_STOP_UNDI
authorMichael Brown <mcb30@etherboot.org>
Sun, 28 Jun 2009 19:12:16 +0000 (20:12 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sun, 28 Jun 2009 19:12:16 +0000 (20:12 +0100)
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).

src/arch/i386/interface/pxe/pxe_preboot.c

index 21461a5..3939c7b 100644 (file)
@@ -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;
 }