@@ -133,6 +133,34 @@ _tx_thread_context_restore:
133133 csrw fcsr, t0
134134#endif
135135
136+ #if defined(__riscv_vector)
137+ /* Recover vector registers v0-v31 */
138+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
139+ addi t1, sp, 64*8
140+ #else
141+ addi t1, sp, 31*8
142+ #endif
143+ addi t2, t1, 4*8
144+ vsetvli t3, zero, e8, m8, ta, ma
145+ vle8.v v0, (t2) // Recover v0 ~ v7
146+ add t2, t2, t3
147+ vle8.v v8, (t2) // Recover v8 ~ v15
148+ add t2, t2, t3
149+ vle8.v v16, (t2) // Recover v16 ~ v23
150+ add t2, t2, t3
151+ vle8.v v24, (t2) // Recover v24 ~ v31
152+ add t2, t2, t3
153+
154+ /* Recover vector CSRs */
155+ ld t2, 0 *8 (t1)
156+ ld t3, 1*8 (t1)
157+ ld t4, 2*8 (t1)
158+ vsetvl zero, t4, t3
159+ csrw vstart, t2
160+ ld t4, 3*8 (t1)
161+ csrw vcsr, t4
162+ #endif
163+
136164 /* Recover standard registers. */
137165
138166 /* Restore registers,
@@ -163,6 +191,10 @@ _tx_thread_context_restore:
163191#if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
164192 li t0, 0x2000 // Set FS bits (bits 14:13 to 01) for FP state
165193 or t1, t1, t0
194+ #endif
195+ #if defined(__riscv_vector)
196+ li t0, 0x0200 // Set VS bits (bits 10:9 to 01) for vector state
197+ or t1, t1, t0
166198#endif
167199 csrw mstatus, t1 // Update mstatus safely
168200
@@ -189,6 +221,21 @@ _tx_thread_context_restore:
189221#else
190222 addi sp, sp, 32*8 // Recover stack frame - without floating point enabled
191223#endif
224+
225+ #if defined(__riscv_vector)
226+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
227+ addi t0, sp, -65*8
228+ #else
229+ addi t0, sp, -32*8
230+ #endif
231+ csrr t1, vlenb // Get vector register byte length
232+ slli t1, t1, 5 // Multiply by 32 (number of vector registers)
233+ addi t1, t1, 4*8 // Add vector CSR space: vstart, vtype, vl, vcsr
234+ add sp, sp, t1 // Recover vector stack frame
235+
236+ ld t1, 18*8 (t0) // Recover t1
237+ ld t0, 19*8 (t0) // Recover t0
238+ #endif
192239 mret // Return to point of interrupt
193240
194241 /* } */
@@ -268,6 +315,34 @@ _tx_thread_no_preempt_restore:
268315 csrw fcsr, t0 // Restore fcsr
269316#endif
270317
318+ #if defined(__riscv_vector)
319+ /* Recover vector registers v0-v31 */
320+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
321+ addi t1, sp, 64*8
322+ #else
323+ addi t1, sp, 31*8
324+ #endif
325+ addi t2, t1, 4*8
326+ vsetvli t3, zero, e8, m8, ta, ma
327+ vle8.v v0, (t2) // Recover v0 ~ v7
328+ add t2, t2, t3
329+ vle8.v v8, (t2) // Recover v8 ~ v15
330+ add t2, t2, t3
331+ vle8.v v16, (t2) // Recover v16 ~ v23
332+ add t2, t2, t3
333+ vle8.v v24, (t2) // Recover v24 ~ v31
334+ add t2, t2, t3
335+
336+ /* Recover vector CSRs */
337+ ld t2, 0 *8 (t1)
338+ ld t3, 1*8 (t1)
339+ ld t4, 2*8 (t1)
340+ vsetvl zero, t4, t3
341+ csrw vstart, t2
342+ ld t4, 3*8 (t1)
343+ csrw vcsr, t4
344+ #endif
345+
271346 /* Recover the saved context and return to the point of interrupt. */
272347
273348 /* Recover standard registers. */
@@ -289,6 +364,10 @@ _tx_thread_no_preempt_restore:
289364#if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
290365 li t0, 0x2000 // Set FS bits for FP state
291366 or t1, t1, t0
367+ #endif
368+ #if defined(__riscv_vector)
369+ li t0, 0x0200 // Set VS bits (bits 10:9 to 01) for vector state
370+ or t1, t1, t0
292371#endif
293372 csrw mstatus, t1 // Update mstatus safely
294373
@@ -315,6 +394,21 @@ _tx_thread_no_preempt_restore:
315394#else
316395 addi sp, sp, 32*8 // Recover stack frame - without floating point enabled
317396#endif
397+
398+ #if defined(__riscv_vector)
399+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
400+ addi t0, sp, -65*8
401+ #else
402+ addi t0, sp, -32*8
403+ #endif
404+ csrr t1, vlenb // Get vector register byte length
405+ slli t1, t1, 5 // Multiply by 32 (number of vector registers)
406+ addi t1, t1, 4*8 // Add vector CSR space: vstart, vtype, vl, vcsr
407+ add sp, sp, t1 // Recover vector stack frame
408+
409+ ld t1, 18*8 (t0) // Recover t1
410+ ld t0, 19*8 (t0) // Recover t0
411+ #endif
318412 mret // Return to point of interrupt
319413
320414 /* }
@@ -357,6 +451,36 @@ _tx_thread_preempt_restore:
357451 fsd f27, 58*8 (t0) // Store fs11
358452#endif
359453
454+ #if defined(__riscv_vector)
455+ /* Store vector registers and CSRs */
456+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
457+ addi t1, t0, 64*8
458+ #else
459+ addi t1, t0, 31*8
460+ #endif
461+ /* Store vector CSRs */
462+ csrr t2, vstart // Store vstart
463+ sd t2, 0 *8 (t1)
464+ csrr t2, vtype // Store vtype
465+ sd t2, 1*8 (t1)
466+ csrr t2, vl // Store vl
467+ sd t2, 2*8 (t1)
468+ csrr t2, vcsr // Store vcsr
469+ sd t2, 3*8 (t1)
470+
471+ /* Store vector registers v0-v31 */
472+ addi t2, t1, 4*8
473+ vsetvli t3, zero, e8, m8, ta, ma
474+ vse8.v v0, 0 (t2) // Store v0 ~ v7
475+ add t2, t2, t3
476+ vse8.v v8, 0 (t2) // Store v8 ~ v15
477+ add t2, t2, t3
478+ vse8.v v16, 0 (t2) // Store v16 ~ v23
479+ add t2, t2, t3
480+ vse8.v v24, 0 (t2) // Store v24 ~ v31
481+ add t2, t2, t3
482+ #endif
483+
360484 /* Store standard preserved registers. */
361485
362486 sd x9, 11*8 (t0) // Store s1
0 commit comments