Applied patch by "Grey":
Entering the boot loader menu has changed/simplified while reducing the boot time by .75 seconds. Now it is enough to hold one of shift/Esc/F8/F12/Space. Thanks! I've also updated the boot loader documentation to reflect the change, but I only mentioned holding shift. I know that changing the documention directly is not preferred anymore, but I wanted to make sure this patch is complete. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35050 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
7974d3dcf3
commit
06f34bf2d8
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
<p>Haiku's Boot Loader can help when you experience hardware related problems or want to choose which Haiku installation to start, if you have more than one (maybe on an installation CD or USB stick).<br />
|
<p>Haiku's Boot Loader can help when you experience hardware related problems or want to choose which Haiku installation to start, if you have more than one (maybe on an installation CD or USB stick).<br />
|
||||||
It's also handy after you installed a software component that acts up and prevents you from booting the system to remove it again. The <i>Disable user add-ons</i> option that's mentioned below, will start Haiku without loading user installed components, e.g. a driver.</p>
|
It's also handy after you installed a software component that acts up and prevents you from booting the system to remove it again. The <i>Disable user add-ons</i> option that's mentioned below, will start Haiku without loading user installed components, e.g. a driver.</p>
|
||||||
<p>To enter the Boot Loader options, you have to press the <span class="key">SPACE BAR</span> right at the beginning of the boot process. It's easy to miss so you best keep hitting the key until it shows up.</p>
|
<p>To enter the Boot Loader options, you have to press and keep holding the <span class="key">SHIFT</span> key before the beginning of Haiku's boot process. If you have a boot manager installed, you can start holding the <span class="key">SHIFT</span> key before invoking the boot entry for Haiku. If Haiku is the only operating system installed, you can start pressing <span class="key">SHIFT</span> while you still see boot messages from the BIOS.</p>
|
||||||
<p><br /></p>
|
<p><br /></p>
|
||||||
<p>Once it's there, you're offered three menus:</p>
|
<p>Once it's there, you're offered three menus:</p>
|
||||||
<table summary="bootloader menus" border="0" cellspacing="0" cellpadding="2">
|
<table summary="bootloader menus" border="0" cellspacing="0" cellpadding="2">
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#define SAVED_EAX 0x10008
|
#define SAVED_EAX 0x10008
|
||||||
#define SAVED_ES 0x1000c
|
#define SAVED_ES 0x1000c
|
||||||
#define SAVED_FLAGS 0x10010
|
#define SAVED_FLAGS 0x10010
|
||||||
|
#define SAVED_EBP 0x10014
|
||||||
// we're overwriting the start of our boot loader to hold some
|
// we're overwriting the start of our boot loader to hold some
|
||||||
// temporary values - the first 1024 bytes of it are used at
|
// temporary values - the first 1024 bytes of it are used at
|
||||||
// startup only, and we avoid some linking issues this way
|
// startup only, and we avoid some linking issues this way
|
||||||
@ -74,7 +75,7 @@ _no_paging:
|
|||||||
// setup protected stack frame again
|
// setup protected stack frame again
|
||||||
movl SAVED_ESP, %eax
|
movl SAVED_ESP, %eax
|
||||||
movl %eax, %esp
|
movl %eax, %esp
|
||||||
movl %eax, %ebp
|
movl SAVED_EBP, %ebp
|
||||||
|
|
||||||
// copy the return address to the current stack
|
// copy the return address to the current stack
|
||||||
movl REAL_MODE_STACK, %eax
|
movl REAL_MODE_STACK, %eax
|
||||||
@ -96,6 +97,8 @@ FUNCTION(switch_to_real_mode)
|
|||||||
movl %esp, %eax
|
movl %esp, %eax
|
||||||
movl %eax, SAVED_ESP
|
movl %eax, SAVED_ESP
|
||||||
|
|
||||||
|
movl %ebp, SAVED_EBP
|
||||||
|
|
||||||
// put the return address on the real mode stack
|
// put the return address on the real mode stack
|
||||||
movl (%esp), %eax
|
movl (%esp), %eax
|
||||||
movl %eax, REAL_MODE_STACK
|
movl %eax, REAL_MODE_STACK
|
||||||
@ -232,6 +235,63 @@ int_number:
|
|||||||
|
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
|
|
||||||
|
/** uint32 search_keyboard_buffer()
|
||||||
|
* Search in keyboard buffer keycodes for F8, F12 or Space
|
||||||
|
* if not found - search ESC keycode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FUNCTION(search_keyboard_buffer)
|
||||||
|
pushal
|
||||||
|
pushfl
|
||||||
|
|
||||||
|
// make sure the correct IDT is in place
|
||||||
|
lidt idt_descriptor
|
||||||
|
|
||||||
|
call switch_to_real_mode
|
||||||
|
.code16
|
||||||
|
|
||||||
|
cld
|
||||||
|
push %ds
|
||||||
|
xorl %eax, %eax
|
||||||
|
mov %ax, %ds
|
||||||
|
mov $0x41E, %si // BIOS kbd buffer
|
||||||
|
search_cycle1:
|
||||||
|
lodsw
|
||||||
|
cmp $0x4200, %ax // test F8 key
|
||||||
|
jz to_ret
|
||||||
|
cmp $0x8600, %ax // test F12 key
|
||||||
|
jz to_ret
|
||||||
|
cmp $0x3920, %ax // test Space key
|
||||||
|
jz to_ret
|
||||||
|
cmp $0x440, %si
|
||||||
|
jnz search_cycle1
|
||||||
|
|
||||||
|
movw $0x41E, %si // BIOS kbd buffer
|
||||||
|
search_cycle2:
|
||||||
|
lodsw
|
||||||
|
cmp $0x011B, %ax // test ESC key
|
||||||
|
jz to_ret
|
||||||
|
cmp $0x440, %si
|
||||||
|
jnz search_cycle2
|
||||||
|
to_ret:
|
||||||
|
pop %ds
|
||||||
|
|
||||||
|
// save %eax
|
||||||
|
movl %eax, (SAVED_EAX - 0x10000)
|
||||||
|
|
||||||
|
call switch_to_protected_mode
|
||||||
|
.code32
|
||||||
|
|
||||||
|
popfl
|
||||||
|
popal
|
||||||
|
|
||||||
|
// restore %eax
|
||||||
|
movl SAVED_EAX, %eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
|
||||||
.globl idt_descriptor
|
.globl idt_descriptor
|
||||||
idt_descriptor:
|
idt_descriptor:
|
||||||
.short 0x7ff // IDT at 0x0, default real mode location
|
.short 0x7ff // IDT at 0x0, default real mode location
|
||||||
|
@ -41,5 +41,10 @@ extern
|
|||||||
"C"
|
"C"
|
||||||
#endif
|
#endif
|
||||||
void call_bios(uint8 num, struct bios_regs *regs);
|
void call_bios(uint8 num, struct bios_regs *regs);
|
||||||
|
extern
|
||||||
|
#ifdef __cplusplus
|
||||||
|
"C"
|
||||||
|
#endif
|
||||||
|
uint32 search_keyboard_buffer();
|
||||||
|
|
||||||
#endif /* BIOS_H */
|
#endif /* BIOS_H */
|
||||||
|
@ -58,21 +58,23 @@ wait_for_key(void)
|
|||||||
extern "C" uint32
|
extern "C" uint32
|
||||||
check_for_boot_keys(void)
|
check_for_boot_keys(void)
|
||||||
{
|
{
|
||||||
union key key;
|
bios_regs regs;
|
||||||
uint32 options = 0;
|
uint32 options = 0;
|
||||||
|
uint32 keycode = 0;
|
||||||
while ((key.ax = check_for_key()) != 0) {
|
regs.eax = 0x0200;
|
||||||
switch (key.code.ascii) {
|
call_bios(0x16, ®s);
|
||||||
case ' ':
|
// Read Keyboard flags. bit 0 LShift, bit 1 RShift
|
||||||
|
if ((regs.eax & 0x03) != 0) {
|
||||||
|
// LShift or RShift - option menu
|
||||||
options |= BOOT_OPTION_MENU;
|
options |= BOOT_OPTION_MENU;
|
||||||
break;
|
} else {
|
||||||
case 0x1b: // escape
|
keycode = search_keyboard_buffer();
|
||||||
|
if (keycode == 0x4200 || keycode == 0x8600 || keycode == 0x3920) {
|
||||||
|
// F8 or F12 or Space - option menu
|
||||||
|
options |= BOOT_OPTION_MENU;
|
||||||
|
} else if (keycode == 0x011B) {
|
||||||
|
// ESC - debug output
|
||||||
options |= BOOT_OPTION_DEBUG_OUTPUT;
|
options |= BOOT_OPTION_DEBUG_OUTPUT;
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
// evaluate BIOS scan codes
|
|
||||||
// ...
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,9 +129,6 @@ _start(void)
|
|||||||
mmu_init();
|
mmu_init();
|
||||||
parse_multiboot_commandline(&args);
|
parse_multiboot_commandline(&args);
|
||||||
|
|
||||||
// wait a bit to give the user the opportunity to press a key
|
|
||||||
spin(750000);
|
|
||||||
|
|
||||||
// reading the keyboard doesn't seem to work in graphics mode
|
// reading the keyboard doesn't seem to work in graphics mode
|
||||||
// (maybe a bochs problem)
|
// (maybe a bochs problem)
|
||||||
sBootOptions = check_for_boot_keys();
|
sBootOptions = check_for_boot_keys();
|
||||||
|
Loading…
Reference in New Issue
Block a user