tabla qué que procesadores procesador igual x86 intel cpu-architecture amd memory-barriers

x86 - qué - que procesador amd es igual al core i7



¿LFENCE se está serializando en los procesadores AMD? (2)

AMD siempre ha descrito en su manual su implementación de LFENCE como una instrucción de serialización de carga.

Actúa como una barrera para forzar un orden de memoria fuerte (serialización) entre las instrucciones de carga que preceden a LFENCE y las instrucciones de carga que siguen a LFENCE.

El caso de uso original para LFENCE era ordenar cargas de tipo de memoria de WC. Sin embargo, después de que se descubrieron las vulnerabilidades de ejecución especulativa, AMD publicó un documento en enero de 2018 titulado "Técnicas de software para gestionar la especulación en procesadores AMD". Este es el primer y único documento en el que se menciona MSR C001_1029 [1] (otros bits de C001_1029 se describen en algunos documentos de AMD, pero no en el bit 1). Cuando C001_1029 [1] se establece en 1, LFENCE comporta como una instrucción de serialización de despacho (que es más costosa que la simple serialización de carga). Dado que este MSR está disponible en la mayoría de los procesadores AMD más antiguos, parece que casi siempre ha sido compatible. Tal vez porque pensaron que podrían necesitar en el futuro para mantener la compatibilidad con los procesadores Intel con respecto al comportamiento de LFENCE .

Hay excepciones a las reglas de pedido de instrucciones de cercado e instrucciones de serialización e instrucciones que tienen propiedades de serialización. Estas excepciones son sutilmente diferentes entre los procesadores Intel y AMD. Un ejemplo que puedo pensar en este momento es la instrucción CLFLUSH . Así que AMD e Intel significan cosas ligeramente diferentes cuando hablan de instrucciones con propiedades de serialización.

Una cosa que no me queda clara es la siguiente parte de la cita de la respuesta de Harlod:

Los procesadores 0Fh / 11h de la familia AMD admiten LFENCE como serialización siempre, pero no son compatibles con este MSR.

Esta declaración es vaga porque no dice claramente si LFENCE en las familias 0Fh y 11h de AMD está serializando completamente (en la terminología de AMD) o serializando el envío (en la terminología de AMD). Para estar seguro, debe interpretarse como un envío que se serializa únicamente. Los manuales específicos de la familia AMD no mencionan LFENCE o MSR C001_1029.

El kernel de Linux se cambió para usar las propiedades de serialización de LFENCE en los procesadores AMD el 8 de enero de 2018 (16 días antes de la publicación del documento de AMD). El cambio consta de dos confirmaciones 1 y 2 . Se definieron las siguientes macros:

+#define MSR_F10H_DECFG 0xc0011029 +#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1

La primera macro especifica la dirección de MSR y la segunda especifica el desplazamiento. El siguiente código fue agregado en init_amd (algunos comentarios son míos):

/* LFENCE always requires SSE2 */ if (cpu_has(c, X86_FEATURE_XMM2)) { unsigned long long val; int ret; /* The AMD CPU supports LFENCE, but there are three cases to be considered: * 1- MSR C001_1029[1] must be set to enable the dispatch * serializing behavior of LFENCE. This can only be done * if and only if the MSR is supported. * 2- The MSR is not supported (AMD 0Fh/11h). LFENCE is by * default at least dispatch serializing. Nothing needs to * be done. * 3- The MSR is supported, but we are running under a hypervisor * that does not support writing that MSR (because perhaps * the hypervisor has not been updated yet). In this case, resort * to the slower MFENCE for serializing RDTSC and use a Spectre * mitigation that does not require LFENCE (i.e., generic retpoline). /* * A serializing LFENCE has less overhead than MFENCE, so * use it for execution serialization. On families which * don''t have that MSR, LFENCE is already serializing. * msr_set_bit() uses the safe accessors, too, even if the MSR * is not present. */ msr_set_bit(MSR_F10H_DECFG, MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT); /* * Verify that the MSR write was successful (could be running * under a hypervisor) and only then assume that LFENCE is * serializing. */ ret = rdmsrl_safe(MSR_F10H_DECFG, &val); if (!ret && (val & MSR_F10H_DECFG_LFENCE_SERIALIZE)) { /* A serializing LFENCE stops RDTSC speculation */ set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC); /* X86_FEATURE_LFENCE_RDTSC is used later to choose a Spectre mitigation */ } else { /* MFENCE stops RDTSC speculation */ set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC); } }

AMD dijo lo siguiente en ese documento:

AMD planea soporte para este MSR y acceso a este bit para todos los procesadores futuros.

Esto significa que el MSR es arquitectónico en procesadores AMD.

En los documentos recientes de Intel ISA, la instrucción lfence se ha definido como la serialización de la secuencia de instrucciones (que impide la ejecución fuera de orden a través de ella). En particular, la description de la instrucción incluye esta línea:

Específicamente, LFENCE no se ejecuta hasta que todas las instrucciones anteriores se hayan completado localmente, y ninguna instrucción posterior comience a ejecutarse hasta que se complete LFENCE.

Tenga en cuenta que esto se aplica a todas las instrucciones, no solo a las instrucciones de carga de memoria, lo que hace que lfence más que una simple valla de pedido de memoria.

Aunque esto ahora aparece en la documentación de ISA, no está claro si es "arquitectónico", es decir, debe ser obedecido por todas las implementaciones x86, o si es específico de Intel. En particular, ¿los procesadores de AMD también tratan la lfence como una serialización del flujo de instrucciones?


Hay un MSR que configura ese comportamiento:

Descripción: Establezca un MSR en el procesador para que LFENCE sea una instrucción de serialización de despacho y luego use LFENCE en flujos de código para serializar el despacho (LFENCE es más rápido que RDTSCP, que también es serialización de despacho). Este modo de LFENCE se puede habilitar configurando MSR C001_1029 [1] = 1.

Efecto: Al encontrar un LFENCE cuando se establece el bit MSR, el envío se detendrá hasta que la instrucción LFENCE se convierta en la instrucción más antigua de la máquina.

Aplicabilidad: todos los procesadores 10h / 12h / 14h / 15h / 16h / 17h de la familia AMD son compatibles con este MSR. La compatibilidad con LFENCE se indica mediante la función CPUID1 EDX bit 26, SSE2. Los procesadores 0Fh / 11h de la familia AMD admiten LFENCE como serialización siempre, pero no son compatibles con este MSR. AMD planea soporte para este MSR y acceso a este bit para todos los procesadores futuros.

( source )