В моей программе на С ++ есть способ проверить, есть ли у процессора AES-NI

Я хочу иметь возможность проверить, есть ли у процессора AES-NI, доступный для него, с кодом C++ в Windows. (MinGW GCC)

Я нашел решение, написанное на C# с Visual Studio.

Тест на инструкции AES-NI от C#

 private static bool IsAESNIPresent()
 {
    byte[] sn = new byte[16]; // !!! Here were 8 bytes

    if (!ExecuteCode(ref sn))
        return false;

    var ecx = BitConverter.ToUInt32(sn, 8);
    return (ecx & (1 << 25)) != 0;
 }

Есть ли простой способ сделать то же самое с C++? (ССЗ)

2 ответа

Решение

В Pycrypto есть некоторый код, который кажется применимым. Я взял основные части кода для тестирования:

#include <cpuid.h>
#include <stdint.h>
#include <stdio.h>

int main()
{
    uint32_t eax, ebx, ecx, edx;

    eax = ebx = ecx = edx = 0;
    __get_cpuid(1, &eax, &ebx, &ecx, &edx);
    printf("%08x %08x %08x %08x\n", eax, ebx, ecx, edx);
    printf("Has AES-NI: %d\n", (ecx & bit_AES) > 0);

    return 0;
}

Похоже, что результаты соответствуют информации, предоставленной / proc / cpuinfo, или информации, предоставленной веб-страницами Intel.

Для других возможностей, см. Документацию Clang

Для смеха вы можете сделать это...

int have_aes_ni = (((int(*)())"1\xc0\xb0\1\xf\xa2\x89\xc8\xc3")()>>25)&1;

... но тебе придется пройти/SECTION:.data,RWEкомпоновщику, и вы будете осуждены вашими профессиональными коллегами. Вы можете похвастаться тем, как ваш код работает в Linux, так как Security выводит вас из объекта.

На Windows начиная с Visual C++ 2005 вы можете сделать что-то вроде

#include<intrin.h>

...

  int regs[4];
  __cpuid( regs, 1 );
  int have_aes_ni = ( regs[2] >> 25 ) & 1;

РЕДАКТИРОВАТЬ: я не понял, что вы использовали Mingw, где intrin.h может быть недоступен В этом случае ответ J.J. Hakala, вероятно, лучше.

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