rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

[Bug] lwp/vdso: 编译告警

Open unicornx opened this issue 8 months ago • 5 comments

RT-Thread Version

master(commit 45eea78)

Hardware Type/Architectures

bsp/cvitek

Develop Toolchain

GCC

Describe the bug

参考 CASE 2 @https://github.com/plctlab/plct-rt-thread/blob/notes/0.notes/20241223-rtt-test-guide.md#4-%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E8%AF%B4%E6%98%8E

构建 AARCH64 大核时会报如下告警:

CC build/kernel/components/lwp/arch/aarch64/common/vdso_data.o
In file included from /home/u/ws/duo/rt-thread/include/rtthread.h:35:0,
                 from /home/u/ws/duo/rt-thread/components/lwp/arch/aarch64/common/vdso_data.c:11:
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h: In function 'rt_vdso_write_begin':
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h:33:19: warning: passing argument 1 of 'rt_soft_atomic_add' from incompatible pointer type [-Wincompatible-pointer-types]
     rt_atomic_add(&vd[CS_HRES_COARSE].seq, 1);
                   ^
/home/u/ws/duo/rt-thread/include/rtatomic.h:65:50: note: in definition of macro 'rt_atomic_add'
 #define rt_atomic_add(ptr, v) rt_soft_atomic_add(ptr, v)
                                                  ^~~
/home/u/ws/duo/rt-thread/include/rtatomic.h:86:23: note: expected 'volatile rt_atomic_t * {aka volatile long int *}' but argument is of type 'uint32_t * {aka unsigned int *}'
 rt_inline rt_atomic_t rt_soft_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val)
                       ^~~~~~~~~~~~~~~~~~
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h:34:19: warning: passing argument 1 of 'rt_soft_atomic_add' from incompatible pointer type [-Wincompatible-pointer-types]
     rt_atomic_add(&vd[CS_RAW].seq, 1);
                   ^
/home/u/ws/duo/rt-thread/include/rtatomic.h:65:50: note: in definition of macro 'rt_atomic_add'
 #define rt_atomic_add(ptr, v) rt_soft_atomic_add(ptr, v)
                                                  ^~~
/home/u/ws/duo/rt-thread/include/rtatomic.h:86:23: note: expected 'volatile rt_atomic_t * {aka volatile long int *}' but argument is of type 'uint32_t * {aka unsigned int *}'
 rt_inline rt_atomic_t rt_soft_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val)
                       ^~~~~~~~~~~~~~~~~~
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h: In function 'rt_vdso_write_end':
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h:40:19: warning: passing argument 1 of 'rt_soft_atomic_add' from incompatible pointer type [-Wincompatible-pointer-types]
     rt_atomic_add(&vd[CS_HRES_COARSE].seq, 1);
                   ^
/home/u/ws/duo/rt-thread/include/rtatomic.h:65:50: note: in definition of macro 'rt_atomic_add'
 #define rt_atomic_add(ptr, v) rt_soft_atomic_add(ptr, v)
                                                  ^~~
/home/u/ws/duo/rt-thread/include/rtatomic.h:86:23: note: expected 'volatile rt_atomic_t * {aka volatile long int *}' but argument is of type 'uint32_t * {aka unsigned int *}'
 rt_inline rt_atomic_t rt_soft_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val)
                       ^~~~~~~~~~~~~~~~~~
/home/u/ws/duo/rt-thread/components/lwp/vdso/kernel/vdso_data.h:41:19: warning: passing argument 1 of 'rt_soft_atomic_add' from incompatible pointer type [-Wincompatible-pointer-types]
     rt_atomic_add(&vd[CS_RAW].seq, 1);
                   ^
/home/u/ws/duo/rt-thread/include/rtatomic.h:65:50: note: in definition of macro 'rt_atomic_add'
 #define rt_atomic_add(ptr, v) rt_soft_atomic_add(ptr, v)
                                                  ^~~
/home/u/ws/duo/rt-thread/include/rtatomic.h:86:23: note: expected 'volatile rt_atomic_t * {aka volatile long int *}' but argument is of type 'uint32_t * {aka unsigned int *}'
 rt_inline rt_atomic_t rt_soft_atomic_add(volatile rt_atomic_t *ptr, rt_atomic_t val)
                       ^~~~~~~~~~~~~~~~~~

Other additional context

No response

unicornx avatar Apr 02 '25 01:04 unicornx

这个问题很早就一直存在,enable SMART 后就会出现。

unicornx avatar Apr 17 '25 23:04 unicornx

这个问题的原因在于 c 中的类型强转问题告警。

具体见 include/rtatomic.h 中,本 issue 编译时走的是最后一个 else 的逻辑,走 rt_soft_atomic_add

#if defined(RT_USING_STDC_ATOMIC)

#ifndef __STDC_NO_ATOMICS__
...
#define rt_atomic_add(ptr, v) atomic_fetch_add(ptr, v)
...
#else
#error "The standard library C doesn't support the atomic operation"
#endif /* __STDC_NO_ATOMICS__ */

#elif defined(RT_USING_HW_ATOMIC)
...
#define rt_atomic_add(ptr, v) rt_hw_atomic_add(ptr, v)
...

#else
#include <rthw.h>
...
#define rt_atomic_add(ptr, v) rt_soft_atomic_add(ptr, v)
...

components/lwp/vdso/kernel/vdso_data.h 中有如下用法, 这里传入的第一个参数不是 rt_soft_atomic_add 期望的类型 rt_atomic_t

rt_inline
void rt_vdso_write_begin(struct vdso_data *vd)
{
    rt_atomic_add(&vd[CS_HRES_COARSE].seq, 1);
    rt_atomic_add(&vd[CS_RAW].seq, 1);
}

具体怎么解,还得看看 vdso 中的 vdso_data.seq 是不是要改成 rt_atomic_t, 这个涉及面有点大,建议请 vdso 的原作者再仔细看看?

struct vdso_data {
    uint32_t       seq;
    uint32_t       clock_mode;
    uint64_t       realtime_initdata;
    uint64_t       cycle_last;
    struct timespec basetime[VDSO_BASES];
};

unicornx avatar Apr 17 '25 23:04 unicornx

这个是不是还需要enable soft atomic后才会出现?而使用std atomic或者hw atomic则不会出现?

BernardXiong avatar May 19 '25 14:05 BernardXiong

我又看了一下 .config. 却发现 CONFIG_RT_USING_STDC_ATOMIC=y,很奇怪,为啥编译器会认为是走 rt_soft_atomic_add ?

unicornx avatar May 20 '25 03:05 unicornx

我又看了一下 .config. 却发现 CONFIG_RT_USING_STDC_ATOMIC=y,很奇怪,为啥编译器会认为是走 rt_soft_atomic_add ?

好的,那么这个可能确实是和atomic配置相关了,后续再验证下,如有warning再修正掉

BernardXiong avatar May 29 '25 05:05 BernardXiong