URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [coldfire/] [arch/] [current/] [include/] [arch.inc] - Rev 844
Go to most recent revision | Compare with Previous | Blame | View Log
#ifndef CYGONCE_HAL_ARCH_INC
#define CYGONCE_HAL_ARCH_INC
|=============================================================================
|
| arch.inc
|
| ColdFire architecture assembler header file
|
|=============================================================================
| ####ECOSGPLCOPYRIGHTBEGIN####
| -------------------------------------------
| This file is part of eCos, the Embedded Configurable Operating System.
| Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
|
| eCos is free software; you can redistribute it and/or modify it under
| the terms of the GNU General Public License as published by the Free
| Software Foundation; either version 2 or (at your option) any later
| version.
|
| eCos is distributed in the hope that it will be useful, but WITHOUT
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
| for more details.
|
| You should have received a copy of the GNU General Public License
| along with eCos; if not, write to the Free Software Foundation, Inc.,
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
| As a special exception, if other files instantiate templates or use
| macros or inline functions from this file, or you compile this file
| and link it with other works to produce a work based on this file,
| this file does not by itself cause the resulting work to be covered by
| the GNU General Public License. However the source code for this file
| must still be made available in accordance with section (3) of the GNU
| General Public License v2.
|
| This exception does not invalidate any other reasons why a work based
| on this file might be covered by the GNU General Public License.
| -------------------------------------------
| ####ECOSGPLCOPYRIGHTEND####
|=============================================================================
|#####DESCRIPTIONBEGIN####
|
| Author(s): Enrico Piria
| Contributors:
| Date: 2005-25-06
| Purpose: MCF5272 variant definitions.
| Description: This file contains macro definitions used in the
| architecture HAL assembler file.
|
|####DESCRIPTIONEND####
|==========================================================================
#define FUNC_START(name) \
.text; \
.balign 4; \
.type name,@function; \
.globl name; \
name:
| ----------------------------------------------------------------------------
| Macros to deal with the interrupt priority level in the status register.
.macro hal_cpu_int_disable
move.w #0x2700,%sr
.endm
.macro hal_cpu_int_enable work
move.w %sr,\work
and.l #0xf8ff,\work
move.w \work,%sr
.endm
.macro hal_cpu_int_merge from work
move.w %sr,\work
and.l #0xf8ff,\work
and.l #0x0700,\from
or.l \from,\work
move.w \work,%sr
.endm
| ----------------------------------------------------------------------------
| Macro to find the value the SP register had before an exception.
.macro find_original_sp out
move.b CYGARC_CF_FMTVECWORD(%sp),\out
lsr.l #4,\out
and.l #0x00000003,\out
add.l #CYGARC_CF_EXCEPTION_SIZE,\out
add.l %sp,\out
.endm
| ----------------------------------------------------------------------------
| Macros used to save and restore MAC registers during interrupts/exceptions.
#ifdef CYGHWR_HAL_COLDFIRE_MAC
.macro save_mac_registers work
| Store MACSR register
move.l %macsr,\work
move.l \work,CYGARC_CFREG_MACSR(%sp)
| Switch to integer mode. This allows to save the contents of ACC
| without rounding
and.l #0x000000df,\work
move.l \work,%macsr
| Store ACC register
move.l %acc,\work
move.l \work,CYGARC_CFREG_MACC(%sp)
| Store MASK register
move.l %mask,\work
move.l \work,CYGARC_CFREG_MASK(%sp)
.endm
.macro restore_mac_registers work
| Load MACSR register
move.l CYGARC_CFREG_MACSR(%sp),\work
move.l \work,%macsr
| Load ACC register
move.l CYGARC_CFREG_MACC(%sp),\work
move.l \work,%acc
| Load MASK register
move.l CYGARC_CFREG_MASK(%sp),\work
move.l \work,%mask
.endm
#endif
| ----------------------------------------------------------------------------
| Macros used to save registers in interrupt handlers. During an interrupt,
| we save registers %d0-%d1 and %a0-%a1 because of the GNU C calling
| conventions. During the handler we also need register %d2.
#ifdef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
.macro int_pres_regs
lea.l -CYGARC_CF_EXCEPTION_DECREMENT(%sp),%sp
movem.l %d0-%d2,CYGARC_CFREG_DREGS(%sp)
movem.l %a0-%a1,CYGARC_CFREG_AREGS(%sp)
.endm
.macro int_rest_regs
movem.l CYGARC_CFREG_AREGS(%sp),%a0-%a1
movem.l CYGARC_CFREG_DREGS(%sp),%d0-%d2
lea.l CYGARC_CF_EXCEPTION_DECREMENT(%sp),%sp
.endm
#else /* CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT */
.macro int_pres_regs
lea.l -CYGARC_CF_EXCEPTION_DECREMENT(%sp),%sp
movem.l %d0-%d7,CYGARC_CFREG_DREGS(%sp)
movem.l %a0-%a6,CYGARC_CFREG_AREGS(%sp)
#ifdef CYGHWR_HAL_COLDFIRE_MAC
save_mac_registers %d0
#endif
| Save old SP (before interrupt)
find_original_sp %d0
move.l %d0,CYGARC_CFREG_SP(%sp)
.endm
.macro int_rest_regs
#ifdef CYGHWR_HAL_COLDFIRE_MAC
restore_mac_registers %d0
#endif
movem.l CYGARC_CFREG_AREGS(%sp),%a0-%a6
movem.l CYGARC_CFREG_DREGS(%sp),%d0-%d7
lea.l CYGARC_CF_EXCEPTION_DECREMENT(%sp),%sp
.endm
#endif /* CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT */
| ----------------------------------------------------------------------------
| Macros used to save/restore registers during context switches.
| We don't save registers %d0-%d1 and %a0-%a1 because of the GNU C calling
| conventions: these macros are used in a routine called by C code.
#ifdef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
.macro ctx_save_registers
lea -CYGARC_CF_CONTEXT_SIZE(%sp),%sp
movem.l %d2-%d7,CYGARC_CFREG_D2(%sp)
movem.l %a2-%a6,CYGARC_CFREG_A2(%sp)
#ifdef CYGHWR_HAL_COLDFIRE_MAC
save_mac_registers %d0
#endif
| Save SR and interrupt level
move.w %sr,%d0
move.w %d0,CYGARC_CF_SR(%sp)
.endm
.macro ctx_restore_registers
| Restore SR and interrupt level
move.w CYGARC_CF_SR(%sp),%d0
move.w %d0,%sr
#ifdef CYGHWR_HAL_COLDFIRE_MAC
restore_mac_registers %d0
#endif
movem.l CYGARC_CFREG_D2(%sp),%d2-%d7
movem.l CYGARC_CFREG_A2(%sp), %a2-%a6
lea CYGARC_CF_CONTEXT_SIZE(%sp),%sp
.endm
#else /* CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM */
.macro ctx_save_registers
| Save all of the registers
lea -CYGARC_CF_CONTEXT_SIZE(%sp),%sp
movem.l %d0-%d7,CYGARC_CFREG_DREGS(%sp)
movem.l %a0-%a7,CYGARC_CFREG_AREGS(%sp)
#ifdef CYGHWR_HAL_COLDFIRE_MAC
save_mac_registers %d0
#endif
| Save pc (useful during debugging with GDB)
lea (%pc),%a0
move.l %a0,CYGARC_CFREG_PC(%sp)
| Save SR and interrupt level
move.w %sr,%d0
move.w %d0,CYGARC_CF_SR(%sp)
.endm
.macro ctx_restore_registers
| Restore SR and interrupt level
move.w CYGARC_CF_SR(%sp),%d0
move.w %d0,%sr
#ifdef CYGHWR_HAL_COLDFIRE_MAC
restore_mac_registers %d0
#endif
movem.l CYGARC_CFREG_DREGS(%sp),%d0-%d7
movem.l CYGARC_CFREG_AREGS(%sp),%a0-%a6
lea CYGARC_CF_CONTEXT_SIZE(%sp),%sp
.endm
#endif /* CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM */
| ----------------------------------------------------------------------------
| End of arch.inc
#endif /* ifndef CYGONCE_HAL_ARCH_INC */
Go to most recent revision | Compare with Previous | Blame | View Log