LKGS
Base de carga GS
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F2 0F 00 /6 | LKGS r/m16 | A | Valido | No codificable | Carga GS utilizando r/m16, colocando la dirección base en lugar de la IA32 KERNEL GS BASE MSR. |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
A
16-bit selector
Coste medido
Cargando las mediciones de arch-data...
Descripción
LKGS funciona de la misma manera que MOV a GS excepto que la dirección base del descriptor se carga en el IA32 KERNEL GS BASE MSR en lugar del caché descriptor del segmento GS.
LKGS toma un solo (fuente) operando, que puede ser un registro de proposito general o una ubicación de memoria. El operando debe ser un selector de segmento válido. La instrucción carga el descriptor del segmento referenciado por ese selector de segmento en el caché descriptor GS, con la excepción de la dirección base. La dirección base en el caché descriptor GS no se modifica; la dirección base del descriptor de segmento se carga en el IA32 KERNEL GS BASE MSR. (Ya que la dirección base en el descriptor es sólo 32 bits, los 32 bits superiores de la MSR se limpian.)
Un selector de segmento null (valores 0000-0003) se puede cargar sin causar una excepción. Sin embargo, cualquier intento subsiguiente de referencia GS fuera del modo 64-bit causa una excepción de protección general (#GP) y ninguna referencia de memoria ocurre. LKGS con un selector de segmento null carga cero en IA32 KERNEL GS BASE.
Operación
IF CPL > 0 OR logical processor not in 64-bit mode
THEN #UD; FI;
IF SRC is null
THEN
GS.selector := SRC;
mark GS as null;
IA32_KERNEL_GS_BASE := 0;
ELSE
IF SRC.index is outside descriptor table limits
THEN #GP(selector); FI;
read referenced descriptor for descriptor table;
IF the descriptor is not for a data or readable code segment OR SRC.RPL > descriptor.DPL
THEN #GP(selector); FI;
IF the descriptor is not marked present
THEN #NP(selector);
ELSE
GS.selector := SRC;
GS.attributes := descriptor.attributes;
IA32_KERNEL_GS_BASE := descriptor.base; // bits 63:32 cleared
FI;
FI;Banderas afectadas
None.
Excepciones
Modo protegido
#UD | La instrucción LKGS no se reconoce en modo protegido. |
Modo real
#UD | La instrucción LKGS no se reconoce en modo de direccion real. |
Modo virtual-8086
#UD | La instrucción LKGS no se reconoce en modo virtual-8086. |
Modo de compatibilidad
#UD | La instrucción LKGS no se reconoce en modo de compatibilidad. |
Modo de 64 bits
#UD | Si CPL > 0. Si CPUID.07H.01H:EAX.LKGS[18] no es 1. Si el prefijo LOCK es utilizado. |
#GP(0) | Si la dirección de memoria está en forma no canónica. |
#GP(selector) | Si el índice selector de segmento está fuera de los límites de la tabla descriptor. Si el acceso de memoria a la tabla descriptor no es canónico. Si el descriptor referenciado no es para un segmento de datos o código legible o el selector RPL es mayor que el descriptor DPL. |
#SS(0) | Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre. |