Skip to content

Commit

Permalink
[int13con] Avoid overwriting random portions of SAN boot disks
Browse files Browse the repository at this point in the history
The INT13 console type (CONSOLE_INT13) autodetects at initialisation
time a magic partition to be used for logging iPXE console output.  If
the INT13 drive number mapping is subsequently changed (e.g. because
iPXE was used to perform a SAN boot), then the console logging output
will be written to the incorrect disk.

Fix by recording the INT13 vector at initialisation time, and using
this original vector to emulate INT13 calls for all subsequent
accesses.  This should be robust against drive remapping performed
either by ourselves or by another bootloader (e.g. a chainloaded
undionly.kpxe which then performs a SAN boot).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 27, 2017
1 parent ebceb8a commit c73af29
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions src/arch/x86/interface/pcbios/int13con.c
Expand Up @@ -62,6 +62,10 @@ struct int13con_header {
/** Log partition magic signature */
#define INT13CON_MAGIC "iPXE LOG\n\n"

/** Original INT13 vector */
static struct segoff __bss16 ( int13con_vector );
#define int13con_vector __use_data16 ( int13con_vector )

/** Sector buffer */
static uint8_t __bss16_array ( int13con_buffer, [INT13_BLKSIZE] );
#define int13con_buffer __use_data16 ( int13con_buffer )
Expand Down Expand Up @@ -101,8 +105,13 @@ static int int13con_rw ( unsigned int op, uint64_t lba ) {
int13con_address.buffer.offset = __from_data16 ( int13con_buffer );
int13con_address.lba = lba;

/* Issue INT13 */
__asm__ ( REAL_CODE ( "int $0x13\n\t" )
/* Emulate INT13 via original vector. We do this since iPXE
* (or another subsequent bootloader) may hook INT13 and remap
* drive numbers.
*/
__asm__ ( REAL_CODE ( "pushfw\n\t"
"cli\n\t"
"lcall *int13con_vector\n\t" )
: "=a" ( error )
: "0" ( op << 8 ), "d" ( INT13CON_DRIVE ),
"S" ( __from_data16 ( &int13con_address ) ) );
Expand Down Expand Up @@ -261,6 +270,12 @@ static void int13con_init ( void ) {
return;
}

/* Store original INT13 vector */
copy_from_real ( &int13con_vector, 0, ( 0x13 * 4 ),
sizeof ( int13con_vector ) );
DBG ( "INT13CON using original INT13 vector %04x:%04x\n",
int13con_vector.segment, int13con_vector.offset );

/* Locate log partition */
if ( ( rc = int13con_find() ) != 0)
return;
Expand Down

0 comments on commit c73af29

Please sign in to comment.