#5113: [PATCH] Warm boot for Bootloader --------------------------------+------------------------------------------- Reporter: Grey | Owner: axeld Type: enhancement | Status: new Priority: normal | Milestone: R1 Component: System/Boot Loader | Version: R1/alpha1 Keywords: Warm boot | Blockedby: Platform: x86 | Blocking: --------------------------------+------------------------------------------- Old description: > This is small patch for bootloader. X86 only! > Function war_boot() added to src/system/boot/platform/bios_ia32/bios.S > Press 'W' or 'w' for warm boot. > > Index: src/system/boot/platform/bios_ia32/keyboard.h > =================================================================== > --- src/system/boot/platform/bios_ia32/keyboard.h (revision 34640) > +++ src/system/boot/platform/bios_ia32/keyboard.h (working copy) > @@ -29,6 +29,7 @@ > extern void clear_key_buffer(void); > extern union key wait_for_key(void); > extern uint32 check_for_boot_keys(void); > +extern void warm_boot(void); > > #ifdef __cplusplus > } > Index: src/system/boot/platform/bios_ia32/bios.S > =================================================================== > --- src/system/boot/platform/bios_ia32/bios.S (revision 34640) > +++ src/system/boot/platform/bios_ia32/bios.S (working copy) > @@ -231,7 +231,49 @@ > ret > > //-------------------------------------------------------------- > +/** void warm_boot() > + * Warm booting computer via BIOS int 0x19. save_crx() have to be > called before paging setup. > + */ > +FUNCTION(warm_boot) > + cli > + movl saved_cr0,%eax > + movl %eax,%cr0 > + movl saved_cr3,%eax > + movl %eax,%cr3 > + movl saved_cr4,%eax > + movl %eax,%cr4 > + lidt saved_idt > + call switch_to_real_mode > + .byte 0xCD > + .byte 0x19 > + ret > +//-------------------------------------------------------------- > +/** void save_crx() > + * Save CRx registers state. Required for warm_boot. > + */ > +FUNCTION(save_crx) > + cli > + movl %cr0,%eax > + movl %eax,saved_cr0 > + movl %cr3,%eax > + movl %eax,saved_cr3 > + movl %cr4,%eax > + movl %eax,saved_cr4 > + sidt saved_idt > + ret > +//-------------------------------------------------------------- > + .p2align 4 > +saved_idt: > + .long 0x0 > + .long 0x0 > +saved_cr0: > + .long 0x0 > +saved_cr3: > + .long 0x0 > +saved_cr4: > + .long 0x0 > > + .p2align 4 > .globl idt_descriptor > idt_descriptor: > .short 0x7ff // IDT at 0x0, default > real mode location > Index: src/system/boot/platform/bios_ia32/keyboard.cpp > =================================================================== > --- src/system/boot/platform/bios_ia32/keyboard.cpp (revision 34640) > +++ src/system/boot/platform/bios_ia32/keyboard.cpp (working copy) > @@ -69,6 +69,9 @@ > case 0x1b: // escape > options |= BOOT_OPTION_DEBUG_OUTPUT; > break; > + case 'w': > + case 'W': > + warm_boot(); > case 0: > // evaluate BIOS scan codes > // ... > Index: src/system/boot/platform/bios_ia32/start.c > =================================================================== > --- src/system/boot/platform/bios_ia32/start.c (revision 34640) > +++ src/system/boot/platform/bios_ia32/start.c (working copy) > @@ -107,7 +107,6 @@ > out8(0xfe, 0x64); > } > > - > void > _start(void) > { > @@ -126,6 +125,7 @@ > serial_init(); > console_init(); > cpu_init(); > + save_crx(); > mmu_init(); > parse_multiboot_commandline(&args); New description: This is small patch for bootloader. X86 only! Function war_boot() added to src/system/boot/platform/bios_ia32/bios.S Press 'W' or 'w' for warm boot. {{{ Index: src/system/boot/platform/bios_ia32/keyboard.h =================================================================== --- src/system/boot/platform/bios_ia32/keyboard.h (revision 34640) +++ src/system/boot/platform/bios_ia32/keyboard.h (working copy) @@ -29,6 +29,7 @@ extern void clear_key_buffer(void); extern union key wait_for_key(void); extern uint32 check_for_boot_keys(void); +extern void warm_boot(void); #ifdef __cplusplus } Index: src/system/boot/platform/bios_ia32/bios.S =================================================================== --- src/system/boot/platform/bios_ia32/bios.S (revision 34640) +++ src/system/boot/platform/bios_ia32/bios.S (working copy) @@ -231,7 +231,49 @@ ret //-------------------------------------------------------------- +/** void warm_boot() + * Warm booting computer via BIOS int 0x19. save_crx() have to be called before paging setup. + */ +FUNCTION(warm_boot) + cli + movl saved_cr0,%eax + movl %eax,%cr0 + movl saved_cr3,%eax + movl %eax,%cr3 + movl saved_cr4,%eax + movl %eax,%cr4 + lidt saved_idt + call switch_to_real_mode + .byte 0xCD + .byte 0x19 + ret +//-------------------------------------------------------------- +/** void save_crx() + * Save CRx registers state. Required for warm_boot. + */ +FUNCTION(save_crx) + cli + movl %cr0,%eax + movl %eax,saved_cr0 + movl %cr3,%eax + movl %eax,saved_cr3 + movl %cr4,%eax + movl %eax,saved_cr4 + sidt saved_idt + ret +//-------------------------------------------------------------- + .p2align 4 +saved_idt: + .long 0x0 + .long 0x0 +saved_cr0: + .long 0x0 +saved_cr3: + .long 0x0 +saved_cr4: + .long 0x0 + .p2align 4 .globl idt_descriptor idt_descriptor: .short 0x7ff // IDT at 0x0, default real mode location Index: src/system/boot/platform/bios_ia32/keyboard.cpp =================================================================== --- src/system/boot/platform/bios_ia32/keyboard.cpp (revision 34640) +++ src/system/boot/platform/bios_ia32/keyboard.cpp (working copy) @@ -69,6 +69,9 @@ case 0x1b: // escape options |= BOOT_OPTION_DEBUG_OUTPUT; break; + case 'w': + case 'W': + warm_boot(); case 0: // evaluate BIOS scan codes // ... Index: src/system/boot/platform/bios_ia32/start.c =================================================================== --- src/system/boot/platform/bios_ia32/start.c (revision 34640) +++ src/system/boot/platform/bios_ia32/start.c (working copy) @@ -107,7 +107,6 @@ out8(0xfe, 0x64); } - void _start(void) { @@ -126,6 +125,7 @@ serial_init(); console_init(); cpu_init(); + save_crx(); mmu_init(); parse_multiboot_commandline(&args); }}} -- Comment(by axeld): First of all thanks for the patch. But then, please attach a diff instead of of copying it into the ticket description next time. Also, changes like: {{{ } - void _start(void) }}} shouldn't be found in such a patch, as this introduces a style violation in previously fine code. Then: {{{ + case 'w': + case 'W': + warm_boot(); case 0: }}} There is a "break;" missing - even if warm_boot() is not supposed to return, it's just good style. Finally, what is the purpose of this patch? What does it do, and what does one gain? -- Ticket URL: <http://dev.haiku-os.org/ticket/5113#comment:1> Haiku <http://dev.haiku-os.org> Haiku - the operating system.