300 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/*
 | 
						|
    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.
 | 
						|
    All rights reserved
 | 
						|
 | 
						|
    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
 | 
						|
 | 
						|
    This file is part of the FreeRTOS distribution and was contributed
 | 
						|
    to the project by Technolution B.V. (www.technolution.nl,
 | 
						|
    freertos-riscv@technolution.eu) under the terms of the FreeRTOS
 | 
						|
    contributors license.
 | 
						|
 | 
						|
    FreeRTOS is free software; you can redistribute it and/or modify it under
 | 
						|
    the terms of the GNU General Public License (version 2) as published by the
 | 
						|
    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
 | 
						|
 | 
						|
    ***************************************************************************
 | 
						|
    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
 | 
						|
    >>!   distribute a combined work that includes FreeRTOS without being   !<<
 | 
						|
    >>!   obliged to provide the source code for proprietary components     !<<
 | 
						|
    >>!   outside of the FreeRTOS kernel.                                   !<<
 | 
						|
    ***************************************************************************
 | 
						|
 | 
						|
    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
						|
    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
 | 
						|
    link: http://www.freertos.org/a00114.html
 | 
						|
 | 
						|
    ***************************************************************************
 | 
						|
     *                                                                       *
 | 
						|
     *    FreeRTOS provides completely free yet professionally developed,    *
 | 
						|
     *    robust, strictly quality controlled, supported, and cross          *
 | 
						|
     *    platform software that is more than just the market leader, it     *
 | 
						|
     *    is the industry's de facto standard.                               *
 | 
						|
     *                                                                       *
 | 
						|
     *    Help yourself get started quickly while simultaneously helping     *
 | 
						|
     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
 | 
						|
     *    tutorial book, reference manual, or both:                          *
 | 
						|
     *    http://www.FreeRTOS.org/Documentation                              *
 | 
						|
     *                                                                       *
 | 
						|
    ***************************************************************************
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
 | 
						|
    the FAQ page "My application does not run, what could be wrong?".  Have you
 | 
						|
    defined configASSERT()?
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/support - In return for receiving this top quality
 | 
						|
    embedded software for free we request you assist our global community by
 | 
						|
    participating in the support forum.
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/training - Investing in training allows your team to
 | 
						|
    be as productive as possible as early as possible.  Now you can receive
 | 
						|
    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
 | 
						|
    Ltd, and the world's leading authority on the world's leading RTOS.
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
 | 
						|
    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
 | 
						|
    compatible FAT file system, and our tiny thread aware UDP/IP stack.
 | 
						|
 | 
						|
    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
 | 
						|
    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
 | 
						|
 | 
						|
    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
 | 
						|
    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
 | 
						|
    licenses offer ticketed support, indemnification and commercial middleware.
 | 
						|
 | 
						|
    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
 | 
						|
    engineered and independently SIL3 certified version for use in safety and
 | 
						|
    mission critical applications that require provable dependability.
 | 
						|
 | 
						|
    1 tab == 4 spaces!
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
#ifdef __riscv64
 | 
						|
# define STORE    sd
 | 
						|
# define LOAD     ld
 | 
						|
# define REGBYTES 8
 | 
						|
#else
 | 
						|
# define STORE    sw
 | 
						|
# define LOAD     lw
 | 
						|
# define REGBYTES 4
 | 
						|
#endif
 | 
						|
 | 
						|
#define MSTATUS_PRV1 0x30
 | 
						|
//#define MSTATUS_PRV1 0x1880
 | 
						|
 | 
						|
.global portSAVE_CONTEXT
 | 
						|
.global portRESTORE_CONTEXT
 | 
						|
.global TIMER_CMP_INT
 | 
						|
.global xPortStartScheduler
 | 
						|
.global vPortYield
 | 
						|
.global vTaskIncrementTick
 | 
						|
.global vPortEndScheduler
 | 
						|
.global xExitStack
 | 
						|
 | 
						|
 | 
						|
/* Macro for saving task context */
 | 
						|
