Basically, the loader finds a simple safe way to reboot that's worked since the 286, and VMWare doesn't like it. It's called a triple fault. FreeBSD and Linux even use it to reboot as a fail safe. Read sys/i386/i386/vm_machdep.c and cpu_reset_real to see how FreeBSD handles it. VMWare at least says that "it would have caused the physical machine to restart." Blame VMWare.

On 4/19/2013 11:28 AM, Jeremy Chadwick wrote:
(Please keep me CC'd as I'm not subscribed to -hackers)

When running FreeBSD under VMware Workstation (I'm using 9.0.1, but this
issue has existed for many years now, I remember it occurring on
Workstation 6.x), the following is reproducible:

1. Power on + boot FreeBSD VM
2. At loader menu, press "3" to reboot
3. Loader prints "Rebooting..."
4. VMware proceeds to show the following message in a dialog box:

"A fault has occurred causing a virtual CPU to enter the shutdown state.
If this fault had occurred outside of a virtual machine, it would have
caused the physical machine to restart. The shutdown state can be
reached incorrectly configuring the virtual machine, a bug in the guest
operating system, or a problem in VMware Workstation."

It can also happen when dropping to the loader prompt and doing
"reboot".

It *does not* happen when booting fully into FreeBSD and issuing
"shutdown -r now".  Likewise, hw.acpi.disable_on_reboot and
hw.acpi.handle_reboot have no bearing (e.g. changing either of those to
1 (default = 0) then doing "shutdown -r now" to try and induce the
problem).

So it seems the issue is specific to the bootstrap/loader env.

FreeBSD 9.1-STABLE is being used, but I've seen this happen with FreeBSD
8.x as well as 7.x.  It does not happen with other OSes like Linux and
Solaris.  I have not tried other VM systems (VirtualBox, etc.) but I
imagine they might just silently deal with the situation rather than
provide a useful message (although I know VirtualBox has an amazingly
detailed debugger).

I've looked at sys/boot/i386/loader/main.c (func command_reboot()) and
the actual magic seems to happen inside of __exit.

__exit comes from sys/boot/i386/btx/lib/btxsys.s, which zeros eax then
issues INT 0x30 (syscall interrupt).  That lead me to this:

http://www.freebsd.org/doc/en/books/arch-handbook/book.html

Eek.  x86 architecture is a lot different than I remember it being in
my 386 days, so this is all a bit over my head.


_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"

Reply via email to