2016-09-07 9 views
0

gccの拡張asmを使用してシステムコールを呼び出しています。私は、PowerPC(Freescale MPC5200B)上で独自のRTOSを開発中です。gccの拡張asmで呼び出されたsystemcallによって変更されたレジスタ

gccのdocumentationによれば、gccはアセンブリコードを解析しないため、どのレジスタが変更されているのかわからないため、アセンブリコードが使用する(入力も出力もない)すべてのレジスタをclobbersリストに追加する必要があります。 。

問題は、システムコールがどのレジスタを変更するのかわかりません。実際、私はシステムコールがポインタを保持するレジスタを変更するケースを観察しています。システムコールが返された後、レジスタ内のポインタが使用されているため、無効なメモリアクセスが発生します。

この状況をどのように処理する必要がありますか?将来の読者のために

+1

syscall命令自体が_RCX_と_R11_を変更します。http://www.felixcloutier.com/x86/SYSCALL.html。しかし、Linuxは操作の結果で_RAX_も変更します。後者の登録簿は、[System V 64ビットABI](https://web.archive.org/web/20160706074221/http://www.x86-64.org/documentation/abi.pdf)のセクションA.2.1 _Calling Convention_ _2。システムコールは、syscall命令を介して行われます。カーネルは、%rcxと%r11._ –

+0

と_5レジスタを レジスタに破棄します。システムコールから戻って、レジスタ%raxには システムコールの結果が含まれています。 -4095と-1の間の値は、エラーを示します。 -errno._ –

+0

*この状況をどのように扱うべきですか?* rcxとr11でclawbersを宣言し、 '" = a "(retval) 'gccは結果がraxにあることを知っています。ところで、[x86タグwiki](http://stackoverflow.com/tags/x86/info)には、システムによってどのregが破壊されるのかという質問に対する答えを含むdup-targetを含む、たくさんの良いものへのリンクがありますコール。 (私があなた自身でそれを見つけたはずではない、これはあなたがまだわからない場合に正しい検索条件が出にくいケースの1つです) –

答えて

1

一般的な答えは、あなたがシステムのABIのマニュアルにシステムコールによって変更されたレジスタを見つけることができるということです。

私のシステム(Freescale MPC5200B)では、IBMアプリケーションノート「PowerPCエンベデッドアプリケーションバイナリインタフェース(EABI)準拠のプログラムの開発」が答えました。

私はclobbersリストに揮発性(すなわちR3..R12、F0..F13とフラグレジスタ)とマークされたレジスタを追加しました。