svn commit: r253161 - head/sys/dev/uart

Marcel Moolenaar marcel at xcllnt.net
Thu Jul 11 21:42:04 UTC 2013


On Jul 11, 2013, at 6:41 AM, John Baldwin <jhb at FreeBSD.org> wrote:

> On Wednesday, July 10, 2013 3:59:40 pm Marcel Moolenaar wrote:
>> 
>> On Jul 10, 2013, at 11:09 AM, John Baldwin <jhb at FreeBSD.org> wrote:
>> 
>>> On Wednesday, July 10, 2013 2:05:43 pm John Baldwin wrote:
>>>> On Wednesday, July 10, 2013 1:42:20 pm Marcel Moolenaar wrote:
>>>>> Author: marcel
>>>>> Date: Wed Jul 10 17:42:20 2013
>>>>> New Revision: 253161
>>>>> URL: http://svnweb.freebsd.org/changeset/base/253161
>>>>> 
>>>>> Log:
>>>>> Protect against broken hardware. In this particular case, protect against
>>>>> H/W not de-asserting the interrupt at all. On x86, and because of the
>>>>> following conditions, this results in a hard hang with interrupts disabled:
>>>>> 1.  The uart(4) driver uses a spin lock to protect against concurrent
>>>>>     access to the H/W. Spin locks disable and restore interrupts.
>>>>> 2.  Restoring the interrupt on x86 always writes the flags register. Even
>>>>>     if we're restoring the interrupt from disabled to disabled.
>>>>> 3.  The x86 CPU has a short window in which interrupts are enabled when the
>>>>>     flags register is written.
>>>> 
>>>> Do you have proof of this?
>> 
>> No. I only have proof of a hard hang during auto configuration that
>> cannot be fixed in any other way than not to setup the interrupt at
>> all.
> 
> Ok.  I think what is happening is that you are just spinning in the interrupt
> handler forever due to the hardware being stuck in that case in the old code.
> I assume you tried just using the count first but it still hung?  (Perhaps the
> interrupt was for a PCI device and level-triggered and so it kept reasserting
> anyway?)

Yes, the count alone didn't do the trick. It's really a H/W
problem. I suspect a floating line to an FPGA. The condition
is cleared by means that go beyond FreeBSD, let me put it
that way :-)

> I think your change is correct for a uart that is stuck in this way regardless,
> I just think the hang isn't related to weirdness with x86 temporarily
> re-enabling interrupts.

You're right. I looked at configure() this time and it
starts with enable_intr(). For some reason I had it in
my head that we auto-configure with interrupts disabled.
We do on most platforms, just not on x86...

-- 
Marcel Moolenaar
marcel at xcllnt.net




More information about the svn-src-head mailing list