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
 | 
