Intel TSX:xbegin 始终返回 0

问题描述 投票:0回答:1

我正在编写一些包含 RTM 事务区域的程序。我已经使用

cpuid
指令检查了我的机器是否支持 HLE 和 RTM。但是,我注意到
xbegin
指令总是返回零(rax 寄存器中的值),这表明事务已中止。所以我使用
xbegin
xend
指令编写了一个非常简单的演示,并且不在它们之间插入任何指令。

上面描述的代码是:

int main() {
    asm volatile(".byte 0xc7, 0xf8, 0x03, 0x00, 0x00, 0x00" ::"r"(-1ul)); // xbegin machine code
    asm volatile(".byte 0x0f, 0x01, 0xd5"); // xend machine code
    return 0;
}

对应的汇编代码为:

00000000000005fa <main>:
 5fa:   48 c7 c0 ff ff ff ff    mov    $0xffffffffffffffff,%rax
 601:   c7 f8 03 00 00 00       xbeginq 60a <main+0x10>
 607:   0f 01 d5                xend   
 60a:   b8 00 00 00 00          mov    $0x0,%eax
 60f:   c3                      retq   

在此代码中,我将

xbegin
中的后备地址设置为
xend
的下一条指令的地址。因此,无论事务是否中止,代码都可以正常完成执行。然后我使用
perf
来分析此代码的执行情况,我发现此事务由于 HLE 不友好的指令而中止。我不知道原因。

$ sudo perf stat -e rtm_retired.start ./demo     
                                                                                                                                               
 Performance counter stats for './demo':
                              
                 1      rtm_retired.start

       0.000614539 seconds time elapsed                                               
                                                                                                 
       0.000634000 seconds user
       0.000000000 seconds sys 

$ sudo perf stat -e rtm_retired.commit ./demo                                                                                        
                                                                                                                                                                             
 Performance counter stats for './demo':                                                                                                                                     
                                                                                                                                                                             
                 0      rtm_retired.commit                                                                                                                                   
                                                                                                                                                                             
       0.000657118 seconds time elapsed                                                                                                                                      
                                                                                                                                                                             
       0.000616000 seconds user         
       0.000000000 seconds sys

$ sudo perf stat -e rtm_retired.aborted_unfriendly ./demo

 Performance counter stats for './demo':

                 1      rtm_retired.aborted_unfriendly                                   

       0.000617362 seconds time elapsed

       0.000609000 seconds user
       0.000000000 seconds sys

我的机器配置:

CPU: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
microcode: 0xf0
OS: Linux 5.4.0-150-generic, Ubuntu 18.04.1

更新: 我注意到一篇文章,这意味着英特尔已经通过微码更新禁用了 TSX。他们添加了一个新的 CPUID 位来指示这一更改。我检查了这一点,发现它是在我的处理器上设置的。所以RTM区域无法成功执行。

intel intel-tsx
1个回答
0
投票

我注意到一篇文章,这意味着英特尔已经通过微码更新禁用了 TSX。他们添加了一个新的 CPUID 位来指示这一更改。我检查了这一点,发现它是在我的处理器上设置的。所以RTM区域无法成功执行。

© www.soinside.com 2019 - 2024. All rights reserved.