Intel Quark CoreはLOCKプリフィクス付きの命令が不安定

UbuntuおよびDebian Linuxをインテル Galileo 開発ボードで動かすということが比較的早期から行われており、“「インテル Galileo 開発ボード」関連の日本語ページのリンク集”からも1件リンクしています。このころからlibpthreadのコードでアプリケーションがクラッシュしてしまうことがよく知られていました。

これに関するDebian Linuxのバグレポートがあります:

これによると、LOCKプリフィクスのついているCMPXCHG命令の実行でセグメンテーション・フォルト(Segmentation Fault)が発生しているとのことです。このLOCKプリフィクスを何もしないNOP命令に置き換えると問題なく動作することから、このLOCKプリフィクスとCMPXCHG命令の不整合による問題のようです。

Intelもこの問題が発生することは把握しており、以下のIntel Quark Board Support Package(BSP) Release 1.0.0のリリース・ノートに記載があります:

このリリース・ノートの「Known Issues(既知の問題)」の「71538 – Linux segfault when using lock prefix instruction under specific circumstances(特定の条件下でLOCKプリフィクスを使用するとLinuxでSegfaultが発生する)」がそれです。この部分を引用します:

Implication:
Segfault may occur for specific instruction sequences when using the “lock” prefix instruction on Linux. Not all usages of lock prefixed instructions cause the issue. Specific circumstances are under investigation by Intel.

判明している状況:
LinuxにおいてLOCKプリフィクスを使用すると、特定の命令シーケンスでSegfaultが発生することがあります。LOCKプリフィクスを付与したすべての命令がこの問題を発生させるわけではありません。発生条件はIntelが調査中です。

日本語部分はさかきけいによる意訳

というわけで、具体的な発生条件はまだ絞り込めていないようです。しかし、現時点でわかっている回避策としてあげられているものを以下に引用します:

Inclusion of a ‘nop’ instruction immediately prior to a lock prefix instruction has been shown to resolve the segfault in cases seen so far by Intel.

IntelはLOCKプリフィクスの直前にNOP命令を挿入することで、現在までに見られたSegfaultを回避することができることを確認しています。

Example of failing code sequence using a user space application:
ユーザー空間アプリケーションで失敗するコード・シーケンスの例:

        .code32
.globl main
        .type main, @function
main:
        pushl %ebp
        movl %esp, %ebp
        subl $0xfff88, %esp
        movl %ebp, %eax
        sub $0x100000, %eax
        lock addl $0x1,(%eax)
        leave
        ret

Example of suggested fix:
提示する修正例:

        .code32
.globl main
        .type main, @function
main:
        pushl %ebp
        movl %esp, %ebp
        subl $0xfff88, %esp
        movl %ebp, %eax
        sub $0x100000, %eax
        nop
        lock addl $0x1,(%eax)
        leave
        ret

日本語部分はさかきけいによる意訳

このように「Intel Quark Core(Lakemont Core)」は、LOCKプリフィクスに完全には原因が特定されていない問題が発生しています。現在のところシングル・コアですから、Segmentation Faultが発生するだけですが、もしもLOCKプリフィクスの動作そのものに影響があるとデュアル・コアなどになった時に面倒なことになります。Intel Edisonではデュアル・コアになるそうですから、早めに解決を図りたいとIntelも考えているのではないかと思います。

以上、興味深い問題でしたので、自分用のメモを兼ねて紹介してみました。

関連記事

このエントリーをはてなブックマークに追加