From fa602a671352299822ddd3ccbb5ce69163f9da87 Mon Sep 17 00:00:00 2001 From: xunyingya <619765394@qq.com> Date: Fri, 7 Nov 2025 11:24:47 +0800 Subject: [PATCH 1/3] [libcpu][arm] fix: correct FPU stack initialization order and alignment on Cortex-A --- libcpu/arm/cortex-a/stack.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c index 4c955677f87..73f73e67efe 100644 --- a/libcpu/arm/cortex-a/stack.c +++ b/libcpu/arm/cortex-a/stack.c @@ -31,6 +31,7 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { rt_uint32_t *stk; + rt_uint32_t i = 0; stack_addr += sizeof(rt_uint32_t); stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8); @@ -61,7 +62,25 @@ 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*/ + /* 1. D0-D15 */ + for (i = 0; i <= 15; i++) + { + *(--stk) = 0x00000000; + *(--stk) = 0x00000000; + } + + /* 2. D16-D31 */ + for (i = 16; i <= 31; i++) + { + *(--stk) = 0x00000000; + *(--stk) = 0x00000000; + } + + /* 3. FPSCR */ + *(--stk) = 0x00000000; + + /* 4. FPEXC: EN=1 */ + *(--stk) = 0x40000000; #endif /* return task's current stack address */ From aecd471a38a56b869741053d2ca37cba6879b31a Mon Sep 17 00:00:00 2001 From: xunyingya <619765394@qq.com> Date: Fri, 7 Nov 2025 16:35:23 +0800 Subject: [PATCH 2/3] [libcpu][arm] fix: remove initialization in declaration to pass CI check --- libcpu/arm/cortex-a/stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c index 73f73e67efe..56fe5778167 100644 --- a/libcpu/arm/cortex-a/stack.c +++ b/libcpu/arm/cortex-a/stack.c @@ -31,7 +31,7 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit) { rt_uint32_t *stk; - rt_uint32_t i = 0; + rt_uint32_t i; stack_addr += sizeof(rt_uint32_t); stack_addr = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8); From d074a7e4899420939f527a05d31ee3e96488630a Mon Sep 17 00:00:00 2001 From: xunyingya <619765394@qq.com> Date: Mon, 10 Nov 2025 09:35:09 +0800 Subject: [PATCH 3/3] [libcpu][arm] fix: correct FPU stack initialization sequence and alignment for Cortex-A --- libcpu/arm/cortex-a/stack.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c index 56fe5778167..72e531612d0 100644 --- a/libcpu/arm/cortex-a/stack.c +++ b/libcpu/arm/cortex-a/stack.c @@ -31,7 +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);