[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] *BSD kernel crash at boot in qemu with seabios 1.7.4 (b
From: |
Xin Li |
Subject: |
Re: [Qemu-devel] *BSD kernel crash at boot in qemu with seabios 1.7.4 (bisected) |
Date: |
Tue, 11 Feb 2014 14:34:57 -0800 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
On 2/6/14, 4:44 AM, Michael Tokarev wrote:
> [Changing subject to reflect reality]
>
> I don't really understand what it is all about, as I initially
> said. But I've been told on freebsd IRC channels to post the issue
> to freebsd-emulation list, which I'm Cc'ing now, and if noone
> there answers, also to John Baldwin <address@hidden>.
>
> To bring some context back, here are a few pointers:
>
> http://bugs.debian.org/737142 -- talking about pc-bsd, but it
> appears that the prob affects other BSD kernels too
> http://thread.gmane.org/gmane.comp.emulators.qemu/254074 -- this
> thread
> http://lists.gnu.org/archive/html/qemu-stable/2013-03/msg00037.html
> - a weird issue with freebsd reported last december
>
> If it's a bug in *BSD kernels, maybe someone there will be glad to
> fix it. And maybe together we can come out with a more elegant
> solution to this issue, or maybe to confirm (or deny) that the
> proposed patch is a right thing to do.
Yes it does look like a bug in FreeBSD kernel. Is there a PR already
or should I create one and assign to myself? I will try to fix this
when I have some free cycles.
I assume this also happens when running FreeBSD under qemu on FreeBSD,
right?
Cheers,
> Thanks,
>
> /mjt
>
> 06.02.2014 08:04, Kevin O'Connor wrote:
>> On Wed, Feb 05, 2014 at 12:44:06PM -0500, Kevin O'Connor wrote:
>>> On Tue, Feb 04, 2014 at 04:33:19PM +0400, Michael Tokarev
>>> wrote:
>>>> We have a bugreport in debian,
>>>> http://bugs.debian.org/737142, stating that PC-BSD does not
>>>> work with seabios-1.7.4 anymore.
>>>>
>>>> I digged in, and found out that it fails only with -vga std
>>>> (cirrus works fine). So I bisected the issue - only
>>>> changing vgabios-stdvga.bin, and found this:
>> [...]
>>> This seems to be similar to the freebsd problem reported last
>>> year - see:
>>> http://lists.gnu.org/archive/html/qemu-stable/2013-03/msg00037.html
>>
>>>
[...]
>>> (*) The best I can think of is to try and construct some hand
>>> crafted assembler that can catch buggy x86emu emulators and
>>> force a failure..
>>
>> I have put together some assember to try and run-time test for
>> known broken versions of x86emu. This patch to SeaVGABIOS does
>> seem to catch the freebsd issue and in my tests it convinces
>> freebsd to take a different approach. The patch is a bit ugly
>> though.
>>
>> Comments welcome. -Kevin
>>
>>
>> commit e3caa553e940efb6184b30a5637134c4aa9f8b65 Author: Kevin
>> O'Connor <address@hidden> Date: Wed Feb 5 22:47:29 2014
>> -0500
>>
>> vgabios: Attempt to detect old x86emu and force a fault.
>>
>> Check for cases where the leal instruction does not work. This
>> instruction is known to not be emulated properly on old versions
>> of x86emu. If a broken version of x86emu is found, force a fault
>> that x86emu will easily detect. This should help prevent soft
>> failures when running old software.
>>
>> Signed-off-by: Kevin O'Connor <address@hidden>
>>
>> diff --git a/vgasrc/vgaentry.S b/vgasrc/vgaentry.S index
>> 9854448..e246e7c 100644 --- a/vgasrc/vgaentry.S +++
>> b/vgasrc/vgaentry.S @@ -45,9 +45,27 @@ _rom_header_signature: *
>> Entry points
>> ****************************************************************/
>>
>> - // This macro is the same as ENTRY_ARG except the
>> "calll" - // instruction is avoided to work around known
>> issues in the - // emulation of some versions of x86emu. +
>> // Force a fault if found to be running on broken x86emu
>> versions. + DECLFUNC x86emu_fault +x86emu_fault: +
>> int $0x03 +1: hlt + jmp 1b + + // This macro
>> implements a call while avoiding instructions + // that
>> old versions of x86emu have problems with. + .macro
>> VGA_CALLL cfunc + // Make sure leal instruction works. +
>> movl $0x8000, %ecx + leal (%ecx, %ecx, 1), %ecx +
>> cmpl $0x10000, %ecx + jne x86emu_fault + // Use
>> callw instead of calll + push %ax + callw \cfunc +
>> .endm + + // This macro is the same as ENTRY_ARG except
>> VGA_CALLL is used. .macro ENTRY_ARG_VGA cfunc cli cld @@ -57,7
>> +75,7 @@ _rom_header_signature: movl %esp, %ebx // Backup
>> %esp, then zero high bits movzwl %sp, %esp movl %esp, %eax
>> // First arg is pointer to struct bregs - pushw %ax ;
>> callw \cfunc + VGA_CALLL \cfunc movl %ebx, %esp //
>> Restore %esp (including high bits) POPBREGS .endm @@ -103,7
>> +121,7 @@ entry_10_extrastack: movw %ds, %dx // Setup
>> %ss/%esp and call function movw %dx, %ss movl %eax, %esp -
>> pushw %ax ; callw handle_10 + VGA_CALLL handle_10
>>
>> movl %esp, %eax // Restore registers and return movw
>> BREGS_size+4(%eax), %ss
>>
>
> _______________________________________________
> address@hidden mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-emulation To
> unsubscribe, send any mail to
> "address@hidden"
>
-----BEGIN PGP SIGNATURE-----
iQIcBAEBCgAGBQJS+qWRAAoJEJW2GBstM+nsz3sP/AsGiEPWzHAbQP5nYR9alDiL
dmMd8RB4yVYLmJJXCxLldMjNw3kuHRcZ8IrvCaxsFvUHnzdQudmqCc6uxgcWdC3Y
gqSYP2/dnG5OXsUqmRHW0yKpfrBlbOA/utRDZz9MzTx4m7sudY8y8ZEUmb2OyJOZ
CjQrW5OyHIXUxzdKMlcpiAy5+edQVWk5TBdyz6h0WVrk4A9uuAjOw/DYse05lGVF
l1d/Eto+Wui38fMTjfdVJqVcPrfy859aODf/vRkmznujd0Zumr/8OMXmEsF+Q+iv
ktRNWab39DXIArMsYbCGr7Xg7Q0ZjZB0eAjB8zxW1a0p/7V4Spf9QQu9wNHVi4sf
DOwiaU2K+2/zz/BYIyicyZN+glQMLcq+t3u8uagm6GOcHMx1ZsyFeyIhj8Gbtjfl
VUPOVZfu25dogr5GY2U68tPHoiQStsSvdSg4+jaDYK5AZcs1BGZ5i5ncArjATV1Z
KIe3ISOzu20BMhjAXHALnTNMFuBWD6+Va6ExVHWkWuz445aQ0REx3hJDqWbm7iVd
DTD2N6Bs/uL7P3aVODgz8EqQ6EMhswFYgqSirMb9w38FCLnJ56aAA31kFU00U28p
OG8kzgc3dY0II1vVfNLhrJ5kGNDOKxZ62KsXbLHPdBl3cgKweqghd53WTjU/dSo6
0NVfAqheJ3ifZ0I0yB3d
=jTIz
-----END PGP SIGNATURE-----