跳到主要内容

每周一龙:第 39 期

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

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 上周的进展主要有 Linux、工具链与发行版适配。 详情点进来看!

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

本期周报的实际发稿时间是周三晚间,因为前两天都在忙别的——以为这周信息量不高。

先「马」再看

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

Linux

社区仍在讨论 Linux KVM 在 LoongArch 上的 hypercall 接口定义细节。

Huacai Chen 拟在架构代码中代替驱动保证 IO 操作的顺序语义,具体来说是将 __io_aw() 定义为 mmiowb(),并废除先前为 qspinlock 自定义的行为。但由于涉及精妙、艰深的锁操作,预计仍需一些讨论才能确定此变更是否合理。

Bibo Mao 细化了 KVM CPUCFG 配置字的受支持位域信息。

WANG Rui 跟进上游重构,将 LoongArch Linux 所用的 Rust target 切换为了 Rust 内建的 loongarch64-unknown-none-softfloat。这降低了一些复杂度与维护工作量。

工具链

binutils

近期来自龙芯的维护者 Lulu Cai 生产力爆棚:

  • 允许了 gas 在解析到非法操作数之后继续处理余下输入,而非直接退出。这有助于一次性看清输入中存在的所有错误。
  • 继续迭代 TLS transition 与 relaxation 功能。
  • 为 binutils 汇编器、反汇编器补充了所有 LoongArch 汇编语法的测试用例。
  • 为 LVZ 指令集扩展的 gcsrxchg 指令补充了比照其基础指令集等价物 csrxchgrj 操作数约束检查,意在防止指令编码的实际含义变成 gcsrrdgcsrwr
为啥要特殊处理 CSR 指令的 rj 呢?

CSR、Guest CSR 系列指令各有 3 条,但同一组的 3 条指令都共享操作码,靠 rj 取值来区分语义。rjcsrxchg 指令的写掩码操作数,因此全零的 rj 就表示什么都不写入,这种情况下 csrxchg 便等效于 csrrd 了,而 $r0 正好就是保证为 0 的寄存器。但 LoongArch 设计师觉得这还不过瘾:按照 LoongArch 过程调用约定,$r1 固定表示返回地址, 因此设计师认为不可能有程序将 csrxchg 写掩码放入 $r1,于是将 rj = 1csrxchg 定义为了特例,此时 rj 操作数指向的 $r1 并不表示写掩码,也不会被读取, 而是等价于将整个 rd 都写入指定的 CSR——像是 $r1 存放了全 1 的值一样。 这样做了之后,仅分配一个操作码便表示了三种具体操作,从而达到了「节省编码空间」的既定目的。

从个人理解和软件实现的角度,可以将 csrrdcsrwrcsrxchg 理解为操作码部分重合,但操作数格式不同的三条指令; 也可以将其理解为同一条广义 csrxchg 的语法糖,此指令在 rj = 1 时的行为是不读 $r1 而以全 1 的值作为写掩码。 在后一种理解下,通用的反汇编算法不再需要专门为这种指令实现两阶段处理,而将这部分工作留给更下游的应用—— 大部分应用不那么底层,不需要关心特权架构,也就接触不到这部分复杂度; 而如果都到了要处理特权架构的程度了,这部分额外工作量不过是毛毛雨。 但从龙芯官方手册描述和代码实现来看,则可以看出这些工作人员都在采用前一种理解。

1 月 26 日,mengqinggang 增加了 $s9$fp 寄存器的别名。早在 2021 年,LoongArch ABI 规范文档中就已载明此别名, 但由于最早的一批 LoongArch 上游提交内容都基于更早期的旧世界代码,而远古年代并不存在 $s9 的提法——可考的最早提议是 xen0n 在此规范的首次公开亮相第二天作出的, 因此此支持长期以来都为众人所忽视了。

GCC

chenxiaolong 修复了一些向量测试用例的错误。

Yang Yujie 为 musl libc 更换了库查找路径: 从 /lib64 换回了 /lib,禁用了 multilib 处理。

