]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/IA32_flat/ISR_Support.h
f49d58980fab55425ed6243995bf45ec27fe0bb6
[freertos] / FreeRTOS / Source / portable / GCC / IA32_flat / ISR_Support.h
1 /*\r
2  * FreeRTOS Kernel V10.0.0\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. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29         .extern ulTopOfSystemStack\r
30         .extern ulInterruptNesting\r
31 \r
32 /*-----------------------------------------------------------*/\r
33 \r
34 .macro portFREERTOS_INTERRUPT_ENTRY\r
35 \r
36         /* Save general purpose registers. */\r
37         pusha\r
38 \r
39         /* If ulInterruptNesting is zero the rest of the task context will need\r
40         saving and a stack switch might be required. */\r
41         movl    ulInterruptNesting, %eax\r
42         test    %eax, %eax\r
43         jne             2f\r
44 \r
45         /* Interrupts are not nested, so save the rest of the task context. */\r
46         .if configSUPPORT_FPU == 1\r
47 \r
48                 /* If the task has a buffer allocated to save the FPU context then\r
49                 save the FPU context now. */\r
50                 movl    pucPortTaskFPUContextBuffer, %eax\r
51                 test    %eax, %eax\r
52                 je              1f\r
53                 fnsave  ( %eax ) /* Save FLOP context into ucTempFPUBuffer array. */\r
54                 fwait\r
55 \r
56                 1:\r
57                 /* Save the address of the FPU context, if any. */\r
58                 push    pucPortTaskFPUContextBuffer\r
59 \r
60         .endif /* configSUPPORT_FPU */\r
61 \r
62         /* Find the TCB. */\r
63         movl    pxCurrentTCB, %eax\r
64 \r
65         /* Stack location is first item in the TCB. */\r
66         movl    %esp, (%eax)\r
67 \r
68         /* Switch stacks. */\r
69         movl    ulTopOfSystemStack, %esp\r
70         movl    %esp, %ebp\r
71 \r
72         2:\r
73         /* Increment nesting count. */\r
74         add     $1, ulInterruptNesting\r
75 \r
76 .endm\r
77 /*-----------------------------------------------------------*/\r
78 \r
79 .macro portINTERRUPT_EPILOGUE\r
80 \r
81         cli\r
82         sub             $1, ulInterruptNesting\r
83 \r
84         /* If the nesting has unwound to zero. */\r
85         movl    ulInterruptNesting, %eax\r
86         test    %eax, %eax\r
87         jne             2f\r
88 \r
89         /* If a yield was requested then select a new TCB now. */\r
90         movl    ulPortYieldPending, %eax\r
91         test    %eax, %eax\r
92         je              1f\r
93         movl    $0, ulPortYieldPending\r
94         call    vTaskSwitchContext\r
95 \r
96         1:\r
97         /* Stack location is first item in the TCB. */\r
98         movl    pxCurrentTCB, %eax\r
99         movl    (%eax), %esp\r
100 \r
101         .if configSUPPORT_FPU == 1\r
102 \r
103                 /* Restore address of task's FPU context buffer. */\r
104                 pop     pucPortTaskFPUContextBuffer\r
105 \r
106                 /* If the task has a buffer allocated in which its FPU context is saved,\r
107                 then restore it now. */\r
108                 movl    pucPortTaskFPUContextBuffer, %eax\r
109                 test    %eax, %eax\r
110                 je              1f\r
111                 frstor  ( %eax )\r
112                 1:\r
113         .endif\r
114 \r
115         2:\r
116         popa\r
117 \r
118 .endm\r
119 /*-----------------------------------------------------------*/\r
120 \r
121 .macro portFREERTOS_INTERRUPT_EXIT\r
122 \r
123         portINTERRUPT_EPILOGUE\r
124         /* EOI. */\r
125         movl    $0x00, (0xFEE000B0)\r
126         iret\r
127 \r
128 .endm\r