123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541 |
- /* ------------------------------------------
- * 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 */
|