You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h
+12-12Lines changed: 12 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -80,22 +80,22 @@ csrr t2, lpcount0
80
80
csrrt3, lpstart1
81
81
csrrt4, lpend1
82
82
csrrt5, lpcount1
83
-
swt0, 1*portWORD_SIZE( sp )
84
-
swt1, 2*portWORD_SIZE( sp )
85
-
swt2, 3*portWORD_SIZE( sp )
86
-
swt3, 4*portWORD_SIZE( sp )
87
-
swt4, 5*portWORD_SIZE( sp )
88
-
swt5, 6*portWORD_SIZE( sp )
83
+
swt0, 2*portWORD_SIZE( sp )
84
+
swt1, 3*portWORD_SIZE( sp )
85
+
swt2, 4*portWORD_SIZE( sp )
86
+
swt3, 5*portWORD_SIZE( sp )
87
+
swt4, 6*portWORD_SIZE( sp )
88
+
swt5, 7*portWORD_SIZE( sp )
89
89
.endm
90
90
91
91
/* Restore the additional registers found on the Pulpino. */
Copy file name to clipboardExpand all lines: portable/GCC/RISC-V/portASM.S
+54-44Lines changed: 54 additions & 44 deletions
Original file line number
Diff line number
Diff line change
@@ -162,8 +162,6 @@ definitions. */
162
162
* where the global and thread pointers are currently assumed to be constant so
163
163
* are not saved:
164
164
*
165
-
* [FPU registers (when enabled/available) go here]
166
-
* mstatus
167
165
* xCriticalNesting
168
166
* x31
169
167
* x30
@@ -193,19 +191,12 @@ definitions. */
193
191
* x6
194
192
* x5
195
193
* portTASK_RETURN_ADDRESS
194
+
* [FPU registers (when enabled/available) go here]
196
195
* [chip specific registers go here]
196
+
* mstatus
197
197
* pxCode
198
198
*/
199
199
pxPortInitialiseStack:
200
-
addi a0, a0, -portFPUCONTEXT_SIZE
201
-
csrr t0, mstatus /* Obtain current mstatus value. */
202
-
andi t0, t0, ~0x8 /* Ensure interrupts are disabled when the stack is restored within an ISR. Required when a task is created after the scheduler has been started, otherwise interrupts would be disabled anyway. */
203
-
addi t1, x0, 0x188 /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */
204
-
slli t1, t1, 4
205
-
or t0, t0, t1 /* Set MPIE and MPP bits in mstatus value. */
206
-
207
-
addi a0, a0, -portWORD_SIZE
208
-
store_x t0, 0(a0) /* mstatus onto the stack. */
209
200
addi a0, a0, -portWORD_SIZE /* Space for critical nesting count. */
210
201
store_x x0, 0(a0) /* Critical nesting count starts at 0 for every task. */
211
202
@@ -214,10 +205,12 @@ pxPortInitialiseStack:
214
205
#else
215
206
addi a0, a0, -(22 * portWORD_SIZE) /* Space for registers x10-x31. */
216
207
#endif
217
-
store_x a2, 0(a0) /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */
218
-
addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x5-x9 + taskReturnAddress. */
208
+
store_x a2, 0(a0) /* Task parameters (pvParameters parameter) goes into register x10/a0 on the stack. */
209
+
210
+
addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x5-x9 + taskReturnAddress (register x1). */
219
211
load_x t0, xTaskReturnAddress
220
212
store_x t0, 0(a0) /* Return address onto the stack. */
213
+
221
214
addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */
222
215
chip_specific_stack_frame: /* First add any chip specific registers to the stack frame being created. */
223
216
beq t0, x0, 1f /* No more chip specific registers to save. */
@@ -226,6 +219,23 @@ chip_specific_stack_frame: /* First add any chip specific registers
226
219
addi t0, t0, -1 /* Decrement the count of chip specific registers remaining. */
227
220
j chip_specific_stack_frame /* Until no more chip specific registers. */
228
221
1:
222
+
csrr t0, mstatus /* Obtain current mstatus value. */
223
+
andi t0, t0, ~0x8 /* Ensure interrupts are disabled when the stack is restored within an ISR. Required when a task is created after the scheduler has been started, otherwise interrupts would be disabled anyway. */
224
+
addi t1, x0, 0x188 /* Generate the value 0x1880, which are the MPIE=1 and MPP=M_Mode in mstatus. */
225
+
slli t1, t1, 4
226
+
or t0, t0, t1 /* Set MPIE and MPP bits in mstatus value. */
227
+
228
+
#if( configENABLE_FPU == 1 )
229
+
/* Mark the FPU as clean in the mstatus value. */
230
+
li t1, ~MSTATUS_FS_MASK
231
+
and t0, t0, t1
232
+
li t1, MSTATUS_FS_CLEAN
233
+
or t0, t0, t1
234
+
#endif
235
+
236
+
addi a0, a0, -portWORD_SIZE
237
+
store_x t0, 0(a0) /* mstatus onto the stack. */
238
+
229
239
addi a0, a0, -portWORD_SIZE
230
240
store_x a1, 0(a0) /* mret value (pxCode parameter) onto the stack. */
231
241
ret
@@ -237,46 +247,46 @@ xPortStartFirstTask:
237
247
238
248
load_x x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */
addi x5, x5, 0x08 /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */
252
+
csrw mstatus, x5 /* Interrupts enabled from here! */
253
+
240
254
portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */
241
255
242
-
load_x x7, 4* portWORD_SIZE( sp ) /* t2 */
243
-
load_x x8, 5* portWORD_SIZE( sp ) /* s0/fp */
244
-
load_x x9, 6* portWORD_SIZE( sp ) /* s1 */
245
-
load_x x10, 7* portWORD_SIZE( sp ) /* a0 */
246
-
load_x x11, 8* portWORD_SIZE( sp ) /* a1 */
247
-
load_x x12, 9 * portWORD_SIZE( sp ) /* a2 */
248
-
load_x x13, 10 * portWORD_SIZE( sp ) /* a3 */
249
-
load_x x14, 11 * portWORD_SIZE( sp ) /* a4 */
250
-
load_x x15, 12 * portWORD_SIZE( sp ) /* a5 */
256
+
load_x x7, 5* portWORD_SIZE( sp ) /* t2 */
257
+
load_x x8, 6* portWORD_SIZE( sp ) /* s0/fp */
258
+
load_x x9, 7* portWORD_SIZE( sp ) /* s1 */
259
+
load_x x10, 8* portWORD_SIZE( sp ) /* a0 */
260
+
load_x x11, 9* portWORD_SIZE( sp ) /* a1 */
261
+
load_x x12, 10 * portWORD_SIZE( sp ) /* a2 */
262
+
load_x x13, 11 * portWORD_SIZE( sp ) /* a3 */
263
+
load_x x14, 12 * portWORD_SIZE( sp ) /* a4 */
264
+
load_x x15, 13 * portWORD_SIZE( sp ) /* a5 */
251
265
#ifndef __riscv_32e
252
-
load_x x16, 13 * portWORD_SIZE( sp ) /* a6 */
253
-
load_x x17, 14 * portWORD_SIZE( sp ) /* a7 */
254
-
load_x x18, 15 * portWORD_SIZE( sp ) /* s2 */
255
-
load_x x19, 16 * portWORD_SIZE( sp ) /* s3 */
256
-
load_x x20, 17 * portWORD_SIZE( sp ) /* s4 */
257
-
load_x x21, 18 * portWORD_SIZE( sp ) /* s5 */
258
-
load_x x22, 19 * portWORD_SIZE( sp ) /* s6 */
259
-
load_x x23, 20 * portWORD_SIZE( sp ) /* s7 */
260
-
load_x x24, 21 * portWORD_SIZE( sp ) /* s8 */
261
-
load_x x25, 22 * portWORD_SIZE( sp ) /* s9 */
262
-
load_x x26, 23 * portWORD_SIZE( sp ) /* s10 */
263
-
load_x x27, 24 * portWORD_SIZE( sp ) /* s11 */
264
-
load_x x28, 25 * portWORD_SIZE( sp ) /* t3 */
265
-
load_x x29, 26 * portWORD_SIZE( sp ) /* t4 */
266
-
load_x x30, 27 * portWORD_SIZE( sp ) /* t5 */
267
-
load_x x31, 28 * portWORD_SIZE( sp ) /* t6 */
266
+
load_x x16, 14 * portWORD_SIZE( sp ) /* a6 */
267
+
load_x x17, 15 * portWORD_SIZE( sp ) /* a7 */
268
+
load_x x18, 16 * portWORD_SIZE( sp ) /* s2 */
269
+
load_x x19, 17 * portWORD_SIZE( sp ) /* s3 */
270
+
load_x x20, 18 * portWORD_SIZE( sp ) /* s4 */
271
+
load_x x21, 19 * portWORD_SIZE( sp ) /* s5 */
272
+
load_x x22, 20 * portWORD_SIZE( sp ) /* s6 */
273
+
load_x x23, 21 * portWORD_SIZE( sp ) /* s7 */
274
+
load_x x24, 22 * portWORD_SIZE( sp ) /* s8 */
275
+
load_x x25, 23 * portWORD_SIZE( sp ) /* s9 */
276
+
load_x x26, 24 * portWORD_SIZE( sp ) /* s10 */
277
+
load_x x27, 25 * portWORD_SIZE( sp ) /* s11 */
278
+
load_x x28, 26 * portWORD_SIZE( sp ) /* t3 */
279
+
load_x x29, 27 * portWORD_SIZE( sp ) /* t4 */
280
+
load_x x30, 28 * portWORD_SIZE( sp ) /* t5 */
281
+
load_x x31, 29 * portWORD_SIZE( sp ) /* t6 */
268
282
#endif
269
283
270
284
load_x x5, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Obtain xCriticalNesting value for this task from task's stack. */
271
285
load_x x6, pxCriticalNesting /* Load the address of xCriticalNesting into x6. */
272
286
store_x x5, 0( x6 ) /* Restore the critical nesting value for this task. */
0 commit comments