Explorar el Código

[libcpu][cortex-a] Improve FPU stack initialization implementation

Co-authored-by: BernardXiong <1241087+BernardXiong@users.noreply.github.com>
copilot-swe-agent[bot] hace 2 meses
padre
commit
4dc072c04c
Se han modificado 2 ficheros con 17 adiciones y 1 borrados
  1. 5 0
      libcpu/arm/cortex-a/cpuport.h
  2. 12 1
      libcpu/arm/cortex-a/stack.c

+ 5 - 0
libcpu/arm/cortex-a/cpuport.h

@@ -72,6 +72,11 @@ struct rt_hw_stack
 #define E_Bit       (1<<9)
 #define J_Bit       (1<<24)
 
+/* VFP/NEON register count for FPU context */
+#ifndef VFP_DATA_NR
+#define VFP_DATA_NR 64  /* 32 double-precision registers = 64 words */
+#endif
+
 #ifdef RT_USING_SMP
 typedef union {
     unsigned long slock;

+ 12 - 1
libcpu/arm/cortex-a/stack.c

@@ -31,6 +31,9 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
                              rt_uint8_t *stack_addr, void *texit)
 {
     rt_uint32_t *stk;
+#ifdef RT_USING_FPU
+    rt_uint32_t i;
+#endif
 
     stack_addr += sizeof(rt_uint32_t);
     stack_addr  = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8);
@@ -61,7 +64,15 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
     *(--stk) = 0;       /* user sp*/
 #endif
 #ifdef RT_USING_FPU
-    *(--stk) = 0;       /* not use fpu*/
+    /* FPU context initialization matches context_gcc.S restore order:
+     * Stack layout (high to low): FPEXC -> FPSCR -> D16-D31 -> D0-D15
+     */
+    for (i = 0; i < VFP_DATA_NR; i++)
+    {
+        *(--stk) = 0;   /* Initialize D0-D31 (64 words for 32 double regs) */
+    }
+    *(--stk) = 0;       /* FPSCR: Floating-Point Status and Control Register */
+    *(--stk) = 0x40000000;  /* FPEXC: Enable FPU (bit 30 = EN) */
 #endif
 
     /* return task's current stack address */