28 lines
2.0 KiB
Markdown
Executable File
28 lines
2.0 KiB
Markdown
Executable File
# SYSCALL — Fast System Call
|
|
|
|
## Description
|
|
|
|
SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR (after saving the address of
|
|
the instruction following SYSCALL into RCX). The WRMSR instruction ensures that the IA32_LSTAR MSR always contain a canonical address.
|
|
|
|
## Instruction
|
|
|
|
| Opcode | Assembly | Op/En | Modern Mode | Legacy Mode | Description |
|
|
|--------|----------|-------|-------------|-------------|--------------------------------------------------------------------------------------|
|
|
| 0F 05 | SYSCALL | NP | Valid | Invalid | Fast call to privilege level 0 system procedures. |
|
|
|
|
## Information
|
|
|
|
SYSCALL also saves RFLAGS into R11 and then masks RFLAGS using the IA32_FMASK MSR (MSR address C0000084H); specifically, the processor clears
|
|
in RFLAGS every bit corresponding to a bit that is set in the IA32_FMASK MSR.
|
|
|
|
SYSCALL loads the CS and SS selectors with values derived from bits 47:32 of the IA32_STAR MSR. However, the CS and SS descriptor caches are
|
|
not loaded from the descriptors (in GDT or LDT) referenced by those selectors. Instead, the descriptor caches are loaded with fixed values. See
|
|
the Operation section for details. It is the responsibility of OS software to ensure that the descriptors (in GDT or LDT) referenced by those
|
|
selector values correspond to the fixed values loaded into the descriptor caches; the SYSCALL instruction does not ensure this correspondence.
|
|
|
|
The SYSCALL instruction does not save the stack pointer (RSP). If the OS system-call handler will change the stack pointer, it is the
|
|
responsibility of software to save the previous value of the stack pointer. This might be done prior to executing SYSCALL, with software
|
|
restoring the stack pointer with the instruction following SYSCALL (which will be executed after SYSRET). Alternatively, the OS system-call
|
|
handler may save the stack pointer and restore it before executing SYSRET.
|