2011-10-31 13 views
2

以下に示すように、自分のニーズに合った自分自身のsetjmp/longjmpを書いています。私は32ビットシステムでそれをテストし、それは良い動作します。そのためにレジスタeax、ebx、ecx、edi、esi、esp、ebp、eipを保存して復元します。x86の余分なレジスタ64ビット

しかし、これは64ビットシステムでは十分ではありません。まず第一に、レジスタeXをrXに置き換える必要があると思います。第2に、x86-64ビットの8つの追加レジスタ(r8、r9、r10、r11、r12、r13、r14、r15)を保存する必要があると思います。それで十分でしょうか、それ以上のことをする必要がありますか?

#define MY_SETJMP(n) __asm__ __volatile__ ("movl %eax, regax"#n";" \ 
    "movl %ebx, regbx"#n";" \ 
    "movl %ecx, regcx"#n";" \ 
    "movl %edi, regdi"#n";" \ 
    "movl %esi, regsi"#n";" \ 
    "movl %esp, regsp"#n";" \ 
    "movl %ebp, regbp"#n";" \ 
    "call next"#n";" \ 
    "next"#n": pop regip"#n";" \ 
    "addl $6, regip"#n";" \ 
    ) 

#define MY_LONGJMP(n) __asm__ __volatile__ ("movl regax"#n", %eax;" \ 
    "movl regbx"#n", %ebx;" \ 
    "movl regcx"#n", %ecx;" \ 
    "movl regdi"#n", %edi;" \ 
    "movl regsi"#n", %esi;" \ 
    "movl regsp"#n", %esp;" \ 
    "movl regbp"#n", %ebp;" \ 
    "jmp *regip"#n";" \ 
    ) 
+7

なぜあなたは_working_システムを使用するのではなく、あなた自身のものを作成しましたか? –

+0

私が言ったように、私はそれを既存のsetjmpt/longjmpを使って行うことができない特別な目的のために使用しています。 – MetallicPriest

答えて

7

命令のシーケンスでは、flags registerは保存されません。これはおそらくIA32ですべきです。ウィキペディアのページには、pushfpopfという指示があります。

プログラムがそれらを使用していないことを知らない限り、すべてのベクトルレジスタを保存する必要があります。注意:スカラー浮動小数点のために使用することもできますので、使用するためにベクトル化されたコードをプログラムに入れる必要はありません。 ああ、プログラムが浮動小数点を使用する場合は、使用されている場合には、履歴浮動小数点スタックを保存する必要があります。 Dan Kruchininの答えは、これらのすべてを1つのステップで保存する方法を示しています。

4

は、おそらくあなたがFXSAVE/fxrestore命令を使用して、同様のx87コンテキストを保存する必要があります:http://siyobik.info/main/reference/instruction/FXSAVE

けれども、私はFXSAVE/fxresrtoreが安全にユーザー空間のアプリケーション(スーパーバイザーモードのすなわち外)から使用することができますかわかりませんしかし、あなたはfxsaveがあなた自身で行うことのほとんどすべてを行うことができます。

+0

なぜfxsaveはユーザ空間で安全ではないと思いますか?私が知っているように、特権命令ではありません。 – osgx

関連する問題