]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/RVDS/ARM_CA9/portmacro.inc
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Source / portable / RVDS / ARM_CA9 / portmacro.inc
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 SYS_MODE                        EQU             0x1f\r
29 SVC_MODE                        EQU             0x13\r
30 IRQ_MODE                        EQU             0x12\r
31 \r
32         IMPORT  ulCriticalNesting\r
33         IMPORT  pxCurrentTCB\r
34         IMPORT  ulPortTaskHasFPUContext\r
35         IMPORT  ulAsmAPIPriorityMask\r
36         IMPORT  ulICCPMR\r
37 \r
38 \r
39         MACRO\r
40         portSAVE_CONTEXT\r
41 \r
42         ; Save the LR and SPSR onto the system mode stack before switching to\r
43         ; system mode to save the remaining system mode registers\r
44         SRSDB   sp!, #SYS_MODE\r
45         CPS             #SYS_MODE\r
46         PUSH    {R0-R12, R14}\r
47 \r
48         ; Push the critical nesting count\r
49         LDR             R2, =ulCriticalNesting\r
50         LDR             R1, [R2]\r
51         PUSH    {R1}\r
52 \r
53         ; Does the task have a floating point context that needs saving?  If\r
54         ; ulPortTaskHasFPUContext is 0 then no.\r
55         LDR             R2, =ulPortTaskHasFPUContext\r
56         LDR             R3, [R2]\r
57         CMP             R3, #0\r
58 \r
59         ; Save the floating point context, if any\r
60         FMRXNE  R1,  FPSCR\r
61         VPUSHNE {D0-D15}\r
62         VPUSHNE {D16-D31}\r
63         PUSHNE  {R1}\r
64 \r
65         ; Save ulPortTaskHasFPUContext itself\r
66         PUSH    {R3}\r
67 \r
68         ; Save the stack pointer in the TCB\r
69         LDR             R0, =pxCurrentTCB\r
70         LDR             R1, [R0]\r
71         STR             SP, [R1]\r
72 \r
73         MEND\r
74 \r
75 ; /**********************************************************************/\r
76 \r
77         MACRO\r
78         portRESTORE_CONTEXT\r
79 \r
80         ; Set the SP to point to the stack of the task being restored.\r
81         LDR             R0, =pxCurrentTCB\r
82         LDR             R1, [R0]\r
83         LDR             SP, [R1]\r
84 \r
85         ; Is there a floating point context to restore?  If the restored\r
86         ; ulPortTaskHasFPUContext is zero then no.\r
87         LDR             R0, =ulPortTaskHasFPUContext\r
88         POP             {R1}\r
89         STR             R1, [R0]\r
90         CMP             R1, #0\r
91 \r
92         ; Restore the floating point context, if any\r
93         POPNE   {R0}\r
94         VPOPNE  {D16-D31}\r
95         VPOPNE  {D0-D15}\r
96         VMSRNE  FPSCR, R0\r
97 \r
98         ; Restore the critical section nesting depth\r
99         LDR             R0, =ulCriticalNesting\r
100         POP             {R1}\r
101         STR             R1, [R0]\r
102 \r
103         ; Ensure the priority mask is correct for the critical nesting depth\r
104         LDR             R2, =ulICCPMR\r
105         CMP             R1, #0\r
106         MOVEQ   R4, #255\r
107         LDRNE   R4, =ulAsmAPIPriorityMask\r
108         STR             R4, [r2]\r
109 \r
110         ; Restore all system mode registers other than the SP (which is already\r
111         ; being used)\r
112         POP             {R0-R12, R14}\r
113 \r
114         ; Return to the task code, loading CPSR on the way.\r
115         RFEIA   sp!\r
116 \r
117         MEND\r
118 \r
119         END\r
120 \r