diff --git a/patch_v2/meow_audiod/build_audiod.sh b/patch_v2/meow_audiod/build_audiod.sh index af508e8..fc8ab8e 100755 --- a/patch_v2/meow_audiod/build_audiod.sh +++ b/patch_v2/meow_audiod/build_audiod.sh @@ -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" diff --git a/patch_v2/sdk/test_time32_abi.sh b/patch_v2/sdk/test_time32_abi.sh index c380626..64ba5b8 100755 --- a/patch_v2/sdk/test_time32_abi.sh +++ b/patch_v2/sdk/test_time32_abi.sh @@ -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= 指定 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 [...]" >&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" diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index cb2dd31..9ede180 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -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