From: Michael Brown Date: Wed, 22 Jan 2014 14:03:57 +0000 (+0000) Subject: [vesafb] Handle failures from fbcon_init() X-Git-Tag: v1.20.1~1296 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b20fe3231511ca802235271df0a3442913a3b4a2;p=thirdparty%2Fipxe.git [vesafb] Handle failures from fbcon_init() Signed-off-by: Michael Brown --- 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 @@ -371,6 +371,21 @@ static int vesafb_select_mode ( const uint16_t *mode_numbers, return best_mode_number; } +/** + * 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 * @@ -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(); } /**