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:
1 parent
884d4c4891
commit
7a32b0690e
3 files changed
+93
-8
No files matched your search
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user