mirror of https://github.com/ipxe/ipxe.git
[vesafb] Handle failures from fbcon_init()
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/17/head
parent
c6c8078964
commit
b20fe32315
|
@ -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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue