Вопрос Как включить AVX/AVX2 в unicorn-engine?

servermapper expert
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
15 Фев 2020
Сообщения
279
Реакции
60
шапка, установка UC_CPU_X86_SKYLAKE_SERVER, установка OSXSAVE в 1, а также установка EM в 0, привели к тому что CPUID с параметром 1 возвращает ECX=0xced82203, что по идее означает поддержку AVX/AVX2. но после попытки выполнения инструкции VMOVAPS ymm0, ymm1 происходит краш инструкцией int 29h где-то в vcruntime140d.dll
C++:
Expand Collapse Copy
void emulate( )
{
    auto uc = static_cast< uc_engine * >( 0 );
    uc_open( UC_ARCH_X86, UC_MODE_64, &uc );

    auto err = uc_ctl_set_cpu_model( uc, UC_CPU_X86_SKYLAKE_SERVER );

    auto code_hook = uc_hook( );
    uc_hook_add( uc, &code_hook, UC_HOOK_CODE, hook_code, 0, 1, 0 );

    uc_mem_map( uc, 0x10000, 0x1000, UC_PROT_ALL );
    uc_mem_write( uc, 0x10000, "\xC5\xFC\x28\xC1", 4 );

    auto cr4 = uint64_t( ), cr0 = uint64_t( );
    uc_reg_read( uc, UC_X86_REG_CR4, &cr4 );
    cr4 |= ( 1ull << 18 );
    uc_reg_write( uc, UC_X86_REG_CR4, &cr4 );
   
    uc_reg_read( uc, UC_X86_REG_CR0, &cr0 );
    cr0 &= ~( 1ull << 2 );
    uc_reg_write( uc, UC_X86_REG_CR0, &cr0 );

    uc_emu_start( uc, 0x10000, 0, 0, 0 );

    uc_close( uc );
}
P.S. если попытаться выполнить обычную инструкцию, например MOV RAX, RCX, то выполнение всё равно крашнет также в vcruntime140d.dll, но в hook_code будет видно, что инструкция выполнилась, в случае же с VMOVAPS YMM0, YMM1 такого не происходит.
 
Назад
Сверху Снизу