跳到主要内容

每周两龙:第 33 期

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

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 上两周的进展主要有各大工具链项目,以及 libLoL。 详情点进来看!

因为笔者上周现实生活繁忙,本期改为周二更新前两周的内容,预计下期恢复周一更新。 本期周报的实际发稿时间是周三凌晨,因为这个点才写完——白天都在忙别的。 网页上显示的发稿时间仍然是 1 月 23 日: 这是 Docusaurus 早期为了修复一个时区 bug 而导致的又一个时区 bug。

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

先「马」再看

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

Linux

Linux 6.8 的合并窗口已关闭,v6.8-rc1 已经发布。根据 Huacai Chen 的 KVM PR架构 PR, 本周期的 LoongArch 变更主要有:

  • 抬升了 LLVM/Clang 的最低支持版本到 18,并支持 Rust 语言(WANG Rui)。
  • 内置了龙芯 2K 系列 SoC 的设备树(Binbin Zhou)。
  • BPF JIT 优化与修复(Hengqi Chen)。
  • 支持处理 UEFI ESRT 表格,为系统内的固件升级方案如 fwupd 做准备(Huacai Chen)。
  • 使用公共设施实现了 crashkernel 内核参数(Youling Tang)。
  • 修复了 execve 后的 FCSR 初始化问题(Xi Ruoyao)。
  • 完善了 KVM 内存管理与定时器模拟(Bibo Mao)。
  • 支持在 KVM 虚拟机中使用 LSX、LASX 了(Tianrui Zhao)。

不巧的是,合并 LoongArch KVM 相关修改时漏掉了一个修复构建错误的补丁。 这是针对 KVM 分支的代码重构的跟进,但由于双方分支基础不同,因而需要 Linus 在合并时手工操作;没有人提醒自然就不会操作。 目前如果要编译主线内核,需要打上该补丁,或者禁用 KVM 功能。 不过在目前的仓库状态下,该补丁已经可以直接打上了;因此此问题预计将很快在主线修复。

工具链

ABI

1 月 10 日,龙芯编译器团队贴出了一份调用约定扩展的草稿,该扩展允许通过向量寄存器传递向量参数。 这样做可以减少内存访问,进而提升性能;但也有兼容性、以及与遵循现有调用约定的存量代码的互操作性等方面的担忧。

工单随附了龙芯团队做的原型实现: 请在意技术细节的同学们关注,以求将大概率会存在的问题尽早暴露、修复。 众人拾柴火焰高!

binutils

GNU Binutils 2.42 分支已于 1 月 15 日切出, 理想状况下,将于分支管理员时区的 1 月 29 日发布。

Xi Ruoyao 赶在正式发布前做了些工作:

  • 按照 LoongArch ABI v2.30 调整了若干重定位操作类型的语义,
  • 修了测试,
  • 整理了 2.42 版本的 LoongArch 变更内容文档。

GCC

Lulu Cheng 让 GCC 在使用 extreme 代码模型时,使用宏指令生成符号地址, 但 Xi Ruoyao 认为应该换一种做法。

Lulu Cheng 还将 GOT(全局偏移表)记录标记为了只读。 这可能会允许更多优化。

Xi Ruoyao 发现了 GCC 向量测试套件本身的一些问题。

Xi Ruoyao 还适配了 TLS LD/GD relaxation。

LLVM

LLVM 18 的代码将于中国时间 1 月 24 日冻结。

wangleiat 新增了目标特性(target feature)auto-vec, 用以控制是否进行自动向量化。 目前此特性默认关闭,因为仍需一些工作量才能确保实际提升性能。

yjijd 实现了向量类型的整数转浮点数操作: 即 LLVM IR 的 sitofpuitofp 操作。

Ami-zhang 增加了 LoongArch v1.10 的新增指令支持。

Ami-zhang新增了目标特性 frecipe, 以及相应的 Clang intrinsics,以便开发者控制 LoongArch v1.10 的浮点近似取倒数等操作的使用与否。

MQ-mengqing 给 LLD 增加了基本的 LoongArch linker relaxation 支持。 截至发稿,此 PR 仍然没有合并;鉴于 linker relaxation 在 LoongArch 最新基线状态中的根本性地位, SixWeining 的建议是将其合入主线之后再单独摘入 LLVM 18 发布分支,待组件维护者定夺。

MQ-mengqing 完善了开启 linker relaxation 情况下的 DWARF 调试信息处理。

MQ-mengqing 还根据最新 LoongArch ELF psABI 处理了汇编器对齐指示。 截至发稿,此 PR 仍然没有合并;不过已经通过代码审查,因此赶上 LLVM 18 应该问题不大。

