From ab5b3abbbac98eb52109c34058e1999df7dd0b86 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 20 Mar 2016 09:16:13 +0000 Subject: [PATCH] [int13] Allow drive to be hooked using the natural drive number Interpret the maximum drive number (0xff for hard disks, 0x7f for floppy disks) as meaning "use natural drive number". Signed-off-by: Michael Brown --- src/arch/x86/interface/pcbios/int13.c | 8 ++++++-- src/include/ipxe/sanboot.h | 2 +- src/usr/autoboot.c | 10 ++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/arch/x86/interface/pcbios/int13.c b/src/arch/x86/interface/pcbios/int13.c index 38880e4f0..3b3f87306 100644 --- a/src/arch/x86/interface/pcbios/int13.c +++ b/src/arch/x86/interface/pcbios/int13.c @@ -1588,7 +1588,7 @@ static void int13_free ( struct refcnt *refcnt ) { * * @v uri URI * @v drive Drive number - * @ret rc Return status code + * @ret drive Drive number, or negative error * * Registers the drive with the INT 13 emulation subsystem, and hooks * the INT 13 interrupt vector (if not already hooked). @@ -1603,6 +1603,10 @@ static int int13_hook ( struct uri *uri, unsigned int drive ) { int13_sync_num_drives(); natural_drive = ( ( drive & 0x80 ) ? ( num_drives | 0x80 ) : num_fdds ); + /* Use natural drive number if directed to do so */ + if ( ( drive & 0x7f ) == 0x7f ) + drive = natural_drive; + /* Check that drive number is not in use */ list_for_each_entry ( int13, &int13s, list ) { if ( int13->drive == drive ) { @@ -1661,7 +1665,7 @@ static int int13_hook ( struct uri *uri, unsigned int drive ) { int13_sync_num_drives(); free ( scratch ); - return 0; + return drive; err_guess_geometry: err_parse_iso9660: diff --git a/src/include/ipxe/sanboot.h b/src/include/ipxe/sanboot.h index 57025f2c6..041e18935 100644 --- a/src/include/ipxe/sanboot.h +++ b/src/include/ipxe/sanboot.h @@ -70,7 +70,7 @@ unsigned int san_default_drive ( void ); * * @v uri URI * @v drive Drive number - * @ret rc Return status code + * @ret drive Drive number, or negative error */ int san_hook ( struct uri *uri, unsigned int drive ); diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index e93b0150d..57bf96ef2 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -127,7 +127,9 @@ int uriboot ( struct uri *filename, struct uri *root_path, int drive, /* Hook SAN device, if applicable */ if ( root_path ) { - if ( ( rc = san_hook ( root_path, drive ) ) != 0 ) { + drive = san_hook ( root_path, drive ); + if ( drive < 0 ) { + rc = drive; printf ( "Could not open SAN device: %s\n", strerror ( rc ) ); goto err_san_hook; @@ -136,7 +138,7 @@ int uriboot ( struct uri *filename, struct uri *root_path, int drive, } /* Describe SAN device, if applicable */ - if ( ( drive >= 0 ) && ! ( flags & URIBOOT_NO_SAN_DESCRIBE ) ) { + if ( ! ( flags & URIBOOT_NO_SAN_DESCRIBE ) ) { if ( ( rc = san_describe ( drive ) ) != 0 ) { printf ( "Could not describe SAN device %#02x: %s\n", drive, strerror ( rc ) ); @@ -170,7 +172,7 @@ int uriboot ( struct uri *filename, struct uri *root_path, int drive, } /* Attempt SAN boot if applicable */ - if ( ( drive >= 0 ) && ! ( flags & URIBOOT_NO_SAN_BOOT ) ) { + if ( ! ( flags & URIBOOT_NO_SAN_BOOT ) ) { if ( fetch_intz_setting ( NULL, &skip_san_boot_setting) == 0 ) { printf ( "Booting from SAN device %#02x\n", drive ); rc = san_boot ( drive ); @@ -188,7 +190,7 @@ int uriboot ( struct uri *filename, struct uri *root_path, int drive, err_download: err_san_describe: /* Unhook SAN device, if applicable */ - if ( ( drive >= 0 ) && ! ( flags & URIBOOT_NO_SAN_UNHOOK ) ) { + if ( ! ( flags & URIBOOT_NO_SAN_UNHOOK ) ) { if ( fetch_intz_setting ( NULL, &keep_san_setting ) == 0 ) { san_unhook ( drive ); printf ( "Unregistered SAN device %#02x\n", drive );