检查当前CPU是否支持Intel PT
2024-4-12 16:7:6 Author: mp.weixin.qq.com(查看原文) 阅读量:4 收藏

创建: 2024-04-12 14:48
https://scz.617.cn/unix/202404121448.txt

据云海说,Intel PT没有虚拟化,VMware Guest中没法用这个。检查vmware.log,包含:

Host VT-x Capabilities

Processor trace in VMX           yes

Guest VT-x Capabilities

Processor trace in VMX           no

即是说Host支持PT,Guest不支持。有人提过修改.vmx,增加:

pt.enable = "TRUE"
pt.available = "TRUE"

实测无效。

虽然Guest不支持PT,但后续仍用Guest演示相关命令,未做特别说明时,均默认在Guest中。

$ perf record -e intel_pt//ub date

event syntax error: 'intel_pt//ub'

若内核不旧,这种报错一般是因为CPU不支持PT所致。"perf list"未见"intel_pt"。

$ ls -la /sys/bus/event_source/devices/intel_pt/
ls: cannot access '/sys/bus/event_source/devices/intel_pt/': No such file or directory

$ ls -la /sys/devices/intel_pt/
ls: cannot access '/sys/devices/intel_pt/': No such file or directory

同样表示当前系统不支持PT。但这些办法都是表象,绝对可靠的办法是用CPUID指令,参看:

《Intel 64 and IA-32 Architectures Software Developer Manuals》

https://cdrdv2-public.intel.com/812392/325462-sdm-vol-1-2abcd-3abcd-4.pdf

如下代码用内联汇编执行cpuid指令并检查返回值,以此判断当前CPU是否支持PT:

/*
 * gcc -Wall -pipe -O3 -s -o check_pt check_pt.c
 */

#include <stdio.h>

#define BIT(x)  (1ULL << (x))

int main int argc, char * argv[] )
{
    int a   = 0x7,
        b,
        c   = 0,
        d;

    asm
    (
    "cpuid"
    : "=a" (a), "=b" (b), "=c" (c), "=d" (d)
    : "0" (a), "2" (c)
    );

    printf"ebx=%#x\n", b );
    if ( !( b & BIT(25) ) )
    {
        printf"Intel PT not supported\n" );
    }
    else
    {
        printf"Intel PT supported\n" );
    }
    return 0;
}  /* end of main */


$ ./check_pt
ebx=0x9c27ab
Intel PT not supported

Ubuntu、Debian有cpuid命令,可在bash中直接检查cpuid结果:

$ apt install cpuid

$ cpuid -1 -r -l 7
CPU:
   0x00000007 0x00: eax=0x00000000 ebx=0x009c27ab ecx=0x00000000 edx=0xbc000400

-1表示只检查第1个核,-r表示显示寄存器值,"-l 7"相当于指定eax=7

检查ebx的bit25(从0开始计数)是否为1,为1表示支持Intel PT。具体到本例,检查ebx最高字节bit1,为0表示不支持Intel PT。

cpuid命令已对返回的寄存器值做了解码,无需手工检查bit:

$ cpuid -1 | grep "Intel processor trace"
      Intel processor trace                    = false

可不用cpuid命令,有其他原生方案:

$ grep intel_pt /proc/cpuinfo > /dev/null;echo $?
1

$ lscpu | grep intel_pt > /dev/null;echo $?
1

为0表示grep命中,支持PT;为1表示grep无命中,不支持PT。

假设CPU支持PT,可通过IA32_RTIT_CTL MSR (0x570) bit0启用、禁用PT,有必要检查之:

$ rdmsr -x0 -a 0x570

$ rdmsr -x0 -p 0 0x570
0000000000000000

-a表示所有CPU,"-p n"指定第n个CPU(从0计),bit0为0,表示禁用PT。

总之,有许多大同小异的办法检查当前CPU是否支持PT、是否启用PT。即使CPU支持,也可能出现内核太旧而不支持PT,这是另一回事了,优先检查CPU是否支持。前述手段也适用于WSL1,可藉此检查Host CPU。

Intel PT是一种强大的诊断、调试手段,本想用之,奈何家境贫寒,主力Linux均在VMware Guest中,遗憾。


文章来源: https://mp.weixin.qq.com/s?__biz=MzUzMjQyMDE3Ng==&mid=2247487255&idx=1&sn=da22259a5c5a3a6d1b9f808616fed5eb&chksm=fab2cc28cdc5453e3e93d42face71fb44597dd5248b0dbbc2b2901b0e4eba7a83a2b121850af&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh