]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[i386] Add check_bios_interrupts() debug function
authorMichael Brown <mcb30@ipxe.org>
Tue, 12 Jan 2016 08:27:59 +0000 (08:27 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 12 Jan 2016 08:27:59 +0000 (08:27 +0000)
Provide a debug function check_bios_interrupts() to look for changes
to the interrupt vector table.  This can be useful when investigating
the behaviour (including crashes) of external PXE NBPs.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/include/biosint.h
src/arch/i386/interface/pcbios/biosint.c

index 67d6a3811f4afcec71d6409be1945e6e26a747ca..f47116f70db2faaad12b7e2896414a6998faaeb9 100644 (file)
@@ -29,5 +29,6 @@ extern void hook_bios_interrupt ( unsigned int interrupt, unsigned int handler,
 extern int unhook_bios_interrupt ( unsigned int interrupt,
                                   unsigned int handler,
                                   struct segoff *chain_vector );
+extern void check_bios_interrupts ( void );
 
 #endif /* BIOSINT_H */
index 3b8e804387f001db891cc336c6cd7039a6d11bac..667e9ed8135930badf11a998de22538f1fc74341 100644 (file)
@@ -90,3 +90,30 @@ int unhook_bios_interrupt ( unsigned int interrupt, unsigned int handler,
        hooked_bios_interrupts--;
        return 0;
 }
+
+/**
+ * Dump changes to interrupt vector table (for debugging)
+ *
+ */
+void check_bios_interrupts ( void ) {
+       static struct segoff vectors[256];
+       static uint8_t initialised;
+       struct segoff vector;
+       unsigned int i;
+
+       /* Print any changed interrupt vectors */
+       for ( i = 0; i < ( sizeof ( vectors ) / sizeof ( vectors[0] ) ); i++ ) {
+               copy_from_real ( &vector, 0, ( i * sizeof ( vector ) ),
+                                sizeof ( vector ) );
+               if ( memcmp ( &vector, &vectors[i], sizeof ( vector ) ) == 0 )
+                       continue;
+               if ( initialised ) {
+                       dbg_printf ( "INT %02x changed %04x:%04x => "
+                                    "%04x:%04x\n", i, vectors[i].segment,
+                                    vectors[i].offset, vector.segment,
+                                    vector.offset );
+               }
+               memcpy ( &vectors[i], &vector, sizeof ( vectors[i] ) );
+       }
+       initialised = 1;
+}