david/ipxe
Archived
1
0

[vesafb] Handle failures from fbcon_init()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2014-01-22 14:03:57 +00:00
parent c6c8078964
commit b20fe32315

View File

@ -371,6 +371,21 @@ static int vesafb_select_mode ( const uint16_t *mode_numbers,
return best_mode_number; 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 * Initialise VESA frame buffer
* *
@ -412,10 +427,18 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
vesafb_font(); vesafb_font();
/* Initialise frame buffer console */ /* Initialise frame buffer console */
fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ), if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
&vesafb.pixel, &vesafb.map, &vesafb.font, pixbuf ); &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: err_set_mode:
vesafb_restore();
err_select_mode: err_select_mode:
free ( mode_numbers ); free ( mode_numbers );
err_mode_list: err_mode_list:
@ -427,17 +450,12 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
* *
*/ */
static void vesafb_fini ( void ) { static void vesafb_fini ( void ) {
uint32_t discard_a;
/* Finalise frame buffer console */ /* Finalise frame buffer console */
fbcon_fini ( &vesafb.fbcon ); fbcon_fini ( &vesafb.fbcon );
/* Restore VGA mode */ /* Restore saved VGA mode */
__asm__ __volatile__ ( REAL_CODE ( "int $0x10" ) vesafb_restore();
: "=a" ( discard_a )
: "a" ( VBE_SET_VGA_MODE | vesafb.saved_mode ) );
DBGC ( &vbe_buf, "VESAFB restored VGA mode %#02x\n",
vesafb.saved_mode );
} }
/** /**