123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /*
- * FreeRTOS Kernel V10.4.6
- * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * SPDX-License-Identifier: MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * https://www.FreeRTOS.org
- * https://github.com/FreeRTOS
- *
- */
- .extern pxCurrentTCB
- .extern vTaskISRHandler
- .extern vTaskSwitchContext
- .extern uxCriticalNesting
- .extern pulISRStack
- .global __FreeRTOS_interrupt_handler
- .global VPortYieldASM
- .global vStartFirstTask
- .macro portSAVE_CONTEXT
- /* Make room for the context on the stack. */
- addik r1, r1, -132
- /* Save r31 so it can then be used. */
- swi r31, r1, 4
- /* Copy the msr into r31 - this is stacked later. */
- mfs r31, rmsr
- /* Stack general registers. */
- swi r30, r1, 12
- swi r29, r1, 16
- swi r28, r1, 20
- swi r27, r1, 24
- swi r26, r1, 28
- swi r25, r1, 32
- swi r24, r1, 36
- swi r23, r1, 40
- swi r22, r1, 44
- swi r21, r1, 48
- swi r20, r1, 52
- swi r19, r1, 56
- swi r18, r1, 60
- swi r17, r1, 64
- swi r16, r1, 68
- swi r15, r1, 72
- swi r13, r1, 80
- swi r12, r1, 84
- swi r11, r1, 88
- swi r10, r1, 92
- swi r9, r1, 96
- swi r8, r1, 100
- swi r7, r1, 104
- swi r6, r1, 108
- swi r5, r1, 112
- swi r4, r1, 116
- swi r3, r1, 120
- swi r2, r1, 124
- /* Stack the critical section nesting value. */
- lwi r3, r0, uxCriticalNesting
- swi r3, r1, 128
- /* Save the top of stack value to the TCB. */
- lwi r3, r0, pxCurrentTCB
- sw r1, r0, r3
-
- .endm
- .macro portRESTORE_CONTEXT
- /* Load the top of stack value from the TCB. */
- lwi r3, r0, pxCurrentTCB
- lw r1, r0, r3
- /* Restore the general registers. */
- lwi r31, r1, 4
- lwi r30, r1, 12
- lwi r29, r1, 16
- lwi r28, r1, 20
- lwi r27, r1, 24
- lwi r26, r1, 28
- lwi r25, r1, 32
- lwi r24, r1, 36
- lwi r23, r1, 40
- lwi r22, r1, 44
- lwi r21, r1, 48
- lwi r20, r1, 52
- lwi r19, r1, 56
- lwi r18, r1, 60
- lwi r17, r1, 64
- lwi r16, r1, 68
- lwi r15, r1, 72
- lwi r14, r1, 76
- lwi r13, r1, 80
- lwi r12, r1, 84
- lwi r11, r1, 88
- lwi r10, r1, 92
- lwi r9, r1, 96
- lwi r8, r1, 100
- lwi r7, r1, 104
- lwi r6, r1, 108
- lwi r5, r1, 112
- lwi r4, r1, 116
- lwi r2, r1, 124
- /* Load the critical nesting value. */
- lwi r3, r1, 128
- swi r3, r0, uxCriticalNesting
- /* Obtain the MSR value from the stack. */
- lwi r3, r1, 8
- /* Are interrupts enabled in the MSR? If so return using an return from
- interrupt instruction to ensure interrupts are enabled only once the task
- is running again. */
- andi r3, r3, 2
- beqid r3, 36
- or r0, r0, r0
- /* Reload the rmsr from the stack, clear the enable interrupt bit in the
- value before saving back to rmsr register, then return enabling interrupts
- as we return. */
- lwi r3, r1, 8
- andi r3, r3, ~2
- mts rmsr, r3
- lwi r3, r1, 120
- addik r1, r1, 132
- rtid r14, 0
- or r0, r0, r0
- /* Reload the rmsr from the stack, place it in the rmsr register, and
- return without enabling interrupts. */
- lwi r3, r1, 8
- mts rmsr, r3
- lwi r3, r1, 120
- addik r1, r1, 132
- rtsd r14, 0
- or r0, r0, r0
- .endm
- .text
- .align 2
- __FreeRTOS_interrupt_handler:
- portSAVE_CONTEXT
- /* Entered via an interrupt so interrupts must be enabled in msr. */
- ori r31, r31, 2
- /* Stack msr. */
- swi r31, r1, 8
- /* Stack the return address. As we entered via an interrupt we do
- not need to modify the return address prior to stacking. */
- swi r14, r1, 76
- /* Now switch to use the ISR stack. */
- lwi r3, r0, pulISRStack
- add r1, r3, r0
- bralid r15, vTaskISRHandler
- or r0, r0, r0
- portRESTORE_CONTEXT
- VPortYieldASM:
- portSAVE_CONTEXT
- /* Stack msr. */
- swi r31, r1, 8
- /* Modify the return address so we return to the instruction after the
- exception. */
- addi r14, r14, 8
- swi r14, r1, 76
- /* Now switch to use the ISR stack. */
- lwi r3, r0, pulISRStack
- add r1, r3, r0
- bralid r15, vTaskSwitchContext
- or r0, r0, r0
- portRESTORE_CONTEXT
- vStartFirstTask:
- portRESTORE_CONTEXT
-
-
|