跳到主要内容

每周一龙:第 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 的新闻线索以及 本次为 Linux 稳定性作出的贡献!

工具链

binutils

11 月 14 日,Xi Ruoyao 想给 binutils 在龙架构上增加 DT_RELR 支持,这样可以有效缩小一些大软件的体积; 但 binutils 的源码很不直观,不好改,于是 建立了协调工单。 随后 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 帮忙整理(以及自己制造)的,让我们感谢 的奉献!

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 用户、爱好者们下载体验。 感谢 的新闻线索以及维护工作!

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 帮 把邮件发了。因为邮件正文带了 From: 字段,因此 Git 提交中的作者信息仍然是正确的。