214 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
;/*
 | 
						|
; * Copyright (c) 2006-2021, RT-Thread Development Team
 | 
						|
; *
 | 
						|
; * SPDX-License-Identifier: Apache-2.0
 | 
						|
; *
 | 
						|
; * Change Logs:
 | 
						|
; * Date           Author       Notes
 | 
						|
; * 2017-07-16     zhangjun     for hifive1
 | 
						|
; * 2018-05-29     tanek        optimize  rt_hw_interrupt_*
 | 
						|
; * 2018-05-29     tanek        add mie register to context
 | 
						|
; */
 | 
						|
 | 
						|
/*
 | 
						|
 * rt_base_t rt_hw_interrupt_disable(void);
 | 
						|
 */
 | 
						|
    .globl rt_hw_interrupt_disable
 | 
						|
rt_hw_interrupt_disable:
 | 
						|
    csrrci a0, mstatus, 8
 | 
						|
    ret
 | 
						|
 | 
						|
/*
 | 
						|
 * void rt_hw_interrupt_enable(rt_base_t level);
 | 
						|
 */
 | 
						|
    .globl rt_hw_interrupt_enable
 | 
						|
rt_hw_interrupt_enable:
 | 
						|
    csrw mstatus, a0
 | 
						|
    ret
 | 
						|
 | 
						|
/*
 | 
						|
 * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
 | 
						|
 * a0 --> from
 | 
						|
 * a1 --> to
 | 
						|
 */
 | 
						|
    .globl rt_hw_context_switch
 | 
						|
rt_hw_context_switch:
 | 
						|
 | 
						|
    /* saved from thread context
 | 
						|
     *     x1/ra       -> sp(0)
 | 
						|
     *     x1/ra       -> sp(1)
 | 
						|
     *     mstatus.mie -> sp(2)
 | 
						|
     *     x(i)        -> sp(i-4)
 | 
						|
     */
 | 
						|
    addi  sp,  sp, -32 * 4
 | 
						|
    sw sp,  (a0)
 | 
						|
 | 
						|
    sw x1,   0 * 4(sp)
 | 
						|
    sw x1,   1 * 4(sp)
 | 
						|
 | 
						|
    csrr a0, mstatus
 | 
						|
    andi a0, a0, 8
 | 
						|
    beqz a0, save_mpie
 | 
						|
    li   a0, 0x80
 | 
						|
save_mpie:
 | 
						|
    sw a0,   2 * 4(sp)
 | 
						|
 | 
						|
    sw x4,   4 * 4(sp)
 | 
						|
    sw x5,   5 * 4(sp)
 | 
						|
    sw x6,   6 * 4(sp)
 | 
						|
    sw x7,   7 * 4(sp)
 | 
						|
    sw x8,   8 * 4(sp)
 | 
						|
    sw x9,   9 * 4(sp)
 | 
						|
    sw x10, 10 * 4(sp)
 | 
						|
    sw x11, 11 * 4(sp)
 | 
						|
    sw x12, 12 * 4(sp)
 | 
						|
    sw x13, 13 * 4(sp)
 | 
						|
    sw x14, 14 * 4(sp)
 | 
						|
    sw x15, 15 * 4(sp)
 | 
						|
    sw x16, 16 * 4(sp)
 | 
						|
    sw x17, 17 * 4(sp)
 | 
						|
    sw x18, 18 * 4(sp)
 | 
						|
    sw x19, 19 * 4(sp)
 | 
						|
    sw x20, 20 * 4(sp)
 | 
						|
    sw x21, 21 * 4(sp)
 | 
						|
    sw x22, 22 * 4(sp)
 | 
						|
    sw x23, 23 * 4(sp)
 | 
						|
    sw x24, 24 * 4(sp)
 | 
						|
    sw x25, 25 * 4(sp)
 | 
						|
    sw x26, 26 * 4(sp)
 | 
						|
    sw x27, 27 * 4(sp)
 | 
						|
    sw x28, 28 * 4(sp)
 | 
						|
    sw x29, 29 * 4(sp)
 | 
						|
    sw x30, 30 * 4(sp)
 | 
						|
    sw x31, 31 * 4(sp)
 | 
						|
 | 
						|
    /* restore to thread context
 | 
						|
     * sp(0) -> epc;
 | 
						|
     * sp(1) -> ra;
 | 
						|
     * sp(i) -> x(i+2)
 | 
						|
     */
 | 
						|
    lw sp,  (a1)
 | 
						|
 | 
						|
    /* resw ra to mepc */
 | 
						|
    lw a1,   0 * 4(sp)
 | 
						|
    csrw mepc, a1
 | 
						|
    lw x1,   1 * 4(sp)
 | 
						|
 | 
						|
    /* force to machin mode(MPP=11) */
 | 
						|
    li a1, 0x00001800;
 | 
						|
    csrs mstatus, a1
 | 
						|
    lw a1,   2 * 4(sp)
 | 
						|
    csrs mstatus, a1
 | 
						|
 | 
						|
    lw x4,   4 * 4(sp)
 | 
						|
    lw x5,   5 * 4(sp)
 | 
						|
    lw x6,   6 * 4(sp)
 | 
						|
    lw x7,   7 * 4(sp)
 | 
						|
    lw x8,   8 * 4(sp)
 | 
						|
    lw x9,   9 * 4(sp)
 | 
						|
    lw x10, 10 * 4(sp)
 | 
						|
    lw x11, 11 * 4(sp)
 | 
						|
    lw x12, 12 * 4(sp)
 | 
						|
    lw x13, 13 * 4(sp)
 | 
						|
    lw x14, 14 * 4(sp)
 | 
						|
    lw x15, 15 * 4(sp)
 | 
						|
    lw x16, 16 * 4(sp)
 | 
						|
    lw x17, 17 * 4(sp)
 | 
						|
    lw x18, 18 * 4(sp)
 | 
						|
    lw x19, 19 * 4(sp)
 | 
						|
    lw x20, 20 * 4(sp)
 | 
						|
    lw x21, 21 * 4(sp)
 | 
						|
    lw x22, 22 * 4(sp)
 | 
						|
    lw x23, 23 * 4(sp)
 | 
						|
    lw x24, 24 * 4(sp)
 | 
						|
    lw x25, 25 * 4(sp)
 | 
						|
    lw x26, 26 * 4(sp)
 | 
						|
    lw x27, 27 * 4(sp)
 | 
						|
    lw x28, 28 * 4(sp)
 | 
						|
    lw x29, 29 * 4(sp)
 | 
						|
    lw x30, 30 * 4(sp)
 | 
						|
    lw x31, 31 * 4(sp)
 | 
						|
 | 
						|
    addi sp,  sp, 32 * 4
 | 
						|
    mret
 | 
						|
 | 
						|
