pc386dx exception 6 was Re: 4.6.0pre2 and docs released
Joel Sherrill
joel.sherrill at OARcorp.com
Fri Apr 25 12:38:57 UTC 2003
Angelo Fraietta wrote:
>
>
> Angelo Fraietta wrote:
>
>>
>> Joel Sherrill wrote:
>>
>>>
>>> Angelo Fraietta wrote:
>>>
>>>> Joel Sherrill wrote:
>>>>
>>>>> I am in agreement with Ralf's hunch here. including iostream is
>>>>> bound
>>>>> to be
>>>>> putting some ctor in the system. It has to be doing something
>>>>> that is
>>>>> not
>>>>> legal on a vanilla i386 system. It could be because of inline
>>>>> assembly
>>>>> that
>>>>> is not i386 pure or incorrect code generation for pure i386 that
>>>>> no one
>>>>> has noticed because most people are Pentium and above for Linux, BSD,
>>>>> etc.
>>>>>
>>>>> We really need to know that address of the illegal instruction so
>>>>> we can
>>>>> figure out where it is coming from. Fixing it then will probably be
>>>>> striaghtforward.
>>>>>
>>>> So how do I find the address?
>>>>
>>>
>>> If you don't have visibility with a debugger, then all I know to do
>>> is modify the default exception handler to print the eip somewhere
>>> you can see it.
>>>
>>> When I look at _defaultExcHandler in cpukit/score/cpu/i386/cpu.c, it
>>> already is printing eip. Are you sure it isn't there? If it has
>>> scrolled off, move the print with the eip to the end so it is
>>> visible or switch the console to a com port so you have scroll
>>> history.
>>>
>> PC 104125
>>
>> The instructions there are
>>
>> 104125: f0 0f c1 05 5c 0d 15 lock xadd %eax,0x150d5c
>>
>> --
>>
> In have done an objdump on my working exe and lock xadd is in quite a
> few places.
>
> If I do an objdump on my exe built with gcc295, lock xadd is nowhere
> at all.
>
> I did a search on google for lock xadd and in quite a few places it
> says it is an illegal instruction. It is probably a GCC issue
>
From http://webster.cs.ucr.edu/Page_TechDocs/Doc386/s15_06.html.
> LOCK <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> is
> restricted to certain instructions. The LOCK
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> prefix and
> its corresponding output signal should only be used to prevent other
> bus masters from interrupting a data movement operation. The 80386
> always asserts the LOCK
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> signal
> during an XCHG
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/xchg.html> instruction
> with memory (even if the LOCK
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> prefix is
> not used). LOCK
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> may only be
> used with the following 80386 instructions when they update memory:
> BTS <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/bts.html>,BTR
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/btr.html>,BTC
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/btc.html>,XCHG
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/xchg.html>,ADD
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/add.html>,ADC
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/adc.html>,SUB
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/sub.html>,SBB
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/sbb.html>,INC
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/inc.html>,DEC
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/dec.html>,AND
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/and.html>,OR
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/or.html>, XOR
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/xor.html>,NOT
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/not.html>, and NEG
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/neg.html>. An
> undefined-opcode exception (interrupt 6) results from using LOCK
> <http://webster.cs.ucr.edu/Page_TechDocs/Doc386/lock.html> before any
> other instruction.
Thee offending file appears to be
gcc-XXX/libstdc++-v3/config/cpu//i?86/bits/atomicity.h. There is
an i386 and an i486 directory which have the same code for atomicity.h.
I don't know off hand how
each one is selected and for sure the i386 specific version is using
xadd with a lock which is wrong.
Looking at libstdc++-v3/configure.tgt, I think that fixing the code in
the i386/bits/atomicity.h would
be enough to solve this.
I will file a gcc PR once we figure out how to patch the code.
--joel
More information about the users
mailing list