| /* |
| * Copyright (c) 2018 Synopsys. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #include <zephyr/toolchain.h> |
| #include <zephyr/linker/sections.h> |
| #include <zephyr/arch/cpu.h> |
| |
| .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 |
| .endm |
| |
| .macro clear_callee_regs |
| 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 |
| |
| mov r15, 0 |
| mov r14, 0 |
| mov r13, 0 |
| .endm |
| |
| GTEXT(arc_go_to_normal) |
| GTEXT(_arc_do_secure_call) |
| GDATA(arc_s_call_table) |
| |
| |
| SECTION_FUNC(TEXT, _arc_do_secure_call) |
| /* r0-r5: arg1-arg6, r6 is call id */ |
| /* the call id should be checked */ |
| /* disable normal interrupt happened when processor in secure mode ? */ |
| /* seti (0x30 | (ARC_N_IRQ_START_LEVEL-1)) */ |
| breq r6, ARC_S_CALL_CLRI, _s_clri |
| breq r6, ARC_S_CALL_SETI, _s_seti |
| push_s blink |
| mov blink, arc_s_call_table |
| ld.as r6, [blink, r6] |
| |
| jl [r6] |
| |
| /* |
| * no need to clear callee regs, as they will be saved and restored |
| * automatically |
| */ |
| clear_scratch_regs |
| |
| mov r29, 0 |
| mov r30, 0 |
| |
| |
| _arc_do_secure_call_exit: |
| pop_s blink |
| |
| j [blink] |
| /* enable normal interrupt */ |
| /* |
| * j.d [blink] |
| * seti (0x30 | (CONFIG_NUM_IRQ_PRIO_LEVELS - 1)) |
| */ |
| |
| _s_clri: |
| lr r0, [_ARC_V2_STATUS32] |
| and r0, r0, 0x1e |
| asr r0, r0 |
| or r0, r0, 0x30 |
| mov r6, (0x30 | (ARC_N_IRQ_START_LEVEL-1)) |
| |
| j.d [blink] |
| seti r6 |
| |
| _s_seti: |
| btst r0, 4 |
| jnz __seti_0 |
| mov r0, (CONFIG_NUM_IRQ_PRIO_LEVELS - 1) |
| lr r6, [_ARC_V2_STATUS32] |
| and r6, r6, 0x1e |
| asr r6, r6 |
| cmp r0, r6 |
| mov.hs r0, r6 |
| __seti_0: |
| and r0, r0, 0xf |
| brhs r0, ARC_N_IRQ_START_LEVEL, __seti_1 |
| mov r0, ARC_N_IRQ_START_LEVEL |
| __seti_1: |
| or r0, r0, 0x30 |
| |
| j.d [blink] |
| seti r0 |
| |
| |
| SECTION_FUNC(TEXT, arc_go_to_normal) |
| clear_callee_regs |
| clear_scratch_regs |
| |
| mov fp, 0 |
| mov r29, 0 |
| mov r30, 0 |
| mov blink, 0 |
| |
| jl [r0] |
| /* should not come here */ |
| kflag 1 |
| |