跳到主要内容

每周一龙:第 25 期

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

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 上周的进展主要有 Linux 和工具链(有很多成果)。 详情点进来看!

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

先「马」再看

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

Linux

11 月 19 日,内核构建系统维护者 Masahiro Yamada 帮忙添加了龙架构 vmlinuz.efivmlinux.efi 之间遗漏的依赖关系。 这使得并行构建更可靠:之前有低概率会在这个阶段失败。

11 月 18 日,社区用户 Haowu Ge 在编译 OpenZFS 时,发现多出了对俩 GPL-only 符号的依赖。 因为这俩符号是用来实现 virt_to_page 这一预处理器宏的,而原先对此宏的使用并不涉及 GPL, 所以将 GPL 需求去除大概也合情合理;Huacai Chen 第二天便这么做了

WANG Rui 在持续推进 ClangBuiltLinux 工作:11 月 15 日预防性地增加了编译选项,16 日又改变了绝对重定位的记录方式以允许用 LLVM/Clang 编译可重定位内核。

11 月 15 日,Huacai Chen 参照 RISC-V 做法改变了内核参数 nokaslr 的处理方式,使其不会被透传至 init 进程的命令行参数。

同一天,Huacai Chen 还修复了 Randy Dunlap 前一天自动化发现的 LoongArch KVM 构建失败。 这是一处未跟进的 API 变更;估计是原作者重构时, 由于 LoongArch KVM 代码当时尚未主线化,因而没看到、改到。

11 月 14 日,Xi Ruoyao 在日常的工具链维护中,发现升级到 Linux v6.7-rc1 之后,几条 glibc 多线程同步的测试用例开始超时了,而 x86 居然也存在该问题! 遂果断报告了。 因为引起问题的提交是个常规重构,只是改变了几个标志位的具体取值,所以作者 Peter Zijlstra 也百思不得其解。 直到 Florian Weimer 指出 kernel/futex/core.c 有几处传参直接写了 1 而非 FLAGS_SHARED, 才恍然大悟; 于是此问题在 v6.7-rc2 已得到修复。 感谢 Xi Ruoyao 的新闻线索以及 :ta: 本次为 Linux 稳定性作出的贡献!

工具链

binutils

11 月 14 日,Xi Ruoyao 想给 binutils 在龙架构上增加 DT_RELR 支持,这样可以有效缩小一些大软件的体积; 但 binutils 的源码很不直观,不好改,于是 :ta: 建立了协调工单。 随后 MaskRay 看到了,友情指了条路。

GCC

11 月 19 日,Xi Ruoyao 修复了 LSX 浮点向量 shuffle 最终生成代码其差无比的问题。

11 月 17 日,在排查一个有概率发生的问题时,Xi Ruoyao 发现 GCC 在向量化 LoongArch 浮点舍入操作时,对浮点异常的处理有误。 截至发稿时,迭代到了第三版修复。 这个代码生成问题跟原先要排查的问题无关;还得接着查!

同一天凌晨,Kevin Lee 在 RISC-V 上发现了类似的浮点异常处理问题: 即便加了 -fno-fp-int-builtin-inexact 选项,lroundceilfloor 等操作还是会产生可能抛异常的指令。 随后人们发现 x86_64、AArch64 和 LoongArch 上都存在该问题,因为架构无关部分已经把代码「优化」成了错误形状。 这提醒了 Andrew Pinski 要完善下这部分文档。

11 月 16 日,Xi Ruoyao 完成了一版 LA664 新增特性的 GCC 适配,可以用 -march=la664 了, 也给 -march=native 加了相应处理。 不巧龙芯也做了同样的事,撞车了;Lulu Cheng 第二天发了出来。 龙芯的这版代码只做了原子操作的一部分优化,而未放宽 32 位除法、取余操作的入参要求, 也未去除那些在 LA664 上不再必要的 DBAR 0x700 指令; 因此 Xi Ruoyao 以这一版龙芯代码为基础,又改了一版。

同一天,Jiahao Xu 修了一些 LSX、LASX 测试;Li Wei 也向 GCC 明确了 LoongArch 的 clz ctz 指令可以正确处理输入为零的情况。

这一天 Jiahao Xu 还根据 SPEC2017 跑分结果,把向量访存操作的成本从 1 微调到了 2,让它们和非对齐访存相同; 结果影响到了测试, 待修复。

