LKGS

Base de carga GS

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F2 0F 00 /6LKGS r/m16AValidoNo codificableCarga 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

  1. 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
#UDLa instrucción LKGS no se reconoce en modo protegido.
Modo real
#UDLa instrucción LKGS no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción LKGS no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDLa instrucción LKGS no se reconoce en modo de compatibilidad.
Modo de 64 bits
#UDSi 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.

Fuentes