跳到主要内容

每周一龙:第 27 期

· 阅读需 10 分钟
WANG Xuerui
🐲龙门客栈打杂的

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 上周的进展主要有 ABI、工具链、Firefox、固件、OpenSSL。 详情点进来看!

如无特别说明,文中提及的日期、时间都为北京时间(UTC+8)。

本期周报的实际发稿时间是周二凌晨,因为这个点才写完——白天都在忙别的。 网页上显示的发稿时间仍然是 12 月 4 日: 这是 Docusaurus 早期为了修复一个时区 bug 而导致的又一个时区 bug。

要闻速递

11 月 28 日,龙芯公司在国家会议中心举办了 2023 龙芯产品发布暨用户大会。 笔者在现场获得了一些有价值信息;在未来几期的周报中将陆续为您播报。

先「马」再看

本栏目的内容具有一定延续性,将持续追踪报道 LoongArch 领域的重要或长期项目(坑)。

Linux

Hengqi Chen 在跑 BPF 自我测试的时候,发现开启 LoongArch BPF JIT 之后,一些用例会导致内核 panic 或导致 RCU 卡死。 截至发稿时,修了一种 panic。

Hengqi Chen 继续迭代 的将系统调用号存入 struct thread_info 的补丁系列。 为了解决 execsnoop 等工具不可用的燃眉之急, 单独拆出了 exec 时不清零 $a7(系统调用号寄存器)的补丁;此补丁已被 Huacai Chen 接受, 将在 Linux 6.7 最终发布时可用。

Tiezhu Yang 贴出了第 5 版的为 LoongArch 适配 ORC stack unwinder 的补丁。

工具链

ABI

龙芯团队完成了初版 TLS1 描述符(TLS descriptors,TLSDESC)ABI 的设计与实现:

TLS 描述符是一种用来优化线程本地变量(thread-local variables)访问速度的方案, 由 Alexandre Oliva 在 2005 年前后设计;作者公开了设计文档。 目前实现了或即将实现 TLS 描述符的架构有以下几种:

  • 富士通 FR-V:最初设计的灵感来源和目标架构。
  • x86:i386、AMD64。
  • ARM:ARM、AArch64。
  • Andes NDS32
  • Tensilica Xtensa
  • RISC-V:正在推进中,工单设计稿

LoongArch 不日也将加入它们的行列。 第一版代码还有些地方要改,请直接去上游围观。 值得一提的是原作者也加入了讨论,并从自己的经验给出了宝贵建议!

几乎与此同时,常佳琛同学也贴出了一版对 TLS LE 操作的 relaxation 支持。 这名号在龙芯圈子是头一回见,邮箱后缀也是西安邮电大学,而非 loongson.cn——新鲜血液本就不多见, 何况首秀就在 ABI 这种硬核领域。 让我们热烈欢迎

binutils

先前报道过的 Jiajie Chen 帮忙加的 LoongArch v1.10 新指令,已经进入主线:补丁甲补丁乙

mengqinggang 继续跟进新的中等代码模型(medium code model)过程调用方式 R_LARCH_CALL36 的适配工作,给 binutils 增加了 calltail 伪指令支持。 在邮件列表已经进行了一些讨论,因此这些指令的具体形态可能还会微调,但要加入这两类伪指令这件事应该是确定了。 熟悉 RISC-V 的读者应该(终于)会感到家的温暖 😉

GCC

Joern Rennecke 与 Jeff Law 做了一稿消除多余符号扩展、零扩展的工序(pass)。 这不是专门为 LoongArch 做的工作,但包括 LoongArch 在内的不少架构将从中受益。

Jiahao Xu 按照之前 Xi Ruoyao 的改法, 修复了剩余的子寄存器(subreg)误用, 等于消灭了这些问题逻辑将导致的编译器崩溃(ICE)。 (GCC 要求不能取子寄存器的子寄存器,否则崩溃。)

Jiahao Xu 还修复了 {v,xv}shuf 的测试用例在 LA664 上失败的问题(bug PR112611)。 这是因为原先的预期计算结果就是 LA464 上相应指令的执行效果,而原先的输入数据会触发 LA464 的未定义行为。

