]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/NiosII/port_asm.S
Update version number to 9.0.0rc2.
[freertos] / FreeRTOS / Source / portable / GCC / NiosII / port_asm.S
1 /*\r
2     FreeRTOS V9.0.0rc2 - Copyright (C) 2016 Real Time Engineers Ltd.\r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     This file is part of the FreeRTOS distribution.\r
8 \r
9     FreeRTOS is free software; you can redistribute it and/or modify it under\r
10     the terms of the GNU General Public License (version 2) as published by the\r
11     Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
12 \r
13     ***************************************************************************\r
14     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
15     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
16     >>!   obliged to provide the source code for proprietary components     !<<\r
17     >>!   outside of the FreeRTOS kernel.                                   !<<\r
18     ***************************************************************************\r
19 \r
20     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
21     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
22     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
23     link: http://www.freertos.org/a00114.html\r
24 \r
25     ***************************************************************************\r
26      *                                                                       *\r
27      *    FreeRTOS provides completely free yet professionally developed,    *\r
28      *    robust, strictly quality controlled, supported, and cross          *\r
29      *    platform software that is more than just the market leader, it     *\r
30      *    is the industry's de facto standard.                               *\r
31      *                                                                       *\r
32      *    Help yourself get started quickly while simultaneously helping     *\r
33      *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
34      *    tutorial book, reference manual, or both:                          *\r
35      *    http://www.FreeRTOS.org/Documentation                              *\r
36      *                                                                       *\r
37     ***************************************************************************\r
38 \r
39     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
40     the FAQ page "My application does not run, what could be wrong?".  Have you\r
41     defined configASSERT()?\r
42 \r
43     http://www.FreeRTOS.org/support - In return for receiving this top quality\r
44     embedded software for free we request you assist our global community by\r
45     participating in the support forum.\r
46 \r
47     http://www.FreeRTOS.org/training - Investing in training allows your team to\r
48     be as productive as possible as early as possible.  Now you can receive\r
49     FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
50     Ltd, and the world's leading authority on the world's leading RTOS.\r
51 \r
52     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
53     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
54     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
55 \r
56     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
57     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
58 \r
59     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
60     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
61     licenses offer ticketed support, indemnification and commercial middleware.\r
62 \r
63     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
64     engineered and independently SIL3 certified version for use in safety and\r
65     mission critical applications that require provable dependability.\r
66 \r
67     1 tab == 4 spaces!\r
68 */\r
69 \r
70 .extern         vTaskSwitchContext\r
71         \r
72 .set noat\r
73 \r
74 # Exported to start the first task.\r
75 .globl restore_sp_from_pxCurrentTCB             \r
76         \r
77 # Entry point for exceptions.\r
78 .section .exceptions.entry, "xa"                \r
79 \r
80 # Save the entire context of a task.\r
81 save_context:\r
82         addi    ea, ea, -4                      # Point to the next instruction.\r
83         addi    sp,     sp, -116                # Create space on the stack.\r
84         stw             ra, 0(sp)\r
85                                                                 # Leave a gap for muldiv 0\r
86         stw             at, 8(sp)                \r
87         stw             r2, 12(sp)\r
88         stw             r3, 16(sp)\r
89         stw             r4, 20(sp)\r
90         stw             r5, 24(sp) \r
91         stw             r6, 28(sp) \r
92         stw             r7, 32(sp) \r
93         stw             r8, 36(sp) \r
94         stw             r9, 40(sp) \r
95         stw             r10, 44(sp)\r
96         stw             r11, 48(sp)\r
97         stw             r12, 52(sp)\r
98         stw             r13, 56(sp)\r
99         stw             r14, 60(sp)\r
100         stw             r15, 64(sp)\r
101         rdctl   r5, estatus             # Save the eStatus\r
102         stw             r5, 68(sp)\r
103         stw             ea, 72(sp)                      # Save the PC\r
104         stw             r16, 76(sp)                     # Save the remaining registers\r
105         stw             r17, 80(sp)\r
106         stw             r18, 84(sp)\r
107         stw             r19, 88(sp)\r
108         stw             r20, 92(sp)\r
109         stw             r21, 96(sp)\r
110         stw             r22, 100(sp)\r
111         stw             r23, 104(sp)\r
112         stw             gp, 108(sp)\r
113         stw             fp, 112(sp)\r
114 \r
115 save_sp_to_pxCurrentTCB:\r
116         movia   et, pxCurrentTCB        # Load the address of the pxCurrentTCB pointer\r
117         ldw             et, (et)                        # Load the value of the pxCurrentTCB pointer\r
118         stw             sp, (et)                        # Store the stack pointer into the top of the TCB\r
119         \r
120         .section .exceptions.irqtest, "xa"      \r
121 hw_irq_test:\r
122         /*\r
123      * Test to see if the exception was a software exception or caused \r
124      * by an external interrupt, and vector accordingly.\r
125      */\r
126     rdctl       r4, ipending            # Load the Pending Interrupts indication\r
127         rdctl   r5, estatus             # Load the eStatus (enabled interrupts).\r
128     andi        r2, r5, 1                       # Are interrupts enabled globally.\r
129     beq         r2, zero, soft_exceptions               # Interrupts are not enabled.\r
130     beq         r4, zero, soft_exceptions               # There are no interrupts triggered.\r
131 \r
132         .section .exceptions.irqhandler, "xa"\r
133 hw_irq_handler:\r
134         call    alt_irq_handler                                 # Call the alt_irq_handler to deliver to the registered interrupt handler.\r
135 \r
136     .section .exceptions.irqreturn, "xa"\r
137 restore_sp_from_pxCurrentTCB:\r
138         movia   et, pxCurrentTCB                # Load the address of the pxCurrentTCB pointer\r
139         ldw             et, (et)                                # Load the value of the pxCurrentTCB pointer\r
140         ldw             sp, (et)                                # Load the stack pointer with the top value of the TCB\r
141 \r
142 restore_context:\r
143         ldw             ra, 0(sp)               # Restore the registers.\r
144                                                         # Leave a gap for muldiv 0.\r
145         ldw             at, 8(sp)\r
146         ldw             r2, 12(sp)\r
147         ldw             r3, 16(sp)\r
148         ldw             r4, 20(sp)\r
149         ldw             r5, 24(sp) \r
150         ldw             r6, 28(sp) \r
151         ldw             r7, 32(sp) \r
152         ldw             r8, 36(sp) \r
153         ldw             r9, 40(sp) \r
154         ldw             r10, 44(sp)\r
155         ldw             r11, 48(sp)\r
156         ldw             r12, 52(sp)\r
157         ldw             r13, 56(sp)\r
158         ldw             r14, 60(sp)\r
159         ldw             r15, 64(sp)\r
160         ldw             et, 68(sp)              # Load the eStatus\r
161         wrctl   estatus, et     # Write the eStatus\r
162         ldw             ea, 72(sp)              # Load the Program Counter\r
163         ldw             r16, 76(sp)\r
164         ldw             r17, 80(sp)\r
165         ldw             r18, 84(sp)\r
166         ldw             r19, 88(sp)\r
167         ldw             r20, 92(sp)\r
168         ldw             r21, 96(sp)\r
169         ldw             r22, 100(sp)\r
170         ldw             r23, 104(sp)\r
171         ldw             gp, 108(sp)\r
172         ldw             fp, 112(sp)\r
173         addi    sp,     sp, 116         # Release stack space\r
174 \r
175     eret                                        # Return to address ea, loading eStatus into Status.\r
176    \r
177         .section .exceptions.soft, "xa"\r
178 soft_exceptions:\r
179         ldw             et, 0(ea)                               # Load the instruction where the interrupt occured.\r
180         movhi   at, %hi(0x003B683A)             # Load the registers with the trap instruction code\r
181         ori             at, at, %lo(0x003B683A)\r
182         cmpne   et, et, at                              # Compare the trap instruction code to the last excuted instruction\r
183         beq             et, r0, call_scheduler  # its a trap so switchcontext\r
184         break                                                   # This is an un-implemented instruction or muldiv problem.\r
185         br              restore_context                 # its something else\r
186 \r
187 call_scheduler:\r
188         addi    ea, ea, 4                                               # A trap was called, increment the program counter so it is not called again.\r
189         stw             ea, 72(sp)                                              # Save the new program counter to the context.\r
190         call    vTaskSwitchContext                              # Pick the next context.\r
191         br              restore_sp_from_pxCurrentTCB    # Switch in the task context and restore. \r