Syscall/Sysret は x86-64 の 64 ビットモードでシステムコールを高速に行うための命令。
使用上の注意
- IA32_EFER.SCE (Syscall Enable Bit) = 1 にする必要がある
- IA32_EFER の構造は Intel SDM Vol.3 Table 5-4. Extended Feature Enable MSR (IA32_EFER)
- IA32_STAR の 63:48 および 47:32 に適切なセグメントセレクタ番号を書いておく必要がある
- sysret で 64 ビットモードを維持したまま return するには,オペランドサイズプレフィクスを付けねばならない
- NASM なら
o64 sysret
と書き,GNU ASM なら sysretq
となる。
- C 言語プログラム中に syscall 命令を埋め込む場合,C 言語的には syscall 命令の実行は関数呼び出しではないため,命令の前後で各種レジスタ値が保存されていることが必要。