diff --git a/src/arch/x86/boot/coreboot_table.c b/src/arch/x86/boot/coreboot_table.c index d056837836..18ec6d8c3c 100644 --- a/src/arch/x86/boot/coreboot_table.c +++ b/src/arch/x86/boot/coreboot_table.c @@ -174,7 +174,12 @@ static void lb_framebuffer(struct lb_header *header) { #if CONFIG_FRAMEBUFFER_KEEP_VESA_MODE void fill_lb_framebuffer(struct lb_framebuffer *framebuffer); + int vbe_mode_info_valid(void); + // If there isn't any mode info to put in the table, don't ask for it + // to be filled with junk. + if (!vbe_mode_info_valid()) + return; struct lb_framebuffer *framebuffer; framebuffer = (struct lb_framebuffer *)lb_new_record(header); framebuffer->tag = LB_TAG_FRAMEBUFFER; diff --git a/src/devices/oprom/include/vbe.h b/src/devices/oprom/include/vbe.h index f857b67af2..ab26d59bf6 100644 --- a/src/devices/oprom/include/vbe.h +++ b/src/devices/oprom/include/vbe.h @@ -105,6 +105,9 @@ typedef struct { struct lb_framebuffer; void vbe_set_graphics(void); +// A way to check if mode information collected by vbe_set_graphics is valid +// and fill_lb_framebuffer will have real information to use. +int vbe_mode_info_valid(void); void vbe_textmode_console(void); void fill_lb_framebuffer(struct lb_framebuffer *framebuffer); diff --git a/src/devices/oprom/x86.c b/src/devices/oprom/x86.c index cc70d74cf5..1791a87f14 100644 --- a/src/devices/oprom/x86.c +++ b/src/devices/oprom/x86.c @@ -167,33 +167,40 @@ static void setup_realmode_idt(void) } #if CONFIG_FRAMEBUFFER_SET_VESA_MODE -static u8 vbe_get_mode_info(vbe_mode_info_t * mode_info) +vbe_mode_info_t mode_info; +static int mode_info_valid; + +int vbe_mode_info_valid(void) +{ + return mode_info_valid; +} + +static u8 vbe_get_mode_info(vbe_mode_info_t * mi) { printk(BIOS_DEBUG, "VBE: Getting information about VESA mode %04x\n", - mode_info->video_mode); + mi->video_mode); char *buffer = (char *)&__buffer; u16 buffer_seg = (((unsigned long)buffer) >> 4) & 0xff00; u16 buffer_adr = ((unsigned long)buffer) & 0xffff; realmode_interrupt(0x10, VESA_GET_MODE_INFO, 0x0000, - mode_info->video_mode, 0x0000, buffer_seg, buffer_adr); - memcpy(mode_info->mode_info_block, buffer, sizeof(vbe_mode_info_t)); + mi->video_mode, 0x0000, buffer_seg, buffer_adr); + memcpy(mi->mode_info_block, buffer, sizeof(vbe_mode_info_t)); + mode_info_valid = 1; return 0; } -static u8 vbe_set_mode(vbe_mode_info_t * mode_info) +static u8 vbe_set_mode(vbe_mode_info_t * mi) { - printk(BIOS_DEBUG, "VBE: Setting VESA mode %04x\n", mode_info->video_mode); + printk(BIOS_DEBUG, "VBE: Setting VESA mode %04x\n", mi->video_mode); // request linear framebuffer mode - mode_info->video_mode |= (1 << 14); + mi->video_mode |= (1 << 14); // request clearing of framebuffer - mode_info->video_mode &= ~(1 << 15); - realmode_interrupt(0x10, VESA_SET_MODE, mode_info->video_mode, + mi->video_mode &= ~(1 << 15); + realmode_interrupt(0x10, VESA_SET_MODE, mi->video_mode, 0x0000, 0x0000, 0x0000, 0x0000); return 0; } -vbe_mode_info_t mode_info; - /* These two functions could probably even be generic between * yabel and x86 native. TBD later. */ diff --git a/src/devices/oprom/yabel/vbe.c b/src/devices/oprom/yabel/vbe.c index a9cee30626..9dbe07cdd5 100644 --- a/src/devices/oprom/yabel/vbe.c +++ b/src/devices/oprom/yabel/vbe.c @@ -133,6 +133,13 @@ vbe_info(vbe_info_t * info) return 0; } +static int mode_info_valid; + +int vbe_mode_info_valid(void) +{ + return mode_info_valid; +} + // VBE Function 01h static u8 vbe_get_mode_info(vbe_mode_info_t * mode_info) @@ -167,6 +174,7 @@ vbe_get_mode_info(vbe_mode_info_t * mode_info) memcpy(mode_info->mode_info_block, biosmem + ((M.x86.R_ES << 4) + M.x86.R_DI), sizeof(mode_info->mode_info_block)); + mode_info_valid = 1; //printf("Mode Info Dump:"); //dump(mode_info_block, 64); diff --git a/src/devices/oprom/yabel/vbe.h b/src/devices/oprom/yabel/vbe.h index 6ddeeef292..bf286bc12c 100644 --- a/src/devices/oprom/yabel/vbe.h +++ b/src/devices/oprom/yabel/vbe.h @@ -16,6 +16,7 @@ struct lb_framebuffer; void vbe_set_graphics(void); +int vbe_mode_info_valid(void); void fill_lb_framebuffer(struct lb_framebuffer *framebuffer); void vbe_textmode_console(void);