@@ -138,6 +138,34 @@ _tx_thread_context_restore:
138138 csrw fcsr, t0
139139#endif
140140
141+ #if defined(__riscv_vector)
142+ /* Recover vector registers v0-v31 */
143+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
144+ addi t1, sp, 64*8
145+ #else
146+ addi t1, sp, 31*8
147+ #endif
148+ addi t2, t1, 4*8
149+ vsetvli t3, zero, e8, m8, ta, ma
150+ vle8.v v0, (t2) // Recover v0 ~ v7
151+ add t2, t2, t3
152+ vle8.v v8, (t2) // Recover v8 ~ v15
153+ add t2, t2, t3
154+ vle8.v v16, (t2) // Recover v16 ~ v23
155+ add t2, t2, t3
156+ vle8.v v24, (t2) // Recover v24 ~ v31
157+ add t2, t2, t3
158+
159+ /* Recover vector CSRs */
160+ ld t2, 0 *8 (t1)
161+ ld t3, 1*8 (t1)
162+ ld t4, 2*8 (t1)
163+ vsetvl zero, t4, t3
164+ csrw vstart, t2
165+ ld t4, 3*8 (t1)
166+ csrw vcsr, t4
167+ #endif
168+
141169 /* Recover standard registers. */
142170
143171 /* Restore registers,
@@ -168,6 +196,10 @@ _tx_thread_context_restore:
168196#if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
169197 li t0, 0x2000 // Set FS bits (bits 14:13 to 01) for FP state
170198 or t1, t1, t0
199+ #endif
200+ #if defined(__riscv_vector)
201+ li t0, 0x0200 // Set VS bits (bits 10:9 to 01) for vector state
202+ or t1, t1, t0
171203#endif
172204 csrw mstatus, t1 // Update mstatus safely
173205
@@ -194,6 +226,21 @@ _tx_thread_context_restore:
194226#else
195227 addi sp, sp, 32*8 // Recover stack frame - without floating point enabled
196228#endif
229+
230+ #if defined(__riscv_vector)
231+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
232+ addi t0, sp, -65*8
233+ #else
234+ addi t0, sp, -32*8
235+ #endif
236+ csrr t1, vlenb // Get vector register byte length
237+ slli t1, t1, 5 // Multiply by 32 (number of vector registers)
238+ addi t1, t1, 4*8 // Add vector CSR space: vstart, vtype, vl, vcsr
239+ add sp, sp, t1 // Recover vector stack frame
240+
241+ ld t1, 18*8 (t0) // Recover t1
242+ ld t0, 19*8 (t0) // Recover t0
243+ #endif
197244 mret // Return to point of interrupt
198245
199246 /* } */
@@ -273,6 +320,34 @@ _tx_thread_no_preempt_restore:
273320 csrw fcsr, t0 // Restore fcsr
274321#endif
275322
323+ #if defined(__riscv_vector)
324+ /* Recover vector registers v0-v31 */
325+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
326+ addi t1, sp, 64*8
327+ #else
328+ addi t1, sp, 31*8
329+ #endif
330+ addi t2, t1, 4*8
331+ vsetvli t3, zero, e8, m8, ta, ma
332+ vle8.v v0, (t2) // Recover v0 ~ v7
333+ add t2, t2, t3
334+ vle8.v v8, (t2) // Recover v8 ~ v15
335+ add t2, t2, t3
336+ vle8.v v16, (t2) // Recover v16 ~ v23
337+ add t2, t2, t3
338+ vle8.v v24, (t2) // Recover v24 ~ v31
339+ add t2, t2, t3
340+
341+ /* Recover vector CSRs */
342+ ld t2, 0 *8 (t1)
343+ ld t3, 1*8 (t1)
344+ ld t4, 2*8 (t1)
345+ vsetvl zero, t4, t3
346+ csrw vstart, t2
347+ ld t4, 3*8 (t1)
348+ csrw vcsr, t4
349+ #endif
350+
276351 /* Recover the saved context and return to the point of interrupt. */
277352
278353 /* Recover standard registers. */
@@ -294,6 +369,10 @@ _tx_thread_no_preempt_restore:
294369#if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
295370 li t0, 0x2000 // Set FS bits for FP state
296371 or t1, t1, t0
372+ #endif
373+ #if defined(__riscv_vector)
374+ li t0, 0x0200 // Set VS bits (bits 10:9 to 01) for vector state
375+ or t1, t1, t0
297376#endif
298377 csrw mstatus, t1 // Update mstatus safely
299378
@@ -320,6 +399,21 @@ _tx_thread_no_preempt_restore:
320399#else
321400 addi sp, sp, 32*8 // Recover stack frame - without floating point enabled
322401#endif
402+
403+ #if defined(__riscv_vector)
404+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
405+ addi t0, sp, -65*8
406+ #else
407+ addi t0, sp, -32*8
408+ #endif
409+ csrr t1, vlenb // Get vector register byte length
410+ slli t1, t1, 5 // Multiply by 32 (number of vector registers)
411+ addi t1, t1, 4*8 // Add vector CSR space: vstart, vtype, vl, vcsr
412+ add sp, sp, t1 // Recover vector stack frame
413+
414+ ld t1, 18*8 (t0) // Recover t1
415+ ld t0, 19*8 (t0) // Recover t0
416+ #endif
323417 mret // Return to point of interrupt
324418
325419 /* }
@@ -362,6 +456,36 @@ _tx_thread_preempt_restore:
362456 fsd f27, 58*8 (t0) // Store fs11
363457#endif
364458
459+ #if defined(__riscv_vector)
460+ /* Store vector registers and CSRs */
461+ #if defined(__riscv_float_abi_single) || defined(__riscv_float_abi_double)
462+ addi t1, t0, 64*8
463+ #else
464+ addi t1, t0, 31*8
465+ #endif
466+ /* Store vector CSRs */
467+ csrr t2, vstart // Store vstart
468+ sd t2, 0 *8 (t1)
469+ csrr t2, vtype // Store vtype
470+ sd t2, 1*8 (t1)
471+ csrr t2, vl // Store vl
472+ sd t2, 2*8 (t1)
473+ csrr t2, vcsr // Store vcsr
474+ sd t2, 3*8 (t1)
475+
476+ /* Store vector registers v0-v31 */
477+ addi t2, t1, 4*8
478+ vsetvli t3, zero, e8, m8, ta, ma
479+ vse8.v v0, 0 (t2) // Store v0 ~ v7
480+ add t2, t2, t3
481+ vse8.v v8, 0 (t2) // Store v8 ~ v15
482+ add t2, t2, t3
483+ vse8.v v16, 0 (t2) // Store v16 ~ v23
484+ add t2, t2, t3
485+ vse8.v v24, 0 (t2) // Store v24 ~ v31
486+ add t2, t2, t3
487+ #endif
488+
365489 /* Store standard preserved registers. */
366490
367491 sd x9, 11*8 (t0) // Store s1
0 commit comments