How do I do a COLD Reboot on FreeBSD?
Billy Newsom
smartweb at leadhill.net
Wed Feb 2 00:47:17 PST 2005
Bob Hall wrote:
> This may help.
>
> http://www.faqs.org/faqs/assembly-language/x86/general/part3/section-5.html
>
> Bob Hall
Hmmm. Good link. Here's a better one that I just discovered reading about
this stuff:
http://unix.derkeiler.com/Mailing-Lists/FreeBSD/hackers/2003-11/0205.html
I began to notice that the 0x472 code is rampant in these reboot assembler
code examples. Then I found out that FreeBSD has its own asembly language
found in the boot loaders, etc.
OpenBSD and others like Linux use this stuff similarly. Linux seems to give
you the option in a config file!! to cold reboot.
So this led me to:
/usr/src/sys/i386/i386/locore.s
Which looks to me the place where a warm boot is guaranteed. By the way, the
guy above (Adrian Steinmann) might have cleaned up the code for the btx
(usr/src/sys/boot/i386/btx/btx/btx.S) in 2003. But his code cleanup never
stayed in /usr/src/sys/boot/i386/boot2/boot1.S.
Example from FreeBSD-5-stable:
/usr/src/sys/boot/i386/btx/btx/btx.S has this:
movw $0x1234, BDA_BOOT # Do a warm boot
ljmp $0xffff,$0x0 # reboot the machine
/usr/src/sys/boot/i386/boot2/boot1.S has the *better* version:
movw $0x1234, BDA_BOOT # Do a warm boot
ljmp $0xf000,$0xfff0 # reboot the machine
Anyway, Adrian Steinmann tried to patch the reboot code in btx.s to do some
sort of bugfix and troubleshooting on his particular machine. There may have
been a regresion here since he tried that, but I don't care much about the
BTX or the boot1 code. My issue is for now with the reboot done during a
normal full kernel running. That is when SMP code is active and the memory
is being actively used. I believe the locore.s file is where I need to look,
because it moves this 0x1234 data into the BDA_BOOT location, which is 0x427
in memory.
Therefore, I will try to hack the locore.s file and use a zero instead of
0x1234 to move into memory at the BDA_BOOT location.
here's my unified diff:
-----------------Code
--- locore.s Thu Jul 8 17:35:34 2004
+++ /usr/src/sys/i386/i386/locore.s Wed Feb 2 01:50:36 2005
@@ -214,7 +214,8 @@
movsb
#else /* IBM-PC */
/* Tell the bios to warmboot next time */
- movw $0x1234,0x472
+/* movw $0x1234,0x472 */
+ movw $0x0000,0x472 /* Billy: Perform Cold Reboot! */
#endif /* PC98 */
/* Set up a real frame in case the double return in newboot is executed. */
-----------------Code
The only substantial change is that I hope this make my machine do a cold reboot.
Billy
More information about the freebsd-questions
mailing list