Opened 12 years ago

Last modified 12 years ago

#5113 closed enhancement

[PATCH] Warm boot for Bootloader — at Version 1

Reported by: Grey Owned by: axeld
Priority: normal Milestone: R1
Component: System/Boot Loader Version: R1/alpha1
Keywords: Warm boot Cc:
Blocked By: Blocking:
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);
 

Change History (3)

by Grey, 12 years ago

Attachment: warm_boot.patch added

warm_boot_patch

comment:1 by axeld, 12 years ago

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?

by Grey, 12 years ago

Attachment: warm_boot.2.patch added

corrected warm_boot.patch

Note: See TracTickets for help on using tickets.