Jiahao Xu 还加了 -mrecip 选项,用来控制是否利用 LA664 的两种浮点近似倒数指令。代码仍需修改。

liwei 用 LoongArch SIMD 指令优化了标量的 __builtin_popcount 操作。 (这个操作的含义是求整数的二进制表示中 1 的个数;population count 直译是「人口计数」,很形象。)

编者按

这个操作有向量版:{v,xv}pcnt.[bhwd],却没有标量版,不对称。 在一些零星使用,因而不值得向量化的场景可能吃亏。 希望以后能补上这一块……

liwei 还优化了取奇/偶元素的向量操作。

liwei 还清理了上次优化后重复的 CLZ_DEFINED_VALUE_AT_ZERO 定义。

guojie 在 UBSan 的指导下修复了 LoongArch 后端在处理立即数时,可能触发的一处未定义行为。

guojie 还优化了高 32 位与低 32 位碰巧相同的立即数的装载。

本期的 GCC 新闻都是 Xi Ruoyao 帮忙整理的,让我们感谢 的奉献!

LLVM

wangleiat 仿照两年前的一组 x86 改动,修复了在代码生成的边界情况时 fnmsub.[sd] 的错误用法。

wangleiat 用 SIMD 指令支持了 LLVM IR 的 extractelement 操作(提取元素:提取位于输入向量的给定索引的标量元素)。 这应该是最早一批的 LLVM/Clang 向量支持了,期待后续的更多内容。

SixWeining 让 LoongArch Clang 支持了 -mcmodel=(代码模型)参数,用法与 GCC 的该参数相同。

heiher 的 LLVM IR code_model 新增工作接近尾声: 目前所有代码审查意见都处理完了。

杂闻播报

Firefox

安同开源社区(AOSC)注重桌面用户体验与生产力,已经在圈内小有名气。AOSC 的开发者们本次也为火狐(Firefox)浏览器在 LoongArch 的良好用户体验帮了大忙。

刘子兴成功适配了 WebRTC,已经可以用 Discord 连麦了,其他类似网站说不定也能用:

Firefox WebRTC on LoongArch

此工作后续会推入上游。

王江津去除了视频硬解接口 VA-API 的架构放行名单,使所有的 Linux 平台不论架构,只要能成功加载 libva,即可硬解视频。Firefox 122 将包含此改进。

固件

龙芯固件团队放出了 3A6000 评估板 EVB_XA61200 的固件更新。 相比出厂版本,修复了如较新型号的 AMD 显卡插上则无法亮机、DMI 信息不含内存实际运行频率等大量问题, 建议有动手能力的同学跟进更新。 请去官方仓库页面查看自己的硬件是否匹配, 及下载更新文件。 感谢 Xi Ruoyao 提供新闻线索!

yetist 为著名的自动固件升级工具 fwupd 的 UEFI 模块 fwupd-efi 增加了 LoongArch 支持。 感谢 Revy 提供新闻线索!

OpenSSL

上期提到的别名分析(aliasing analysis) 问题已被修复,并往回移植到 3.2.x 分支了: 从 OpenSSL 3.2.1 开始,即便启用 LTO,也不用非得手工指定平台为 linux64-loongarch64 了。 感谢 Xi Ruoyao 完成此工作并提供新闻线索!

张贴栏

本栏目可供张贴公益性质的各种信息。

  • 友情扩散:安同开源社区(AOSC)的龙架构移植主线化工作「合龙」仍在如火如荼进行中, 此工作完成后龙架构将升格为 AOSC OS 的 Tier 1 架构。 欢迎同学们试用、反馈,也欢迎有志之士一同加入(沟通渠道详见 AOSC 网站相关栏目)。
  • 本周报持续接受网友投稿。欢迎来上游坐坐!

Footnotes

  1. Thread-Local Storage,线程本地存储。此 TLS 非彼 TLS(Transport Layer Security,传输层安全)。