From b20fe3231511ca802235271df0a3442913a3b4a2 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 22 Jan 2014 14:03:57 +0000 Subject: [PATCH] [vesafb] Handle failures from fbcon_init() Signed-off-by: Michael Brown --- src/arch/i386/interface/pcbios/vesafb.c | 36 ++++++++++++++++++------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/arch/i386/interface/pcbios/vesafb.c b/src/arch/i386/interface/pcbios/vesafb.c index 557f9017..480c9acf 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(); } /**