542 lines
9.2 KiB
C
542 lines
9.2 KiB
C
/* ------------------------------------------
|
|
* Copyright (c) 2016, Synopsys, Inc. All rights reserved.
|
|
|
|
* 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 of the Synopsys, Inc., 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 HOLDER 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.
|
|
*
|
|
* \version 2016.05
|
|
* \date 2014-07-15
|
|
* \author Wayne Ren(Wei.Ren@synopsys.com)
|
|
--------------------------------------------- */
|
|
|
|
/**
|
|
* \file
|
|
* \ingroup ARC_HAL_MISC
|
|
* \brief common macro definitions for assembly file
|
|
*/
|
|
/** @cond ARC_HAL_ASM_COMMON */
|
|
|
|
#ifndef _ARC_HAL_ASM_COMMON_H_
|
|
#define _ARC_HAL_ASM_COMMON_H_
|
|
|
|
#include "embARC_BSP_config.h"
|
|
#include "arc_feature_config.h"
|
|
|
|
/* Note on the LD/ST addr modes with addr reg wback
|
|
*
|
|
* LD.a same as LD.aw
|
|
*
|
|
* LD.a reg1, [reg2, x] => Pre Incr
|
|
* Eff Addr for load = [reg2 + x]
|
|
*
|
|
* LD.ab reg1, [reg2, x] => Post Incr
|
|
* Eff Addr for load = [reg2]
|
|
*/
|
|
#if defined(__GNU__)
|
|
.macro PUSH reg
|
|
st.a \reg, [sp, -4]
|
|
.endm
|
|
|
|
.macro PUSHAX aux
|
|
lr r10, [\aux]
|
|
PUSH r10
|
|
.endm
|
|
|
|
.macro POP reg
|
|
ld.ab \reg, [sp, 4]
|
|
.endm
|
|
|
|
.macro POPAX aux
|
|
POP r10
|
|
sr r10, [\aux]
|
|
.endm
|
|
#else
|
|
.macro PUSH, reg
|
|
st.a reg, [sp, -4]
|
|
.endm
|
|
|
|
.macro PUSHAX, aux
|
|
lr r10, [aux]
|
|
PUSH r10
|
|
.endm
|
|
|
|
.macro POP, reg
|
|
ld.ab reg, [sp, 4]
|
|
.endm
|
|
|
|
.macro POPAX, aux
|
|
POP r10
|
|
sr r10, [aux]
|
|
.endm
|
|
#endif
|
|
|
|
/*--------------------------------------------------------------
|
|
* Helpers to save/restore callee-saved regs:
|
|
* used by several macros below
|
|
*-------------------------------------------------------------*/
|
|
.macro SAVE_CALLEE_REGS
|
|
PUSH r13
|
|
PUSH r14
|
|
PUSH r15
|
|
#ifndef ARC_FEATURE_RF16
|
|
PUSH r16
|
|
PUSH r17
|
|
PUSH r18
|
|
PUSH r19
|
|
PUSH r20
|
|
PUSH r21
|
|
PUSH r22
|
|
PUSH r23
|
|
PUSH r24
|
|
PUSH r25
|
|
#endif
|
|
.endm
|
|
|
|
.macro RESTORE_CALLEE_REGS
|
|
#ifndef ARC_FEATURE_RF16
|
|
POP r25
|
|
POP r24
|
|
POP r23
|
|
POP r22
|
|
POP r21
|
|
POP r20
|
|
POP r19
|
|
POP r18
|
|
POP r17
|
|
POP r16
|
|
#endif
|
|
POP r15
|
|
POP r14
|
|
POP r13
|
|
.endm
|
|
|
|
.macro CLEAR_CALLEE_REGS
|
|
#ifndef ARC_FEATURE_RF16
|
|
mov r25, 0
|
|
mov r24, 0
|
|
mov r23, 0
|
|
mov r22, 0
|
|
mov r21, 0
|
|
mov r20, 0
|
|
mov r19, 0
|
|
mov r18, 0
|
|
mov r17, 0
|
|
mov r16, 0
|
|
#endif
|
|
mov r15, 0
|
|
mov r14, 0
|
|
mov r13, 0
|
|
.endm
|
|
|
|
.macro CLEAR_SCRATCH_REGS
|
|
mov r1, 0
|
|
mov r2, 0
|
|
mov r3, 0
|
|
mov r4, 0
|
|
mov r5, 0
|
|
mov r6, 0
|
|
mov r7, 0
|
|
mov r8, 0
|
|
mov r9, 0
|
|
mov r10, 0
|
|
mov r11, 0
|
|
mov r12, 0
|
|
|
|
mov fp, 0
|
|
mov r29, 0
|
|
mov r30, 0
|
|
.endm
|
|
|
|
|
|
.macro SAVE_LP_REGS
|
|
PUSH r60
|
|
PUSHAX AUX_LP_START
|
|
PUSHAX AUX_LP_END
|
|
.endm
|
|
|
|
.macro RESTORE_LP_REGS
|
|
POPAX AUX_LP_END
|
|
POPAX AUX_LP_START
|
|
POP r10
|
|
/* must not use the LP_COUNT register(r60) as the destination of multi-cycle instruction */
|
|
mov r60, r10
|
|
|
|
.endm
|
|
|
|
.macro SAVE_R0_TO_R12
|
|
PUSH r0
|
|
PUSH r1
|
|
PUSH r2
|
|
PUSH r3
|
|
#ifndef ARC_FEATURE_RF16
|
|
PUSH r4
|
|
PUSH r5
|
|
PUSH r6
|
|
PUSH r7
|
|
PUSH r8
|
|
PUSH r9
|
|
#endif
|
|
PUSH r10
|
|
PUSH r11
|
|
PUSH r12
|
|
.endm
|
|
|
|
.macro RESTORE_R0_TO_R12
|
|
POP r12
|
|
POP r11
|
|
POP r10
|
|
#ifndef ARC_FEATURE_RF16
|
|
POP r9
|
|
POP r8
|
|
POP r7
|
|
POP r6
|
|
POP r5
|
|
POP r4
|
|
#endif
|
|
POP r3
|
|
POP r2
|
|
POP r1
|
|
POP r0
|
|
.endm
|
|
|
|
.macro SAVE_CODE_DENSITY
|
|
PUSHAX AUX_JLI_BASE
|
|
PUSHAX AUX_LDI_BASE
|
|
PUSHAX AUX_EI_BASE
|
|
.endm
|
|
|
|
.macro RESTORE_CODE_DENSITY
|
|
POPAX AUX_EI_BASE
|
|
POPAX AUX_LDI_BASE
|
|
POPAX AUX_JLI_BASE
|
|
.endm
|
|
|
|
/* todo: check the contents of NON_SCRATCH_REGS in debug */
|
|
.macro SAVE_NONSCRATCH_REGS
|
|
/* r0-r12 are saved by caller function */
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH blink
|
|
SAVE_CALLEE_REGS
|
|
.endm
|
|
|
|
.macro RESTORE_NONSCRATCH_REGS
|
|
RESTORE_CALLEE_REGS
|
|
POP blink
|
|
POP fp
|
|
POP gp
|
|
.endm
|
|
|
|
|
|
.macro SAVE_FIQ_EXC_REGS
|
|
#ifndef ARC_FEATURE_RGF_BANKED_REGS
|
|
SAVE_R0_TO_R12
|
|
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH r30 /* general purpose */
|
|
PUSH blink
|
|
|
|
#else
|
|
#if ARC_FEATURE_RGF_BANKED_REGS != 4 && ARC_FEATURE_RGF_BANKED_REGS != 8 && \
|
|
ARC_FEATURE_RGF_BANKED_REGS != 16 && ARC_FEATURE_RGF_BANKED_REGS != 32
|
|
#error "unsupported ARC_FEATURE_RGF_BANKED_REGS"
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 || \
|
|
ARC_FEATURE_RGF_BANKED_REGS == 16
|
|
PUSH r4
|
|
PUSH r5
|
|
PUSH r6
|
|
PUSH r7
|
|
PUSH r8
|
|
PUSH r9
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8
|
|
PUSH r10
|
|
PUSH r11
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4
|
|
PUSH r12
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH r30 /* general purpose */
|
|
PUSH blink
|
|
#endif
|
|
|
|
#endif /* #ifndef ARC_FEATURE_RGF_BANKED_REGS */
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
SAVE_CODE_DENSITY
|
|
#endif
|
|
SAVE_LP_REGS
|
|
.endm
|
|
|
|
.macro RESTORE_FIQ_EXC_REGS
|
|
RESTORE_LP_REGS
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
RESTORE_CODE_DENSITY
|
|
#endif
|
|
|
|
#ifndef ARC_FEATURE_RGF_BANKED_REGS
|
|
POP blink
|
|
POP r30
|
|
POP fp
|
|
POP gp
|
|
|
|
RESTORE_R0_TO_R12
|
|
#else
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS != 4 && ARC_FEATURE_RGF_BANKED_REGS != 8 && \
|
|
ARC_FEATURE_RGF_BANKED_REGS != 16 && ARC_FEATURE_RGF_BANKED_REGS != 32
|
|
#error "unsupported ARC_FEATURE_RGF_BANKED_REGS"
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8
|
|
POP blink
|
|
POP r30
|
|
POP fp
|
|
POP gp
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4
|
|
POP r12
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8
|
|
POP r11
|
|
POP r10
|
|
#endif
|
|
|
|
#if ARC_FEATURE_RGF_BANKED_REGS == 4 || ARC_FEATURE_BANKED_REGS == 8 || \
|
|
ARC_FEATURE_RGF_BANKED_REGS == 16
|
|
POP r9
|
|
POP r8
|
|
POP r7
|
|
POP r6
|
|
POP r5
|
|
POP r4
|
|
#endif
|
|
|
|
#endif /* #ifndef ARC_FEATURE_RGF_BANKED_REGS */
|
|
.endm
|
|
|
|
/* normal interrupt prologue, pc, status and r0-r11 are saved by hardware */
|
|
.macro INTERRUPT_PROLOGUE
|
|
PUSH r12
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH ilink
|
|
PUSH r30
|
|
|
|
sub sp, sp, 4 /* skip bta */
|
|
.endm
|
|
|
|
|
|
/* normal interrupt epilogue, pc, status and r0-r11 are restored by hardware */
|
|
.macro INTERRUPT_EPILOGUE
|
|
add sp, sp, 4 /* skip bta */
|
|
|
|
POP r30
|
|
POP ilink
|
|
POP fp
|
|
POP gp
|
|
POP r12
|
|
.endm
|
|
|
|
#if SECURESHIELD_VERSION == 2
|
|
/* exception prologue, create the same frame of interrupt manually */
|
|
.macro EXCEPTION_PROLOGUE
|
|
st.as r10, [sp, -6] /* save r10 first, free up a register*/
|
|
|
|
PUSHAX AUX_ERSTATUS
|
|
sub sp, sp, 4 /* slot for SEC_STAT */
|
|
PUSHAX AUX_ERRET
|
|
|
|
PUSH blink
|
|
|
|
PUSH r11
|
|
sub sp, sp, 4 /* r10 is pushed before */
|
|
#ifndef ARC_FEATURE_RF16
|
|
PUSH r9
|
|
PUSH r8
|
|
PUSH r7
|
|
PUSH r6
|
|
PUSH r5
|
|
PUSH r4
|
|
#endif
|
|
PUSH r3
|
|
PUSH r2
|
|
PUSH r1
|
|
PUSH r0
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
SAVE_CODE_DENSITY
|
|
#endif
|
|
SAVE_LP_REGS
|
|
|
|
PUSH r12
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH ilink
|
|
PUSH r30
|
|
|
|
PUSHAX AUX_ERBTA
|
|
.endm
|
|
|
|
/* exception epilogue, restore the same frame of interrupt manually */
|
|
.macro EXCEPTION_EPILOGUE
|
|
POPAX AUX_ERBTA
|
|
|
|
POP r30
|
|
POP ilink
|
|
POP fp
|
|
POP gp
|
|
POP r12
|
|
|
|
RESTORE_LP_REGS
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
RESTORE_CODE_DENSITY
|
|
#endif
|
|
POP r0
|
|
POP r1
|
|
POP r2
|
|
POP r3
|
|
#ifndef ARC_FEATURE_RF16
|
|
POP r4
|
|
POP r5
|
|
POP r6
|
|
POP r7
|
|
POP r8
|
|
POP r9
|
|
#endif
|
|
add sp, sp, 4 /* r10 will be popped finally */
|
|
POP r11
|
|
|
|
POP blink
|
|
|
|
|
|
POPAX AUX_ERRET
|
|
add sp, sp, 4 /* slot for SEC_STAT */
|
|
POPAX AUX_ERSTATUS
|
|
|
|
ld.as r10, [sp, -6] /* restore r10 */
|
|
.endm
|
|
#else /* normal version */
|
|
/* exception prologue, create the same frame of interrupt manually */
|
|
.macro EXCEPTION_PROLOGUE
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
st.as r10, [sp, -11] /* save r10 first, free up a register*/
|
|
#else
|
|
st.as r10, [sp, -8]
|
|
#endif
|
|
PUSHAX AUX_ERSTATUS
|
|
PUSHAX AUX_ERRET
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
SAVE_CODE_DENSITY
|
|
#endif
|
|
SAVE_LP_REGS
|
|
|
|
PUSH blink
|
|
|
|
PUSH r11
|
|
sub sp, sp, 4 /* r10 is pushed before */
|
|
#ifndef ARC_FEATURE_RF16
|
|
PUSH r9
|
|
PUSH r8
|
|
PUSH r7
|
|
PUSH r6
|
|
PUSH r5
|
|
PUSH r4
|
|
#endif
|
|
PUSH r3
|
|
PUSH r2
|
|
PUSH r1
|
|
PUSH r0
|
|
|
|
PUSH r12
|
|
PUSH gp
|
|
PUSH fp
|
|
PUSH ilink
|
|
PUSH r30
|
|
|
|
PUSHAX AUX_ERBTA
|
|
.endm
|
|
|
|
/* exception epilogue, restore the same frame of interrupt manually */
|
|
.macro EXCEPTION_EPILOGUE
|
|
POPAX AUX_ERBTA
|
|
|
|
POP r30
|
|
POP ilink
|
|
POP fp
|
|
POP gp
|
|
POP r12
|
|
|
|
POP r0
|
|
POP r1
|
|
POP r2
|
|
POP r3
|
|
#ifndef ARC_FEATURE_RF16
|
|
POP r4
|
|
POP r5
|
|
POP r6
|
|
POP r7
|
|
POP r8
|
|
POP r9
|
|
#endif
|
|
add sp, sp, 4 /* r10 will be popped finally */
|
|
POP r11
|
|
|
|
POP blink
|
|
|
|
RESTORE_LP_REGS
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
RESTORE_CODE_DENSITY
|
|
#endif
|
|
|
|
POPAX AUX_ERRET
|
|
POPAX AUX_ERSTATUS
|
|
|
|
#ifdef ARC_FEATURE_CODE_DENSITY
|
|
ld.as r10, [sp, -11] /* restore r10 */
|
|
#else
|
|
ld.as r10, [sp, -8]
|
|
#endif
|
|
.endm
|
|
|
|
#endif /* SECURESHIELD_VERSION == 2 */
|
|
|
|
#endif /* _ARC_HAL_ASM_COMMON_H */
|
|
/** @endcond */
|