/*
 | 
						|
 * void rt_hw_context_switch_to(rt_uint32 to);
 | 
						|
 * a0 --> to
 | 
						|
 */
 | 
						|
    .globl rt_hw_context_switch_to
 | 
						|
rt_hw_context_switch_to:
 | 
						|
    lw sp, (a0)
 | 
						|
 | 
						|
    /* load epc from stack */
 | 
						|
    lw a0,   0 * 4(sp)
 | 
						|
    csrw mepc, a0
 | 
						|
    lw x1,   1 * 4(sp)
 | 
						|
    /* load mstatus from stack */
 | 
						|
    lw a0,   2 * 4(sp)
 | 
						|
    csrw mstatus, a0
 | 
						|
    lw x4,   4 * 4(sp)
 | 
						|
    lw x5,   5 * 4(sp)
 | 
						|
    lw x6,   6 * 4(sp)
 | 
						|
    lw x7,   7 * 4(sp)
 | 
						|
    lw x8,   8 * 4(sp)
 | 
						|
    lw x9,   9 * 4(sp)
 | 
						|
    lw x10, 10 * 4(sp)
 | 
						|
    lw x11, 11 * 4(sp)
 | 
						|
    lw x12, 12 * 4(sp)
 | 
						|
    lw x13, 13 * 4(sp)
 | 
						|
    lw x14, 14 * 4(sp)
 | 
						|
    lw x15, 15 * 4(sp)
 | 
						|
    lw x16, 16 * 4(sp)
 | 
						|
    lw x17, 17 * 4(sp)
 | 
						|
    lw x18, 18 * 4(sp)
 | 
						|
    lw x19, 19 * 4(sp)
 | 
						|
    lw x20, 20 * 4(sp)
 | 
						|
    lw x21, 21 * 4(sp)
 | 
						|
    lw x22, 22 * 4(sp)
 | 
						|
    lw x23, 23 * 4(sp)
 | 
						|
    lw x24, 24 * 4(sp)
 | 
						|
    lw x25, 25 * 4(sp)
 | 
						|
    lw x26, 26 * 4(sp)
 | 
						|
    lw x27, 27 * 4(sp)
 | 
						|
    lw x28, 28 * 4(sp)
 | 
						|
    lw x29, 29 * 4(sp)
 | 
						|
    lw x30, 30 * 4(sp)
 | 
						|
    lw x31, 31 * 4(sp)
 | 
						|
 | 
						|
    addi sp,  sp, 32 * 4
 | 
						|
    mret
 | 
						|
 | 
						|
/*
 | 
						|
 * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
 | 
						|
 */
 | 
						|
    .globl rt_thread_switch_interrupt_flag
 | 
						|
    .globl rt_interrupt_from_thread
 | 
						|
    .globl rt_interrupt_to_thread
 | 
						|
    .globl rt_hw_context_switch_interrupt
 | 
						|
rt_hw_context_switch_interrupt:
 | 
						|
    addi sp, sp, -16
 | 
						|
    sw   s0, 12(sp)
 | 
						|
    sw   a0, 8(sp)
 | 
						|
    sw   a5, 4(sp)
 | 
						|
 | 
						|
    la   a0, rt_thread_switch_interrupt_flag
 | 
						|
    lw   a5, (a0)
 | 
						|
    bnez a5, _reswitch
 | 
						|
    li   a5, 1
 | 
						|
    sw   a5, (a0)
 | 
						|
 | 
						|
    la   a5, rt_interrupt_from_thread
 | 
						|
    lw   a0, 8(sp)
 | 
						|
    sw   a0, (a5)
 | 
						|
 | 
						|
_reswitch:
 | 
						|
    la   a5, rt_interrupt_to_thread
 | 
						|
    sw   a1, (a5)
 | 
						|
 | 
						|
    lw   a5, 4(sp)
 | 
						|
    lw   a0, 8(sp)
 | 
						|
    lw   s0, 12(sp)
 | 
						|
    addi sp, sp, 16
 | 
						|
    ret
 |