aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2010-07-26 23:47:26 -0400
committerKevin O'Connor <kevin@koconnor.net>2010-07-26 23:47:26 -0400
commitcadaf0e35d4530a0aa3f3100c3c0e5c96d9f0556 (patch)
treee87fca3a157363d1ca064258a44704dd1a289305 /src
parent2641186e7650d1dbe9249f57fe005581f31da402 (diff)
downloadseabios-cadaf0e35d4530a0aa3f3100c3c0e5c96d9f0556.tar.gz
Be sure to disable bootsplash on all BIOS boot cases.
Disable the bootsplash on cbfs payload exec, and if something hooks int19. Also, be sure to only disable the bootsplash (revert to text mode) once.
Diffstat (limited to 'src')
-rw-r--r--src/biosvar.h3
-rw-r--r--src/boot.c8
-rw-r--r--src/bootsplash.c9
-rw-r--r--src/post.c8
4 files changed, 19 insertions, 9 deletions
diff --git a/src/biosvar.h b/src/biosvar.h
index dce35af2..df0df0eb 100644
--- a/src/biosvar.h
+++ b/src/biosvar.h
@@ -1,6 +1,6 @@
// Variable layouts of bios.
//
-// Copyright (C) 2008,2009 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
#ifndef __BIOSVAR_H
@@ -216,6 +216,7 @@ struct extended_bios_data_area_s {
u8 other2[0xC4];
// 0x121 - Begin custom storage.
+ u8 bootsplash_active;
u8 ps2ctr;
struct usbkeyinfo usbkey_last;
diff --git a/src/boot.c b/src/boot.c
index 814dee12..44964a70 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -1,6 +1,6 @@
// Code to load disk image and start system boot.
//
-// Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
// Copyright (C) 2002 MandrakeSoft S.A.
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
@@ -343,11 +343,10 @@ boot_prep(void)
static void
call_boot_entry(u16 bootseg, u16 bootip, u8 bootdrv)
{
- dprintf(1, "Booting from %04x:%04x\n", bootseg, bootip);
-
/* Go back to text, the OS might expect it... (Can't do this any later) */
disable_bootsplash();
+ dprintf(1, "Booting from %04x:%04x\n", bootseg, bootip);
struct bregs br;
memset(&br, 0, sizeof(br));
br.flags = F_IF;
@@ -431,6 +430,7 @@ boot_cbfs(struct ipl_entry_s *ie)
return;
if (count--)
continue;
+ disable_bootsplash();
cbfs_run_payload(file);
}
}
@@ -462,7 +462,7 @@ do_boot(u16 seq_nr)
printf("Booting from %s...\n"
, strtcpy(desc, ie->description, ARRAY_SIZE(desc)));
- switch(ie->type) {
+ switch (ie->type) {
case IPL_TYPE_FLOPPY:
boot_disk(0x00, IPL.checkfloppysig);
break;
diff --git a/src/bootsplash.c b/src/bootsplash.c
index b96e0666..9ff81b37 100644
--- a/src/bootsplash.c
+++ b/src/bootsplash.c
@@ -10,6 +10,7 @@
#include "config.h" // CONFIG_*
#include "util.h" // dprintf
#include "jpeg.h" // splash
+#include "biosvar.h" // SET_EBDA
/****************************************************************
@@ -99,7 +100,7 @@ static void enable_vga_text_console(void)
call16_int10(&br);
// Write to screen.
- printf("Starting SeaBIOS (version %s)\n\n", VERSION);
+ printf("SeaBIOS (version %s)\n\n", VERSION);
}
void enable_vga_console(void)
@@ -181,7 +182,7 @@ void enable_vga_console(void)
dprintf(8, "bytes per scanline: %d\n", mode_info->bytes_per_scanline);
dprintf(8, "bits per pixel: %d\n", mode_info->bits_per_pixel);
- /* Look for bootsplash.jpg in CBFS and decompress it... */
+ /* Decompress jpeg */
dprintf(8, "Copying boot splash screen...\n");
cbfs_copyfile(file, jpeg, filesize);
dprintf(8, "Decompressing boot splash screen...\n");
@@ -194,6 +195,7 @@ void enable_vga_console(void)
/* Show the picture */
iomemcpy(framebuffer, picture, imagesize);
+ SET_EBDA(bootsplash_active, 1);
cleanup:
free(jpeg);
@@ -210,7 +212,8 @@ gotext:
void
disable_bootsplash(void)
{
- if (! CONFIG_BOOTSPLASH)
+ if (! CONFIG_BOOTSPLASH || !GET_EBDA(bootsplash_active))
return;
+ SET_EBDA(bootsplash_active, 0);
enable_vga_text_console();
}
diff --git a/src/post.c b/src/post.c
index fc7acc58..0cb9e575 100644
--- a/src/post.c
+++ b/src/post.c
@@ -1,6 +1,6 @@
// 32bit code to Power On Self Test (POST) a machine.
//
-// Copyright (C) 2008,2009 Kevin O'Connor <kevin@koconnor.net>
+// Copyright (C) 2008-2010 Kevin O'Connor <kevin@koconnor.net>
// Copyright (C) 2002 MandrakeSoft S.A.
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
@@ -276,6 +276,12 @@ _start(void)
// Write protect bios memory.
make_bios_readonly();
+ // Disable bootsplash if something has hooked int19.
+ extern void entry_19_official(void);
+ if (GET_IVT(0x19).segoff
+ != SEGOFF(SEG_BIOS, (u32)entry_19_official - BUILD_BIOS_ADDR).segoff)
+ disable_bootsplash();
+
// Invoke int 19 to start boot process.
dprintf(3, "Jump to int19\n");
struct bregs br;