|
@@ -371,6 +371,21 @@ static int vesafb_select_mode ( const uint16_t *mode_numbers,
|
371
|
371
|
return best_mode_number;
|
372
|
372
|
}
|
373
|
373
|
|
|
374
|
+/**
|
|
375
|
+ * Restore video mode
|
|
376
|
+ *
|
|
377
|
+ */
|
|
378
|
+static void vesafb_restore ( void ) {
|
|
379
|
+ uint32_t discard_a;
|
|
380
|
+
|
|
381
|
+ /* Restore saved VGA mode */
|
|
382
|
+ __asm__ __volatile__ ( REAL_CODE ( "int $0x10" )
|
|
383
|
+ : "=a" ( discard_a )
|
|
384
|
+ : "a" ( VBE_SET_VGA_MODE | vesafb.saved_mode ) );
|
|
385
|
+ DBGC ( &vbe_buf, "VESAFB restored VGA mode %#02x\n",
|
|
386
|
+ vesafb.saved_mode );
|
|
387
|
+}
|
|
388
|
+
|
374
|
389
|
/**
|
375
|
390
|
* Initialise VESA frame buffer
|
376
|
391
|
*
|
|
@@ -412,10 +427,18 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
|
412
|
427
|
vesafb_font();
|
413
|
428
|
|
414
|
429
|
/* Initialise frame buffer console */
|
415
|
|
- fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
|
416
|
|
- &vesafb.pixel, &vesafb.map, &vesafb.font, pixbuf );
|
|
430
|
+ if ( ( rc = fbcon_init ( &vesafb.fbcon, phys_to_user ( vesafb.start ),
|
|
431
|
+ &vesafb.pixel, &vesafb.map, &vesafb.font,
|
|
432
|
+ pixbuf ) ) != 0 )
|
|
433
|
+ goto err_fbcon_init;
|
|
434
|
+
|
|
435
|
+ free ( mode_numbers );
|
|
436
|
+ return 0;
|
417
|
437
|
|
|
438
|
+ fbcon_fini ( &vesafb.fbcon );
|
|
439
|
+ err_fbcon_init:
|
418
|
440
|
err_set_mode:
|
|
441
|
+ vesafb_restore();
|
419
|
442
|
err_select_mode:
|
420
|
443
|
free ( mode_numbers );
|
421
|
444
|
err_mode_list:
|
|
@@ -427,17 +450,12 @@ static int vesafb_init ( unsigned int min_width, unsigned int min_height,
|
427
|
450
|
*
|
428
|
451
|
*/
|
429
|
452
|
static void vesafb_fini ( void ) {
|
430
|
|
- uint32_t discard_a;
|
431
|
453
|
|
432
|
454
|
/* Finalise frame buffer console */
|
433
|
455
|
fbcon_fini ( &vesafb.fbcon );
|
434
|
456
|
|
435
|
|
- /* Restore VGA mode */
|
436
|
|
- __asm__ __volatile__ ( REAL_CODE ( "int $0x10" )
|
437
|
|
- : "=a" ( discard_a )
|
438
|
|
- : "a" ( VBE_SET_VGA_MODE | vesafb.saved_mode ) );
|
439
|
|
- DBGC ( &vbe_buf, "VESAFB restored VGA mode %#02x\n",
|
440
|
|
- vesafb.saved_mode );
|
|
457
|
+ /* Restore saved VGA mode */
|
|
458
|
+ vesafb_restore();
|
441
|
459
|
}
|
442
|
460
|
|
443
|
461
|
/**
|