.macro portSAVE_CONTEXT
 | 
						|
	.global	pxCurrentTCB
 | 
						|
	/* make room in stack */
 | 
						|
	addi	sp, sp, -REGBYTES * 32
 | 
						|
 | 
						|
	/* Save Context */
 | 
						|
	STORE	x1, 0x0(sp)
 | 
						|
	STORE	x2, 1 * REGBYTES(sp)
 | 
						|
	STORE	x3, 2 * REGBYTES(sp)
 | 
						|
	STORE	x4, 3 * REGBYTES(sp)
 | 
						|
	STORE	x5, 4 * REGBYTES(sp)
 | 
						|
	STORE	x6, 5 * REGBYTES(sp)
 | 
						|
	STORE	x7, 6 * REGBYTES(sp)
 | 
						|
	STORE	x8, 7 * REGBYTES(sp)
 | 
						|
	STORE	x9, 8 * REGBYTES(sp)
 | 
						|
	STORE	x10, 9 * REGBYTES(sp)
 | 
						|
	STORE	x11, 10 * REGBYTES(sp)
 | 
						|
	STORE	x12, 11 * REGBYTES(sp)
 | 
						|
	STORE	x13, 12 * REGBYTES(sp)
 | 
						|
	STORE	x14, 13 * REGBYTES(sp)
 | 
						|
	STORE	x15, 14 * REGBYTES(sp)
 | 
						|
	STORE	x16, 15 * REGBYTES(sp)
 | 
						|
	STORE	x17, 16 * REGBYTES(sp)
 | 
						|
	STORE	x18, 17 * REGBYTES(sp)
 | 
						|
	STORE	x19, 18 * REGBYTES(sp)
 | 
						|
	STORE	x20, 19 * REGBYTES(sp)
 | 
						|
	STORE	x21, 20 * REGBYTES(sp)
 | 
						|
	STORE	x22, 21 * REGBYTES(sp)
 | 
						|
	STORE	x23, 22 * REGBYTES(sp)
 | 
						|
	STORE	x24, 23 * REGBYTES(sp)
 | 
						|
	STORE	x25, 24 * REGBYTES(sp)
 | 
						|
	STORE	x26, 25 * REGBYTES(sp)
 | 
						|
	STORE	x27, 26 * REGBYTES(sp)
 | 
						|
	STORE	x28, 27 * REGBYTES(sp)
 | 
						|
	STORE	x29, 28 * REGBYTES(sp)
 | 
						|
	STORE	x30, 29 * REGBYTES(sp)
 | 
						|
	STORE	x31, 30 * REGBYTES(sp)
 | 
						|
 | 
						|
	/* Store current stackpointer in task control block (TCB) */
 | 
						|
	LOAD	t0, pxCurrentTCB	//pointer
 | 
						|
	STORE	sp, 0x0(t0)
 | 
						|
	.endm
 | 
						|
 | 
						|
/* Saves current error program counter (EPC) as task program counter */
 | 
						|
.macro portSAVE_EPC
 | 
						|
  csrr	t0, mepc
 | 
						|
	STORE	t0, 31 * REGBYTES(sp)
 | 
						|
	.endm
 | 
						|
 | 
						|
/* Saves current return adress (RA) as task program counter */
 | 
						|
.macro portSAVE_RA
 | 
						|
	STORE	ra, 31 * REGBYTES(sp)
 | 
						|
	.endm
 | 
						|
 | 
						|
/* Macro for restoring task context */
 | 
						|
