Implement irqsave/restore

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@747 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2008-03-23 17:58:08 +00:00
parent be1a006d7f
commit d7c8012d41
5 changed files with 98 additions and 40 deletions

View File

@ -81,10 +81,10 @@ typedef long sint32;
typedef unsigned long uint32; typedef unsigned long uint32;
/* This is the size of the interrupt state save returned by irqsave(). /* This is the size of the interrupt state save returned by irqsave().
* It holds the contents of the interrupt vector address * It holds the AF regiser pair + a zero pad byte
*/ */
typedef ubyte irqstate_t; typedef uint24 irqstate_t;
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */

View File

@ -43,7 +43,8 @@ CMN_CSRCS = up_initialize.c up_allocateheap.c up_createstack.c \
up_reprioritizertr.c up_idle.c up_assert.c up_doirq.c \ up_reprioritizertr.c up_idle.c up_assert.c up_doirq.c \
up_mdelay.c up_udelay.c up_usestack.c up_mdelay.c up_udelay.c up_usestack.c
CHIP_ASRCS = ez80_startup.asm ez80_saveusercontext.asm ez80_restorecontext.asm CHIP_ASRCS = ez80_startup.asm ez80_irqsave.asm \
ez80_saveusercontext.asm ez80_restorecontext.asm
ifeq ($(CONFIG_ARCH_CHIP_EZ80F91),y) ifeq ($(CONFIG_ARCH_CHIP_EZ80F91),y)
CHIP_ASRCS += ez80f91_init.asm CHIP_ASRCS += ez80f91_init.asm
endif endif

View File

@ -78,30 +78,13 @@ chipreg_t *current_regs;
void up_irqinitialize(void) void up_irqinitialize(void)
{ {
} current_regs = NULL;
/* And finally, enable interrupts */
/**************************************************************************** #ifndef CONFIG_SUPPRESS_INTERRUPTS
* Name: irqsave asm("ei");
* #endif
* Description:
* Disable all interrupts; return previous interrupt state
*
****************************************************************************/
irqstate_t irqsave(void)
{
}
/****************************************************************************
* Name: irqrestore
*
* Description:
* Restore previous interrupt state
*
****************************************************************************/
void irqrestore(irqstate_t flags)
{
} }
/**************************************************************************** /****************************************************************************

View File

@ -0,0 +1,88 @@
;**************************************************************************
; arch/z80/src/ez80/ez80_irqsave.asm
;
; Copyright (C) 2008 Gregory Nutt. All rights reserved.
; Author: Gregory Nutt <spudmonkey@racsa.co.cr>
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
;
; 1. Redistributions of source code must retain the above copyright
; notice, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
; notice, this list of conditions and the following disclaimer in
; the documentation and/or other materials provided with the
; distribution.
; 3. Neither the name NuttX nor the names of its contributors may be
; used to endorse or promote products derived from this software
; without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
; COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
; OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
; ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
; POSSIBILITY OF SUCH DAMAGE.
;
;**************************************************************************
;**************************************************************************
; Global Symbols Imported
;**************************************************************************
;**************************************************************************
; Global Symbols Expported
;**************************************************************************
xdef _irqsave
xdef _irqrestore
;**************************************************************************
; Code
;**************************************************************************
segment CODE
.assume ADL=1
;****************************************************************************
;* Name: irqstate_t irqsave(void)
;*
;* Description:
;* Disable all interrupts; return previous interrupt state
;*
;****************************************************************************
_irqsave:
ld a, i ; AF = interrupt state
di ; Interrupts are disabled (does not affect F)
push af ; Transfer to HL via the stack
pop hl ;
ret ; And return
;****************************************************************************
;* Name: void irqrestore(irqstate_t flags)
;*
;* Description:
;* Restore previous interrupt state
;*
;****************************************************************************
_irqrestore:
di ; Assume disabled
pop hl ; HL = return address
pop af ; AF Parity bit holds interrupt state
jp po, _disabled ; Skip over re-enable if Parity odd
ei ; Re-enable interrupts
_disabled:
push af ; Restore stack
push hl ;
ret ; and return
end

View File

@ -81,20 +81,6 @@ irqhandler: macro vectno
jp _ez80_rstcommon ; Remaining RST handling is common jp _ez80_rstcommon ; Remaining RST handling is common
endmac irqhandler endmac irqhandler
; Save Interrupt State
irqsave: macro
ld a, i ; sets parity bit to value of IEF2
push af
di ; disable interrupts while loading table
endmac irqsave
; Restore Interrupt State
irqrestore: macro
pop af
jp po, $+5 ; parity bit is IEF2
ei
endmac irqrestore
;************************************************************************** ;**************************************************************************
; Reset entry points ; Reset entry points
;************************************************************************** ;**************************************************************************