]> git.sur5r.net Git - freertos/blob - Source/portable/GCC/NiosII/port_asm.S
Update to V6.1.1
[freertos] / Source / portable / GCC / NiosII / port_asm.S
1 /*\r
2     FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd.\r
3 \r
4     ***************************************************************************\r
5     *                                                                         *\r
6     * If you are:                                                             *\r
7     *                                                                         *\r
8     *    + New to FreeRTOS,                                                   *\r
9     *    + Wanting to learn FreeRTOS or multitasking in general quickly       *\r
10     *    + Looking for basic training,                                        *\r
11     *    + Wanting to improve your FreeRTOS skills and productivity           *\r
12     *                                                                         *\r
13     * then take a look at the FreeRTOS books - available as PDF or paperback  *\r
14     *                                                                         *\r
15     *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *\r
16     *                  http://www.FreeRTOS.org/Documentation                  *\r
17     *                                                                         *\r
18     * A pdf reference manual is also available.  Both are usually delivered   *\r
19     * to your inbox within 20 minutes to two hours when purchased between 8am *\r
20     * and 8pm GMT (although please allow up to 24 hours in case of            *\r
21     * exceptional circumstances).  Thank you for your support!                *\r
22     *                                                                         *\r
23     ***************************************************************************\r
24 \r
25     This file is part of the FreeRTOS distribution.\r
26 \r
27     FreeRTOS is free software; you can redistribute it and/or modify it under\r
28     the terms of the GNU General Public License (version 2) as published by the\r
29     Free Software Foundation AND MODIFIED BY the FreeRTOS exception.\r
30     ***NOTE*** The exception to the GPL is included to allow you to distribute\r
31     a combined work that includes FreeRTOS without being obliged to provide the\r
32     source code for proprietary components outside of the FreeRTOS kernel.\r
33     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT\r
34     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
35     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
36     more details. You should have received a copy of the GNU General Public \r
37     License and the FreeRTOS license exception along with FreeRTOS; if not it \r
38     can be viewed here: http://www.freertos.org/a00114.html and also obtained \r
39     by writing to Richard Barry, contact details for whom are available on the\r
40     FreeRTOS WEB site.\r
41 \r
42     1 tab == 4 spaces!\r
43 \r
44     http://www.FreeRTOS.org - Documentation, latest information, license and\r
45     contact details.\r
46 \r
47     http://www.SafeRTOS.com - A version that is certified for use in safety\r
48     critical systems.\r
49 \r
50     http://www.OpenRTOS.com - Commercial support, development, porting,\r
51     licensing and training services.\r
52 */\r
53 \r
54 .extern         vTaskSwitchContext\r
55         \r
56 .set noat\r
57 \r
58 # Exported to start the first task.\r
59 .globl restore_sp_from_pxCurrentTCB             \r
60         \r
61 # Entry point for exceptions.\r
62 .section .exceptions.entry, "xa"                \r
63 \r
64 # Save the entire context of a task.\r
65 save_context:\r
66         addi    ea, ea, -4                      # Point to the next instruction.\r
67         addi    sp,     sp, -116                # Create space on the stack.\r
68         stw             ra, 0(sp)\r
69                                                                 # Leave a gap for muldiv 0\r
70         stw             at, 8(sp)                \r
71         stw             r2, 12(sp)\r
72         stw             r3, 16(sp)\r
73         stw             r4, 20(sp)\r
74         stw             r5, 24(sp) \r
75         stw             r6, 28(sp) \r
76         stw             r7, 32(sp) \r
77         stw             r8, 36(sp) \r
78         stw             r9, 40(sp) \r
79         stw             r10, 44(sp)\r
80         stw             r11, 48(sp)\r
81         stw             r12, 52(sp)\r
82         stw             r13, 56(sp)\r
83         stw             r14, 60(sp)\r
84         stw             r15, 64(sp)\r
85         rdctl   r5, estatus             # Save the eStatus\r
86         stw             r5, 68(sp)\r
87         stw             ea, 72(sp)                      # Save the PC\r
88         stw             r16, 76(sp)                     # Save the remaining registers\r
89         stw             r17, 80(sp)\r
90         stw             r18, 84(sp)\r
91         stw             r19, 88(sp)\r
92         stw             r20, 92(sp)\r
93         stw             r21, 96(sp)\r
94         stw             r22, 100(sp)\r
95         stw             r23, 104(sp)\r
96         stw             gp, 108(sp)\r
97         stw             fp, 112(sp)\r
98 \r
99 save_sp_to_pxCurrentTCB:\r
100         movia   et, pxCurrentTCB        # Load the address of the pxCurrentTCB pointer\r
101         ldw             et, (et)                        # Load the value of the pxCurrentTCB pointer\r
102         stw             sp, (et)                        # Store the stack pointer into the top of the TCB\r
103         \r
104         .section .exceptions.irqtest, "xa"      \r
105 hw_irq_test:\r
106         /*\r
107      * Test to see if the exception was a software exception or caused \r
108      * by an external interrupt, and vector accordingly.\r
109      */\r
110     rdctl       r4, ipending            # Load the Pending Interrupts indication\r
111         rdctl   r5, estatus             # Load the eStatus (enabled interrupts).\r
112     andi        r2, r5, 1                       # Are interrupts enabled globally.\r
113     beq         r2, zero, soft_exceptions               # Interrupts are not enabled.\r
114     beq         r4, zero, soft_exceptions               # There are no interrupts triggered.\r
115 \r
116         .section .exceptions.irqhandler, "xa"\r
117 hw_irq_handler:\r
118         call    alt_irq_handler                                 # Call the alt_irq_handler to deliver to the registered interrupt handler.\r
119 \r
120     .section .exceptions.irqreturn, "xa"\r
121 restore_sp_from_pxCurrentTCB:\r
122         movia   et, pxCurrentTCB                # Load the address of the pxCurrentTCB pointer\r
123         ldw             et, (et)                                # Load the value of the pxCurrentTCB pointer\r
124         ldw             sp, (et)                                # Load the stack pointer with the top value of the TCB\r
125 \r
126 restore_context:\r
127         ldw             ra, 0(sp)               # Restore the registers.\r
128                                                         # Leave a gap for muldiv 0.\r
129         ldw             at, 8(sp)\r
130         ldw             r2, 12(sp)\r
131         ldw             r3, 16(sp)\r
132         ldw             r4, 20(sp)\r
133         ldw             r5, 24(sp) \r
134         ldw             r6, 28(sp) \r
135         ldw             r7, 32(sp) \r
136         ldw             r8, 36(sp) \r
137         ldw             r9, 40(sp) \r
138         ldw             r10, 44(sp)\r
139         ldw             r11, 48(sp)\r
140         ldw             r12, 52(sp)\r
141         ldw             r13, 56(sp)\r
142         ldw             r14, 60(sp)\r
143         ldw             r15, 64(sp)\r
144         ldw             et, 68(sp)              # Load the eStatus\r
145         wrctl   estatus, et     # Write the eStatus\r
146         ldw             ea, 72(sp)              # Load the Program Counter\r
147         ldw             r16, 76(sp)\r
148         ldw             r17, 80(sp)\r
149         ldw             r18, 84(sp)\r
150         ldw             r19, 88(sp)\r
151         ldw             r20, 92(sp)\r
152         ldw             r21, 96(sp)\r
153         ldw             r22, 100(sp)\r
154         ldw             r23, 104(sp)\r
155         ldw             gp, 108(sp)\r
156         ldw             fp, 112(sp)\r
157         addi    sp,     sp, 116         # Release stack space\r
158 \r
159     eret                                        # Return to address ea, loading eStatus into Status.\r
160    \r
161         .section .exceptions.soft, "xa"\r
162 soft_exceptions:\r
163         ldw             et, 0(ea)                               # Load the instruction where the interrupt occured.\r
164         movhi   at, %hi(0x003B683A)             # Load the registers with the trap instruction code\r
165         ori             at, at, %lo(0x003B683A)\r
166         cmpne   et, et, at                              # Compare the trap instruction code to the last excuted instruction\r
167         beq             et, r0, call_scheduler  # its a trap so switchcontext\r
168         break                                                   # This is an un-implemented instruction or muldiv problem.\r
169         br              restore_context                 # its something else\r
170 \r
171 call_scheduler:\r
172         addi    ea, ea, 4                                               # A trap was called, increment the program counter so it is not called again.\r
173         stw             ea, 72(sp)                                              # Save the new program counter to the context.\r
174         call    vTaskSwitchContext                              # Pick the next context.\r
175         br              restore_sp_from_pxCurrentTCB    # Switch in the task context and restore. \r