david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[i386] Add check_bios_interrupts() debug function

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>
This commit is contained in:
Michael Brown 2016-01-12 08:27:59 +00:00
parent 7d48affec2
commit 83c8f2e8e3
2 changed files with 28 additions and 0 deletions

View 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 */

View 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;
}