.macro portRESTORE_CONTEXT
 | 
						|
 | 
						|
	.global	pxCurrentTCB
 | 
						|
	/* Load stack pointer from the current TCB */
 | 
						|
	LOAD	sp, pxCurrentTCB
 | 
						|
	LOAD	sp, 0x0(sp)
 | 
						|
 | 
						|
	/* Load task program counter */
 | 
						|
	LOAD	t0, 31 * REGBYTES(sp)
 | 
						|
  csrw	mepc, t0
 | 
						|
 | 
						|
	/* Run in machine mode */
 | 
						|
  li 		t0, MSTATUS_PRV1
 | 
						|
  csrs	mstatus, t0
 | 
						|
 | 
						|
	/* Restore registers,
 | 
						|
	   Skip global pointer because that does not change */
 | 
						|
	LOAD	x1, 0x0(sp)
 | 
						|
	LOAD	x4, 3 * REGBYTES(sp)
 | 
						|
	LOAD	x5, 4 * REGBYTES(sp)
 | 
						|
	LOAD	x6, 5 * REGBYTES(sp)
 | 
						|
	LOAD	x7, 6 * REGBYTES(sp)
 | 
						|
	LOAD	x8, 7 * REGBYTES(sp)
 | 
						|
	LOAD	x9, 8 * REGBYTES(sp)
 | 
						|
	LOAD	x10, 9 * REGBYTES(sp)
 | 
						|
	LOAD	x11, 10 * REGBYTES(sp)
 | 
						|
	LOAD	x12, 11 * REGBYTES(sp)
 | 
						|
	LOAD	x13, 12 * REGBYTES(sp)
 | 
						|
	LOAD	x14, 13 * REGBYTES(sp)
 | 
						|
	LOAD	x15, 14 * REGBYTES(sp)
 | 
						|
	LOAD	x16, 15 * REGBYTES(sp)
 | 
						|
	LOAD	x17, 16 * REGBYTES(sp)
 | 
						|
	LOAD	x18, 17 * REGBYTES(sp)
 | 
						|
	LOAD	x19, 18 * REGBYTES(sp)
 | 
						|
	LOAD	x20, 19 * REGBYTES(sp)
 | 
						|
	LOAD	x21, 20 * REGBYTES(sp)
 | 
						|
	LOAD	x22, 21 * REGBYTES(sp)
 | 
						|
	LOAD	x23, 22 * REGBYTES(sp)
 | 
						|
	LOAD	x24, 23 * REGBYTES(sp)
 | 
						|
	LOAD	x25, 24 * REGBYTES(sp)
 | 
						|
	LOAD	x26, 25 * REGBYTES(sp)
 | 
						|
	LOAD	x27, 26 * REGBYTES(sp)
 | 
						|
	LOAD	x28, 27 * REGBYTES(sp)
 | 
						|
	LOAD	x29, 28 * REGBYTES(sp)
 | 
						|
	LOAD	x30, 29 * REGBYTES(sp)
 | 
						|
	LOAD	x31, 30 * REGBYTES(sp)
 | 
						|
 | 
						|
	addi	sp, sp, REGBYTES * 32
 | 
						|
	mret
 | 
						|
	.endm
 | 
						|
 | 
						|
/* Macro for restoring task context */
 | 
						|
.align 2
 | 
						|
TIMER_CMP_INT:
 | 
						|
	portSAVE_CONTEXT
 | 
						|
	portSAVE_EPC
 | 
						|
	jal	vPortSysTickHandler
 | 
						|
	portRESTORE_CONTEXT
 | 
						|
 | 
						|
xPortStartScheduler:
 | 
						|
#ifdef __gracefulExit
 | 
						|
	/* Stores context when starting the scheduler in xStartContext.
 | 
						|
	   This is used for when you want to gracefully exit the scheduler.
 | 
						|
	   For example if you want to test multiple instances after each other in one test suite.
 | 
						|
     */
 | 
						|
	la		t0, xStartContext
 | 
						|
	STORE	x1, 0x0(t0)
 | 
						|
	STORE	x2, 1 * REGBYTES(t0)
 | 
						|
	STORE	x3, 2 * REGBYTES(t0)
 | 
						|
	STORE	x4, 3 * REGBYTES(t0)
 | 
						|
	STORE	x5, 4 * REGBYTES(t0)
 | 
						|
	STORE	x6, 5 * REGBYTES(t0)
 | 
						|
	STORE	x7, 6 * REGBYTES(t0)
 | 
						|
	STORE	x8, 7 * REGBYTES(t0)
 | 
						|
	STORE	x9, 8 * REGBYTES(t0)
 | 
						|
	STORE	x10, 9 * REGBYTES(t0)
 | 
						|
	STORE	x11, 10 * REGBYTES(t0)
 | 
						|
	STORE	x12, 11 * REGBYTES(t0)
 | 
						|
	STORE	x13, 12 * REGBYTES(t0)
 | 
						|
	STORE	x14, 13 * REGBYTES(t0)
 | 
						|
	STORE	x15, 14 * REGBYTES(t0)
 | 
						|
	STORE	x16, 15 * REGBYTES(t0)
 | 
						|
	STORE	x17, 16 * REGBYTES(t0)
 | 
						|
	STORE	x18, 17 * REGBYTES(t0)
 | 
						|
	STORE	x19, 18 * REGBYTES(t0)
 | 
						|
	STORE	x20, 19 * REGBYTES(t0)
 | 
						|
	STORE	x21, 20 * REGBYTES(t0)
 | 
						|
	STORE	x22, 21 * REGBYTES(t0)
 | 
						|
	STORE	x23, 22 * REGBYTES(t0)
 | 
						|
	STORE	x24, 23 * REGBYTES(t0)
 | 
						|
	STORE	x25, 24 * REGBYTES(t0)
 | 
						|
	STORE	x26, 25 * REGBYTES(t0)
 | 
						|
	STORE	x27, 26 * REGBYTES(t0)
 | 
						|
	STORE	x28, 27 * REGBYTES(t0)
 | 
						|
	STORE	x29, 28 * REGBYTES(t0)
 | 
						|
	STORE	x30, 29 * REGBYTES(t0)
 | 
						|
	STORE	x31, 30 * REGBYTES(t0)
 | 
						|
