mirror of
https://github.com/ipxe/ipxe
synced 2025-12-13 15:31:42 +03:00
Allow re-entrancy and provide a global counter of the number of
interrupts hooked.
This commit is contained in:
@@ -7,6 +7,17 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hooked interrupt count
|
||||||
|
*
|
||||||
|
* At exit, after unhooking all possible interrupts, this counter
|
||||||
|
* should be examined. If it is non-zero, it means that we failed to
|
||||||
|
* unhook at least one interrupt vector, and so must not free up the
|
||||||
|
* memory we are using. (Note that this also implies that we should
|
||||||
|
* re-hook INT 15 in order to hide ourselves from the memory map).
|
||||||
|
*/
|
||||||
|
int hooked_bios_interrupts = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hook INT vector
|
* Hook INT vector
|
||||||
*
|
*
|
||||||
@@ -26,9 +37,15 @@ void hook_bios_interrupt ( unsigned int interrupt, unsigned int handler,
|
|||||||
.offset = handler,
|
.offset = handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if ( ( chain_vector->segment != 0 ) ||
|
||||||
|
( chain_vector->offset != 0 ) ) {
|
||||||
|
/* Already hooked; do nothing */
|
||||||
|
return;
|
||||||
|
}
|
||||||
copy_from_real ( chain_vector, 0, ( interrupt * 4 ),
|
copy_from_real ( chain_vector, 0, ( interrupt * 4 ),
|
||||||
sizeof ( *chain_vector ) );
|
sizeof ( *chain_vector ) );
|
||||||
copy_to_real ( 0, ( interrupt * 4 ), &vector, sizeof ( vector ) );
|
copy_to_real ( 0, ( interrupt * 4 ), &vector, sizeof ( vector ) );
|
||||||
|
hooked_bios_interrupts++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,5 +70,8 @@ int unhook_bios_interrupt ( unsigned int interrupt, unsigned int handler,
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
copy_to_real ( 0, ( interrupt * 4 ), chain_vector,
|
copy_to_real ( 0, ( interrupt * 4 ), chain_vector,
|
||||||
sizeof ( *chain_vector ) );
|
sizeof ( *chain_vector ) );
|
||||||
|
chain_vector->segment = 0;
|
||||||
|
chain_vector->offset = 0;
|
||||||
|
hooked_bios_interrupts--;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user