rt-thread
rt-thread copied to clipboard
[Bug] lwp/vdso: 编译告警
RT-Thread Version
master(commit 45eea78)
Hardware Type/Architectures
bsp/cvitek
Develop Toolchain
GCC
Describe the bug
构建 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
这个问题很早就一直存在,enable SMART 后就会出现。
这个问题的原因在于 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];
};
这个是不是还需要enable soft atomic后才会出现?而使用std atomic或者hw atomic则不会出现?
我又看了一下 .config. 却发现 CONFIG_RT_USING_STDC_ATOMIC=y,很奇怪,为啥编译器会认为是走 rt_soft_atomic_add ?
我又看了一下 .config. 却发现
CONFIG_RT_USING_STDC_ATOMIC=y,很奇怪,为啥编译器会认为是走 rt_soft_atomic_add ?
好的,那么这个可能确实是和atomic配置相关了,后续再验证下,如有warning再修正掉