]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/ARM_CA5_No_GIC/portASM.h
Roll up the minor changes checked into svn since V10.0.0 into new V10.0.1 ready for...
[freertos] / FreeRTOS / Source / portable / IAR / ARM_CA5_No_GIC / portASM.h
1 ;/*\r
2 ; * FreeRTOS Kernel V10.0.1\r
3 ; * Copyright (C) 2017 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 #if configFPU_D32 == 1\r
57         VPUSHNE {D16-D31}\r
58 #endif ; configFPU_D32\r
59         PUSHNE  {R1}\r
60 \r
61         ; Save ulPortTaskHasFPUContext itself\r
62         PUSH    {R3}\r
63 \r
64         ; Save the stack pointer in the TCB\r
65         LDR             R0, =pxCurrentTCB\r
66         LDR             R1, [R0]\r
67         STR             SP, [R1]\r
68 \r
69         endm\r
70 \r
71 ; /**********************************************************************/\r
72 \r
73 portRESTORE_CONTEXT macro\r
74 \r
75         ; Set the SP to point to the stack of the task being restored.\r
76         LDR             R0, =pxCurrentTCB\r
77         LDR             R1, [R0]\r
78         LDR             SP, [R1]\r
79 \r
80         ; Is there a floating point context to restore?  If the restored\r
81         ; ulPortTaskHasFPUContext is zero then no.\r
82         LDR             R0, =ulPortTaskHasFPUContext\r
83         POP             {R1}\r
84         STR             R1, [R0]\r
85         CMP             R1, #0\r
86 \r
87         ; Restore the floating point context, if any\r
88         POPNE   {R0}\r
89 #if configFPU_D32 == 1\r
90         VPOPNE  {D16-D31}\r
91 #endif ; configFPU_D32\r
92         VPOPNE  {D0-D15}\r
93         VMSRNE  FPSCR, R0\r
94 \r
95         ; Restore the critical section nesting depth\r
96         LDR             R0, =ulCriticalNesting\r
97         POP             {R1}\r
98         STR             R1, [R0]\r
99 \r
100         ; Restore all system mode registers other than the SP (which is already\r
101         ; being used)\r
102         POP             {R0-R12, R14}\r
103 \r
104         ; Return to the task code, loading CPSR on the way.  CPSR has the interrupt\r
105         ; enable bit set appropriately for the task about to execute.\r
106         RFEIA   sp!\r
107 \r
108         endm\r
109 \r
110 \r
111 \r
112 \r
113 \r