{{stub}}
Mit '''''syscall''''' und '''''sysret''''' stehen im [[Long Mode]] zwei Instruktionen zur Verfügung mit deren Hilfe schnelle Wechsel in Ring 0 bzw. Ring 3 möglich sind.
== Anforderungen ==
Für die Verwendung von syscall und sysret müssen Code- und Stack-Segmente in einer ganz bestimmten Reihenfolge liegen.
Es muss das Segment für den Kernel Stack direkt hinter dem Kernel Code Segment liegen:
#Kernel Code
#Kernel Stack ''(Daten)''
So dass ''KERNEL_SS = KERNEL_CS + 8'' gilt.
Für den User Mode muss ein eventuell vorhandenes 32 Bit Code Segment direkt vor dem Stack Segment und das 64 Bit Code Segment direkt dahinter liegen:
#User Code 32 Bit
#User Stack ''(Daten)''
#User Code 64 Bit
So dass gilt ''USER_SS = USER_32_CS + 8'' bzw. ''USER_64_CS = USER_32_CS + 16''.
== Initialisierung ==
'''MSR.STAR''' ''(0xc000 0081)''
{| {{prettytable}} width='500px'
! width='25%' | 63 – 48
! width='25%' | 47 – 32
! width='50%' | 31 – 0
|-
| SYSRET_CS
| SYSCALL_CS
| bgcolor='#ccc'|
|}
'''MSR.LSTAR''' ''(0xc000 0082)''
{| {{prettytable}} width='500px'
! 63–0
|-
| Ziel für 64 Bit Code
|}
'''MSR.CSTAR''' ''(0xc000 0083)'':
{| {{prettytable}} width='500px'
! 63–0
|-
| Ziel für 32 Bit Code
|}
== syscall ==
Die ''syscall'' Instruktion veranlasst einen Wechsel in Ring 0. Dabei wird die Rücksprungadresse in ''RCX'' gesichert. Das ''CS'' Register wird mit ''STAR.SYSCALL_CS'' und ''SS'' mit ''STAR.SYSCALL_CS + 8''.
Wird ''syscall'' aus dem 32 Bit-Modus heraus aufgerufen wird ''RIP'' mit ''CSTAR'' geladen, aus dem 64 Bit-Modus heraus mit ''LSTAR''.
== sysret ==
Mit der ''sysret'' Instruktion wechselt die CPU in Ring 3 und lädt ''RIP'' bzw. ''EIP'' mit dem Wert aus ''RCX''.
Das ''SS'' Register wird mit ''STAR.SYSRET_CS + 8'' geladen und ''CS'' mit ''STAR.SYSRET_CS'' bzw. ''STAR.SYSRET_CS'' + 16.
Um in den 64 Bit User Mode (Ring 3) zu wechseln braucht es die Opcodes 48 0f 07.
NASM:
o64 sysret
GNU/As:
sysretq
In den 32 Bit User Mode (Ring 3) wechselt man mit den Opcodes 0f 07.
NASM und GNU/As:
sysret
[[Kategorie:x86-64]]