11 月 14 日,Lulu Cheng 让 GCC 在中等代码模型(-mcmodel=medium)下,换作%call36 形式进行过程调用。call36 是第 23 期报道过的新 ABI。 这个变更欠考虑了搭配旧汇编器使用的情况;Xi Ruoyao 11 月 18 日帮忙修复了

同一天,上游开发者 Andrew Pinski 修复了1上期周报提到的一处实际上是劣化的「优化」。 (这修复把 PowerPC 的测试炸了,但上游的结论是应该改 PowerPC 相关代码。)

同一天凌晨,Xi Ruoyao 还发现有个 GCC 插件测试用例在龙架构上应该就没运行成功过;该问题仍待排查。

11 月 13 日,Xi Ruoyao 抄了个 AArch64 的优化,能为形如 copysign(x, -1) 的操作产生高效的向量化代码; 又移植了 LLVM 的 DBAR 优化 (周报第 20 期有报道)。

以上新增的大块内容都赶上了 GCC 14 stage 1,在明年的 GCC 14.1 正式版就能用上了。 等不及的同学也可以下载 GCC 14 快照自行编译,或使用 Gentoo(直接 unmask 相应版本即可)等滚动发行版, 马上体验。

本期的大多数 GCC 新闻都是 Xi Ruoyao 帮忙整理(以及自己制造)的,让我们感谢 :ta: 的奉献!

LLVM

人们已经在紧锣密鼓实现 LoongArch ELF psABI v2.20 的新内容了。

11 月 14 日,MaskRay 亲自帮忙修复了上期周报提到的 LLVM issue #71645

同一天,MQ-mengqing 为 LLD 增加了 R_LARCH_{ADD,SUB}6 两种重定位记录的支持, 又为 LoongArch MC 增加了 relaxation 支持。

11 月 13 日,MQ-mengqing 试图为 LoongArch MC 增加类似 GAS 的条件跳转范围扩展的一道工序, 但 MaskRay 及时指出当年 RISC-V 做相同事情被发现的坑: 如果龙架构能避免踩到这些坑,那么便能「比 RISC-V 做得更好」。MQ-mengqing 显然受益匪浅,应该在改代码了。

Rust

11 月 17 日,heiher 为了让 rustup 1.27.0 发布时能包含龙架构二进制, 临时给龙架构的 rustup 关掉了 OpenSSL。 这还是第 10 期讲过的龙芯挖的坑的后续……

11 月 14 日,heiher 为 Rust 的 LoongArch musl 支持(loongarch64-unknown-linux-musl 构建目标) 提前建立了协调工单。

musl 移植的上游化进度

目前龙芯推进的 musl LoongArch 支持补丁已经翻新到了第 9 版, 但似乎每次更新都塞了一些代码审查评论之外的修改。 这使上游维护者困惑: 本来上一版已经没问题了,结果又塞了新东西。

截至发稿时,看上去龙芯维护者已经恢复了补丁第 8 版发出的现状——这回应该能合并了!

杂闻播报

11 月 18 日,shipujin 发布了 Slackwareloong64 LTS 1.0 的 Live 镜像。欢迎感兴趣的 Slackware 用户、爱好者们下载体验。 感谢 :ta: 的新闻线索以及维护工作!

11 月 17 日,龙芯将《手册》英文版翻译的仓库短暂解除了只读状态; 文档维护者 Yanteng Si 遂推入了《手册》v1.10 的部分更新, 并相应地更新了 Linux 龙架构文档的链接。

本次翻译更新是不完整的:只包含了新增指令的描述, 而没有覆盖第 1.5 节关于指令集演进的说明、 第 2.2.10.5 节的新 CPUCFG 字段描述,或者特权架构部分的更新。 结合龙芯维护者在 binutils 邮件列表上,对上个月 LoongArch v1.10 指令支持工作 (第 22 期有报道) 的一封回复, 本次更新应该是实用主义的:可能仅仅为了能够快速推进新指令的上游化,临时叫人更新一下, 而并非专门排期来做这件事——如果是后一种情况,那么应该不会只做完一部分就提交了。

张贴栏

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

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

Footnotes

  1. 该修复方案是 Andrew Pinski 提出的,只是 Xi Ruoyao 帮 :ta: 把邮件发了。因为邮件正文带了 From: 字段,因此 Git 提交中的作者信息仍然是正确的。