summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2014-01-22 15:03:57 +0100
committerMichael Brown2014-01-22 15:16:30 +0100
commitb20fe3231511ca802235271df0a3442913a3b4a2 (patch)
tree2cb34b2cf3550c8c7f4ffb416dd59163e20c0179
parent[png] Add support for PNG images (diff)
downloadipxe-b20fe3231511ca802235271df0a3442913a3b4a2.tar.gz
ipxe-b20fe3231511ca802235271df0a3442913a3b4a2.tar.xz
ipxe-b20fe3231511ca802235271df0a3442913a3b4a2.zip
[vesafb] Handle failures from fbcon_init()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/i386/interface/pcbios/vesafb.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/src/arch/i386/interface/pcbios/vesafb.c b/src/arch/i386/interface/pcbios/vesafb.c
index 557f9017b..480c9acf7 100644
--- a/src/arch/i386/interface/pcbios/vesafb.c
+++ b/src/arch/i386/interface/pcbios/vesafb.c
@@ -372,6 +372,21 @@ static int vesafb_select_mode ( const uint16_t *mode_numbers,
}
/**
+ * Restore video mode
+ *
+ */
+static void vesafb_restore ( void ) {
+ uint32_t discard_a;
+
+ /* Restore saved VGA mode */
+ __asm__ __volatile__ ( REAL_CODE ( "int $0x10" )
+ : "=a" ( discard_a )
+ : "a" ( VBE_SET_VGA_MODE | vesafb.saved_mode ) );
+ DBGC ( &vbe_buf, "VESAFB restored VGA mode %#02x\n",
+ vesafb.saved_mode );
+}
+
+/**
* Initialise VESA frame buffer
*
* @v min_width Minimum required width (in pixels)
@@ -412,10 +427,18 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
vesafb_font();
/* Initialise frame buffer console */
- fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
- &vesafb.pixel, &vesafb.map, &vesafb.font, pixbuf );
+ if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
+ &vesafb.pixel, &vesafb.map, &vesafb.font,
+ pixbuf ) ) != 0 )
+ goto err_fbcon_init;
+
+ free ( mode_numbers );
+ return 0;
+ fbcon_fini ( &vesafb.fbcon );
+ err_fbcon_init:
err_set_mode:
+ vesafb_restore();
err_select_mode:
free ( mode_numbers );
err_mode_list:
@@ -427,17 +450,12 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
*
*/
static void vesafb_fini ( void ) {
- uint32_t discard_a;
/* Finalise frame buffer console */
fbcon_fini ( &vesafb.fbcon );
- /* Restore VGA mode */
- __asm__ __volatile__ ( REAL_CODE ( "int $0x10" )
- : "=a" ( discard_a )
- : "a" ( VBE_SET_VGA_MODE | vesafb.saved_mode ) );
- DBGC ( &vbe_buf, "VESAFB restored VGA mode %#02x\n",
- vesafb.saved_mode );
+ /* Restore saved VGA mode */
+ vesafb_restore();
}
/**