Opened 9 years ago

Closed 9 years ago

#5113 closed enhancement (duplicate)

[PATCH] Warm boot for Bootloader

Reported by: Grey Owned by: axeld
Priority: normal Milestone: R1
Component: System/Boot Loader Version: R1/alpha1
Keywords: Warm boot Cc:
Blocked By: #5312 Blocking:
Has a Patch: no Platform: x86

Description (last modified by axeld)

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);
 

Attachments (2)

warm_boot.patch (2.6 KB) - added by Grey 9 years ago.
warm_boot_patch
warm_boot.2.patch (2.5 KB) - added by Grey 9 years ago.
corrected warm_boot.patch

Download all attachments as: .zip

Change History (5)

Changed 9 years ago by Grey

Attachment: warm_boot.patch added

warm_boot_patch

comment:1 Changed 9 years ago by axeld

Description: modified (diff)

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?

Changed 9 years ago by Grey

Attachment: warm_boot.2.patch added

corrected warm_boot.patch

comment:2 Changed 9 years ago by Grey

Ok. Patch corrected and attached. I am working on boot_loader patch for compressed kernel and modules loading. A lot of reboots required for this job. So I make this small patch to accelerate reboot. I hope warm_reboot will be useful for other developers. When boot_loader starting, it's possible to press space or ESC for open menu. This patch add one more opportunity - to press W for warm boot and fast reload fist level bootmanager ( in my case it is GRUB).

comment:3 Changed 9 years ago by axeld

Blocked By: 5312 added
Resolution: duplicate
Status: newclosed

Superceded by #5312.

Note: See TracTickets for help on using tickets.