From owner-svn-src-head@FreeBSD.ORG Thu Jul 11 21:42:03 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id E953AFE9; Thu, 11 Jul 2013 21:42:03 +0000 (UTC) (envelope-from marcel@xcllnt.net) Received: from mail.xcllnt.net (mail.xcllnt.net [50.0.150.214]) by mx1.freebsd.org (Postfix) with ESMTP id AA4AD176F; Thu, 11 Jul 2013 21:42:03 +0000 (UTC) Received: from amoroson-sslvpn-nc.jnpr.net (natint3.juniper.net [66.129.224.36]) (authenticated bits=0) by mail.xcllnt.net (8.14.7/8.14.7) with ESMTP id r6BLft2B066233 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Thu, 11 Jul 2013 14:41:57 -0700 (PDT) (envelope-from marcel@xcllnt.net) Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Mac OS X Mail 6.5 \(1508\)) Subject: Re: svn commit: r253161 - head/sys/dev/uart From: Marcel Moolenaar In-Reply-To: <201307110941.34400.jhb@freebsd.org> Date: Thu, 11 Jul 2013 14:41:50 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <84AC1620-BD44-4A55-B580-02F3D50C546B@xcllnt.net> References: <201307101742.r6AHgKOm024113@svn.freebsd.org> <201307101409.42228.jhb@freebsd.org> <201307110941.34400.jhb@freebsd.org> To: John Baldwin X-Mailer: Apple Mail (2.1508) Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, Marcel Moolenaar , src-committers@freebsd.org X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Jul 2013 21:42:04 -0000 On Jul 11, 2013, at 6:41 AM, John Baldwin wrote: > On Wednesday, July 10, 2013 3:59:40 pm Marcel Moolenaar wrote: >>=20 >> On Jul 10, 2013, at 11:09 AM, John Baldwin wrote: >>=20 >>> 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 >>>>>=20 >>>>> 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. >>>>=20 >>>> Do you have proof of this? >>=20 >> 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. >=20 > 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... --=20 Marcel Moolenaar marcel@xcllnt.net