跳至主要内容

開源貢獻紀錄

貢獻散在三個不同的系統上:GitHub PR、AOSP 的 Gerrit(android-review)、 OpenBMC 的 Gerrit。三邊的狀態字眼還不一樣(merged / MERGED / NEW / ABANDONED), 所以這頁統一成同一套圖例,並在最後附上重新查詢的指令,讓它可以隨時更新。

資料以 2026-10-07 查詢結果為準。

圖例:✅ 已合入 | 🔄 review 中 | ⛔ 已關閉(未合入)


一覽​

平台專案✅ 已合入🔄 review 中
AOSP Gerritkernel/common(Android Common Kernel)5 個 change(含 automerge 共 15 筆)1
AOSP Gerritplatform/hardware/interfaces—12
AOSP Gerritplatform/hardware/libhardware—5
AOSP Gerritplatform/bootable/libbootloader(GBL)3—
OpenBMC Gerritopenbmc/libpldm—4
GitHubsysprog21(elfuse / codetrial / frama-c-mcp / shecc / rv32emu)177
GitHubu-root、vmtest、llama.cpp、sse2neon76
GitHubARM-software、DMTF、OpenPRoT12
GitHub其他(cert-tools、os-in-1000-lines)3—

主題大致分三塊:Android kernel、HAL 與 bootloader 的文件/健壯性修補、RISC-V 與 SIMD 相關的 效能與模擬器工作、韌體協定(PLDM、SPDM)的邊界檢查。


依領域分類​

同一筆會出現在多個領域(例如 llama.cpp 的 SpacemiT kernel 同時是 RISC-V 和 LLM), 這裡不做互斥切分。

領域✅ 已合入🔄 review 中
資料中心 / 伺服器59
RISC-V77
Compiler / 工具鏈 / 執行環境128
LLM / AI111
Android818
韌體 / 開機810

資料中心 / 伺服器​

貢獻狀態為什麼算這一類
u-root #3733、#3735、#3750✅u-root 是 LinuxBoot 的 userland,拿 Linux 取代 UEFI DXE 的那套做法,主要使用者就是 OCP 系的伺服器韌體
u-root #3762、#3761✅ / 🔄同一個 LinuxBoot userland 的 CI:讓整合測試真的在 riscv64 上開機跑
u-root #3774、#3775、#3776🔄同一個 userland 的開機路徑:kexec 失敗訊息、boot menu 的 shell、universal payload 載入
DMTF/libspdm #3816✅SPDM 是 PCIe/CXL 裝置認證與量測的協定,用在伺服器內部元件的信任建立
OpenPRoT/pldm-lib #21🔄PRoT(Platform Root of Trust)+ PLDM,伺服器主板上的信任根
openbmc/libpldm ×4🔄BMC 就是伺服器的管理控制器,PLDM 是它對外的協定之一

RISC-V​

貢獻狀態為什麼算這一類
llama.cpp #27961、#28479✅SpacemiT X60 的 IME 矩陣加速路徑,RISC-V 向量/矩陣擴充的實際應用
u-root #3733✅riscv64 的 kexec 支援
u-root #3762、#3761✅ / 🔄#3733 的後續:CI 原本只編 riscv64 不開機。#3762 把 QEMU 網卡改用 -netdev/-device,讓 riscv64 virt 機器真的有 NIC;#3761 補上 riscv64 的 kexec_load 整合測試
hugelgupf/vmtest #132🔄把 u-root CI 用的 riscv64 測試 kernel 從 v6.6 升到 v6.18:riscv 的 kexec_file_load 要到 6.16 才收 Image,舊 kernel 上這個測試只能跳過
rv32emu ×5🔄RVV(向量擴充)指令實作與 cross-EEW overlap 規則
AOSP libbootloader 4314126✅GBL 的 riscv64 QEMU 範例:riscv64 virt 機器沒有預設的 block controller,要明確掛 virtio-blk-device,U-Boot 才找得到 ESP
os-in-1000-lines #101、#131✅這本教材的目標平台就是 RISC-V(qemu-system-riscv32);繁體中文版在上游 README 掛名