#endif
 | 
						|
	jal		vPortSetupTimer
 | 
						|
	portRESTORE_CONTEXT
 | 
						|
 | 
						|
.align 2
 | 
						|
vPortEndScheduler:
 | 
						|
#ifdef __gracefulExit
 | 
						|
	/* Load current context from xStartContext */
 | 
						|
	la		t0, xStartContext
 | 
						|
	LOAD	x1, 0x0(t0)
 | 
						|
	LOAD	x2, 1 * REGBYTES(t0)
 | 
						|
	LOAD	x3, 2 * REGBYTES(t0)
 | 
						|
	LOAD	x4, 3 * REGBYTES(t0)
 | 
						|
	LOAD	x5, 4 * REGBYTES(t0)
 | 
						|
	LOAD	x6, 5 * REGBYTES(t0)
 | 
						|
	LOAD	x7, 6 * REGBYTES(t0)
 | 
						|
	LOAD	x8, 7 * REGBYTES(t0)
 | 
						|
	LOAD	x9, 8 * REGBYTES(t0)
 | 
						|
	LOAD	x10, 9 * REGBYTES(t0)
 | 
						|
	LOAD	x11, 10 * REGBYTES(t0)
 | 
						|
	LOAD	x12, 11 * REGBYTES(t0)
 | 
						|
	LOAD	x13, 12 * REGBYTES(t0)
 | 
						|
	LOAD	x14, 13 * REGBYTES(t0)
 | 
						|
	LOAD	x15, 14 * REGBYTES(t0)
 | 
						|
	LOAD	x16, 15 * REGBYTES(t0)
 | 
						|
	LOAD	x17, 16 * REGBYTES(t0)
 | 
						|
	LOAD	x18, 17 * REGBYTES(t0)
 | 
						|
	LOAD	x19, 18 * REGBYTES(t0)
 | 
						|
	LOAD	x20, 19 * REGBYTES(t0)
 | 
						|
	LOAD	x21, 20 * REGBYTES(t0)
 | 
						|
	LOAD	x22, 21 * REGBYTES(t0)
 | 
						|
	LOAD	x23, 22 * REGBYTES(t0)
 | 
						|
	LOAD	x24, 23 * REGBYTES(t0)
 | 
						|
	LOAD	x25, 24 * REGBYTES(t0)
 | 
						|
	LOAD	x26, 25 * REGBYTES(t0)
 | 
						|
	LOAD	x27, 26 * REGBYTES(t0)
 | 
						|
	LOAD	x28, 27 * REGBYTES(t0)
 | 
						|
	LOAD	x29, 28 * REGBYTES(t0)
 | 
						|
	LOAD	x30, 39 * REGBYTES(t0)
 | 
						|
	LOAD	x31, 30 * REGBYTES(t0)
 | 
						|
#endif
 | 
						|
	ret
 | 
						|
 | 
						|
.align 2
 | 
						|
vPortYield:
 | 
						|
	csrci mstatus, 8
 | 
						|
	portSAVE_CONTEXT
 | 
						|
	portSAVE_RA
 | 
						|
	jal	vTaskSwitchContext
 | 
						|
	portRESTORE_CONTEXT
 |