杂闻播报

libLoL 架构升级,兼容性持续提升

1 月 19 日,以 0.1.0 版本的发布为标志,libLoL 已转向共享 sysroot 的,仅在 libc 层面处理符号版本问题的方案,而不再需要从旧世界发行版(如 Loongnix)取用系统库。 这样既让兼容层的体积得到大幅缩减:安装包现已不足 1MiB, 也避免了先前由于使用商业发行版二进制文件,而可能为社区发行版提供者、用户带来的法律风险。 更多技术细节请见 libLoLREADME 文档。 (本站不久也将上架相关阅读材料。)

截至发稿时,libLoL 已迭代至 0.1.3 版本:又修复了旧世界 .NET 8、WPS PDF、钉钉等应用或组件的兼容性问题。 如果您依赖的旧世界应用仍然不能完美运行,请将问题报告到 libLoL 上游工单系统, 以便开发者们帮忙。

需要修订《手册》以明确 ftint 的边界情况行为

在测试正则表达式库 PCRE2 新版的 LoongArch JIT 支持时,xen0n 发现代码中缺失了关于浮点数转整数操作在 LoongArch 上的边界情况行为的记载。 虽然 lrzlin 马上做了实验并修复了此问题, 但 xry111 随即指出《龙芯架构参考手册》对此未加详细说明,因而理论上仍可能存在行为与当下实验结果不符的芯片。 社区已将此问题提醒到龙芯官方:我们没权限改《手册》,只能你们来了!

社区维护的 LoongArch Chromium 补丁集现已可用

Chromium 浏览器,及基于其内核的一众衍生项目如 QtWebEngine、Electron 等等,已成为当代桌面、移动端不可或缺的基础设施。 但由于其代码规模庞大,且演进极为迅速、激进,一直以来,如何持续维护可用的 Chromium 分支这件事,对那些非 x86 或 ARM 架构的系统集成工作者而言,都是一块心病。 即便「多金」如 IBM PowerPC,「网红」如 RISC-V,也只能紧赶慢赶,而暂未能进入 Chromium 主线,从日常 git rebase 解冲突的苦海「上岸」。

截至目前,LoongArch 也并未在 Chromium 主线得到完整支持,因此为 LoongArch 打包的同学们也要自行维护分支。 龙芯公司先前即出于业务需求,适配了龙芯浏览器、Electron 等项目; 但由于跟进新版本不及时、无统一的补丁分发渠道等因素,这些工作并未能惠及新世界发行版的工作人员。 龙芯开源社区于 2023 年 10 月即关注了此事, 呼吁维护一套公共的 Chromium 补丁集;但限于人力,当时未有回应。

好在新的一年,勇士们终究站了出来: 基于 SignKirigami 制作的 Qt6 WebEngine 补丁集,杰哥完成了完整 Chromium 的构建与测试工作,成果已在安同开源社区(AOSC)组织下公开了

OpenSSL

lrzlin 修复了 xry111(🤡——xry 本人自嘲)之前重构代码时的一处不小心, 此 bug 有可能导致 ChaCha20 算法的 SIMD 优化版本永远跑不到。

社区整活:儿:

本栏目接受任何网友的投稿,只要内容与 LoongArch 有关,并可以为读者带来价值, 无论严肃贡献(整的大活:儿:)或是博君一笑都一概欢迎!

Xinmudotmoe 在龙芯固件团队未提供相应支持的情况下,自己动手丰衣足食,手工移除了 3C5000 工作站主板固件中所有与显示相关的模块,终于能在 3C5000 工作站上使用近年的 AMD 显卡了。 但 :ta: 警告说这样做要付出很大代价(原文经过了些许编辑):

警告

这种方式有一些已知问题。

  • 不同于 3A6000 固件中官方提供的关闭 x86emu 功能,此方式同时使固件失去点亮屏幕的能力(3A6000 固件下关闭 x86emu 后,仍可通过板载显卡看到固件配置选项)。 但修改后仍可通过串口配置固件。
  • 不能在插入 BMC 的情况下启动,否则蜂鸣器会长鸣,无法启动。
  • 不能通过 BMC 刷入修改后的固件,但可以通过 BMC 恢复为原版固件。

鉴于此,较「献祭流」而言,本方案风险可能大于收益。

同时,经过 :ta: 的测试,3C5000 超频后可以稳定在全核 2.5GHz,并跑了 CoreMark。 超频后的多核分数大约是 3A5000 的 4 倍,3A6000 的 2 倍。

Kiri2002 正在推进将 Arch Linux 中文社区(archlinuxcn) 维护的软件包在 Loong Arch Linux 上打包的工作。

张贴栏

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

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