fix(m43): r1 评审 P2 — 语义断言入仓 + audiod 表述对齐产物

- test_time32_abi.sh 增加 16 字节 time64 布局断言:4263 后必须写 tv_sec 0x0/0x4
  (含 sra 符号扩展)+ tv_nsec 0x8;支持「内联」与「调用后转换」两种编译形态。
  自证:amsd 出货件 FAIL、修复后 amsd PASS、不加修复重编 sysui FAIL。
- build_audiod.sh / fw_content.conf:41 的 audiod 例外说明改为:「出货件是旧工具链
  静态 musl,4403→ENOSYS→4263+宽度转换本身健康;glibc-2.22 目标同样无 ABI 错位」,
  不再单称 glibc-dynamic。
This commit is contained in:
AskaEth committed 2026-11-11 18:51:16 +08:00
1 parent 884d4c4891
commit 7a32b0690e
3 files changed
+93 -8

No files matched your search

+4 -3
View File
@@ -55,9 +55,10 @@ if [ "$1" = "cli" ]; then
fi
# meow_audiod:mipsel glibc-dynamic,BT 直链 libasound(-Llibbt -lasound)。-lpthread 供播放线程。
# M43 例外:本守护走 glibc-2.22(time_t 32 位、struct timespec 8 字节),头/实现 ABI 一致,
# 不存在 zig-musl 的 time64 头 vs time32 实现错位;meow_time32.c 的 __clock_* 接管是 musl 内部
# 符号,对 glibc 目标无意义且可能引入符号冲突,故**不链**。musl-static 的 meow_audio CLI 已链。
# M43 例外:本目标走 glibc-2.22(time_t 32 位、timespec 8 字节)→ 无 musl time64 头/实现错位;
# 当前钉在 fw_content.conf 的出货件则是旧工具链静态 musl,其 4403→ENOSYS→4263+宽度转换本身健康。
# 两种形态都不需要 meow_time32.c(其 __clock_* 接管针对 zig musl 内部符号)。musl-static 的
# meow_audio CLI 已链 time32。
# 链接源 libbt/libasound.so.2.0.0(设备固件 libasound.so.2 副本);缺失时从固件镜像自拷贝(idempotent)。
LIBBT="libbt"
ASOUND_SRC="$ROOT/hiby_os_crack/r3proii/squashfs-root-example/usr/lib/libasound.so.2.0.0"
+88 -4
View File
@@ -7,14 +7,93 @@
# bash patch_v2/sdk/test_time32_abi.sh patch_v2/meow_watchdog/meow_watchdog patch_v2/meow_launcherd/meow_launcherd
# 可用 OBJDUMP=<path> 指定 objdump(默认 llvm-objdump)。
#
# 期望:每个二进制 4263 出现 ≥1 次(time32 取时路径存在),4403 出现 0 次
# (CLOCK_ABI.md §2.3:zig musl 把 time64 分支整段编掉,残留 4403 说明链接到了未修复的取时)。
# 期望:每个二进制同时满足三条——
# 1) 4263(SYS_clock_gettime time32)出现 ≥1 次;
# 2) 4403(SYS_clock_gettime64)出现 0 次;
# 3) 4263 之后必须把结果按 16 字节 time64 布局写回:tv_sec 写 0x0/0x4(含 sra ...0x1f
# 符号扩展)、tv_nsec 写 0x8。
# 第 3 条是必需的:zig 0.17 的「缺陷版」与 meow_time32 的「修复版」都呈 4263-only,
# 只看 1/2 区分不了。缺陷版把 4263 的 a1 直接指向调用方 8 字节缓冲、无宽度转换;修复版
# 才写 0x0/0x4/0x8。已知样本:amsd 出货件(缺陷)FAIL、修复后 amsd PASS、当前 zig 不加
# meow_time32.c 重编的 sysui FAIL。
set -u
OD="${OBJDUMP:-llvm-objdump}"
command -v "$OD" >/dev/null 2>&1 || { echo "缺少 objdump: $OD(可用 OBJDUMP=... 覆盖)" >&2; exit 2; }
[ "$#" -gt 0 ] || { echo "用法: $0 <mipsel-binary> [...]" >&2; exit 2; }
# 语义断言(两条路径,覆盖内联与非内联两种编译形态):
# A. 4263 指令所在窗口内出现同一基址寄存器的 0x0/0x4/0x8 存储 + sra 符号扩展(内联形态);
# B. 若 A 不成立,定位 4263 所在函数(最近的 jal 目标),检查其直接调用者在 jal 之后是否
# 做同样的 0x0/0x4/0x8 写回(meow_ui_time.c 那种「调用 time32 取时再转换」的形态)。
# 缺陷版两条都不成立:4263 的 a1 直达调用方 8 字节缓冲、无宽度转换。
sem_awk='
function hex2num(h, i, n, c) {
n = 0; h = tolower(h)
for (i = 1; i <= length(h); i++) {
c = index("0123456789abcdef", substr(h, i, 1)) - 1
if (c < 0) return -1
n = n * 16 + c
}
return n
}
function window_has_16b(from, to, j, l, frag, f, off, r, has_sra, seen, k, a) {
delete seen
has_sra = 0
for (j = from; j <= to && j <= NR; j++) {
l = line[j]
if (l ~ /sra[ \t]+\$[0-9a-z]+,[ \t]*\$[0-9a-z]+,[ \t]*0x1f/) has_sra = 1
if (l ~ /(^|[ \t])sw[ \t]+\$[0-9a-z]+,[ \t]*0x[048]\(\$[0-9a-z]+\)/) {
frag = l
if (match(frag, /0x[048]\(\$[0-9a-z]+\)/)) {
f = substr(frag, RSTART, RLENGTH)
off = substr(f, 3, 1)
r = f; sub(/.*\(\$/, "", r); sub(/\).*/, "", r)
seen[off SUBSEP r] = 1
}
}
}
if (!has_sra) return 0
for (k in seen) {
split(k, a, SUBSEP)
if (a[1] == "0" && (("4" SUBSEP a[2]) in seen) && (("8" SUBSEP a[2]) in seen)) return 1
}
return 0
}
{ line[NR] = $0 }
END {
ng = 0; nj = 0
for (i = 1; i <= NR; i++) {
if (!match(line[i], /^[ \t]*[0-9a-f]+:/)) continue
h = substr(line[i], RSTART, RLENGTH); sub(/:$/, "", h); gsub(/[ \t]/, "", h)
addr[i] = hex2num(h)
if (line[i] ~ /addiu[ \t]+\$[0-9a-z]+,[ \t]*\$zero,[ \t]*0x10a7/) { ng++; gt[ng] = i }
if (match(line[i], /jal[ \t]+0x[0-9a-f]+/)) {
s = substr(line[i], RSTART, RLENGTH); sub(/.*0x/, "", s)
nj++; jfrom[nj] = i; jto[nj] = hex2num(s)
}
}
for (g = 1; g <= ng; g++) {
i = gt[g]
if (window_has_16b(i + 1, i + 70)) exit 0
}
for (g = 1; g <= ng; g++) {
a = addr[gt[g]]
best = -1
for (j = 1; j <= nj; j++) {
t = jto[j]
if (t <= a && a - t <= 1024 && t > best) best = t
}
if (best < 0) continue
for (j = 1; j <= nj; j++) {
if (jto[j] != best) continue
if (window_has_16b(jfrom[j] + 1, jfrom[j] + 60)) exit 0
}
}
exit 1
}
'
fail=0
for bin in "$@"; do
[ -f "$bin" ] || { echo "FAIL 文件不存在: $bin"; fail=1; continue; }
@@ -25,14 +104,19 @@ for bin in "$@"; do
# 十六进制偏移(如 <.text+0x11338>)也含该子串,会把已修好的二进制误判为残留 4403。
n_time32=$(printf '%s\n' "$dis" | grep -cE 'addiu[[:space:]]+\$[0-9a-z]+,[[:space:]]*\$zero,[[:space:]]*0x10a7' || true)
n_time64=$(printf '%s\n' "$dis" | grep -cE 'addiu[[:space:]]+\$[0-9a-z]+,[[:space:]]*\$zero,[[:space:]]*0x1133' || true)
printf '%-60s SYS_clock_gettime(4263)=%s clock_gettime64(4403)=%s\n' \
"$bin" "$n_time32" "$n_time64"
sem=FAIL
if printf '%s\n' "$dis" | awk "$sem_awk"; then sem=OK; fi
printf '%-52s 4263=%-2s 4403=%-2s 16B-layout=%s\n' \
"$bin" "$n_time32" "$n_time64" "$sem"
if [ "$n_time32" -lt 1 ]; then
echo "FAIL $bin: 未找到 4263(o32 time32)取时路径"; fail=1
fi
if [ "$n_time64" -ne 0 ]; then
echo "FAIL $bin: 发现 4403(time64)路径(应有 0 处)"; fail=1
fi
if [ "$sem" != "OK" ]; then
echo "FAIL $bin: 4263 后无 16 字节 time64 写回(0x0/0x4/0x8)——疑似直接写调用方 8 字节/无宽度转换"; fail=1
fi
done
[ "$fail" -eq 0 ] && echo "ALL PASS" || echo "SOME TESTS FAILED"
+1 -1
View File
@@ -38,7 +38,7 @@ patch_v2/meow_svc_power/meow_svc_power|/usr/bin/meow_svc_power|39ae3aa255695a97f
patch_v2/meow_verify/meow_verify|/usr/bin/meow_verify|6c2e8ed24aebe5caf41e7aed391312d5|II期验签 2B(多公钥+v2签名块 agent-221)
patch_v2/meow_crash/meow_crash|/usr/bin/meow_crash|ce8aa8bede960844b4d50dfa9171a13b|系统级崩溃捕获 (agent-187) + log升级: 清理前缀扩 perf_/hang_ 承接1GB纪律 (337);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
patch_v2/meow_svc_perf/meow_svc_perf|/usr/bin/meow_svc_perf|44e2ff6f5666ef6509e63ab3e606bb33|性能专项服务 M2.75 + log升级(337:卡死快照+perf基线) + OOM治理C(348:Cached/Dirty监控降载, /tmp/meow_cachegov_c.state单点);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|b122c9b81880b00f705bca30e42f3d58|独占音频守护 M6.42(开机路由武装瘦身防楔死:去无条件apply_route(5)→target双写,当前端口正确则跳过强烧,仅未武装/端口不对/读失败才写目标;保留M2.91核心防挂死武装,numid=9语义/popen有界超时/D态抛弃/io_thread未动;降低stock hbc3000驱动楔死整机硬冻结触发面;glibc-dynamic链libasound;0warning;需真机多boot复测);M43 例外:glibc-2.22 无 musl time64 ABI 错位,不链 meow_time32
patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|b122c9b81880b00f705bca30e42f3d58|独占音频守护 M6.42(开机路由武装瘦身防楔死:去无条件apply_route(5)→target双写,当前端口正确则跳过强烧,仅未武装/端口不对/读失败才写目标;保留M2.91核心防挂死武装,numid=9语义/popen有界超时/D态抛弃/io_thread未动;降低stock hbc3000驱动楔死整机硬冻结触发面;glibc-dynamic链libasound;0warning;需真机多boot复测)
patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|3909c8d226d9da5afba4563056d105a5|audiod 用户侧 CLI M6.34(+蓝牙P2 audio_output/OUT_BT codec 展示;monitor 实时电平表/文本电平条;status 补 rms/peak;0warning);M43 链 meow_time32(musl-static,修 time64 ABI 的取时/睡眠)
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_powermgr|40217b5dc91da5c08d094c403eeb5fb2|功耗管理专项服务期2 M6.1(期1+history/top/events+mp2731 current_now 实测充电功率+WiFi 未关联档/BT rfkill 细化+系数路径 /data/meow/powermgr/;IPC 0xD0-D7);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_power|40217b5dc91da5c08d094c403eeb5fb2|meow_powermgr 的 CLI 形态(同二进制双形态,argv[0]=meow_power 即 CLI:status/estimate/model/history/top/events,policy 期3桩);M43 链 meow_time32