Skip to content

开放边境寄存器

本页上的所有地址、计数和 sidecar 数字均适用于 libtpu-0.0.40-cp314 轮中的 libtpu.so(build-id md5 89edbbe81c5b328a958fe628a9f2207d,781,691,048 字节,ELF x86-64,未剥离)。其他版本会有所不同。

摘要

本书中的每一页都断言有关未剥离的 745 MB 二进制文件的信息,并且只有当它陈述其自身边缘与其内部一样精确时,重构才是可审计的。这个附录就是那个边缘:尚未完全解决的问题的诚实目录,作为实时记录而不是免责声明保存。它与 wiki 的其余部分相反 - 每个条目不是“这里是算法”,而是“这里是问题,这里正是关闭它的证据,这里是拥有答案的页面”。

边界分为五类,其区别很重要,因为它们以不同的方式关闭。 反编译墙是 Hex-Rays 拒绝解除的功能 - 大多数是导入存根,没有主体可恢复,剩余的 ~21 是手动反汇编通道将关闭的真实代码。 依赖于硬件的事实是静态分析在结构上无法确认的值,因为它们仅存在于供电的 TPU 上:运行时填充的框架 vtable 插槽、实时遥测计数器、根据设备状态解析的标志默认值。 每代数据差距是旧代号的常量,以一种原型形式提供,但不是另一种形式。 推断链接项是 wiki 通过名称家族协议追踪的边缘,但没有在叶子处进行字节确认。 命名的开放问题是五个具体任务(#1092#1096#1171P-3-478..482 SparseCore/DMA 集群);恢复过程直接从反编译中关闭了 #1092/#1096/#1171 三重奏(两个表面 CORRECTION),随后的定向反汇编批处理关闭了 P-3-478..482 集群(三个字节跟踪,一个确认为非边缘),因此所有五个都已解决。

寄存器只有同时也是已关闭项目的墓地时才是可信的。几个曾经开放的声明不仅被悬而未决——它们被后来的分析“推翻”了,这些 CORRECTION 在这里被记录为“通过更正关闭”,以证明寄存器反映了当前状态,而不是最初的临时假设。 Trailing-zstd blob、“walrus”pass driver 和 naive demangle-rate count 都是有效的示例。

对于审核员来说,此页面的契约是:

  • 确切的失败层 - 516个反编译拒绝和7,915个分析问题,分解到结构原因,以便读者知道哪些是知识差距,哪些是噪音。
  • 每个项目的可封闭性等级 - 置信度列,在此页面上唯一,对可以如何自信地缩小差距以及通过什么证据进行评分,而不是当前声明的置信度。
  • 每个项目的所属页面 - 每个开放问题都会路由到吸收其解决方案的页面,因此关闭边界是一个可导航的任务列表,而不是一个愿望。
反编译失败516(无 cfunc) — 由 方法论-深度 所有
—导入/数据存根486(0x228601080x228611xx thunk band;不是知识差距)
—手写汇编9(BoringSSL bignum/MD5、dnnl JIT 内核;不存在 C 源代码)
——模板/代码生成巨头~21(正品残墙)
分析问题7,915(6种;final 4188占主导地位)
命名的开放任务P-3-478..482 SC/DMA 集群 — #1092/#1096/#1171 三重奏在稍后的过程中恢复(现已关闭)
因更正而关闭Trailing-zstd blob · “walrus” · demangle-rate · 每代几何源
置信列语义间隙的可闭合性,当前索赔的不确定性

前沿寄存器

下表是主索引。每一行是一个未清项目; 置信度列对给定阻塞证据列中指定的证据来“缩小”差距的信心程度进行评分 - HIGH 表示有界手动传递已识别的地址来关闭它,LOW 意味着关闭它需要二进制文件不包含的证据(受电设备,较新的版本)。读取 CLOSED 的行被保留以表明寄存器处于活动状态;它们的详细信息位于 §因更正而关闭 部分。

未清项目类别阻止证据以关闭它所属页面
~21 个模板/代码生成函数,没有 cfunc反编译墙指定地址的手动解除;提高电梯预算方法论-深度
dnnl JIT + BoringSSL asm 存根不可恢复为 C反编译墙None — 没有 C 源代码的汇编;阅读disasm嵌入式库图集
PJRT vtable 插槽由 Create 的框架填充取决于硬件TPU 上的实时 PJRT_Client_Create 跟踪客户端和设备
FLAGS_enable_runtime_uptime_telemetry 实时值取决于硬件设备上运行时;遥测数据被读取,而不是存储流执行器 pjrt 适配器
根据设备状态解析的默认标志取决于硬件设备驻留配置;静态默认可能是哨兵标志-目录-完整
chip_config(驾驶员侧)与 chip_parts(几何)拆分已关闭(已恢复)已恢复:kChipConfigAliases (0x2200b8b0) 是由 TpuVersion {2,3,4,5}(变体 "default")键入的静态 4 条目 flat_map; v4/v5 共享一个别名子映射。每个 TpuVersion 消费者的划分是完全静态的,不是设备探测的每代比较矩阵 每个嵌入的 blob 中都不存在
issue_latency_cycle_count每代差距chip_parts 填充字段 4 的构建每代比较矩阵 每个嵌入的 blob 中都不存在
834 流操作每叶 (pattern,verb,dtype,space) 操作码关闭(阴性结果)不存在每叶静态表:槽命令是在 SparseCoreStreamEncoder::Encode (0x1eb9b4c0) 中从 4 个正交原始位字段运行时组装的 - 形式(位 53–58:线性 0x3b/跨步 0x3a/间接0x39),动词 (dword[+0x18]>>9)&7,dtype (>>0xc)&1,内存空间 (qword[+0x10]>>0x2f)&7。打开 INFERRED → 经过验证的组合非每叶llvmtpu-内在表
890 默认构建器操作的精确数量+结果谓词RECOVERED(元数)/NEGATIVE(谓词)从每个操作的损坏的 Op<…OneResult/ZeroResults…NOperands<Lj N>…> 特征包中读取的 Arity 字节 - (#res,#operands) 形状为 1356 个中的 1060 个,完整的人口普查列表。结果谓词:MLIR 层没有每操作 Vreg/Mask/Scalar/Ptr — 所有通用 OneTypedResult<mlir::Type> + 一个共享 isCompatibleOuterTypellvmtpu-内在表
每固有 LLVM IntrProperties已恢复解码:set = IntrinsicsToAttributesMap[ID−1] >> 9 (@0x416fb30);所有 12 个 fn-attr 集均已字节解码、每集精确普查(总计为 1356)、16 叶样本字节验证;其他 1340 个叶子的每一叶都是确定性的半字查找llvmtpu-内在表
#1092 结构化稀疏时隙编码已关闭(已恢复)已恢复:没有专用稀疏捆绑槽 - 稀疏性在打包的 MXU 操作数布局中运行(SparsityConfig,1:N 限制,SME 外积门)插槽稀疏-v5plus
#1096 每代 NOP 规范模板已关闭(已恢复)恢复:两个正交无操作 — 空槽谓词 kNeverExecute=31 填充 + 操作码空间全 1 NOP(CORRECTION NOP-1:默认捆绑包停止)nop-规范
#1171 TpuVersion 感知标志前缀调度已关闭(已恢复)已恢复:代号前缀标志无条件注册并应用 gen-blind (CORRECTION DISPATCH-1);活动生成器仅选择数据/编解码器,而不选择标志门控标志前缀调度
P-3-478 InitializeOnScs 查找回调边缘已关闭(已恢复)恢复:InitializeOnScs (0x1337aa60) 将核心索引然后 call *0x98(%rbx) 折叠到 ExplicitRingRecord (0x133a9a40) / ExplicitAllToAllRingRecord (0x133a94a0),写入(ordinal, next_chip, reorder) 转策略 +0x58/+0x60/+0x78张量核势垒
P-3-480 LatencyTable::Create(TpuVersion) factory tail已关闭(已恢复)已恢复:不是 cmp switch,而是由五个 static-init TU initializer 填充的平面 ordinal-indexed inlined_vector<AnyInvocable> registry(0x225799f8);registry[version](entry) 通过 call *0x18,per-gen invoker→ctor 已按字节追踪循环表系列
P-3-481 SetLatchIndices 每代超限握手已关闭(已恢复)恢复:门为 idx==0 && !GainLatchModeHasOverrunChecks(latch_mode)(vtable +0x358);只有 ViperfishTarget::HasMsrOverrunChecks (0x1d49aac0 = mov $1) 返回 TRUE,因此只有 v5 索引第一个锁存器锁存器分配溢出
P-3-482 cmem-负载/稀疏 DMA 边缘关闭(非边缘)非边缘:EmitVectorCmemLoad (0x14120a40) 仅调用 SlotMap 绑定器 — 无 DMA/稀疏被调用者。稀疏性是 v5+ SparseCore (gxc::*); v4 pxc::isa 无稀疏编解码器;两者从不同时发生插槽-cmem-负载-pf
尾随 zstd blob → 每个代号常量已关闭— 翻转:不存在斑点尾随-zstd-blob
“海象”通管道驱动程序已关闭— 翻转:二进制中出现零次术语表
naive _Z-前缀拆解率(98%)已关闭— 推翻:现场支持率为 93.0%方法论-深度
7 illegal_addr 分析问题已关闭(已分类)— 分类:6 是 gRPC 过滤器尾声中故意的 call *0x10 近空陷阱,1 是 .rodata 跳转表 IDA 未对齐;没有重新定位,没有段外数据引用§7个非法地址异常

注意 — 此页面上的“置信度”列故意“不是”证据公约 为本书其余部分定义的四级行为量表。在这里,它对缩小差距的可处理性进行评分:HIGH/MEDIUM 项目是有界静态工作,该语料库已包含其输入; LOW 物品需要动力设备或不同的构造; CERTAIN (won't improve) 物品位于其永久楼层。


反编译墙

用途

头条新闻是 516 个函数,Hex-Rays 没有返回 cfunc — 884,832 个恢复函数的 0.058%。天真的读起来,“516个函数没有反编译”听起来像是516个函数的知识鸿沟。它不是。 方法论-深度差距审计拥有完整的分类法;该部分的工作是说明 516 人中哪些是“前沿”(值得重新攻击)以及哪些是永久在场上的。

三大结构性原因

按地址带和分解名称对 516 进行的细分将每个拒绝放入三个桶之一:

text
516 decompilation refusals (no cfunc)
├─ 486  import / data stubs        0x22860108–0x228611xx (one shard)
│        strlen · free · getenv · abort · __cxa_finalize · __tls_get_addr
│        MallocExtension_Internal_* · sched_getcpu · eventfd
│        → PLT/GOT-style thunks; no local body exists to lift. NOT a gap.
├─   9  hand-written assembly      0x206ee040–0x2071e720 · 0x1b012c00 …
│        bn_sqr8x_mont · bn_power5_nohw · bn_mulx4x_mont_gather5 · md5_sha1_final
│        dnnl jit_avx512/jit_uni convolution kernels
│        → assembly with no C source; read the disasm, never the cfunc. Floor.
└─ ~21  template / codegen giants  the genuine residual wall
         mlir::Dialect::addOperations<…1000+ TF ops…>  @ 0xfedc180
         xla::jellyfish::ReduceEmitter::EmitReduction  @ 0x13e16240
         llvm::LiveIntervals::computeVirtRegInterval   @ 0x18e601e0
         llvm::X86II::getMemoryOperandNo · AtomicExpandImpl::run · RegAllocEvictModel
         xla::{viperfish,ghostlite}::*Performance ctors · DummyAlias*Printer
         → real code Hex-Rays declined on lift budget; a manual pass closes these.

明白了 — 主要的 486 个是 0x2286xxxx 中单个连续分片中的导入 thunk。如果读者将“516 个失败”视为 516 个缺失函数,则夸大了大约 24 倍的差距。实际的前沿是 ~21 个 template/codegen 函数; 486 个 thunk 通过它们的符号名称简单解析,9 个 ASM 存根位于其永久层。引用 ~21,而不是 516,作为可恢复的墙。

什么关闭每个桶

铲斗计数关闭者
导入/数据存根486已按交易品种名称关闭;无需反编译
手写汇编9阅读反汇编; cfunc永远不会存在
模板 / codegen Giants~21手动解除指定地址传递;预算增加的一些电梯

QUIRK — 最大的单一拒绝,0xfedc180 处的 mlir::Dialect::addOperations<…>,是一个注册整个 TensorFlow MLIR 操作集的 C++ 调用 - 超过一千个操作类作为单个语句中的模板参数。它在算法上并不有趣;恢复它会产生一个平面注册列表,而不是逻辑。它位于边界只是因为反编译器拒绝它,而不是因为重新实现器需要它的主体。 jellyfish::ReduceEmitter::EmitReduction 拒绝(0x13e16240)是相反的——深度嵌套的 btree_map 签名背后真正有趣的减少排放逻辑——并且是一个值得有针对性的手动通过的模板爆炸拒绝。该过程已完成0x13e162400x13e16720 的窗口反汇编将其恢复为细轴调度程序(验证 → 两个轴位 → 尾调用五个专用发射器之一),并在 融合模式§ReduceEmitter::EmitReduction 中编写。因此,剩余墙的 TPU-IP 一半被关闭 - 剩下的是注册样板 (addOperations) 和上游 LLVM/XLA 巨人,其逻辑是可恢复的,但不是 TPU 特定的。

零输出层 — 5 个命名地址(已关闭)

516“无 cfunc”计数是 Hex-Rays 产生一些输出但没有干净的 C 树的集合。一个严格更难的子集是工件级底层:IDA 为其编写的地址根本没有反编译文件。对于libtpu.so来说,该集合恰好是五个命名地址,命名它们解决了楼层是否隐藏任何TPU IP的问题。事实并非如此——每个人都是第三方:

地址nm 符号种类它是什么
0x1ffb8020riegeli::TransposeDecoder::Parse代码,7,424 Briegeli 柱状转置记录解码器(跟踪容器编解码器,riegeli-trace-container);对于电梯预算来说太大,向上游出售
0x21055260proto2::internal::UntypedMapBase::SpaceUsedExcludingSelfLong代码,1,984 Bprotobuf映射字段内存核算;供应给上游
0x206a3600mlkem::(anon)::fips::ensure_decap_self_test()::$_0::__invoke代码,很简单ML-KEM FIPS 开盖自测 lambda — call decap_self_test; test eax; ret; BoringSSL 后量子加密
0x206a8000(无 — 0x1000ecp_nistz256_precomputed0x206a70000x206cc000,148 KB)数据NIST P-256 预先计算的 EC 点表; BoringSSL 加密常量,而不是代码
0x206d2690boringssl_self_test_fast()::kTLS10Secret数据TLS-1.0 KDF 已知答案测试秘密(字节包含文字 TLS10-KDF KAT); BoringSSL 自检常量,不是代码

明白了 — 五个(0x206a80000x206d2690)中的两个是数据 IDA 试图将其提升为函数 — NIST P-256 点表和 TLS KDF 测试向量 — 因此“反编译失败”是正确的结果,而不是间隙。另外三个是供应的库代码(riegeli 解码器、protobuf accountant、单行 ML-KEM 自测试)。没有一个是 TPU IP。整个 745 MB 二进制文件的工件级反编译层是两个加密 blob、两个上游库函数和一个加密自测试存根 - 确认可恢复的 TPU 表面已完全解除。

7915问题分析

第二层发布的是problems sidecar:7,915 IDA分析问题,与反编译拒绝和按类型而不是按子系统聚类不同。

问题类型计数它是什么前沿?
final4,188地址最终确定,但没有完整的流分辨率否 — 分析记账
rolled1,659指令已纳入先前的分析单元否 — 簿记
disasm_problem942字节跨度 IDA 无法干净地反汇编Marginal — 代码中数据边缘
bad_stack574堆栈指针增量在某个点未解析边际 — 影响帧恢复
head_problem545指令头边界模糊否 — 簿记
illegal_addr7引用任何段之外的地址是的 — 7 个值得一看的异常现象

注意 — 7,915 个问题绝大多数是分析簿记(final + rolled + head_problem = 6,392, 81%),而不是知识差距。前沿审计员应该追踪的唯一行是 7 illegal_addr 异常 - 指向每个定义段之外的引用,这通常意味着加载程序在运行时解析的重定位或真正的分析失误。它们是最容易处理的问题地板项目,下面对它们进行了全面分类。

7 个 illegal_addr 异常 — 分类(已关闭)

该元页面拥有分类,因为这七个站点是问题层项目,没有自己的子系统深层页面。七个地址中的每一个都位于可执行段的“内部”(没有一个地址是越界的作为代码地址); IDA 标记的是,在该站点解码的操作数引用了每个 PT_LOAD 之外的地址。下面确认了两个结构性原因 - 接近空的绝对间接调用和未对齐的跳转表基加载 IDA - 不存在任何知识差距。

测量它们所依据的段框架 (readelf -lW):

text
LOAD  VirtAddr 0x00000000  FileSiz 0x213f25d0  Flg R E   ← .text lives here (sec [21] 0x0e63c000..0x21217484)
LOAD  VirtAddr 0x215f25e0  FileSiz 0x00a62bc0  Flg RW
LOAD  VirtAddr 0x222551c0  FileSiz 0x0026e6a0  Flg RW
LOAD  VirtAddr 0x22798c30  FileSiz 0x00021c00  Flg RW
站点(指令地址)解码后的操作数陷入搬迁?分类
0x20062a67call *0x10 (ff 14 25 10 00 00 00)绝对 0x10 PT_LOAD(ELF 标头间隙,低于 LOAD1 VMA 0)(readelf -rW 现场为空;0x10 未修补)近空绝对间接调用;故意无法访问/中止融合 gRPC 过滤器尾声的尾部
0x2006a8a4call *0x10(相同7字节)绝对 0x10 → 无 PT_LOAD相同惯用法(不同过滤器融合)
0x20070a95call *0x10(相同)绝对 0x10 → 无 PT_LOAD相同的成语
0x20074db2call *0x10(相同)绝对 0x10 → 无 PT_LOAD相同的成语
0x20079a52call *0x10(相同)绝对 0x10 → 无 PT_LOAD相同的成语
0x2007e7b5call *0x10(相同)绝对 0x10 → 无 PT_LOAD相同的成语
0xee6c96blealea -0x4af7817(%rip),%rsi # 0xa375158桌子底座 0xa375158.rodata (秒 [11],+0x1ed5158)不需要(RIP 相关,无动态重新定位)跳转表调度;标记字节位于 movslq (%rsi,%rdx,4); add %rsi,%rdx; jmp *%rdx 交换机的 lea 内部 — IDA 未能遵循计算表,基址有效

引用证据:

  • 这六个 gRPC 站点是字节相同且唯一的。 整个 .text 反汇编扫描发现 ff 14 25 10 00 00 00 / call *0x10 编码 正好六次 - 这六个站点,没有其他地方。每个处的原始字节(文件偏移量 = .text 的 VMA):… 77 | ff 14 25 10 00 00 00 | 48 89 …。没有基址寄存器的 SIB 字节 25 编码 disp32-absolute 内存操作数,因此调用取消引用固定线性地址 0x10。该地址位于 LOAD1 的 VirtAddr 0x0 映射区域的第一个代码下方(在标头间隙中),并且不在 PT_LOAD 中 — 因此是 illegal_addrreadelf -rW 在六个指令偏移量中的任何一个处都没有列出重定位,因此加载程序永远不会重写 0x10;它是一个编译时固定的近空指针,是高度模板化的 grpc_core::promise_filter_detail::MapResult<…> 过滤器融合组合器的无法访问/崩溃的尾部。 (grep 0000000000000010 时出现的 R_X86_64_DTPMOD64 行是 TLS 模块重定位,其 addend 列是 0x10;它们的目标 VMA 是 .got 中的 0x22048d50…,与绝对 0x10 的任何代码引用无关。)
  • absl 站点是一个跳转表,是一个不错的参考。0xee6c968 中,指令是 lea -0x4af7817(%rip),%rsi # 0xa375158,紧随其后的是 movslq (%rsi,%rdx,4),%rdx ; add %rsi,%rdx ; jmp *%rdxabsl::container_internal::raw_hash_set<…tsl::tstring…>::find_large 中规范的相对偏移跳转表调度。标记的地址 0xee6c96blea 的三个字节(RIP 位移字节 e9 87 50 fb),因此 IDA 的线性扫描未对齐,然后无法解析计算出的 jmp *%rdx。表基 0xa375158 干净地解析为 .rodata(第 [11] 节,0x84a0000..0xbe8af28,偏移量 +0x1ed5158);没有任何内容超出段。这是可恢复的分析失误,而不是知识差距。

明白了 — 这七个都不是加载程序在运行时解析的重定位(上面的注释命名的第三个假设):readelf -rW 在每个站点都是空的,唯一需要修复的候选目标 - 绝对 0x10 - 故意不打补丁。六个是 gRPC 模板尾声中故意的近空间接调用陷阱;一种是 IDA 误读了 .rodata 跳转表。所有七项均以 剩余间隙结束 - illegal_addr 地板已完全考虑在内,无需设备上的证据。


硬件相关事实

用途

第二类前沿项目无法通过任何量的静态工作来关闭,因为该事实并不存在于二进制文件中 - 它仅存在于供电的 TPU 上。这些项目在此处精确标记,因此以后的页面不会将静态占位符视为实际值。此类别中每个项目的可关闭性置信度为 LOW:关闭它们需要一个实时设备,这超出了本书所基于的静态 RE 方法。

运行时填充框架 Vtable 插槽

libtpu.so 是一个 PJRT 插件,导出一个 C 符号 GetPjrtApi,返回一个 140 槽 PJRT_Api vtable (API & vtable 重建)。在这些插槽中,有 5 个由 CreatePjrtApi 的调用者注入,其中 4 个携带真正的 TPU 特定代码(插槽 8、15、87、103,全部为 tpu_plugin:: 命名空间);所有这些都是静态可解析的 - tpu_plugin::PJRT_Client_Create (0xe6a8840) 的插槽 15 点,在二进制文件中得到确认。但是 Create 构建的 PJRT_Client 对象的“内容”——每个设备句柄、tpu::System* 共享指针、有线设备/内存/拓扑槽——在运行时由探测硬件填充。静态二进制文件显示构造代码(客户端和设备);它无法显示结果对象图,因为这取决于设备枚举的核心数量以及 tpu::System::Initialize (0x1d0ae420) 发现的内容。

注意 — wiki 将 PJRT_Client_CreateGetTpuPjRtClient (0xf8008c0) → xla::TpuClient 构造完全跟踪为代码。它无法跟踪的是构造后的状态:存在多少个 xla::TpuDevice 对象、每个 TpuCoreLocation 解析为什么、Semaphore 的限制允许什么。这些是运行时事实。从代码路径重建客户端的重新实现者将得到正确的形状人口是一个实时跟踪问题。

实时遥测值

构造路径读取 FLAGS_enable_runtime_uptime_telemetry,设置后会将正常运行时间遥测合并到客户端配置中。旗帜的存在及其门是静态的;它流式传输的遥测是没有静态表示的运行时计数器。任何描述遥测内容的页面都描述的是线路模式,而不是观察到的值。

标志默认值可解决设备上的问题

旗帜目录 从二进制文件中恢复每个标志的静态默认值。标志子集带有静态 sentinel 默认值,运行时会在启动时覆盖设备状态(例如 -1/0 占位符,表示“询问硬件”)。对于这些,静态默认值不是有效的默认值。前沿项目是:哪些标志携带哨兵,以及每个标志解析什么设备状态规则。这只能通过设备(即 LOW)关闭。

明白了 — 将标志的静态默认值读取为其有效默认值的重新实现者将错误配置其实际值是设备派生的任何标志。静态目录关于“二进制文件存储的内容”是正确的;它对运行时替代什么保持沉默。将任何看起来像哨兵的默认值视为未解决,直到在硬件上得到确认。


每代数据差距

用途

较旧的代号常量是一个经常被假设的差距,结果是大部分已关闭 - 寄存器的工作是准确地说出这一点,而不是留下模糊的“较早的一代可能不完整”。真正的残差很窄。

已经关闭的内容

暗示的差距 - “旧代号仅以 chip_configs 形式发布,而不是 chip_parts” - 不适用于此版本。 每代比较矩阵 确认所有九个 <codename>_chip_parts.binarypb blob(v2 到 v7)都连续嵌入 .rodata0xbdf29a0..,由 TpuChipParts::DefaultsForVersion (0x20b1b040) 解析。因此,较旧的通道/子通道/MXU/内存常量是原始来源且可实现的,不是推断的。 HBM/VMEM/SMEM/SFLAG 字节、MXU VectorIsa 和每代频率均直接从线路字节解码。

更正(PGM-1,总结)—每代几何图形不是tpu::TpuChipConfig::Create (0x20ae98e0) 编写,作为早期框架的假设。 TpuChipConfig::Create 通过 kChipConfigAliases 平面图 (0x2200b8b0) 构建驱动程序端内存/队列布局;车道/子车道几何形状是 TpuChipParts/TpuTopology 属性。此更正完全归每代比较矩阵 每个嵌入的 blob 中都不存在所有;它在此处记录为 CLOSED per-gen item,因此该寄存器反映了已解决的状态。

正品残片

剩余间隙为什么开放关闭者
chip_config(驱动程序)与 chip_parts(几何)消费者拆分已恢复 — kChipConfigAliases 是由 TpuVersion {2,3,4,5} 键控的静态 4 条目 flat_map<TpuVersionAndVariant, MapView>(所有变体 "default"); v4/v5共享一张子图;别名词汇 default/legacy/megacore/megachip/megachip_tccontrolper-TpuVersion 分割是静态的,不是设备探测的;只有类型擦除的MapView键→值方向是残留的
issue_latency_cycle_count(VectorIsa 字段 4)每个嵌入式 blob 中不存在(原始默认值 0) — 真正的每代问题延迟存在于成本模型 Performance 网格中,而不是 chip_partschip_parts 填充字段 4 的构建 — 可能永远不存在

明白了 — issue_latency_cycle_count 是陷阱。该字段存在于 chip_parts 模式中,但从未在此构建中填充(对于所有世代,它读取为原始默认值 0)。重新实现者不得**从 chip_parts 读取 MXU/VPU 问题延迟;实时值通过 CycleTable::GetCyclesForThroughput(每代 vtable 插槽 +0x10)查询。 chip_parts 零并不是答案——而是没有答案。


推断链接项目

用途

第四类是通过名称家族协议追踪的 wiki 的边缘——确认类→引擎映射并定位降低通道——但没有对叶编码进行字节转储。这些在其所属页面上的评级为 INFERREDI;它们是真正的前沿,因为结论是值得信赖的,而确切的叶子尚未得到重新验证。

内在→ISel 叶间隙

LLVMTPU内在表 以两种独立的方式恢复所有 1356 个不同的 llvm.tpu.* 内在函数。仍然推断出三个叶级事实:

推断链接已知的内容尚未字节确认的内容
834 流操作已解决(负面结果) — 类别→发动机 + 降低位置;编码器 Encode (0x1eb9b4c0) 11 臂 proto-oneof + 4 字节验证字段访问器数字命令是运行时由(form、verb、dtype、memspace)位字段组成 - 没有静态的每叶命令表可供转储
890 默认构建器操作已恢复 — 从 Op<…> 特征包中读取 1060/1356 的 (#res,#operands) 字节(完整人口普查列表);流分割 6/8/9、DMA 11/12-iova 修正浮出水面结果 TypeConstraint 是一个负结果:MLIR 层没有每操作寄存器类谓词(所有 OneTypedResult<mlir::Type> + isCompatibleOuterType) - 细化仅存在于下游 LLVM 内在签名中
每本征 IntrProperties已恢复 — 通过 set = IntrinsicsToAttributesMap[ID−1] >> 9 (@0x416fb30) 的 IntrNoMem/IntrArgMemOnly/IntrWillReturn/… 位;所有 12 个 fn-attr 集均已字节解码、人口普查精确 (1356)、16 叶样本字节验证每叶集,用于未单独转录的 1340 个非采样 ID(确定性半字查找)

QUIRK — 834 路流操作爆炸编码 — 没有单个参数化 llvm.tpu.stream 操作。这里的前沿不是“找到参数化”(没有);它是“对 834 个叶子中的每一个叶子进行字节转储匹配器臂”。这是有界的工作,但有 834 个叶子,这就是为什么尽管路径已知,但可关闭性是 MEDIUM 而不是 HIGH

字节确认计数器示例

并非每个内在→ISel 链接都保持推断。 SparseCore addrspacecast 系列(16 个操作)进行了端到端跟踪并“纠正”了一个常见假设:

修正(INTR-2,总结)— SparseCore addrspacecast 内在函数低于 ISD::ADDRSPACECAST (0xf4) 节点;它们随着 LLVM-IR 内部调用被消费 SC 加载存储 ISel 吸收而存活下来。整个 .text 外部引用将每个 0xf4 构造函数调用者放置在通用 LLVM 中,没有放置在 TPU/SC 带中。这是 addrspacecast-isel 拥有的;这里引用它作为推断链接的有效示例,即封闭升级为修正——前沿不仅是“填补空白”,而且是“重新验证和推翻”。


命名开放问题

用途

该带最初是五个 O 分级任务,其深层页面作为存根存在,没有完整的原始结果文件。后来的恢复过程直接从反编译中关闭了 #1092/#1096/#1171 三人组——它们的深层页面现在已满,其中两个在此过程中浮出了 CORRECTION。随后的目标反汇编批次也关闭了 P-3-478..482 SparseCore/DMA 集群(三个恢复字节精确,一个确认非边缘),因此所有五个命名问题现在都已解决。下表记录了审计跟踪的所有五个。

五项任务(现已全部解决)

任务主题所属页面(当前状态)什么关闭/关闭它
#1092结构化稀疏时隙编码 (v5+)插槽稀疏-v5plus — 已恢复关闭:无专用槽位;稀疏性存在于压缩的 MXU 操作数布局中
#1096每代 NOP 规范模板nop-规范 — 已恢复关闭:谓词 kNeverExecute=31 填充 + 全 1 操作码 NOP (CORRECTION NOP-1)
#1171TpuVersion 感知标志前缀调度标志前缀调度 — 已恢复已关闭:标志已注册 gen-blind (CORRECTION DISPATCH-1)
P-3-478..482SparseCore / DMA 边缘(集群)屏障/成本/计划/isa 页面 — 已恢复已关闭:回调/工厂/溢出字节跟踪; cmem-load/sparsity“边缘”是已确认的非边缘

P-3-478..482 集群是一组相关的 SparseCore 和 DMA 边缘,用于馈送完成的页面;现在已经完全解决了。 P-3-478InitializeOnScs 查找回调目标 — 字节追踪到 call *0x98ExplicitRingRecord/ExplicitAllToAllRingRecord 写入 (ordinal, next_chip, reorder) (张量核势垒)。 P-3-480(LatencyTable::Create(TpuVersion) 的尾部)被恢复为由五个静态初始化 TU 初始值设定项 (循环表系列) 填充的平面序数索引 AnyInvocable 注册表。 P-3-481SetLatchIndices 每代溢出握手 — ViperfishTarget::HasMsrOverrunChecks 上的门(唯一返回 TRUE 的代),因此只有 v5 索引第一个锁存器 (锁存器分配溢出)。 P-3-482 — 假定的 cmem-load → 稀疏 DMA 边缘 — 是一个已确认的 非边缘:v4 cmem-load 发射链不触及 DMA 或稀疏路径,并且稀疏性是不相交的 v5+ SparseCore ISA (插槽-cmem-负载-pf)。

注意 — #1171 现已关闭 — flag-prefix-dispatch 已恢复,其 OPEN 横幅已替换为完整解码(CORRECTION DISPATCH-1:代号前缀标志注册为 gen-blind;活动 gen 仅驱动数据/编解码器选择)。该行保留在此处作为恢复关闭审核条目,与跟踪 zstd 和海象项目保留在下面的墓地中的方式相同。


因更正而关闭(墓地) {#closed-by-correction-the-graveyard}

只会增长的登记册是愿望清单,而不是审计。这些项目在早期分析中是开放的,现在通过更正关闭——后来的证据推翻了最初的主张。它们被保留,而不是删除,因此读者可以看到寄存器反映了当前的事实而不是最初的猜测。

已关闭项目原始索赔是什么推翻了它所属更正
尾随 zstd blob~4.1 MB zstd-dictionary blob 在 0x20f99bef 处附加到 EOF 后面,解码为每个代号的硬件常量偏移量为 ~2.6 MB 内部 .text;字节是 x86-64 mov 立即数;没有字典,没有框架,没有有效负载CORRECTION (ZSTD-01)尾随-zstd-blob
“海象”通行证驱动程序名为“walrus”的 IR/编译器传递管道驱动程序不区分大小写的名称字符串表搜索返回次出现;真正的驱动程序是 HLO 通行证注册表,不受任何“海象”符号的控制CORRECTION (GLOSS-1)术语表
拆解率(98%)98% 的函数带有分解名称(来自 _Z 前缀计数)_Z 前缀超调:871,370 个 _Z 名称中的约 48,500 个名称未能分解或分解为自身;现场支持率为 822,847 / 884,832 = 93.0%CORRECTION (METH-D1)方法论-深度
每代几何源车道/子车道几何由 tpu::TpuChipConfig::Create 编写TpuChipConfig::Create 仅构建驾驶员侧布局;几何是 MXU VectorIsaTpuTopology 属性CORRECTION (PGM-1)每代比较矩阵 每个嵌入的 blob 中都不存在

QUIRK — 尾随 zstd 闭包是保留寄存器的最有力的论据。最初的声明有文件偏移量、大小、压缩格式和解码目标——它足够具体,可以“声音”恢复。它在每一个重要事实上都是错误的。防御是一次交叉检查:在雕刻之前解决锚点相对于符号图的偏移。这里的每一行都在提醒我们,一个听起来精确的声明,但缺少一个交叉检查,正是重建出错的地方。


交叉引用