查看问题详情

编号项目分类查看权限最后更新
0000060Gcc[所有项目] 所有分类公开2017-03-01 14:22
报告员kkndyu分派给xuchenghua 
优先级严重性崩溃出现频率总是
状态 已分配处理状况未处理 
平台loongson3操作系统linux mainline操作系统版本4.10
摘要0000060: gcc优化llsc插入sync指令导致异常表不正确,系统panix
描述futex初始化时 futex_init(void)调用futex_detect_cmpxchg()

此函数的uaddr为NULL,设计来就失败返回EFAULT

在具体的实现函数futex_atomic_cmpxchg_inatomic中由于gcc优化
“在ll与sc之间的跳转指令的目标地址前加sync指令。”导致随后的异常表指针指向的是sync指令,而不是预计出错的ll指令,do_page_fault在search_exception_tables时无法找到这一项,导致系统启动时直接panic。

另外同样的原因, __futex_atomic_op中也存在同样的问题。

在loongson自己的代码中作出了修改
把异常表项
" "__UA_ADDR "\t1b, 4b \n"
变成了
" "__UA_ADDR "\t(1b + 4), 4b \n" \
" "__UA_ADDR "\t(1b + 8), 4b \n"
即手动将异常表指针从sync下移指向ll指令

个人认为应该修改的是gcc实现,而不是内核代码
标签没加标签.

活动

kkndyu

2017-03-01 09:55

报告者   ~0000254

gcc版本

gs464核交叉编译器(gcc-4.8.3 64位)

问题历史

日期 用户名 字段 更改
2017-03-01 09:48 kkndyu 新建问题
2017-03-01 09:55 kkndyu 注释已添加: 0000254
2017-03-01 14:22 administrator 分派给 => xuchenghua
2017-03-01 14:22 administrator 状态 新建 => 已分配