From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24836 invoked by alias); 1 Nov 2013 17:42:25 -0000 Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Received: (qmail 24826 invoked by uid 89); 1 Nov 2013 17:42:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.2 X-HELO: calivar.com Received: from calivar.demon.co.uk (HELO calivar.com) (83.104.54.243) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Fri, 01 Nov 2013 17:42:23 +0000 Received: from daikon.calivar.com (daikon.calivar.com [10.0.1.1]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by calivar.com (Postfix) with ESMTPS id 3BC256F41F; Fri, 1 Nov 2013 17:42:20 +0000 (GMT) Message-ID: <5273E7FC.7010907@calivar.com> Date: Fri, 01 Nov 2013 17:42:00 -0000 From: Nick Garnett User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: Andrew Parlane , ecos-discuss@ecos.sourceware.org References: <52729021.3080205@carallon.com> <5273DFAE.1080000@calivar.com> <5273E2EE.3010908@carallon.com> In-Reply-To: <5273E2EE.3010908@carallon.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Subject: Re: [ECOS] Spurious interrupt on ARM. X-SW-Source: 2013-11/txt/msg00006.txt.bz2 On 01/11/13 17:20, Andrew Parlane wrote: > Sorry, I should have been a bit more clear. > First we skip the ISR by jumping to the spurious_IRQ label, and then we > switch stacks if necessary, then we have (line numbers may vary): > > 941 // The return value from the handler (in r0) will indicate > whether a > 942 // DSR is to be posted. Pass this together with a pointer to the > 943 // interrupt object we have just used to the interrupt tidy > up routine. > 944 > 945 // don't run this for spurious interrupts! > 946 cmp v1,#CYGNUM_HAL_INTERRUPT_NONE > 947 beq 17f > 948 ldr r1,.hal_interrupt_objects > 949 ldr r1,[r1,v1,lsl #2] > 950 mov r2,v6 // register frame > 951 > 952 THUMB_MODE(r3,10) > 953 > 954 bl interrupt_end // post any bottom layer handler > 955 // threads and call scheduler > 956 ARM_MODE(r1,10) > 957 17: > > So it compares the result of hal_IRQ_handler (stored in v1) with > CYGNUM_HAL_INTERRUPT_NONE, and jumps forwards to label 17: which is > after interrupt_end. if it was a spurious IRQ. Hmm. You're right. That is clearly wrong. Our own sources have the following code, which is slightly different: // The return value from the handler (in r0) will indicate whether a // DSR is to be posted. Pass this together with a pointer to the // interrupt object we have just used to the interrupt tidy up routine. // For a spurious interrupt, pass a NULL object. interrupt_end() will // handle that and still unlock the scheduler. cmp v1,#CYGNUM_HAL_INTERRUPT_NONE moveq r1,#0 beq 17f ldr r1,.hal_interrupt_objects ldr r1,[r1,v1,lsl #2] 17: mov r2,v6 // register frame So interrupt_end does get called, but with a NULL interrupt object pointer. -- Nick Garnett Kernel Architect eCosCentric Limited http://www.eCosCentric.com The eCos experts Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No: 4422071 -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss