use crate::windows::constants;
use crate::emu;
pub fn IsProcessorFeaturePresent(emu: &mut emu::Emu) {
let feature = emu
.maps
.read_dword(emu.regs().get_esp())
.expect("kernel32!IsProcessorFeaturePresent cannot read feature");
emu.stack_pop32(false);
let msg = match feature {
constants::PF_ARM_64BIT_LOADSTORE_ATOMIC => "PF_ARM_64BIT_LOADSTORE_ATOMIC",
constants::PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE => "PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE",
constants::PF_ARM_EXTERNAL_CACHE_AVAILABLE => "PF_ARM_EXTERNAL_CACHE_AVAILABLE",
constants::PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE => "PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE",
constants::PF_ARM_VFP_32_REGISTERS_AVAILABLE => "PF_ARM_VFP_32_REGISTERS_AVAILABLE",
constants::PF_3DNOW_INSTRUCTIONS_AVAILABLE => "PF_3DNOW_INSTRUCTIONS_AVAILABLE",
constants::PF_CHANNELS_ENABLED => "PF_CHANNELS_ENABLED",
constants::PF_COMPARE_EXCHANGE_DOUBLE => "PF_COMPARE_EXCHANGE_DOUBLE",
constants::PF_COMPARE_EXCHANGE128 => "PF_COMPARE_EXCHANGE128",
constants::PF_COMPARE64_EXCHANGE128 => "PF_COMPARE64_EXCHANGE128",
constants::PF_FASTFAIL_AVAILABLE => "PF_FASTFAIL_AVAILABLE",
constants::PF_FLOATING_POINT_EMULATED => "PF_FLOATING_POINT_EMULATED",
constants::PF_FLOATING_POINT_PRECISION_ERRATA => "PF_FLOATING_POINT_PRECISION_ERRATA",
constants::PF_MMX_INSTRUCTIONS_AVAILABLE => "PF_MMX_INSTRUCTIONS_AVAILABLE",
constants::PF_NX_ENABLED => "PF_NX_ENABLED",
constants::PF_PAE_ENABLED => "PF_PAE_ENABLED",
constants::PF_RDTSC_INSTRUCTION_AVAILABLE => "PF_RDTSC_INSTRUCTION_AVAILABLE",
constants::PF_RDWRFSGSBASE_AVAILABLE => "PF_RDWRFSGSBASE_AVAILABLE",
constants::PF_SECOND_LEVEL_ADDRESS_TRANSLATION => "PF_SECOND_LEVEL_ADDRESS_TRANSLATION",
constants::PF_SSE3_INSTRUCTIONS_AVAILABLE => "PF_SSE3_INSTRUCTIONS_AVAILABLE",
constants::PF_SSSE3_INSTRUCTIONS_AVAILABLE => "PF_SSSE3_INSTRUCTIONS_AVAILABLE",
constants::PF_SSE4_1_INSTRUCTIONS_AVAILABLE => "PF_SSE4_1_INSTRUCTIONS_AVAILABLE",
constants::PF_SSE4_2_INSTRUCTIONS_AVAILABLE => "PF_SSE4_2_INSTRUCTIONS_AVAILABLE",
constants::PF_AVX_INSTRUCTIONS_AVAILABLE => "PF_AVX_INSTRUCTIONS_AVAILABLE",
constants::PF_AVX2_INSTRUCTIONS_AVAILABLE => "PF_AVX2_INSTRUCTIONS_AVAILABLE",
constants::PF_AVX512F_INSTRUCTIONS_AVAILABLE => "PF_AVX512F_INSTRUCTIONS_AVAILABLE",
constants::PF_VIRT_FIRMWARE_ENABLED => "PF_VIRT_FIRMWARE_ENABLED",
constants::PF_XMMI_INSTRUCTIONS_AVAILABLE => "PF_XMMI_INSTRUCTIONS_AVAILABLE",
constants::PF_XMMI64_INSTRUCTIONS_AVAILABLE => "PF_XMMI64_INSTRUCTIONS_AVAILABLE",
constants::PF_XSAVE_ENABLED => "PF_XSAVE_ENABLED",
constants::PF_ARM_V8_INSTRUCTIONS_AVAILABLE => "PF_ARM_V8_INSTRUCTIONS_AVAILABLE",
constants::PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE => {
"PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE"
}
constants::PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE => {
"PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE"
}
constants::PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE => {
"PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE"
}
_ => "unknown feature",
};
log_red!(
emu,
"kernel32!IsProcessorFeaturePresent feature: {} {}",
feature,
msg
);
emu.regs_mut().rax = 1;
}