Xi Ruoyao 重构了向量浮点比较操作的测试用例, 通过避免使用固定寄存器号的方式,使相关循环能被向量化,进而让这些测试得以正常通过了。

Xi Ruoyao 为 gcc 也增加了fp 称作 s9 的支持。

LLVM

LLVM 18.1.0 已于中国时间 3 月 6 日下午正式发布。请打包人们在处理此版本时注意:

这些 backports 未能赶上 18.1.0,但后续的补丁版本应该会包含了,因此预计只需为 18.1.0 这个版本做特殊处理。

以下变更都对应当前开发中的分支,即 LLVM 19。

MQ-mengqing 一个月前为 LLD 增加了 ULEB128 重定位操作的支持,这对 DWARF v5 调试信息的处理至关重要。此 PR 终于在 3 月 5 日合并了。

wangleiat 跟进先前在第 36 期周报报道过的 GCC 同款修复,为 Clang 也修复了 __iocsrrd_h 的返回值类型。

wangleiat 还为 LoongArch 代码生成后端启用了 Machine Scheduler。

SixWeining 为解决 Firefox JavaScript 原子操作的行为错误,仿照先前 RISC-V 的类似修复, 为 LoongArch CAS 操作的输入做了符号扩展。 此额外处理对拥有原生 CAS 支持的 LA664 微架构是不必要的;龙芯方面暂时没搞,xen0n 准备近期做掉。

leecheechen 避免了 llvm.loongarch.lasx.xvpermi.q intrinsic 可能的未定义行为。

Rust

heiherxiangzhai 向 Rust stdarch SIMD intrinsics 库贡献了 LSX 与 LASX 的包装。这将极大便利 Rust 生态内的 LoongArch SIMD 优化工作。 虽然代码目前已经合并了,也请关心这方面基础建设的同学们抽空测试、审查这些新增功能,以便尽早发现仍可能存在的设计、易用性问题等等。 感谢 heiher 提供新闻线索!

由于 Rust 官方使用的 LoongArch 工具链版本较低,在之前第 35 期周报报道的 medium 代码模型工作合并之后,出现了死循环的问题, heiher 只好将其暂时回滚。 由于 GCC 13 与 binutils 2.42 无法互操作是已知问题, 后续预计要等 crosstools-NG 项目合并 binutils 2.42 支持之后才方便恢复了。

杂闻播报

杰哥为 Debian GRUB 增加的 LoongArch EFI 平台支持终于冲过了终点线,很快将被集成了。 不过发稿前可能等不到了:i386 架构的构建居然失败了,可能导致自动合并被阻止。 感谢杰哥提供新闻线索。

Xinmudotmoe 测试了采用 64KiB 页的 Linux,发现无法完成引导。目前的调查显示这很可能是因为 BFD 链接器默认使用的页大小是 16KiB。 以前 xen0n 在做 LLD 移植的时候对此参数采用了 64KiB;后续 binutils 方面可能要跟进此处理。

来自安同开源社区(AOSC)的新旧世界兼容层 libLoL 发布了 0.1.4 版本, 同时提供适配 Debian 的安装包。 另外,社区整理了旧世界应用的兼容性。 感谢王邈提供新闻线索!

Linux From Scratch 12.1 的 LoongArch 版本——loongarch-12.1 现已发布,您可在以下网址阅读:

感谢 xry111 提供新闻线索!

Debian 的 Linux 内核团队合并了 Weihao Li 的架构支持补丁。随着 Debian 不稳定版的 Linux 版本上升到 6.7.7-1,Debian 内核终于支持了 LoongArch。 感谢 zhangn1985 提供新闻线索!

张贴栏

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

  • AOSC OS 维护者白铭骢注意到 Intel 独立显卡的驱动支持已进入 Linux 6.8,遂发布了英雄帖, 召唤勇者为其添加非 4KiB 页架构(如🐉)支持。
  • 您可在 GitHub 浏览目前所有开放的英雄帖。
  • 本周报持续接受网友投稿。欢迎来上游坐坐!