]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/ARM_CA9/portASM.h
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Source / portable / IAR / ARM_CA9 / portASM.h
1 ;/*\r
2 ; * FreeRTOS Kernel V10.3.0\r
3 ; * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4 ; *\r
5 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6 ; * this software and associated documentation files (the "Software"), to deal in\r
7 ; * the Software without restriction, including without limitation the rights to\r
8 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9 ; * the Software, and to permit persons to whom the Software is furnished to do so,\r
10 ; * subject to the following conditions:\r
11 ; *\r
12 ; * The above copyright notice and this permission notice shall be included in all\r
13 ; * copies or substantial portions of the Software.\r
14 ; *\r
15 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 ; *\r
22 ; * http://www.FreeRTOS.org\r
23 ; * http://aws.amazon.com/freertos\r
24 ; *\r
25 ; * 1 tab == 4 spaces!\r
26 ; */\r
27 \r
28         EXTERN  vTaskSwitchContext\r
29         EXTERN  ulCriticalNesting\r
30         EXTERN  pxCurrentTCB\r
31         EXTERN  ulPortTaskHasFPUContext\r
32         EXTERN  ulAsmAPIPriorityMask\r
33 \r
34 portSAVE_CONTEXT macro\r
35 \r
36         ; Save the LR and SPSR onto the system mode stack before switching to\r
37         ; system mode to save the remaining system mode registers\r
38         SRSDB   sp!, #SYS_MODE\r
39         CPS             #SYS_MODE\r
40         PUSH    {R0-R12, R14}\r
41 \r
42         ; Push the critical nesting count\r
43         LDR             R2, =ulCriticalNesting\r
44         LDR             R1, [R2]\r
45         PUSH    {R1}\r
46 \r
47         ; Does the task have a floating point context that needs saving?  If\r
48         ; ulPortTaskHasFPUContext is 0 then no.\r
49         LDR             R2, =ulPortTaskHasFPUContext\r
50         LDR             R3, [R2]\r
51         CMP             R3, #0\r
52 \r
53         ; Save the floating point context, if any\r
54         FMRXNE  R1,  FPSCR\r
55         VPUSHNE {D0-D15}\r
56         VPUSHNE {D16-D31}\r
57         PUSHNE  {R1}\r
58 \r
59         ; Save ulPortTaskHasFPUContext itself\r
60         PUSH    {R3}\r
61 \r
62         ; Save the stack pointer in the TCB\r
63         LDR             R0, =pxCurrentTCB\r
64         LDR             R1, [R0]\r
65         STR             SP, [R1]\r
66 \r
67         endm\r
68 \r
69 ; /**********************************************************************/\r
70 \r
71 portRESTORE_CONTEXT macro\r
72 \r
73         ; Set the SP to point to the stack of the task being restored.\r
74         LDR             R0, =pxCurrentTCB\r
75         LDR             R1, [R0]\r
76         LDR             SP, [R1]\r
77 \r
78         ; Is there a floating point context to restore?  If the restored\r
79         ; ulPortTaskHasFPUContext is zero then no.\r
80         LDR             R0, =ulPortTaskHasFPUContext\r
81         POP             {R1}\r
82         STR             R1, [R0]\r
83         CMP             R1, #0\r
84 \r
85         ; Restore the floating point context, if any\r
86         POPNE   {R0}\r
87         VPOPNE  {D16-D31}\r
88         VPOPNE  {D0-D15}\r
89         VMSRNE  FPSCR, R0\r
90 \r
91         ; Restore the critical section nesting depth\r
92         LDR             R0, =ulCriticalNesting\r
93         POP             {R1}\r
94         STR             R1, [R0]\r
95 \r
96         ; Ensure the priority mask is correct for the critical nesting depth\r
97         LDR             R2, =portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS\r
98         CMP             R1, #0\r
99         MOVEQ   R4, #255\r
100         LDRNE   R4, =( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT )\r
101         STR             R4, [r2]\r
102 \r
103         ; Restore all system mode registers other than the SP (which is already\r
104         ; being used)\r
105         POP             {R0-R12, R14}\r
106 \r
107         ; Return to the task code, loading CPSR on the way.\r
108         RFEIA   sp!\r
109 \r
110         endm\r
111 \r
112 \r
113 \r
114 \r
115 \r