]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[int13] Test correct return status from INT 13 calls
authorMichael Brown <mcb30@ipxe.org>
Thu, 26 Jan 2017 09:45:19 +0000 (09:45 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 26 Jan 2017 09:45:19 +0000 (09:45 +0000)
INT 13 calls return a status value via %ah, with CF set if %ah is
non-zero (indicating an error).  Our wrappers zero the whole of %ax if
CF is clear, to allow C code (which has no easy access to CF) to
simply test for a non-zero status to detect an error.

The current code assigns the returned status to a uint8_t, effectively
testing %al rather than %ah.  Fix by treating the returned status as a
uint16_t instead.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/interface/pcbios/int13.c

index 8b2e134b5d47d540c64818161f41b5b47b5c75cc..3e03e8c5db62e622417ba67ee046e1cc2d5215ad 100644 (file)
@@ -1751,7 +1751,7 @@ static void int13_unhook ( unsigned int drive ) {
  * @ret rc             Return status code
  */
 static int int13_load_mbr ( unsigned int drive, struct segoff *address ) {
-       uint8_t status;
+       uint16_t status;
        int discard_b, discard_c, discard_d;
        uint16_t magic;
 
@@ -1775,7 +1775,7 @@ static int int13_load_mbr ( unsigned int drive, struct segoff *address ) {
                               : "a" ( 0x0201 ), "b" ( *address ),
                                 "c" ( 1 ), "d" ( drive ) );
        if ( status ) {
-               DBG ( "INT13 drive %02x could not read MBR (status %02x)\n",
+               DBG ( "INT13 drive %02x could not read MBR (status %04x)\n",
                      drive, status );
                return -EIO;
        }
@@ -1818,7 +1818,7 @@ static int int13_load_eltorito ( unsigned int drive, struct segoff *address ) {
                struct eltorito_validation_entry valid;
                struct eltorito_boot_entry boot;
        } __attribute__ (( packed )) catalog;
-       uint8_t status;
+       uint16_t status;
 
        /* Use INT 13, 4d to read the boot catalog */
        __asm__ __volatile__ ( REAL_CODE ( "stc\n\t"
@@ -1833,7 +1833,7 @@ static int int13_load_eltorito ( unsigned int drive, struct segoff *address ) {
                                 "S" ( __from_data16 ( &eltorito_cmd ) ) );
        if ( status ) {
                DBG ( "INT13 drive %02x could not read El Torito boot catalog "
-                     "(status %02x)\n", drive, status );
+                     "(status %04x)\n", drive, status );
                return -EIO;
        }
        copy_from_user ( &catalog, phys_to_user ( eltorito_cmd.buffer ), 0,
@@ -1880,7 +1880,7 @@ static int int13_load_eltorito ( unsigned int drive, struct segoff *address ) {
                                 "S" ( __from_data16 ( &eltorito_address ) ) );
        if ( status ) {
                DBG ( "INT13 drive %02x could not read El Torito boot image "
-                     "(status %02x)\n", drive, status );
+                     "(status %04x)\n", drive, status );
                return -EIO;
        }