Работает ли LFENCE на процессорах AMD?

В последних документах Intel ISA lfence инструкция была определена как сериализация потока команд (предотвращение неправильного выполнения через него). В частности, описание инструкции включает в себя следующую строку:

В частности, LFENCE не выполняется до тех пор, пока все предыдущие инструкции не будут выполнены локально, и никакие более поздние инструкции не начнут выполняться до завершения LFENCE.

Обратите внимание, что это относится ко всем инструкциям, а не только к инструкциям по загрузке памяти, что делает lfence больше, чем просто забор на память.

Хотя это теперь появляется в документации ISA, неясно, является ли это "архитектурным", то есть, должно ли выполняться всеми реализациями x86, или это специфично для Intel. В частности, процессоры AMD тоже относятся lfence как сериализовать поток инструкций?

2 ответа

AMD всегда в своем руководстве описывала их реализацию LFENCE как инструкция сериализации загрузки

Действует как барьер для принудительного упорядочения памяти (сериализации) между инструкциями загрузки, предшествующими LFENCE, и инструкциями загрузки, которые следуют за LFENCE.

Оригинальный вариант использования для LFENCE заказывал загрузку типа памяти WC. Однако после того, как были обнаружены спекулятивные уязвимости исполнения, в январе 2018 года AMD выпустила документ, озаглавленный "Программные методы управления спекуляциями на процессорах AMD". Это первый и единственный документ, в котором упоминается MSR C001_1029[1] (другие биты C001_1029 обсуждаются в некоторых документах AMD, но не бит 1). Когда C001_1029 [1] установлен на 1, LFENCE ведет себя как инструкция сериализации отправки (что дороже, чем просто сериализация загрузки). Поскольку этот MSR доступен на большинстве старых процессоров AMD, кажется, что он почти всегда поддерживается. Возможно, потому что они думали, что в будущем им может понадобиться совместимость с процессорами Intel в отношении поведения LFENCE,

Существуют исключения из правил упорядочения команд ограждения и сериализации инструкций и инструкций, которые имеют свойства сериализации. Эти исключения слегка различаются между процессорами Intel и AMD. Пример, который я могу вспомнить прямо сейчас, это CLFLUSH инструкция. Поэтому AMD и Intel имеют в виду немного разные вещи, когда говорят об инструкциях со свойствами сериализации.

Одна вещь, которая мне не ясна, - это следующая часть цитаты из ответа Харлода:

Процессоры семейства AMD 0Fh/11h всегда поддерживают сериализацию LFENCE, но не поддерживают эту MSR.

Это утверждение расплывчато, потому что не ясно LFENCE в семействах AMD 0Fh и 11h полностью сериализуются (в терминологии AMD) или диспетчеризируются (в терминологии AMD). В целях безопасности его следует интерпретировать только как сериализацию отправки. В руководствах для семейства AMD нет упоминаний LFENCE или MSR C001_1029.


Ядро Linux было изменено, чтобы использовать свойства сериализации LFENCE на процессорах AMD 8 января 2018 года (за 16 дней до выпуска документа AMD). Изменение состоит из двух коммитов 1 и 2. Были определены следующие макросы:

+#define MSR_F10H_DECFG         0xc0011029
+#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT    1

Первый макрос определяет адрес MSR, а второй - смещение. Следующий код был добавлен в init_amd (некоторые комментарии мои):

/* 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 сказала следующее в этом документе:

AMD планирует поддержку этого MSR и доступ к этому биту для всех будущих процессоров.

Это означает, что MSR является архитектурным на процессорах AMD.

Существует MSR, который настраивает это поведение:

Описание: Установите MSR в процессоре таким образом, чтобы LFENCE была командой сериализации отправки, а затем используйте LFENCE в потоках кода для сериализации отправки (LFENCE быстрее, чем RDTSCP, который также выполняет сериализацию отправки). Этот режим LFENCE может быть включен путем установки MSR C001_1029[1]=1.

Эффект: при обнаружении LFENCE, когда установлен бит MSR, отправка будет остановлена, пока инструкция LFENCE не станет самой старой инструкцией в машине.

Применимость: Все процессоры семейства AMD 10h/12h/14h/15h/16h/17h поддерживают эту MSR. Поддержка LFENCE указывается в CPUID function1 EDX, бит 26, SSE2. Процессоры семейства AMD 0Fh/11h всегда поддерживают сериализацию LFENCE, но не поддерживают эту MSR. AMD планирует поддержку этого MSR и доступ к этому биту для всех будущих процессоров.

( источник)

Другие вопросы по тегам