Compiler / 工具鏈 / 執行環境​

貢獻狀態為什麼算這一類
shecc #339✅自我編譯的教學用 C 最佳化編譯器,補的是暫存器配置相關的測試
sse2neon #774、#773✅ / 🔄SSE intrinsics 轉 NEON/SVE2,是編譯器 intrinsics 層的工作
ARM optimized-routines #97🔄libc 例程的最佳化實作與量測
frama-c-mcp ×3✅Frama-C 的靜態分析/形式驗證(EVA、WP)工具鏈
rv32emu ×5🔄指令集模擬器,本身帶 JIT
elfuse ×8✅ ×7 / 🔄 ×1嚴格說是執行環境不是編譯器:在 macOS 上跑 Linux ELF,做的是 ELF 載入與 syscall 語意轉譯

LLM / AI​

貢獻狀態為什麼算這一類
llama.cpp #27961、#28479✅推論引擎的 CPU kernel(Q8_0 量化矩陣乘)
frama-c-mcp ×3✅MCP server,把形式驗證工具接給 AI agent 用
codetrial ×6✅Gemini 驅動的即時技術面試模擬器;含在瀏覽器讀 JD/履歷 PDF(#98)、讓模型扮演候選人來檢查面試規則(#107)
codetrial #110🔄讓報告與行為檢查改由本機模型產生(併入了原本的 #99)

Android​

貢獻狀態為什麼算這一類
kernel/common ×5(dma-heap、dma-buf、binder、scsi/ufs)✅Android Common Kernel(ACK)
platform/hardware/interfaces ×12🔄HAL 範例實作的 service fuzzer 與生命週期修補
platform/hardware/libhardware ×5🔄HID report descriptor 解析的邊界問題
android17-6.18 的 scsi/ufs 重送🔄同一個 change 往穩定分支的 backport
platform/bootable/libbootloader ×3✅GBL(Generic Bootloader)的 QEMU 範例與除錯腳本修正

韌體 / 開機​

貢獻狀態為什麼算這一類
u-root #3733、#3735、#3750✅kexec、zimage 解析、reboot——都在「把下一個 kernel 帶起來」這條路徑上
u-root #3762、#3761、vmtest #132✅ / 🔄 / 🔄riscv64 kexec 路徑的整合測試,以及它需要的測試 kernel
u-root #3774、#3775、#3776🔄kexec 失敗時說清楚原因、boot menu 進 shell 改成 exec 取代自己、universal payload 的載入錯誤與警告分開回傳
AOSP libbootloader ×3✅GBL 是 Android 的 UEFI app 型 bootloader,修的是它在 QEMU 上的開機與除錯路徑(OVMF 韌體路徑、riscv64 磁碟掛載、rust-gdb 位置)
DMTF/libspdm #3816✅裝置韌體的認證與 session key 管理
OpenPRoT/pldm-lib #21、openbmc/libpldm ×4🔄PLDM 是韌體之間(BMC ↔ 裝置)的管理協定

不屬於上述任一類:cert-tools #55(區塊鏈證書工具的日期解析修正)。


依影響力排序​

「影響力」沒有客觀分數,這裡用三個軸排,並在每一列寫出它為什麼在這個位置, 好讓排序可以被質疑而不是只能被接受:

  1. 觸及範圍——這段程式碼最後會跑在多少裝置、多少人手上(專案規模只是代理指標)。
  2. 變更性質——新功能/效能路徑 > 正確性與邊界修補 > 文件與測試補強。
  3. 狀態——已合入 > review 中 > 已關閉。

已合入​

#貢獻專案規模為什麼排在這裡
1llama.cpp #27961、#28479 — SpacemiT IME kernel sources 與 Q8_0 IME1 矩陣 kernel129k ★觸及範圍最大,而且兩步都進了:#27961 讓 RISC-V 加速路徑編得進去,#28479 是 kernel 本身
2u-root #3733 — pkg/boot riscv64 kexec support3.1k ★新功能,而且落在開機鏈核心:u-root 是 LinuxBoot/firmware 場景的 userland
3libspdm #3816 — key update rollback189 ★star 數不高但身分特殊:DMTF 的 SPDM 參考實作。修的是 KEY_UPDATE 失敗時金鑰只換了一半、無法回復的正確性問題
4sse2neon #774 — 拿掉 <fenv.h> 依賴1.5k ★影響所有 includer——header 汙染是會傳染給下游的那種 bug
5u-root #3750、#3735、#3762 — reboot 指令、zimage 長度上限、riscv64 CI 的網卡3.1k ★一個新指令、一個邊界修正,同樣在開機路徑上;#3762 是 CI,讓 riscv64 整合測試有網路可用
6elfuse ×7 — futex、pty hangup、AT_EMPTY_PATH、CLONE_THREAD 的 SIGCHLD…268 ★專案規模小,但技術深度最高:syscall 語意層級的行為正確性,錯了不會有人幫你發現
7AOSP kernel/common ×5(dma-heap、dma-buf、binder、scsi/ufs)Android ACK觸及範圍其實最廣(進 ACK 並 automerge 到 6 條分支,往下就是所有 Android 裝置的 kernel 樹),但性質是 kernel-doc 修補,所以沒有排在功能型變更之前
8AOSP libbootloader ×3 — OVMF 韌體路徑、launch_qemu_gdb.sh 的 rust-gdb 路徑、riscv64 範例掛上 virtio-blkAndroid GBL照官方說明跑 QEMU 範例會直接失敗的三個問題,擋住的是每個第一次上手 GBL 的人;但性質是範例與開發腳本,不進產品映像
9shecc #339 — 參數 slot 尚未建立前的逃逸讀取測試1.4k ★教學用 C 編譯器,補的是會被後續重構踩到的測試
10frama-c-mcp ×3、codetrial ×631 / 62 ★工具鏈與服務端的實用修補,觸及範圍最小
11os-in-1000-lines #101、#131 — 繁體中文翻譯與校稿3.6k ★讀者觸及很廣,但不是程式碼,另成一類
12cert-tools #5542 ★2022 年的單點 bug 修正

Review 中(潛在影響)​

同樣三個軸,但狀態全部是 🔄,所以這裡排的是「如果合入會有多大影響」。

#貢獻專案規模為什麼排在這裡
1AOSP hardware/interfaces ×12、libhardware ×5Android給預設/範例 HAL 補 service fuzzer 並修出生命週期問題。廠商常以範例實作為起點,所以修在這裡會往下游擴散
2u-root #3774、#3775、#3776 — kexec 失敗訊息、boot menu 的 shell、universal payload 的回傳值3.1k ★都在開機路徑上:#3775 修的是進 shell 後 boot 程序還留在底下、離開 shell 被當成錯誤;另外兩筆是錯誤回報與 API 整理
3sse2neon #773 — SVE2 fast path1.5k ★效能路徑,opt-in 所以風險可控
4optimized-routines #97 — strcmp benchmark711 ★Arm 官方倉庫,但性質是 benchmark 而非實作
5rv32emu ×5 — RVV 指令實作590 ★量大且偏功能,但侷限在單一模擬器內
6u-root #3761、vmtest #132 — riscv64 的 kexec 整合測試與測試 kernel3.1k / 42 ★替已合入的 #3733 補上真正會開機的測試;維護者希望升級 vmtest 的 riscv64 kernel,而不是在 u-root 繞過 v6.6 的限制,所以拆出 vmtest #132。性質是 CI,不改產品程式碼
7libpldm ×4(OpenBMC)、pldm-lib #21OpenBMC / 新專案韌體協定的邊界檢查,影響面取決於這兩個 library 被採用的程度
8codetrial #11062 ★功能型但侷限在單一小專案

AOSP(android-review.googlesource.com)​

kernel/common — Android Common Kernel​

ACK 的 kernel-doc 與註解修補。合入 android-mainline 之後,automerger 會把同一個 change 自動傳播到 android-mainline-desktop、android-mainline-riscv64 等分支 (標題帶 am: 的那些),所以一個 change 在 Gerrit 上會出現好幾筆。

變更主分支狀態傳播到
ANDROID: dma-heap: restore struct dma_heap kernel-doc lost in a mergeandroid-mainline✅-desktop ✅、-riscv64 ✅
ANDROID: dma-buf: fix kernel-doc for dma_buf_set_name()android14-6.1✅android14-kiwi-6.1 ✅
ANDROID: binder: fix kernel-doc for struct binder_priorityandroid-mainline✅android17-6.18 ✅、-desktop ✅、-riscv64 ✅
ANDROID: scsi: ufs: fix kernel-doc for the UPIU prepare helpersandroid-mainline✅-desktop ✅、-riscv64 ✅、android17-6.18 🔄(第一次送的 4267244 已 abandon 後重送)
ANDROID: dma-heap: document the return values of the exported helpersandroid-mainline✅-desktop ✅、-riscv64 ✅

platform/hardware/interfaces — HAL 範例實作的 fuzzer 與生命週期修補​

12 筆,目前都在 review(🔄)。主軸是替預設/範例 HAL 實作補 service fuzzer, 順手修出 fuzzer 會踩到的生命週期問題。

子系統變更
gnssstop double owning the Gnss service、do not call a null callback、stop the reporting thread before destroying it、let a restarted reporting thread stop、do not sleep out a caller's batching interval、add a service fuzzer
secure_elementmove the emulated card out of main.cpp、add a service fuzzer
rebootescrowreject keys the encoder cannot encode、add a service fuzzer
contexthubadd a service fuzzer
tetheroffloadadd a service fuzzer

platform/hardware/libhardware — HID report descriptor 解析​

5 筆,都在 review(🔄)。先補 fuzzer,再修 fuzzer 找出來的解析邊界問題。

變更
HidUtils: add a report descriptor parser fuzzer
HidUtils: fix undefined shifts in HidItem
HidUtils: reject zero bit reports
HidUtils: reject out of range unit exponent
HidUtils: bound local item range expansion

platform/bootable/libbootloader — GBL 的 QEMU 範例與除錯腳本​

GBL(Generic Bootloader)的 gbl-mainline 分支,背景見 Android GBL 介紹。 三筆都是「照官方說明做會直接失敗」的問題。

變更狀態內容
Fix OVMF firmware path in standalone QEMU instructions✅x86_64 範例指向的 OVMF_CODE.fd 在現行 Debian/Ubuntu 的 ovmf 套件已不存在(只剩 4M 版本),改指 OVMF_CODE_4M.fd
Fix rust-gdb prebuilt path in launch_qemu_gdb.sh✅腳本找的 rust-gdb 路徑與 manifest 實際 checkout 的 Rust toolchain 位置不同,腳本一開始就中止
Attach virtio-blk in riscv64 QEMU example✅riscv64 virt 機器沒有預設 block controller,只給 -drive 不會掛上任何裝置,U-Boot 找不到 ESP 就停在提示字元

OpenBMC(gerrit.openbmc.org)​

openbmc/libpldm 的參數驗證與對齊問題,4 筆都在 review(🔄)。

變更
platform: Reject a compositeEffecterCount of zero
platform: Reject a NULL field argument
platform: Avoid unaligned loads in value encoders
platform: Use the sensor data-size constants

GitHub​

✅ 已合入​

專案PR內容
sysprog21/elfuse#350Prove the futex words behind Linux's refusals
#352Bound the pty hangup reads with an alarm
#353Answer AT_EMPTY_PATH before the path resolver
#358Drain the deferred stack unmap before the tid
#361Stop faking SIGCHLD on a CLONE_THREAD exit
#363Name deferral as a register class
#374Decide the commit-message rules in the C locale
sysprog21/frama-c-mcp#25Compare the machine model before calling variants duplicates
#29Count a timeout retry's flips instead of forbidding them
#32Key the opam cache on the opam that reads it
sysprog21/codetrial#3、#5、#17、#21連線中斷後續跑、prelude 缺的 header、錄影長度上限、把長度傳給頁面
#98Read JD and resume PDFs in the browser
#107Hold played candidates to the interview rules
sysprog21/shecc#339Test an escaped parameter read before its slot exists
u-root/u-root#3733pkg/boot: add riscv64 kexec support
#3735pkg/boot/zimage: accept a longer kernel size entry
#3750cmds/core/reboot: add reboot command
#3762integration: attach socket NICs with -netdev/-device
ggml-org/llama.cpp#27961ggml-cpu: conditionally add SpacemiT IME kernel sources
#28479ggml-cpu: add Q8_0 IME1 matrix kernel for SpacemiT X60
DMTF/libspdm#3816Fix key update rollback for Specula cluster A.1 and A.3
DLTcollab/sse2neon#774Drop the <fenv.h> dependency to stop leaking FE_* into includers
nuta/operating-system-in-1000-lines#101繁體中文版翻譯
#131繁體中文版校稿
blockchain-certificates/cert-tools#55prevent isoformat error

🔄 Review 中​

專案PR內容
sysprog21/rv32emu#766、#767、#768、#770、#774RVV 整數指令、whole vector register move、單倍寬浮點轉換,以及 widening 運算的 cross-EEW overlap 規則
DLTcollab/sse2neon#773Add opt-in SVE2 fast path for _SIDD_CMP_EQUAL_ANY
ARM-software/optimized-routines#97bench: add strcmp benchmark
OpenPRoT/pldm-lib#21pldm-common: bound wire version-string lengths by the destination
sysprog21/elfuse#365Give each restated rule one owner
u-root/u-root#3761integration: run kexec_load tests on riscv64
#3774kexec: explain kexec_file_load failures
#3775menu: exec the shell instead of running it as a child
#3776universalpayload: return the load error last
hugelgupf/vmtest#132kernel-riscv64: bump to Linux 6.18.54
sysprog21/codetrial#110Run reports and the behaviour check on a local model

⛔ 已關閉(未合入)​

留著是因為它們通常有下文:被拆小、被重送,或被維護者換了做法。

專案PR後續
ggml-org/llama.cpp#28025重送為 #28479
u-root/u-root#3736arm kexec,riscv64 那條(#3733)先進
sysprog21/rv32emu#769、#771、#772、#773RVV 浮點系列,改以其他 PR 重整
sysprog21/elfuse#362AGENTS.md 的組織方式,維護者另有想法
sysprog21/codetrial#4lobby 控制項位置
#99本機模型寫報告,維護者要求併入 #110 一起審
#104中文 JD 的需求擷取,維護者表示目前不考慮中文 JD

未收錄​

  • 自己的 repo(alanhc/*)的 PR,以及學生時期社團/課程 repo 的練習 PR。
  • 直接 push、沒有走 PR 的 commit。
  • 以其他帳號或信箱送出的變更(這頁只查得到目前用的兩組 Gerrit 身分與 GitHub 帳號)。

資料來源與更新方式​

三邊都有公開 API,更新這頁不需要人工翻紀錄:

# GitHub:已合入 / review 中 / 已關閉
gh search prs --author alanhc --merged --limit 100 \
--json repository,title,number,url,createdAt
gh search prs --author alanhc --state open --limit 50 \
--json repository,title,number,url,createdAt
# closed 同時包含已合入的,要扣掉上面 --merged 的結果才是「已關閉未合入」
gh search prs --author alanhc --state closed --limit 100 \
--json repository,title,number,url,closedAt

# Gerrit REST API(回傳開頭有 )]}' 前綴,要先去掉才能餵給 JSON parser)
curl -s 'https://android-review.googlesource.com/changes/?q=author:%22Alan%20Tseng%22&n=100' # 引號與空白要 URL 編碼,否則可能回空
curl -s 'https://gerrit.openbmc.org/changes/?q=owner:alanhc&n=100'

Gerrit 查詢要注意兩件事:

  • owner: 和 author: 不是同一件事。 AOSP 的 automerger 會用機器人帳號重送同一個 change,那些 change 的 owner 是 android-build-automerger-*,只有 author: 查得到自己。
  • 狀態字眼要換算:Gerrit 的 NEW 是「還在 review」,不是「新的還沒送」; ABANDONED 對應 GitHub 的 closed。