Intel(R) Trace Hub (TH)

概述

Intel(R) Trace Hub (TH) 是一组硬件块,它通过多种类型的跟踪输出端口(以系统跟踪协议 (MIPI STPv2) 编码)生成、切换和输出来自多个硬件和软件源的跟踪数据,旨在执行完整的系统调试。有关该硬件的更多信息,请参阅 Intel(R) Trace Hub 开发者手册 [1]。

它由跟踪源、跟踪目的地(输出)和一个交换机(全局跟踪中心,Global Trace Hub,简称 GTH)组成。这些设备位于它们自己的总线(“intel_th”)上,可以通过 sysfs 属性来发现和配置它们。

目前,支持以下 Intel TH 子设备(块):
  • 软件跟踪中心(Software Trace Hub,简称 STH),跟踪源,它是一个系统跟踪模块(System Trace Module,简称 STM)设备;

  • 内存存储单元(Memory Storage Unit,简称 MSU),跟踪输出,允许将跟踪中心输出存储在系统内存中;

  • 并行跟踪接口输出(Parallel Trace Interface output,简称 PTI),通过 PTI 端口输出到外部调试主机的跟踪输出;

  • 全局跟踪中心(Global Trace Hub,简称 GTH),它是一个交换机,也是 Intel(R) Trace Hub 架构的核心组件。

输出设备的公共属性在 ABI file testing/sysfs-bus-intel_th-output-devices 中有描述,其中最显著的是“active”,它用于启用或禁用对特定输出设备的跟踪输出。

GTH 允许通过其“masters”属性组将不同的 STP master 引导到不同的输出端口。关于 GTH 接口的更详细描述,请参见 ABI file testing/sysfs-bus-intel_th-devices-gth

STH 注册了一个 stm 类设备,通过它为用户空间和内核空间软件跟踪源提供接口。有关这方面的更多信息,请参阅 系统跟踪模块

可以将 MSU 配置为将跟踪数据收集到系统内存缓冲区中,随后可以通过其设备节点的 read() 或 mmap() 接口读取这些数据,并将其导向“软件 sink”驱动程序,由其消费数据和/或进一步转发。

总的来说,Intel(R) Trace Hub 不需要任何特殊的用空间软件即可运行;一切都可以通过 sysfs 属性和设备节点进行配置、启动和收集。

[1] https://software.intel.com/sites/default/files/managed/d3/3c/intel-th-developer-manual.pdf

总线和子设备

对于系统中的每个 Intel TH 设备,都会为其创建一个独立的总线,并分配一个 ID 号,该 ID 号反映了 TH 设备的枚举顺序。所有 TH 子设备(intel_th 总线上的设备)都以此 ID 开头:0-gth、0-msc0、0-msc1、0-pti、0-sth,后面跟着设备名称和一个可选的索引。

输出设备也会在 /dev/intel_thN 中获得一个设备节点,其中 N 是 Intel TH 设备的 ID。例如,MSU 的内存缓冲区在分配后,可以通过 /dev/intel_th0/msc{0,1} 进行访问。

快速示例

# 弄清楚哪个 GTH 端口是第一个内存控制器

$ cat /sys/bus/intel_th/devices/0-msc0/port
0

# 看上去它是端口 0,配置 master 33 将数据发送到端口 0

$ echo 0 > /sys/bus/intel_th/devices/0-gth/masters/33

# 在第一个内存控制器上分配一个具有 2 个窗口的多块缓冲区,每个窗口有 64 页

$ echo multi > /sys/bus/intel_th/devices/0-msc0/mode
$ echo 64,64 > /sys/bus/intel_th/devices/0-msc0/nr_pages

# 同时为该控制器启用回绕(wrapping)

$ echo 1 > /sys/bus/intel_th/devices/0-msc0/wrap

# 并启用对该端口的跟踪

$ echo 1 > /sys/bus/intel_th/devices/0-msc0/active

# .. 将数据发送到 master 33,有关更多详细信息,请参阅 系统跟踪模块 .. # .. 等待跟踪信息累积 .. # .. 并停止跟踪

$ echo 0 > /sys/bus/intel_th/devices/0-msc0/active

# 现在你可以从设备节点收集跟踪信息了

$ cat /dev/intel_th0/msc0 > my_stp_trace

主机调试器模式

可以从远程调试主机配置 Trace Hub 并控制其跟踪捕获,该主机应通过其中一个硬件调试接口连接,然后该接口将用于控制 Intel Trace Hub 并将其跟踪数据传输到调试主机。

需要告知驱动程序正在采用这种安排,以便它不会触及任何捕获/端口配置,从而避免与调试主机的配置访问发生冲突。驱动程序在此模式下执行的唯一活动是向软件跟踪中心(一个 stm 类设备)收集软件跟踪。用户仍负责设置接收端解码器能够识别的合适的 master/channel 映射。

为了启用主机模式,将 ‘intel_th’ 内核模块的 ‘host_mode’ 参数设置为 ‘y’。没有任何虚拟输出设备会显示在 intel_th 总线上。此外,‘gth’ 设备的跟踪配置和捕获控制属性组将不会暴露。‘sth’ 设备将照常运行。

软件宿(Software Sinks)

内存存储单元(MSU)驱动程序提供了一个内核内 API,供驱动程序将自己注册为跟踪数据的软件宿。此类驱动程序可以通过其他设备(如 USB 设备控制器或网卡)进一步导出数据。

该 API 有两个主要部分:
  • 通知软件宿某个特定窗口已满,并“锁定”该窗口,即使其无法用于跟踪收集;当发生这种情况时,如果缓冲区中的下一个窗口处于未锁定状态,MSU 驱动程序将自动切换到下一个窗口,否则将停止跟踪捕获;

  • 跟踪窗口的“锁定”状态,并提供一种方法供软件宿驱动程序在窗口解锁且可再次用于收集跟踪数据时通知 MSU 驱动程序。

一个示例宿驱动程序 msu-sink 说明了软件宿的实现。在功能上,它只要窗口满就会立即解锁窗口,使 MSU 保持在循环缓冲区(circular buffer)模式下运行。与“multi”模式不同,它会填满缓冲区中的所有窗口,而不仅仅是第一个窗口。可以通过向“mode”文件写入“sink”来启用它(假设已加载 msu-sink.ko)。