Я пытаюсь использовать CPUID, но есть некоторые ограничения. Согласно странице CPUID на sandpile.org, стандартные функции CPUID 0000_0004h и выше будут работать, только если установлен флаг MISC_ENABLE. Флаг LCMV установлен на 0. Этот флаг представляет собой бит 22 регистра модели (MSR) 1A0. По-видимому, это ограничение связано с ошибкой в Windows NT (спасибо, Microsoft, что облегчили мне задачу ;)).
Я могу проверить наличие флага LCMV с CPUID 0000_0001h (флаги ecx, бит 3). Если предположить, что он присутствует, то для чего он нужен и почему он так влияет на CPUID? Является ли MSR 1A0 регистром для чтения/записи или только для чтения? Как такой специальный регистр вообще считывается/записывается с использованием ассемблерного кода?
Если регистр технически доступен для чтения/записи, безопасно ли сбросить бит 22 в 0 на время выполнения инструкции CPUID перед восстановлением исходного значения? Или я сильно облажался, если он установлен неправильно (т.е. включен)?
Наконец, sandpile использует формулировку: "Этот уровень доступен, только если для MISC_ENABLE.LCMV установлено значение 0. , Это связано с ошибкой Windows NT». Если набор стандартных уровней специально отключен по этой причине, будет ли это отражено в выводе регистра eax уровня CPUID 0000_000h (максимально поддерживаемый стандартный уровень)?
Фу... Думаю, на этом все.