Each of the users of the int13 drive registration routines basically does the same thing. Register the drive, try to boot it. Return error on failure, and unregiser unless keep_san is set.
This patch consolidates each of those users into a common helper function. Perhaps keepsan.c needs a new name, but I think this is a decent place to put it. --- src/arch/i386/include/int13.h | 1 + src/arch/i386/interface/pcbios/aoeboot.c | 13 +----------- src/arch/i386/interface/pcbios/ib_srpboot.c | 13 +----------- src/arch/i386/interface/pcbios/int13.c | 1 + src/arch/i386/interface/pcbios/iscsiboot.c | 13 +----------- src/arch/i386/interface/pcbios/keepsan.c | 29 ++++++++++++++++++++++++++- src/include/gpxe/sanboot.h | 3 +- 7 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/arch/i386/include/int13.h b/src/arch/i386/include/int13.h index e1884d9..fbd13c0 100644 --- a/src/arch/i386/include/int13.h +++ b/src/arch/i386/include/int13.h @@ -288,5 +288,6 @@ struct master_boot_record { extern void register_int13_drive ( struct int13_drive *drive ); extern void unregister_int13_drive ( struct int13_drive *drive ); extern int int13_boot ( unsigned int drive ); +extern int register_and_boot_drive ( struct int13_drive *drive ); #endif /* INT13_H */ diff --git a/src/arch/i386/interface/pcbios/aoeboot.c b/src/arch/i386/interface/pcbios/aoeboot.c index 2670b15..f30e950 100644 --- a/src/arch/i386/interface/pcbios/aoeboot.c +++ b/src/arch/i386/interface/pcbios/aoeboot.c @@ -49,18 +49,7 @@ static int aoeboot ( const char *root_path ) { drive->blockdev = &ata->blockdev; - register_int13_drive ( drive ); - printf ( "Registered as BIOS drive %#02x\n", drive->drive ); - printf ( "Booting from BIOS drive %#02x\n", drive->drive ); - rc = int13_boot ( drive->drive ); - printf ( "Boot failed\n" ); - - /* Leave drive registered, if instructed to do so */ - if ( keep_san() ) - return rc; - - printf ( "Unregistering BIOS drive %#02x\n", drive->drive ); - unregister_int13_drive ( drive ); + rc = register_and_boot_drive ( drive ); err_init: aoe_detach ( ata ); diff --git a/src/arch/i386/interface/pcbios/ib_srpboot.c b/src/arch/i386/interface/pcbios/ib_srpboot.c index b1cbc33..247a4f8 100644 --- a/src/arch/i386/interface/pcbios/ib_srpboot.c +++ b/src/arch/i386/interface/pcbios/ib_srpboot.c @@ -44,18 +44,7 @@ static int ib_srpboot ( const char *root_path ) { container_of ( scsi->backend, struct srp_device, refcnt ); sbft_fill_data ( srp ); - register_int13_drive ( drive ); - printf ( "Registered as BIOS drive %#02x\n", drive->drive ); - printf ( "Booting from BIOS drive %#02x\n", drive->drive ); - rc = int13_boot ( drive->drive ); - printf ( "Boot failed\n" ); - - /* Leave drive registered, if instructed to do so */ - if ( keep_san() ) - return rc; - - printf ( "Unregistering BIOS drive %#02x\n", drive->drive ); - unregister_int13_drive ( drive ); + rc = register_and_boot_drive ( drive ); err_init: srp_detach ( scsi ); diff --git a/src/arch/i386/interface/pcbios/int13.c b/src/arch/i386/interface/pcbios/int13.c index 87b613a..6f8a32c 100644 --- a/src/arch/i386/interface/pcbios/int13.c +++ b/src/arch/i386/interface/pcbios/int13.c @@ -713,3 +713,4 @@ int int13_boot ( unsigned int drive ) { return -ECANCELED; /* -EIMPOSSIBLE */ } + diff --git a/src/arch/i386/interface/pcbios/iscsiboot.c b/src/arch/i386/interface/pcbios/iscsiboot.c index 00efd8f..1ec083a 100644 --- a/src/arch/i386/interface/pcbios/iscsiboot.c +++ b/src/arch/i386/interface/pcbios/iscsiboot.c @@ -46,18 +46,7 @@ static int iscsiboot ( const char *root_path ) { container_of ( scsi->backend, struct iscsi_session, refcnt ); ibft_fill_data ( netdev, iscsi ); - register_int13_drive ( drive ); - printf ( "Registered as BIOS drive %#02x\n", drive->drive ); - printf ( "Booting from BIOS drive %#02x\n", drive->drive ); - rc = int13_boot ( drive->drive ); - printf ( "Boot failed\n" ); - - /* Leave drive registered, if instructed to do so */ - if ( keep_san() ) - return rc; - - printf ( "Unregistering BIOS drive %#02x\n", drive->drive ); - unregister_int13_drive ( drive ); + rc = register_and_boot_drive ( drive ); err_init: iscsi_detach ( scsi ); diff --git a/src/arch/i386/interface/pcbios/keepsan.c b/src/arch/i386/interface/pcbios/keepsan.c index 904e017..22ba4b5 100644 --- a/src/arch/i386/interface/pcbios/keepsan.c +++ b/src/arch/i386/interface/pcbios/keepsan.c @@ -5,6 +5,7 @@ #include <gpxe/init.h> #include <gpxe/sanboot.h> #include <usr/autoboot.h> +#include <int13.h> struct setting keep_san_setting __setting = { .name = "keep-san", @@ -13,7 +14,7 @@ struct setting keep_san_setting __setting = { .type = &setting_type_int8, }; -int keep_san ( void ) { +static int keep_san ( void ) { int keep_san; keep_san = fetch_intz_setting ( NULL, &keep_san_setting ); @@ -24,3 +25,29 @@ int keep_san ( void ) { shutdown_exit_flags |= SHUTDOWN_KEEP_DEVICES; return 1; } + +/** + * Register an INT 13 drive with the BIOS, and possibly boot it + * + * @v drive Drive number + * @ret rc Return status code + * + * If a boot operation is requested and performed successfully, + * this function will never return. + */ +int register_and_boot_drive ( struct int13_drive *drive ) { + int rc; + + register_int13_drive ( drive ); + printf ( "Registered as BIOS drive %#02x\n", drive->drive ); + printf ( "Booting from BIOS drive %#02x\n", drive->drive ); + rc = int13_boot ( drive->drive ); + printf ( "Boot failed\n" ); + + /* Leave drive registered, if instructed to do so */ + if ( !keep_san() ) { + printf ( "Unregistering BIOS drive %#02x\n", drive->drive ); + unregister_int13_drive ( drive ); + } + return rc; +} diff --git a/src/include/gpxe/sanboot.h b/src/include/gpxe/sanboot.h index fd06316..20b5063 100644 --- a/src/include/gpxe/sanboot.h +++ b/src/include/gpxe/sanboot.h @@ -15,6 +15,7 @@ struct sanboot_protocol { #define __sanboot_protocol __table_entry ( SANBOOT_PROTOCOLS, 01 ) -extern int keep_san ( void ); +struct int13_drive; +int register_and_boot_drive ( struct int13_drive *drive ); #endif /* _GPXE_SANBOOT_H */ -- 1.7.1.rc2 _______________________________________________ gPXE mailing list gPXE@etherboot.org http://etherboot.org/mailman/listinfo/gpxe