Re: loader crash / BTX halted on 9.0-RC2 DVD with AMD pseudo-RAID

13 views
Skip to first unread message

John Baldwin

unread,
Nov 22, 2011, 10:26:22 AM11/22/11
to freebsd...@freebsd.org, John Nielsen, cur...@freebsd.org
On Monday, November 21, 2011 1:45:36 pm John Nielsen wrote:
> This weekend I downloaded the Freebsd 9.0 RC2 amd64 ISO image and burned it
to a DVD. I have a computer that currently runs Windows 7 but I plan to
install FreeBSD on it in the near future so I booted it up from the DVD to
check the hardware/driver status. Much to my dismay, the boot loader crashed
right away (register dump followed by "BTX halted") and the computer
immediately rebooted. I took a video with my phone so I could capture the
crash message, screenshot here:
>
> http://picpaste.com/pics/BTXcrash.1321899682.jpg
>
> I then tried tweaking a few BIOS settings and found that turning off the
built-in pseudo-RAID allowed the DVD to boot normally. I changed the SATA type
from "RAID" to "AHCI". Fortunately I plan to use the controller in AHCI mode
for the FreeBSD installation so this won't end up being a problem for me, but
I still thought it was worth reporting.

Hmmm, so this is odd. It died with an Invalid TSS exception on the iret
instruction at the end of the return-from-real-mode trampoline in BTX.
Looking at the dump I noticed that PSL_NT is set in %eflags, so for some
reason the iret was trying to do a nested task return. We shouldn't let
that flag leak out of any real mode code. Try this patch perhaps:

Index: btx.S
===================================================================
--- btx.S (revision 227815)
+++ btx.S (working copy)
@@ -39,6 +39,8 @@
.set PSL_RESERVED_DEFAULT,0x00000002
.set PSL_T,0x00000100 # Trap flag
.set PSL_I,0x00000200 # Interrupt enable flag
+ .set PSL_D,0x00000400 # String instruction direction
+ .set PSL_NT,0x00004000 # Nested task flag
.set PSL_VM,0x00020000 # Virtual 8086 mode flag
.set PSL_AC,0x00040000 # Alignment check flag
/*
@@ -609,8 +611,8 @@ rret_tramp: movw $MEM_ESPR-0x08,%sp # Reset stack
pushl %ds # regs
pushl %es
pushfl # Save %eflags
- cli # Disable interrupts
- std # String ops dec
+ pushl $PSL_RESERVED_DEFAULT|PSL_D # Use clean %eflags with
+ popfl # string ops dec
xorw %ax,%ax # Reset seg
movw %ax,%ds # regs
movw %ax,%es # (%ss is already 0)
@@ -673,6 +675,7 @@ rret_tramp.1: xorl %ecx,%ecx # Zero
testl $V86F_FLAGS,%edx # User wants flags?
jz rret_tramp.3 # No
movl MEM_ESPR-0x3c,%eax # Read real mode flags
+ andl $~(PSL_T|PSL_NT),%eax # Clear unsafe flags
movw %ax,-0x08(%esi) # Update user flags (low 16)
/*
* Return to the user task

I haven't tested it yet, so only try this from a CD install for now.

--
John Baldwin
_______________________________________________
freebsd...@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-curre...@freebsd.org"

John Nielsen

unread,
Nov 22, 2011, 10:07:52 PM11/22/11
to John Baldwin, freebsd...@freebsd.org
On Nov 22, 2011, at 10:26 AM, John Baldwin <j...@freebsd.org> wrote:

> On Monday, November 21, 2011 1:45:36 pm John Nielsen wrote:
>> This weekend I downloaded the Freebsd 9.0 RC2 amd64 ISO image and burned it
> to a DVD. I have a computer that currently runs Windows 7 but I plan to
> install FreeBSD on it in the near future so I booted it up from the DVD to
> check the hardware/driver status. Much to my dismay, the boot loader crashed
> right away (register dump followed by "BTX halted") and the computer
> immediately rebooted. I took a video with my phone so I could capture the
> crash message, screenshot here:
>>
>> http://picpaste.com/pics/BTXcrash.1321899682.jpg
>>
>> I then tried tweaking a few BIOS settings and found that turning off the
> built-in pseudo-RAID allowed the DVD to boot normally. I changed the SATA type
> from "RAID" to "AHCI". Fortunately I plan to use the controller in AHCI mode
> for the FreeBSD installation so this won't end up being a problem for me, but
> I still thought it was worth reporting.
>
> Hmmm, so this is odd. It died with an Invalid TSS exception on the iret
> instruction at the end of the return-from-real-mode trampoline in BTX.
> Looking at the dump I noticed that PSL_NT is set in %eflags, so for some
> reason the iret was trying to do a nested task return. We shouldn't let
> that flag leak out of any real mode code. Try this patch perhaps:

Thanks for looking!

I put gptboot on a USB stick and tried it with and without the patch. Identical behavior in both cases to booting from the DVD (only faster)--BTX dump and an instant reboot. I didn't do a screen capture yet but will be happy to tomorrow if it will help.

JN

Reply all
Reply to author
Forward
0 new messages