This article may be too technical for most readers to understand.(January 2025) |
В архитектуре x86 инструкция CPUID (идентифицируется кодом CPUID
операции ) является дополнительной инструкцией процессора (ее название происходит от CPU Identification), позволяющей программному обеспечению обнаруживать детали процессора. Она была представлена Intel в 1993 году с выпуском процессоров Pentium и SL-enhanced 486. [1]
Программа может использовать его для определения типа процессора и реализации CPUID
таких функций, как MMX / SSE .
До того, как эта инструкция стала общедоступной CPUID
, программисты писали сложный машинный код , который использовал незначительные различия в поведении ЦП, чтобы определить марку и модель процессора. [2] [3] [4] [5] С появлением процессора 80386 EDX при сбросе указывал версию, но это можно было прочитать только после сброса, и не было стандартного способа для приложений считывать это значение.
За пределами семейства x86 разработчикам по-прежнему в основном приходится использовать экзотические процессы (включая синхронизацию инструкций или триггеры сбоев ЦП) для определения имеющихся изменений в конструкции ЦП.
Например, в семействе Motorola 680x0 — в котором никогда не было CPUID
инструкций любого вида — некоторые конкретные инструкции требовали повышенных привилегий. Они могли использоваться для различения различных членов семейства ЦП. В Motorola 68010 инструкция MOVE из SR стала привилегированной. Это заметное изменение инструкции (и конечного автомата) позволило 68010 соответствовать требованиям виртуализации Попека и Голдберга . Поскольку 68000 предлагал непривилегированный MOVE из SR, два разных ЦП можно было различить по срабатыванию состояния ошибки ЦП.
Хотя эта CPUID
инструкция специфична для архитектуры x86, другие архитектуры (например, ARM) часто предоставляют регистры на кристалле, которые можно считывать заданными способами для получения тех же видов информации, которые предоставляет CPUID
инструкция x86.
Код операции CPUID
— 0F A2
.
На языке ассемблера инструкция CPUID
не принимает параметров, поскольку CPUID
неявно использует регистр EAX для определения основной категории возвращаемой информации. В более поздней терминологии Intel это называется CPUID leaf. CPUID
следует вызывать с EAX = 0
first, так как это сохранит в регистре EAX наивысший параметр вызова EAX (leaf), который реализует CPU.
Для получения информации о расширенных функциях CPUID
следует вызывать с установленным старшим битом EAX. Для определения наивысшего параметра вызова расширенных функций вызовите CPUID
с EAX = 80000000h
.
Листья CPUID больше 3, но меньше 80000000 доступны только тогда, когда регистры, специфичные для модели, имеют IA32_MISC_ENABLE.BOOT_NT4 [бит 22] = 0 (что по умолчанию). Как следует из названия, Windows NT 4.0 до SP6 не загружалась должным образом, если этот бит не был установлен, [6] но более поздним версиям Windows он не нужен, поэтому базовые листья больше 4 можно считать видимыми в текущих системах Windows. По состоянию на апрель 2024 года [update]базовые допустимые листья достигают 23h, но информация, возвращаемая некоторыми листьями, не раскрывается в общедоступной документации, т. е. они «зарезервированы».
Некоторые из недавно добавленных листьев также имеют подлистья, которые выбираются через регистр ECX перед вызовом CPUID
.
Это возвращает строку идентификатора производителя ЦП – двенадцатисимвольную строку ASCII, хранящуюся в EBX, EDX, ECX (в таком порядке). Самый высокий базовый параметр вызова (наибольшее значение, которое может быть установлено в EAX перед вызовом CPUID
) возвращается в EAX.
Ниже приведен список процессоров и наивысшая реализованная функция.
Процессоры | Базовый | Расширенный |
---|---|---|
Ранее Intel 486 | CPUID не реализован | |
Более поздние Intel 486 и Pentium | 0x01 | Не реализовано |
Pentium Pro , Pentium II и Celeron | 0x02 | Не реализовано |
Пентиум III | 0x03 | Не реализовано |
Пентиум 4 | 0x02 | 0x8000 0004 |
Xeon | 0x02 | 0x8000 0004 |
Пентиум М | 0x02 | 0x8000 0004 |
Pentium 4 с технологией Hyper-Threading | 0x05 | 0x8000 0008 |
Пентиум Д (8xx) | 0x05 | 0x8000 0008 |
Пентиум Д (9xx) | 0x06 | 0x8000 0008 |
Основной дуэт | 0x0A | 0x8000 0008 |
Core 2 Дуо | 0x0A | 0x8000 0008 |
Xeon 3000 , 5100, 5200, 5300, 5400 ( серия 5000 ) | 0x0A | 0x8000 0008 |
Серия Core 2 Duo 8000 | 0x0D | 0x8000 0008 |
Xeon 5200, 5400 серии | 0x0A | 0x8000 0008 |
Атом | 0x0A | 0x8000 0008 |
Процессоры на базе Nehalem | 0x0B | 0x8000 0008 |
Процессоры на базе Ivy Bridge | 0x0D | 0x8000 0008 |
Процессоры на базе Skylake (базовая и максимальная частота процессора; опорная частота шины) | 0x16 | 0x8000 0008 |
Основной лист перечисления атрибутов поставщика систем на кристалле | 0x17 | 0x8000 0008 |
Процессоры на базе Meteor Lake | 0x23 | 0x8000 0008 |
Ниже приведены известные строки идентификаторов производителей процессоров:
"AuthenticAMD"
– АМД"CentaurHauls"
– IDT WinChip/ Centaur (включая некоторые процессоры VIA и Zhaoxin)"CyrixInstead"
– Cyrix /ранние STMicroelectronics и IBM"GenuineIntel"
– Интел"GenuineIotel"
– Интел (редко) [7] [8]"TransmetaCPU"
– Трансмета"GenuineTMx86"
– Трансмета"Geode by NSC"
– Национальный полупроводник"NexGenDriven"
– НексГен"RiseRiseRise"
- Рост"SiS SiS SiS "
– Сис"UMC UMC UMC "
– УМК"Vortex86 SoC"
– DM&P Vortex86" Shanghai "
– Чжаосинь"HygonGenuine"
– Хайгон"Genuine RDC"
– RDC Semiconductor Co. Ltd. [9]"E2K MACHINE"
– МЦСТ Эльбрус [10]"VIA VIA VIA "
– ЧЕРЕЗ [ необходима ссылка ]"AMD ISBETTER"
– ранние инженерные образцы процессора AMD K5 [11] [12] [ необходим лучший источник ]Ниже приведены строки идентификаторов, используемые программными ядрами ЦП с открытым исходным кодом :
"GenuineAO486"
– процессор ao486 (старый) [13] [14]"MiSTer AO486"
– Процессор ao486 (новый) [15] [14]"GenuineIntel"
– v586 core [16] (идентично строке Intel ID)Ниже приведены известные строки идентификаторов виртуальных машин:
"MicrosoftXTA"
– Microsoft x86-to-ARM [17]"GenuineIntel"
– Apple Розетта 2 [18]"VirtualApple"
– Новые версии Apple Rosetta 2"PowerVM Lx86"
– PowerVM Lx86 (эмулятор x86 для процессоров IBM POWER5 / POWER6 ) [19]"Neko Project"
– Neko Project II ( эмулятор PC-98 ) (используется, когда ЦП для эмуляции установлен на «Neko Processor II») [20] [21]Например, на GenuineIntel
процессоре значения, возвращаемые в EBX, равны 0x756e6547
, EDX 0x49656e69
и ECX равны 0x6c65746e
. Следующий пример кода отображает строку идентификатора поставщика, а также наивысший параметр вызова, реализуемый ЦП.
.intel_syntax без префикса .текст.m0: .string "CPUID: %x\n" .m1: .string "Наибольший номер реализованной базовой функции: %i\n" .m2: .string "ID поставщика: %s\n" .globl основной основной:нажмите r12 mov eax , 1 суб рсп , 16 cpuid леа рди , .m0 [ рип ] mov esi , eax вызов printfmov eax , 0 cpuidлеа рди , .m1 [ рип ] mov esi , eax mov r12d , edx mov ebp , ecx вызов printf mov 3 [ rsp ], ebx леа рси , 3 [ rsp ] леа рди , .м2 [ рип ] mov 7 [ rsp ], r12d mov 11 [ rsp ], ebp вызов printfдобавить рсп , 16 поп р12 в отставке .section .note.GNU - стек , "" , @ progbits
На некоторых процессорах можно изменить строку идентификатора производителя, сообщаемую CPUID.(EAX=0), записав новую строку идентификатора в определенные регистры MSR ( регистры, специфичные для модели ) с помощью WRMSR
инструкции. Это использовалось на процессорах не Intel для включения функций и оптимизаций, которые были отключены в программном обеспечении для процессоров, не возвращающих GenuineIntel
строку идентификатора. [22] Процессоры, которые, как известно, обладают такими регистрами MSR, включают:
Процессор | MSR-ы |
---|---|
IDT WinChip | 108h-109h [23] |
ЧЕРЕЗ С3 , С7 | 1108h-1109h [24] |
ВИА Нано | 1206h-1207h [25] |
Transmeta Crusoe , Эффисон | 80860001h-80860003h [26] [27] |
AMD Geode GX, LX | 3000h-3001h [28] |
DM&P Vortex86 EX2 | 52444300h-52444301h [29] |
Это возвращает степпинг , модель и информацию о семействе процессора в регистре EAX (также называемом сигнатурой процессора), флаги функций в регистрах EDX и ECX, а также дополнительную информацию о функциях в регистре EBX. [30]
ЕАХ | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Сдержанный | Расширенный семейный идентификатор | Расширенный идентификатор модели | Сдержанный | Тип процессора | Семейный идентификатор | Модель | Шаговый идентификатор |
Тип | Кодирование в двоичном формате |
---|---|
Производитель оригинального оборудования ( OEM ) Процессор | 00 |
Процессор Intel Overdrive | 01 |
Двойной процессор (применимо только к процессорам Intel P5 Pentium ) [31] | 10 |
Зарезервированное значение | 11 |
По состоянию на октябрь 2023 года известны следующие идентификаторы семейства процессоров x86: [32]
Семейный идентификатор + Расширенный семейный идентификатор | Интел | АМД | Другой |
---|---|---|---|
0h | — | — | — |
1h | — | — | — |
2h | — | — | — |
3h | [а] | — | — |
4h | 486 | 486 , [33] 5x86 , Элан SC4xx/5xx [34] | Cyrix 5x86 , [35] Cyrix MediaGX , [36] UMC Green CPU , [4] МЦСТ Эльбрус (большинство моделей), [10] MiSTer ao486 [37] |
5h | Пентиум , Пентиум MMX , Кварк X1000 | К5 , К6 | Cyrix 6x86 , Cyrix MediaGXm , [36] Geode (кроме NX), NexGen Nx586, [4] IDT WinChip , IDT WinChip 2, IDT WinChip 3, Transmeta Crusoe , Rise mP6 , SiS 550, DM&P Vortex86 (ранний), [38] RDC IAD 100, MCST Эльбрус-8С2 [10] |
6h | Pentium Pro , Pentium II , Pentium III , Pentium M , Intel Core (все варианты), Intel Atom (все варианты), Xeon (кроме вариантов NetBurst ), Xeon Phi (кроме KNC) | K7: Athlon , Athlon XP | Cyrix 6x86 MX/MII, VIA C3 , VIA C7 , VIA Nano , DM&P Vortex86 (DX3,EX2 [39] ), Zhaoxin ZX-A/B/C/C+, ( Centaur CNS [40] ), МЦСТ Эльбрус-12С/16С/2С3 [10] |
7h | Itanium (в режиме IA-32) | — | Чжаосинь Кайсянь, Чжаосинь Кайсэн |
8h | [б] | — | — |
9h | — | — | — |
0Ah | — | — | — |
0Bh | Ксеон Фи (Уголок рыцарей) [42] | — | — |
0Ch | — | — | — |
0Dh | — | — | — |
0Eh | — | — | — |
0Fh | NetBurst (Пентиум 4) | K8/Hammer ( Athlon 64 ) | Transmeta Efficeon |
10h | — | K10 : Феномен | — |
11h | Itanium 2 [43] (в режиме IA-32) | Турион X2 | — |
12h | — | Льяно | — |
13h | Intel Core (Panther Cove и выше) [44] | — | — |
14h | — | Бобкэт | — |
15h | — | Бульдозер , Копер , Паровой каток , Экскаватор | — |
16h | — | Ягуар , Пума | — |
17h | — | Дзен 1 , Дзен 2 | — |
18h | — | Хигон Дхьяна | |
19h | — | Дзен 3 , Дзен 4 | — |
1Ah | — | Дзен 5 | — |
CPUID
инструкцию, однако он возвращает идентификатор семейства 3h
в сбросе значения EDX.8h
Биты | EBX | Действительный |
---|---|---|
7:0 | Индекс бренда | |
15:8 | CLFLUSH размер строки (Значение * 8 = размер строки кэша в байтах) | если CLFLUSH установлен флаг функции.CPUID.01.EDX.CLFSH [бит 19]= 1 |
23:16 | Максимальное количество адресуемых идентификаторов для логических процессоров в данном физическом корпусе; Ближайшее целое число, являющееся степенью двойки, которое не меньше этого значения, представляет собой количество уникальных начальных идентификаторов APIC, зарезервированных для адресации различных логических процессоров в физическом корпусе. [a] Прежнее использование: Количество логических процессоров на один физический процессор; два для процессора Pentium 4 с технологией Hyper-Threading. [47] | если установлен флаг функции Hyper-Threading . CPUID.01.EDX.HTT [бит 28]= 1 |
31:24 | Локальный APIC ID: начальный APIC-ID используется для идентификации исполняющего логического процессора. [b] | Pentium 4 и последующие процессоры. |
Информация о процессоре и флаги функций зависят от производителя, но обычно значения Intel используются другими производителями в целях совместимости.
Кусочек | EDX | ECX [а] | Кусочек | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
0 | фпу | Встроенный x87 FPU | sse3 | SSE3 ( Новые инструкции Prescott - PNI) | 0 | |
1 | вмэ | Расширения виртуального режима 8086 (такие как VIF, VIP, PVI) | pclmulqdq | PCLMULQDQ (инструкция по умножению без переноса) | 1 | |
2 | де | Отладка расширений ( CR4 бит 3) | dtes64 | 64-битное отладочное хранилище (edx бит 21) | 2 | |
3 | псе | Расширение размера страницы (страницы по 4 МБ) | монитор | MONITOR и MWAIT инструкции ( PNI ) | 3 | |
4 | тск | Счетчик отметок времени и RDTSC инструкция | ds-cpl | Отладочное хранилище, сертифицированное CPL | 4 | |
5 | мср | Регистры и RDMSR /или WRMSR инструкции, специфичные для конкретной модели | vmx | Расширения виртуальной машины | 5 | |
6 | паэ | Расширение физического адреса | смкс | Расширения безопасного режима ( LaGrande ) ( GETSEC инструкция) | 6 | |
7 | мсе | Исключение проверки машины | стандартное восточное время | Улучшенный SpeedStep | 7 | |
8 | cx8 [б] | CMPXCHG8B ( сравнить и поменять местами ) инструкция | тм2 | Тепловой монитор 2 | 8 | |
9 | апик [c] | Встроенный усовершенствованный программируемый контроллер прерываний | ссс3 | Дополнительные инструкции SSE3 | 9 | |
10 | (мтрр) [д] | (сдержанный) | cnxt-id | Контекстный идентификатор L1 | 10 | |
11 | сеп [э] | SYSENTER и SYSEXIT быстрые инструкции системного вызова | сдбг | Интерфейс отладки Silicon | 11 | |
12 | мтрр | Тип памяти Диапазон Регистры [f] | фма | Совмещенное умножение-сложение (FMA3) | 12 | |
13 | стр. | Страница Глобального Разрешения Бита в CR4 | cx16 | CMPXCHG16B инструкция [г] | 13 | |
14 | МКА | Архитектура машинной проверки | xtpr | Можно отключить отправку сообщений о приоритете задач | 14 | |
15 | смов | Условный ход: CMOV и FCMOV инструкции FCOMI [ h] | пдкм | Возможности мониторинга производительности и отладки | 15 | |
16 | похлопать | Таблица атрибутов страницы | (зарезервировано) [я] | 16 | ||
17 | псе-36 | 36-битное расширение размера страницы | pcid | Идентификаторы контекста процесса ( CR4 бит 17) | 17 | |
18 | псн | Серийный номер процессора поддерживается и включен [j] | дка | Прямой доступ к кэшу для записи DMA [58] [59] | 18 | |
19 | клфш | CLFLUSH инструкция очистки строки кэша ( SSE2 ) | sse4.1 | Инструкции SSE4.1 | 19 | |
20 | (нх) | Бит запрета выполнения (NX) ( только для Itanium , зарезервирован для других процессоров) [60] [k] | sse4.2 | Инструкции SSE4.2 | 20 | |
21 | дс | Отладочное хранилище: сохранение трассировки выполненных прыжков | x2apic | x2APIC (улучшенный APIC) | 21 | |
22 | acpi | Бортовые терморегуляторы MSR для ACPI | movbe | MOVBE инструкция ( big-endian ) | 22 | |
23 | ммкс | Инструкции MMX (64-бит SIMD) | попкнт | POPCNT инструкция | 23 | |
24 | fxsr | FXSAVE , FXRSTOR инструкции, CR4 бит 9 | tsc-deadline | APIC реализует одноразовую операцию с использованием значения крайнего срока TSC | 24 | |
25 | ссэ | Инструкции потокового SIMD Extensions (SSE) (также известные как « Katmai New Instructions»; 128-битный SIMD) | aes-ni | Набор инструкций AES | 25 | |
26 | sse2 | Инструкции SSE2 | xсохранить | Сохранение/восстановление состояния расширяемого процессора: XSAVE , XRSTOR , XSETBV , XGETBV инструкции | 26 | |
27 | SS | Кэш ЦП реализует самонаблюдение | osxсохранить | XSAVE включено ОС | 27 | |
28 | хтт | Зарезервированное поле «Макс. идентификаторы APIC» действительно [l] | avx | Расширенные векторные расширения (256-бит SIMD) | 28 | |
29 | тм | Тепловой монитор автоматически ограничивает температуру | ф16с | Инструкции по преобразованию чисел с плавающей точкой в формат FP16 и обратно | 29 | |
30 | ia64 | Процессор IA64 , эмулирующий x86 [60] | рдрнд | RDRAND (генератор случайных чисел на кристалле) | 30 | |
31 | пбэ | Возможность пробуждения при включении Pending Break (контакт PBE#) | гипервизор | Гипервизор присутствует (всегда ноль на физических процессорах) [63] [64] [65] | 31 |
CPUID
с листовым индексом (EAX) больше 0 может оставить EBX и ECX неизмененными, сохранив их старые значения. По этой причине рекомендуется обнулить EBX и ECX перед выполнением CPUID
с листовым индексом 1.К процессорам, демонстрирующим подобное поведение, относятся Cyrix MII [48] и IDT WinChip 2. [49]
CentaurHauls
, GenuineTMx86
и RiseRiseRise
) CMPXCHG8B
инструкция всегда поддерживается, однако бит функции для инструкции может быть не установлен. Это обходной путь для ошибки в Windows NT. [50]AuthenticAMD
Family 5 Model 0) бит 9 EDX использовался для указания поддержки PGE. Он был перемещен в бит 13, начиная с K5 Model 1. [51]GenuineIntel
семейство 6, модель 1) бит 11 EDX недействителен — бит установлен, но инструкции SYSENTER
и SYSEXIT
не поддерживаются на Pentium Pro. [53]MTRRCAP
MSR только для чтения (MSR 0FEh
). Этот MSR имеет следующую структуру: Биты | Использование |
---|---|
7:0 | Количество MTRR с переменным диапазоном |
8 | Поддерживаются MTRR с фиксированным диапазоном |
9 | (Сдержанный) |
10 | Поддерживаемый тип памяти Write-Combining |
11 | Поддерживается SMRR (регистр диапазона системного управления) |
12 | Поддерживается PRMRR (регистр диапазона зарезервированной памяти процессора, часть SGX ) |
13 | Поддерживается SMRR2 [54] |
14 | Поддерживается SMRR-блокировка |
15 | Поддерживается SEAMRR (регистр диапазона безопасного арбитражного режима, часть TDX ) [55] |
63:16 | (Сдержанный) |
CMPXCHG16B
установленный бит функции, даже если они не поддерживают эту инструкцию — это применимо только к чипам GenuineIntel
семейства 0Fh
Model 3 Stepping 4 (90 нм Pentium 4). [56]FCMOV
и FCOMI
инструкции доступны только при наличии встроенного x87 FPU (обозначается битом 0 EDX).119h
( BBL_CR_CTL
) в 1. Это приведет к удалению листа 3 и заставит CPUID.(EAX=1):EDX[бит 18] вернуть 0.В более старой документации этот бит часто указывается как флаг « технологии Hyper-Threading » [61] — однако, хотя этот флаг является необходимым условием для поддержки Hyper-Threading, он сам по себе не указывает на поддержку Hyper-Threading и был установлен на многих процессорах, которые не поддерживают какую-либо форму многопоточной технологии. [62]
Зарезервированные поля следует маскировать перед их использованием для идентификации процессора.
Возвращает список дескрипторов, указывающих возможности кэша и TLB в регистрах EAX, EBX, ECX и EDX.
На процессорах, которые поддерживают этот лист, вызов CPUID
с EAX=2 приведет к тому, что нижний байт EAX будет установлен в 01h
[a] , а оставшиеся 15 байт EAX/EBX/ECX/EDX будут заполнены 15 дескрипторами, по одному байту каждый. Эти дескрипторы предоставляют информацию о кэшах процессора, TLB и предварительной выборке. Обычно это один кэш или TLB на дескриптор, но некоторые значения дескрипторов предоставляют и другую информацию - в частности, 00h
используется для пустого дескриптора, FFh
указывает, что лист не содержит допустимой информации кэша и что вместо него следует использовать лист 4h, и FEh
указывает, что лист не содержит допустимой информации TLB и что вместо него следует использовать лист 18h. Дескрипторы могут появляться в любом порядке.
Для каждого из четырех регистров (EAX, EBX, ECX, EDX), если установлен бит 31, то регистр не следует считать содержащим допустимые дескрипторы (например, на Itanium в режиме IA-32 CPUID(EAX=2) возвращается 80000000h
в EDX — это следует интерпретировать как то, что EDX не содержит допустимой информации, а не то, что он содержит дескриптор для кэша L2 объемом 512 КБ.)
В таблице ниже для известных значений дескриптора приводится сжатое описание кэша или TLB, указанного этим значением дескриптора (или другая информация, где это применимо). Суффиксы, используемые в таблице:
Кэш инструкций или данных уровня 1 | Кэш 2-го уровня | Кэш 3-го уровня | Инструкция или данные TLB | Уровень 2 общий TLB | Другая информация | (сдержанный) |
х0 | х1 | х2 | х3 | х4 | х5 | х6 | х7 | х8 | х9 | хА | хБ | хС | хД | хЭ | хФ | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x | нулевой дескриптор | ITLB: 32E, 4Kp, 4A | ITLB: 2E, 4Mp, FA | DTLB: 64E, 4Kp, 4A | DTLB: 8E, 4Mp, 4A | DTLB: 32E, 4Mp, 4A | L1I: 8К, 4А, 32Л | 0x | L1I: 16К, 4А, 32Л | L1I: 32К, 4А, 64Л | L1D: 8К, 2А, 32Л | ITLB: 4E, 4Mp, FA | L1D: 16К, 4А, 32Л | L1D: 16К, 4А, 64Л [б] | L1D: 24К, 6А, 64Л [б] | 0x | ||
1x | (L1D: 16K, 4A, 32L) [c] | (L1I: 16K, 4A, 32L) [c] | 1x | (L2C: 96K, 6A, 64L) [c] | L2C: 128К, 2А, 64Л | 1x | ||||||||||||
2x | L2C: 256К, 8А, 64Л [г] | L3C: 512К, 4А, 64Л, 2С | L3C: 1М, 8А, 64Л, 2С | L2C: 1М, 16А, 64Л | L3C: 2М, 8А, 64Л, 2С | (128-байтовая предварительная выборка) [e] | (128-байтовая предварительная выборка) [e] | 2x | (128-байтовая предварительная выборка) [e] | L3C: 4М, 8А, 64Л, 2С | L1D: 32К, 8А, 64Л | 2x | ||||||
3x | L1I: 32К, 8А, 64Л | 3x | L2C: 128K, 4A, 64L, 2S [ж] | L2C: 192К, 6А, 64Л, 2С [ж] | L2C: 128K, 2A, 64L, 2S [ж] | L2C: 256К, 4А, 64Л, 2С [ж] | L2C: 384K, 6A, 64L, 2S [ж] | L2C: 512K, 4A, 64L, 2S [ж] | L2C: 256К, 2А, 64Л [г] | 3x | ||||||||
4x | кэш L3 отсутствует | L2C: 128К, 4А, 32Л | L2C: 256K, 4A, 32L [ч] | L2C: 512К, 4А, 32Л | L2C: 1M, 4A, 32L | L2C: 2М, 4А, 32Л | L3C: 4М, 4А, 64Л | L3C: 8М, 8А, 64Л | 4x | L2C: 3М, 12А, 64Л | L2C/L3C: [я] 4M, 16A, 64L | L3C: 6М, 12А, 64Л | L3C: 8М, 16А, 64Л | L3C: 12М, 12А, 64Л | L3C: 16М, 16А, 64Л | L2C: 6М, 24А, 64Л | ITLB: 32E, 4Kp [j] | 4x |
5x | ITLB: 64E,FA, 4K/2M/4Mp | ITLB: 128E,FA, 4K/2M/4Mp | ITLB: 256E,FA, 4K/2M/4Mp | ITLB: 7E, 2M/4Mp, FA | DTLB: 16E, 4Mp, 4A | DTLB: 16E, 4Kp, 4A | 5x | ДТЛБ: 16E, 4Kp, FA | DTLB: 32E, 2M/4Mp, 4A | DTLB: 64E 4K/4Mp, FA | DTLB: 128E, 4K/4Mp, FA | DTLB: 256E, 4K/4Mp, FA | 5x | |||||
6x | L1D: 16К, 8А, 64Л | ITLB: 48E, 4Kp, FA | Два DTLB: 32E, 2M/4Mp, 4A + 4E, 1Gp, FA | DTLB: 512E, 4Kp, 4A | L1D: 8К, 4А, 64Л | L1D: 16К, 4А, 64Л | 6x | L1D: 32К, 4А, 64Л | DTLB: 64E, 4Kp, 8A | DTLB: 256E, 4Kp, 8A | DTLB: 128E, 2M/4Mp, 8A | DTLB: 16E, 1Gp, FA | 6x | |||||
7x | Кэш трассировки , 12K-μop, 8A [k] | Кэш трассировки, 16K-μop, 8A | Кэш трассировки, 32K-μop, 8A | Кэш трассировки, 64K-μop, 8A [f] | [час] | ITLB: 8E, 2M/4Mp, FA [л] | (L1I: 16K, 4A, 64L) [м] [ч] | 7x | L2C: 1M, 4A, 64L | L2C: 128К, 8А, 64Л, 2С | L2C: 256К, 8А, 64Л, 2С | L2C: 512К, 8А, 64Л, 2С | L2C: 1M, 8A, 64L, 2S | L2C: 2М, 8А, 64Л | (L2C: 256K, 8A, 128L) [м] | L2C: 512К, 2А, 64Л | 7x | |
8x | L2C: 512К, 8А, 64Л [к] | (L2C: 128K, 8A, 32L) [э] | L2C: 256K, 8A, 32L [ч] | L2C: 512К, 8А, 32Л | L2C: 1M, 8A, 32L | L2C: 2М, 8А, 32Л | L2C: 512К, 4А, 64Л | L2C: 1M, 8A, 64L | 8x | (L3C: 2M, 4A, 64L) [c] | (L3C: 4M, 4A, 64L) [c] | (L3C: 8M, 4A, 64L) [c] | (L3C: 3M, 12A, 128L) [м] [н] | 8x | ||||
9x | (ITLB: 64E,FA, 4K-256Mp) [c] | (DTLB: 32E,FA, 4K-256Mp) [c] | 9x | (DTLB: 96E,FA, 4K-256Mp) [c] | 9x | |||||||||||||
Топор | ДТЛБ: 32E, 4Kp, FA | Топор | Топор | |||||||||||||||
Вх | ITLB: 128E, 4Kp, 4A | ITLB: 8E, 2M/4Mp, 4A [o] | ITLB: 64E, 4Kp, 4A | DTLB: 128E, 4Kp, 4A | DTLB: 256E, 4Kp, 4A | ITLB: 64E, 4Kp, 8A | ITLB: 128E, 4Kp, 8A | Вх | DTLB: 64E, 4Kp, 4A | Вх | ||||||||
Сх | DTLB: 8E, 4K/4Mp, 4A | L2TLB: 1024E, 4K/2Mp, 8A | DTLB: 16E, 2M/4Mp, 4A [83] | Два L2 STLB: 1536E, 4K/2Mp, 6A [p] + 16E, 1Gp, 4A | DTLB: 32E, 2M/4Mp, 4A | Сх | L2TLB: 512E, 4Kp, 4A | Сх | ||||||||||
Дкс | L3C: 512К, 4А, 64Л | L3C: 1М, 4А, 64Л | L3C: 2М, 4А, 64Л | L3C: 1М, 8А, 64Л | L3C: 2М, 8А, 64Л | Дкс | L3C: 4М, 8А, 64Л | L3C: 1,5M, 12A, 64L | L3C: 3М, 12А, 64Л | L3C: 6М, 12А, 64Л | Дкс | |||||||
Бывший | L3C: 2М, 16А, 64Л | L3C: 4М, 16А, 64Л | L3C: 8М, 16А, 64Л | Бывший | L3C: 12М, 24А, 64Л | L3C: 18M, 24A, 64L [86] | L3C: 24М, 24А, 64Л | Бывший | ||||||||||
Фх | 64-байтовая предварительная выборка [q] | 128-байтовая предварительная выборка [q] | Фх | Лист 2 не имеет информации о TLB, используйте лист 18h | Лист 2 не имеет кэш-информации, используйте лист 4 | Фх | ||||||||||||
х0 | х1 | х2 | х3 | х4 | х5 | х6 | х7 | х8 | х9 | хА | хБ | хС | хД | хЭ | хФ |
CPUID
должен быть вызван с EAX=2, чтобы получить все дескрипторы кэша/TLB. Однако все известные процессоры, реализующие этот лист, возвращают 01h
этот байт, а более новая документация Intel (SDM rev 053 [66] и более поздние) определяет этот байт как имеющий значение 01h
.0Dh
и 0Eh
, Intel AP-485 rev 37 [67] перечисляет кэши, которые они описывают как имеющие ECC - это было удалено в rev 38 и более поздних документах Intel.10h
, 15h
, 1Ah
, 88h
, 89h
, 8Ah
, 90h
, 96h
, 9Bh
документированы только для режима работы IA-32 процессора Itanium . [68]21h
в некоторых местах (например, AP-485 rev 36 [69] , но не rev 37) называется «MLC» (кэш среднего уровня).26h
, 27h
, 28h
и 81h
не указаны в документации Intel и не используются ни в одном из известных выпущенных процессоров. ( 81h
был замечен в инженерных образцах отмененного Intel Timna . [79] ) Тем не менее, сообщалось, что они распознаются ядром Windows NT v5.1 ( Windows XP ) и выше. 81h
также распознается v5.0 ( Windows 2000 ). [80]39h-3Eh
и 73h
перечислены в версии 36 Intel AP-485, [69], но были удалены из более поздней документации Intel, хотя некоторые из них использовались в процессорах Intel (в основном в процессорах Celeron на базе Netburst39h
, например, в «Willamette-128» , [70], 3Bh
в «Northwood-128», [71] и 3Ch
в «Prescott-256» [72] ).3Fh
не указан ни в одной известной документации Intel — тем не менее он используется в процессорах Intel Tolapai [73] и указан в предоставленном Intel патче ядра Linux. [74]CyrixInstead
семейство 6, модель 5) указывает, что этот процессор использует значения дескрипторов 74h
и 77h
для своих TLB, а также значения 42h
и 82h
для своих кэшей, но не указывает, каким кэшам/TLB в процессоре соответствует каждое из этих значений дескрипторов. [75]49h
указывает на кэш-память 3-го уровня на GenuineIntel
процессорах семейства 0Fh Model 6 (Xeon на базе Pentium 4) и кэш-память 2-го уровня на других процессорах.4Fh
. Процессоры, использующие этот дескриптор (Intel Atom "Bonnell" [76] ), в другом месте описаны как имеющие полностью ассоциативный 32-записный ITLB. [77]CyrixInstead
и Geode by NSC
) дескрипторы 70h
и 80h
имеют разное значение: [78]70h
указывает на 32-записную общую 4-канальную ассоциативную буферную иерархию инструкций и данных с размером страницы 4 КБ.80h
указывает на общий кэш L1 для инструкций и данных объемом 16 КБ с 4-канальной ассоциативностью и размером строки кэша 16 байт.76h
указан как кэш L2 объемом 1 МБ в версии 37 Intel AP-485 [67], но как инструкция TLB в версии 38 и всей более поздней документации Intel.77h
, 7Eh
, 8Dh
документированы только для режима работы IA-32 Itanium 2. [81]B1h
емкость TLB составляет 8 элементов при использовании страниц по 2 МБ, но уменьшается до 4 элементов при использовании страниц по 4 МБ.C3h
многие процессоры Intel, использующие этот дескриптор, имеют L2 TLB, который является 12-канальным наборно-ассоциативным, а не 6-канальным наборно-ассоциативным. Это применимо по крайней мере к процессорам Skylake [84] и Whiskey/Kaby/Coffee/Comet Lake [85] .F0h
, F1h
является рекомендуемым шагом для предварительной выборки памяти с помощью PREFETCHNTA
инструкции. [87]Это возвращает серийный номер процессора. Серийный номер процессора был введен в Intel Pentium III , но из-за проблем с конфиденциальностью эта функция больше не реализована в более поздних моделях (бит функции PSN всегда очищен). Процессоры Transmeta Efficeon и Crusoe также поддерживают эту функцию. Однако процессоры AMD не реализуют эту функцию ни в одной из моделей процессоров.
Для процессоров Intel Pentium III серийный номер возвращается в регистрах EDX:ECX. Для процессоров Transmeta Efficeon он возвращается в регистрах EBX:EAX. А для процессоров Transmeta Crusoe он возвращается только в регистре EBX.
Обратите внимание, что для работы функции серийного номера процессора необходимо включить ее в настройках BIOS .
Эти два листа используются для предоставления информации об уровнях иерархии кэша , доступных ядру процессора, на котором CPUID
выполняется инструкция. Лист 4
используется на процессорах Intel, а лист 8000'001Dh
используется на процессорах AMD — они оба возвращают данные в EAX, EBX, ECX и EDX, используя тот же формат данных, за исключением того, что лист 4
возвращает несколько дополнительных полей, которые считаются «зарезервированными» для листа 8000'001Dh
. Они оба предоставляют информацию о кэше ЦП в серии подлистов, выбранных ECX — чтобы получить информацию обо всех уровнях кэша, необходимо вызывать CPUID
многократно, с EAX= 4
или 8000'001Dh
и ECX, установленными на увеличивающиеся значения, начиная с 0 (0,1,2,...), пока не будет найден подлист, не описывающий никаких кэшей (EAX[4:0]=0). Подлисты, которые возвращают информацию о кэше, могут появляться в любом порядке, но все они появятся перед первым подлистом, не описывающим никаких кэшей.
В таблице ниже поля, определенные для листа 4
, но не для листа, 8000'001Dh
выделены желтым цветом ячеек и элементом (#4) .
Кусочек | ЕАХ | EBX | EDX [а] | Кусочек | ||
---|---|---|---|---|---|---|
0 | Тип кэша:
| Размер строки когерентности системы в байтах, минус 1 | WBINVD Область действия для аннулирования кэша. Значение 0 указывает, что инструкции INVD / WBINVD аннулируют все кэши нижних уровней этого кэша, включая кэши, принадлежащие процессорам-братьям, разделяющим этот кэш. Значение 1 указывает, что кэши нижних уровней процессоров-братьев, разделяющих этот кэш, не обязательно будут очищены. | 0 | ||
1 | Инклюзивность кэша. Если 1, то кэш включает кэши более низкого уровня. | 1 | ||||
2 | Сложная индексация кэша. Если 1, то кэш использует сложную функцию для индексации кэша, в противном случае кэш напрямую отображается. (#4) | 2 | ||||
3 | (сдержанный) | 3 | ||||
4 | (сдержанный) | 4 | ||||
7:5 | Уровень кэша (начиная с 1) | (сдержанный) | 7:5 | |||
8 | Самоинициализирующийся уровень кэша (1=не требует программной инициализации после сброса) | (сдержанный) | 8 | |||
9 | Полностью ассоциативный кэш | (сдержанный) | 9 | |||
10 | ( WBINVD область выполнения аннулирования кэша) [b] (#4) | (сдержанный) | 10 | |||
11 | (Инклюзивность кэша) [b] (#4) | (сдержанный) | 11 | |||
13:12 | (сдержанный) | Физические разделы строк (количество строк кэша, имеющих общий тег адреса кэша), минус 1 | (сдержанный) | 13:12 | ||
21:14 | Максимальное количество адресуемых идентификаторов для логических процессоров, разделяющих этот кэш, минус 1 | (сдержанный) | 21:14 | |||
25:22 | Способы ассоциативности кэша , минус 1 | (сдержанный) | 25:22 | |||
31:26 | Максимальное количество адресуемых идентификаторов для ядер процессора в физическом корпусе, минус 1 (#4) | (сдержанный) | 31:26 |
GenuineIntel
семейство 0Bh
). [42] Для других процессоров вместо этого следует использовать биты 1:0 EDX.Для любых допустимых и не полностью ассоциативных кэшей возвращаемое в ECX значение равно числу наборов в кэше минус 1. (Для полностью ассоциативных кэшей ECX следует рассматривать так, как если бы он возвращал значение 0.) Для любого заданного кэша, описанного подлистом листа CPUID
или 4
, 8000'001Dh
общий размер кэша в байтах можно вычислить следующим образом:
CacheSize = (EBX[11:0]+1) * (EBX[21:12]+1) * (EBX[31:22]+1) * (ECX+1)
Например, на процессорах Intel Crystalwell выполнение CPUID с EAX=4 и ECX=4 приведет к тому, что процессор вернет следующую информацию о размере кэша уровня 4 в EBX и ECX: EBX=03C0F03F
и ECX=00001FFF
- это следует понимать так, что этот кэш имеет размер строки кэша 64 байта (EBX[11:0]+1), имеет 16 строк кэша на тег (EBX[21:12]+1), является 16-канальным наборно-ассоциативным (EBX[31:22]+1) с 8192 наборами (ECX+1), что составляет общий размер 64*16*16*8192=134217728 байт или 128 двоичных мегабайт.
Эти два листа используются для топологии процессора (поток, ядро, пакет) и перечисления иерархии кэша в многоядерных (и гиперпоточных) процессорах Intel. [89] По состоянию на 2013 год [update]AMD не использует эти листья, но имеет альтернативные способы перечисления ядер. [90]
В отличие от большинства других листьев CPUID, лист Bh будет возвращать разные значения в EDX в зависимости от того, на каком логическом процессоре выполняется инструкция CPUID; возвращаемое в EDX значение на самом деле является идентификатором x2APIC логического процессора. Однако пространство идентификаторов x2APIC не отображается непрерывно на логические процессоры; в отображении могут быть пробелы, что означает, что некоторые промежуточные идентификаторы x2APIC не обязательно соответствуют какому-либо логическому процессору. Дополнительная информация для отображения идентификаторов x2APIC на ядра предоставляется в других регистрах. Хотя лист Bh имеет подлистья (выбираемые ECX, как описано ниже), возвращаемое в EDX значение зависит только от логического процессора, на котором выполняется инструкция, но не от подлистья.
Топология процессора(ов), представленная листом Bh, является иерархической, но со странной оговоркой, что порядок (логических) уровней в этой иерархии не обязательно соответствует порядку в физической иерархии ( SMT /core/package). Однако каждый логический уровень может быть запрошен как подлист ECX (листа Bh) для его соответствия «типу уровня», который может быть либо SMT, ядром, либо «недействительным». Пространство идентификаторов уровня начинается с 0 и является непрерывным, что означает, что если идентификатор уровня недействителен, все идентификаторы более высоких уровней также будут недействительными. Тип уровня возвращается в битах 15:08 ECX, в то время как количество логических процессоров на запрашиваемом уровне возвращается в EBX. Наконец, связь между этими уровнями и идентификаторами x2APIC возвращается в EAX[4:0] как количество бит, на которое идентификатор x2APIC должен быть сдвинут, чтобы получить уникальный идентификатор на следующем уровне.
Например, двухъядерный процессор Westmere , способный поддерживать гиперпоточность (имеющий два ядра и четыре потока в общей сложности), может иметь идентификаторы x2APIC 0, 1, 4 и 5 для своих четырех логических процессоров. Лист Bh (=EAX), подлист 0 (=ECX) CPUID может, например, возвращать 100h в ECX, что означает, что уровень 0 описывает уровень SMT (гиперпоточность), и возвращать 2 в EBX, поскольку на каждое физическое ядро приходится два логических процессора (единицы SMT). Значение, возвращаемое в EAX для этого 0-подлиста, в этом случае должно быть 1, поскольку сдвиг вышеупомянутых идентификаторов x2APIC вправо на один бит дает уникальный номер ядра (на следующем уровне иерархии идентификаторов уровня) и стирает бит идентификатора SMT внутри каждого ядра. Более простой способ интерпретации этой информации заключается в том, что последний бит (бит номер 0) идентификатора x2APIC идентифицирует блок SMT/hyperthreading внутри каждого ядра в нашем примере. Переход к подлисту 1 (путем выполнения другого вызова CPUID с EAX=Bh и ECX=1) может, например, вернуть 201h в ECX, что означает, что это уровень типа ядра, и 4 в EBX, поскольку в пакете 4 логических процессора; возвращаемый EAX может быть любым значением больше 3, поскольку так получается, что бит номер 2 используется для идентификации ядра в идентификаторе x2APIC. Обратите внимание, что бит номер 1 идентификатора x2APIC в этом примере не используется. Однако возвращаемый EAX на этом уровне вполне может быть 4 (и так оно и есть на Clarkdale Core i3 5x0), поскольку это также дает уникальный идентификатор на уровне пакета (очевидно, = 0) при сдвиге идентификатора x2APIC на 4 бита. Наконец, вы можете задаться вопросом, что может нам рассказать лист EAX=4, чего мы еще не узнали. В EAX[31:26] он возвращает биты маски APIC, зарезервированные для пакета; в нашем примере это будет 111b, поскольку биты с 0 по 2 используются для идентификации логических процессоров внутри этого пакета, но бит 1 также зарезервирован, хотя и не используется как часть схемы идентификации логического процессора. Другими словами, идентификаторы APIC с 0 по 7 зарезервированы для пакета, хотя половина этих значений не сопоставляется с логическим процессором.
Иерархия кэша процессора исследуется путем рассмотрения подлистьев листа 4. Идентификаторы APIC также используются в этой иерархии для передачи информации о том, как различные уровни кэша совместно используются блоками SMT и ядрами. Продолжая наш пример, кэш L2, который совместно используется блоками SMT одного и того же ядра, но не между физическими ядрами на Westmere, обозначается установкой EAX[26:14] в 1, в то время как информация о том, что кэш L3 совместно используется всем пакетом, обозначается установкой этих битов в (по крайней мере) 111b. Подробности кэша, включая тип кэша, размер и ассоциативность, передаются через другие регистры на листе 4.
Остерегайтесь, что более старые версии Intel app note 485 содержат некоторую вводящую в заблуждение информацию, особенно в отношении идентификации и подсчета ядер в многоядерном процессоре; [91] ошибки от неправильной интерпретации этой информации были даже включены в пример кода Microsoft для использования CPUID, даже для издания Visual Studio 2013 года, [92] а также на странице sandpile.org для CPUID, [93] но пример кода Intel для идентификации топологии процессора [89] имеет правильную интерпретацию, а текущее Руководство разработчика программного обеспечения Intel имеет более понятный язык. (Открытый исходный код) кроссплатформенного производственного кода [94] от Wildfire Games также реализует правильную интерпретацию документации Intel.
Примеры определения топологии, включающие старые (до 2010 года) процессоры Intel, в которых отсутствует x2APIC (и, следовательно, не реализован лист EAX=Bh), приведены в презентации Intel 2010 года. [95] Помните, что использование этого старого метода определения на процессорах Intel 2010 года и более новых может переоценить количество ядер и логических процессоров, поскольку старый метод определения предполагает, что в пространстве идентификаторов APIC нет пробелов, и это предположение нарушается некоторыми новыми процессорами (начиная с серии Core i3 5x0), но эти новые процессоры также поставляются с x2APIC, поэтому их топологию можно правильно определить с помощью метода листа EAX=Bh.
Возвращает информацию о функциях, связанных с инструкциями MONITOR
и MWAIT
в регистрах EAX, EBX, ECX и EDX.
Кусочек | ЕАХ | EBX | EDX | Кусочек | ||
---|---|---|---|---|---|---|
3:0 | Наименьший размер строки монитора в байтах | Наибольший размер строки монитора в байтах | Количество поддерживаемых подсостояний C0 [a]MWAIT | 3:0 | ||
7:4 | Количество поддерживаемых подсостояний C1MWAIT | 7:4 | ||||
11:8 | Количество поддерживаемых подсостояний C2MWAIT | 11:8 | ||||
15:12 | Количество поддерживаемых подсостояний C3MWAIT | 15:12 | ||||
19:16 | (сдержанный) | (сдержанный) | Количество поддерживаемых подсостояний C4MWAIT | 19:16 | ||
23:20 | Количество поддерживаемых подсостояний C5MWAIT | 23:20 | ||||
27:24 | Количество поддерживаемых подсостояний C6MWAIT | 27:24 | ||||
31:28 | Количество поддерживаемых подсостояний C7MWAIT | 31:28 |
Кусочек | Екб | |
---|---|---|
Короткий | Особенность | |
0 | ЕМХ | Перечисление расширений MONITOR/MWAIT в ECX и EDX поддерживается |
1 | МБП | Поддерживает обработку прерываний как событий останова, MWAIT даже если прерывания отключены. |
2 | (сдержанный) | |
3 | Безмониторный_MWAIT | Разрешить MWAIT использовать для управления питанием без настройки мониторинга памяти с помощью MONITOR [96] |
31:4 | (сдержанный) |
Это возвращает биты функций в регистре EAX и дополнительную информацию в регистрах EBX, ECX и EDX.
Кусочек | ЕАХ | |
---|---|---|
Короткий | Особенность | |
0 | ДТС | Возможности цифрового термодатчика |
1 | Возможности технологии Intel Turbo Boost | |
2 | АРАТ [а] | Возможность использования постоянно работающего таймера APIC |
3 | (сдержанный) | |
4 | польских злотых | Возможность уведомления об ограничении мощности |
5 | ECMD | Возможность расширенной модуляции тактовой частоты |
6 | ПТМ | Возможность управления температурой упаковки |
7 | HWP | Аппаратно-управляемые состояния производительности . Добавлены MSR:
|
8 | HWP_Уведомление | Уведомление HWP об изменении динамической гарантированной производительности - IA32_HWP_INTERRUPT ( 773h ) MSR |
9 | HWP_Activity_Window | Управление окном активности HWP - биты 41:32 IA32_HWP_REQUEST MSR |
10 | HWP_Энергоэффективность_Предпочтение | HWP Управление предпочтениями в области энергии/производительности - биты 31:24 IA32_HWP_REQUEST MSR |
11 | HWP_Package_Level_Request | HWP Контроль на уровне пакетов - IA32_HWP_REQUEST_PKG ( 772h ) MSR |
12 | (сдержанный) | |
13 | HDC | Поддерживается аппаратный режим Duty Cycling . Добавлены MSR:
|
14 | Доступна технология Intel Turbo Boost Max 3.0 | |
15 | Поддерживаются прерывания при изменении IA32_HWP_CAPABILITIES .Highest_Performance (биты 7:0) | |
16 | Поддерживается переопределение HWP PECI - биты 63:60 IA32_HWP_PECI_REQUEST_INFO ( 775h ) MSR | |
17 | Гибкий HWP - биты 63:59 IA32_HWP_REQUEST MSR | |
18 | Режим быстрого доступа | Поддерживается режим быстрого доступа для IA32_HWP_REQUEST MSR [b] |
19 | HW_FEEDBACK | Интерфейс обратной связи оборудования. Добавлены MSR:
|
20 | IA32_HWP_REQUEST бездействующего логического процессора игнорируется, когда активен только один из двух логических процессоров, совместно использующих физический процессор . | |
21 | (сдержанный) | |
22 | HWP Управление MSR | IA32_HWP_CTL ( 776h ) MSR поддерживается [98] |
23 | Поддерживается Intel Thread Director. Добавлены MSR:
| |
24 | IA32_THERM_INTERRUPT Поддерживается MSR бит 25 | |
31:25 | (сдержанный) |
IA32_HWP_REQUEST
MSR на процессорах, которые его поддерживают, необходимо установить бит 0 FAST_UNCORE_MSRS_CTL
( 657h
) MSR.Кусочек | EBX | Екб | EDX | Кусочек | ||
---|---|---|---|---|---|---|
0 | Количество порогов прерывания в цифровом тепловом датчике | Поддерживаемый эффективный частотный интерфейс - IA32_MPERF ( 0E7h ) и IA32_APERF ( 0E8h ) MSR | Отчеты об отзывах оборудования: поддерживается отчетность о возможностях производительности | 0 | ||
1 | (Возможность ACNT2) [a] | Отчеты об отзывах оборудования: поддерживается отчетность о возможностях эффективности | 1 | |||
2 | (сдержанный) | (сдержанный) | 2 | |||
3 | Возможность смещения производительности и энергии - IA32_ENERGY_PERF_BIAS ( 1B0h ) MSR | 3 | ||||
7:4 | (сдержанный) | (сдержанный) | 7:4 | |||
11:8 | Количество классов Intel Thread Director, поддерживаемых оборудованием | Размер структуры интерфейса аппаратной обратной связи (в единицах по 4 КБ) минус 1 | 11:8 | |||
15:12 | (сдержанный) | 15:12 | ||||
31:16 | (сдержанный) | Индекс строки этого логического процессора в структуре интерфейса аппаратной обратной связи | 31:16 |
Это возвращает флаги расширенных функций в EBX, ECX и EDX. Возвращает максимальное значение ECX для EAX=7 в EAX.
Кусочек | EBX | Екб | EDX | Кусочек | |||||
---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | ||||
0 | fsgsbase | Доступ к базе %fs и %gs | prefetchwt1 | PREFETCHWT1 инструкция | (sgx-tem) [а] | ? | 0 | ||
1 | IA32_TSC_ADJUST MSR | avx512-vbmi | Инструкции по векторной битовой манипуляции AVX-512 | sgx-ключи | Услуги аттестации для Intel SGX | 1 | |||
2 | sgx | Расширения программного обеспечения Guard | умип | Предотвращение инструкций пользовательского режима | avx512-4vnniw | Инструкции нейронной сети AVX-512 с 4 регистрами | 2 | ||
3 | бми1 | Набор инструкций по битовой манипуляции 1 | пку | Ключи защиты памяти для страниц пользовательского режима | avx512-4fкарты | AVX-512 4-регистровый умножитель с накоплением, одинарная точность | 3 | ||
4 | хле | TSX Аппаратная блокировка Elision | оспке | PKU поддерживается ОС | фсрм | Быстрый короткийREP MOVSB | 4 | ||
5 | avx2 | Расширенные векторные расширения 2 | waitpkg | Инструкции по временной паузе и мониторингу/ожиданию на уровне пользователя ( TPAUSE , UMONITOR , UMWAIT ) | uintr | Прерывания между процессорами пользователя | 5 | ||
6 | fdp-excptn-only | Регистр указателя данных FPU x87 обновляется только при исключениях | avx512-vbmi2 | Инструкции по векторной битовой манипуляции AVX-512 2 | (сдержанный) | 6 | |||
7 | смэп | Предотвращение выполнения режима супервизора | cet_ss/шстк | Обеспечение потока управления (CET): теневой стек (альтернативное название SHSTK) | (сдержанный) | 7 | |||
8 | бми2 | Набор инструкций по битовой манипуляции 2 | гфни | Инструкции по полю Галуа | avx512-vp2intersect | Инструкции по векторному пересечению AVX-512 для 32/64-битных целых чисел | 8 | ||
9 | эмм | УлучшенныйREP MOVSB/STOSB | ваес | Набор инструкций Vector AES (VEX-256/EVEX) | srbds-ctrl | Специальные буферные регистры выборки данных смягчения | 9 | ||
10 | invpcid | INVPCID инструкция | vpclmulqdq | Набор инструкций CLMUL (VEX-256/EVEX) | md-чистый | VERW инструкция очищает буферы ЦП | 10 | ||
11 | ртм | Ограниченная транзакционная память TSX | avx512-vnni | Инструкции векторной нейронной сети AVX-512 | rtm-всегда-отмена [101] | Все транзакции TSX отменены | 11 | ||
12 | рдт-м/пквм | Мониторинг Intel Resource Director (RDT) или мониторинг QOS платформы AMD | avx512-биталг | Инструкции AVX-512 BITALG | (сдержанный) | 12 | |||
13 | x87 FPU CS и DS устарели | tme_ru | Доступны MSR для полного шифрования памяти | rtm-force-abort [101] | TSX_FORCE_ABORT (MSR 0x10f ) доступен | 13 | |||
14 | мпх | Intel MPX (расширения защиты памяти) | avx512-vpopcntdq | Подсчет популяции вектора AVX-512 с двойным и четверным словом | сериализовать | SERIALIZE инструкция | 14 | ||
15 | rdt-a/pqe | Распределение ресурсов Intel Resource Director (RDT) или обеспечение QOS на платформе AMD | (фзм) [а] | ? | гибридный | Смешение типов ЦП в топологии процессора (например, Alder Lake ) | 15 | ||
16 | avx512-ф | AVX-512 Фундамент | ла57 | 5-уровневая страничная адресация (57 бит адреса) | tsxldtrk | Инструкции по приостановке/возобновлению отслеживания адреса загрузки TSXTSUSLDTRK ( и TRESLDTRK ) | 16 | ||
17 | avx512-dq | Инструкции AVX-512 Doubleword и Quadword | мавау | Значение пользовательского пространства MPX Address-Width Adjust, используемое инструкциями MPXBNDLDX и Intel в 64-битном режимеBNDSTX | (сдержанный) | 17 | |||
18 | rdseed | RDSEED инструкция | pconfig | Конфигурация платформы (Инструкции по технологиям шифрования памяти) | 18 | ||||
19 | адкс | Intel ADX (расширения инструкций сложения и переноса с высокой точностью) | лбр | Архитектурные записи последней ветви | 19 | ||||
20 | смапа | Предотвращение доступа в режиме супервизора | cet-ibt | Обеспечение потока управления (CET): косвенное отслеживание ветвлений | 20 | ||||
21 | avx512-ifma | Инструкции AVX-512 по целочисленному умножению-сложению | (сдержанный) | 21 | |||||
22 | (pcommit) | ( PCOMMIT инструкция, устарело) [103] | rdpid | RDPID (Чтение идентификатора процессора) инструкция и IA32_TSC_AUX MSR | amx-bf16 | Вычисление плитки AMX на числах bfloat16 | 22 | ||
23 | clflushopt | CLFLUSHOPT инструкция | кл | Шкафчик для ключей AES | avx512-fp16 | Арифметические инструкции с плавающей точкой половинной точности AVX-512 [104] | 23 | ||
24 | клвб | CLWB (Инструкция обратной записи строки кэша) | bus-lock-обнаружение | Исключения отладки блокировки шины | amx-плитка | Инструкции по загрузке/хранению плитки AMX | 24 | ||
25 | пт | Трассировка процессора Intel | cldemote | CLDEMOTE (Понижение уровня строки кэша) инструкция | amx-int8 | Вычисление плитки AMX на 8-битных целых числах | 25 | ||
26 | avx512-pf | Инструкции предварительной выборки AVX-512 | (мпрр) [а] | ? | ibrs / spec_ctrl | Контроль спекуляций, часть контроля косвенных ветвей (IBC): спекуляция с ограничением косвенных ветвей (IBRS) и барьер предсказания косвенных ветвей (IBPB) [105] [106] | 26 | ||
27 | avx512-er | AVX-512 Экспоненциальные и обратные инструкции | мовдири | MOVDIRI инструкция | стибп | Однопоточный косвенный предиктор ветвления, часть IBC [105] | 27 | ||
28 | avx512-cd | Инструкции по обнаружению конфликтов AVX-512 | movdir64b | MOVDIR64B (64-байтовая инструкция прямого хранения) | L1D_FLUSH | IA32_FLUSH_CMD МСР | 28 | ||
29 | ша | Расширения SHA-1 и SHA-256 | enqcmd | Поставить в очередь магазины и EMQCMD / EMQCMDS инструкции | IA32_ARCH_CAPABILITIES MSR (перечисляет спекулятивные меры по смягчению последствий сторонних каналов [105] ) | 29 | |||
30 | avx512-bw | Инструкции по байтам и словам AVX-512 | sgx-lc | Конфигурация запуска SGX | IA32_CORE_CAPABILITIES MSR (перечисляет основные возможности модели) | 30 | |||
31 | avx512-vl | Расширения длины вектора AVX-512 | пкс | Ключи защиты для страниц режима супервизора | ссбд | Отключение обхода спекулятивного магазина, [105] как смягчение для обхода спекулятивного магазина (IA32_SPEC_CTRL) | 31 |
Это возвращает флаги расширенных функций во всех четырех регистрах.
Кусочек | ЕАХ | EBX | Екб | EDX | Кусочек | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | |||||
0 | ша512 | Расширения SHA-512 | Intel PPIN (защищенный инвентарный номер процессора): IA32_PPIN_CTL ( 04Eh ) и IA32_PPIN ( 04Fh ) MSR. | (сдержанный) | (сдержанный) | 0 | ||||||
1 | см3 | Расширения хэша SM3 | pbndkb | Полное шифрование хранилища: PBNDKB инструкция и TSE_CAPABILITY ( 9F1h ) MSR. | (сдержанный) | (сдержанный) | 1 | |||||
2 | см4 | Расширения шифра SM4 | (сдержанный) | (устаревшая_редуцированная_иса) | (X86S, [107] отменено [108] ) | (сдержанный) | 2 | |||||
3 | рао-инт | Удаленные атомарные операции над целыми числами: AADD , AAND , AOR , AXOR инструкции | CPUIDMAXVAL_LIM_RMV | Если 1, то бит 22 IA32_MISC_ENABLE не может быть установлен в 1, чтобы ограничить значение, возвращаемое функцией CPUID.(EAX=0):EAX[7:0] . | (сдержанный) | (сдержанный) | 3 | |||||
4 | avx-vnni | Инструкции векторной нейронной сети AVX (VNNI) (в кодировке VEX) | (сдержанный) | (сипи64) | 64-битный SIPI (Startup InterProcessor Interrupt) (часть отмененного X86S) | avx-vnni-int8 | Инструкции AVX VNNI INT8 | 4 | ||||
5 | avx512-bf16 | Инструкции AVX-512 для чисел bfloat16 | (сдержанный) | MSR_IMM | Непосредственные формы RDMSR и WRMSRNS инструкции | avx-ne-конвертировать | Инструкции AVX по преобразованию FP без исключений ( bfloat16 ↔FP32 и FP16 →FP32) | 5 | ||||
6 | девчонка | Линейное разделение адресного пространства (CR4 бит 27) | (сдержанный) | (сдержанный) | (сдержанный) | 6 | ||||||
7 | cmpccxadd | CMPccXADD инструкции | (сдержанный) | (сдержанный) | (сдержанный) | 7 | ||||||
8 | archperfmonext | Мониторинг архитектурных характеристик Расширенная створка (EAX=23h) | (сдержанный) | (сдержанный) | amx-комплекс | Поддержка AMX для «сложных» плиток ( TCMMIMFP16PS и TCMMRLFP16PS ) | 8 | |||||
9 | (дедупликация) [а] | ? | (сдержанный) | (сдержанный) | (сдержанный) | 9 | ||||||
10 | фзрм | Быстрая нулевая длина REP MOVSB | (сдержанный) | (сдержанный) | avx-vnni-int16 | Инструкции AVX VNNI INT16 | 10 | |||||
11 | фсрс | Быстрый короткийREP STOSB | (сдержанный) | (сдержанный) | (сдержанный) | 11 | ||||||
12 | rsrcs | Быстро, коротко REP CMPSB иREP SCASB | (сдержанный) | (сдержанный) | (сдержанный) | 12 | ||||||
13 | (сдержанный) | (сдержанный) | (сдержанный) | утмр | События пользовательского таймера: IA32_UINTR_TIMER ( 1B00h ) MSR | 13 | ||||||
14 | (сдержанный) | (сдержанный) | (сдержанный) | префетчи | Инструкции предварительной выборки кэша инструкций ( PREFETCHIT0 и PREFETCHIT1 ) | 14 | ||||||
15 | (сдержанный) | (сдержанный) | (сдержанный) | пользователь_msr | Инструкции по доступу к MSR в пользовательском режиме ( URDMSR и UWRMSR ) | 15 | ||||||
16 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 16 | |||||||
17 | Фред | Гибкий возврат и доставка на мероприятие [109] | (сдержанный) | (сдержанный) | uiret-uif-из-rflags | Если 1, UIRET инструкция (возврат пользовательского прерывания) установит UIF (флаг пользовательского прерывания) в значение бита 1 образа RFLAGS, извлеченного из стека. | 17 | |||||
18 | лкгс | LKGS Инструкция [109] | (сдержанный) | (сдержанный) | cet-sss | Если 1, то теневые стеки супервизора (SSS) контроля потока управления (CET) гарантированно не станут преждевременно занятыми, пока переключение теневого стека не приведет к ошибкам страниц в стеке, на который выполняется переключение. [110] [111] | 18 | |||||
19 | wrmsrns | WRMSRNS инструкция (несериализующая запись в MSR ) | (сдержанный) | (сдержанный) | avx10 | AVX10 Конвергентный вектор ISA (см. также лист 24h) [112] | 19 | |||||
20 | nmi_src | Отчет источника NMI [109] | (сдержанный) | (сдержанный) | (сдержанный) | 20 | ||||||
21 | amx-fp16 | Инструкции AMX для номеров FP16 | (сдержанный) | (сдержанный) | APX_F | Расширения Advanced Performance Extensions , Foundation (добавляет REX2 и расширенные кодировки префиксов EVEX для поддержки 32 GPR, а также некоторые новые инструкции) [113] | 21 | |||||
22 | hreset | HRESET инструкция, IA32_HRESET_ENABLE ( 17DAh ) MSR и сброс истории процессора Leaf (EAX=20h) | (сдержанный) | (сдержанный) | (сдержанный) | 22 | ||||||
23 | avx-ifma | Инструкции AVX IFMA | (сдержанный) | (сдержанный) | мжду | Инструкция MWAIT [б] | 23 | |||||
24 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 24 | |||||||
25 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 25 | |||||||
26 | лам | Маскировка линейного адреса | (сдержанный) | (сдержанный) | (сдержанный) | 26 | ||||||
27 | msrlist | RDMSRLIST и WRMSRLIST инструкции, а также IA32_BARRIER ( 02Fh ) MSR | (сдержанный) | (сдержанный) | (сдержанный) | 27 | ||||||
28 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 28 | |||||||
29 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 29 | |||||||
30 | invd_disable_post_bios_done | Если 1, поддерживается INVD предотвращение выполнения инструкций после завершения BIOS. | (сдержанный) | (сдержанный) | (сдержанный) | 30 | ||||||
31 | МОВРС | MOVRS и PREFETCHRST2 поддерживаемые инструкции (чтение памяти/предварительная выборка с подсказкой общего чтения) | (сдержанный) | (сдержанный) | (сдержанный) | 31 |
MWAIT
может быть указана либо CPUID.(EAX=1).ECX[3] , либо CPUID.(EAX=7,ECX=1).EDX[23]. (Один или оба могут быть установлены.) Первый MONITOR
также указывает на поддержку инструкции, в то время как последний не указывает тем или иным образом, MONITOR
присутствует ли инструкция. MWAIT
без MONITOR
может присутствовать в системах, которые поддерживают функцию "Monitorless MWAIT" (которая сама по себе указана CPUID.(EAX=5).ECX[3] .)Это возвращает флаги расширенных функций в EDX.
EAX, EBX и ECX зарезервированы.
Кусочек | EDX | |
---|---|---|
Короткий | Особенность | |
0 | psfd | Поддерживается отключение Fast Store Forwarding Predictor [114]SPEC_CTRL . ( (MSR 48h ) бит 7) |
1 | ipred_ctrl | Поддерживаются элементы управления IPRED_DIS [115] . ( SPEC_CTRL биты 3 и 4)IPRED_DIS предотвращает спекулятивное выполнение инструкций в непрямой целевой точке ветвления до тех пор, пока не будет разрешен целевой адрес ветвления. |
2 | rrsba_ctrl | Поведение RRSBA [116] [115] отключено поддерживается. ( SPEC_CTRL биты 5 и 6) |
3 | ddpd_u | Поддерживается отключение зависимой от данных предварительной выборки [117]SPEC_CTRL . ( бит 8) |
4 | bhi_ctrl | Поведение BHI_DIS_S [115] включено поддерживается. ( SPEC_CTRL бит 10)BHI_DIS_S предотвращает выбор прогнозируемых целей косвенных ветвей, выполненных в кольце 0/1/2, на основе истории ветвей из ветвей, выполненных в кольце 3. |
5 | mcdt_no | Если установлено, процессор не будет демонстрировать синхронизацию, зависящую от конфигурации MXCSR . |
6 | Поддерживается функция отключения UC-lock. | |
7 | монитор_mitg_no | Если установлено, это указывает на то, что инструкции MONITOR / UMONITOR не подвержены проблемам с производительностью/питанием, вызванным превышением инструкций емкости внутренней таблицы отслеживания монитора. [118] |
31:8 | (сдержанный) |
Этот лист используется для перечисления функций XSAVE и компонентов состояния.
Расширение набора инструкций XSAVE предназначено для сохранения/восстановления расширенного состояния ЦП (обычно для переключения контекста ) таким образом, чтобы его можно было расширить для охвата новых расширений набора инструкций без необходимости понимания специфики новых расширений кодом переключения контекста ОС. Это делается путем определения ряда компонентов состояния , каждый из которых имеет размер и смещение в заданной области сохранения, и каждый соответствует подмножеству состояния, необходимого для того или иного расширения ЦП. EAX=0Dh
Лист CPUID используется для предоставления информации о том, какие компоненты состояния поддерживает ЦП и каковы их размеры/смещения, чтобы ОС могла зарезервировать надлежащее количество пространства и установить соответствующие биты включения.
Компоненты состояния можно разделить на две группы: пользовательское состояние (элементы состояния, которые видны приложению, например, векторные регистры AVX-512 ) и состояние супервизора (элементы состояния, которые влияют на приложение, но не видны пользователю напрямую, например, конфигурация прерывания пользовательского режима). Элементы пользовательского состояния включаются путем установки связанных с ними битов в XCR0
регистре управления, в то время как элементы состояния супервизора включаются путем установки связанных с ними битов в IA32_XSS
( 0DA0h
) MSR - указанные элементы состояния затем становятся компонентами состояния, которые можно сохранять и восстанавливать с помощью семейства инструкций XSAVE
/ .XRSTOR
Механизм XSAVE может обрабатывать до 63 компонентов состояния таким образом. Компоненты состояния 0 и 1 ( x87 и SSE соответственно) имеют фиксированные смещения и размеры - для компонентов состояния 2-62 их размеры, смещения и несколько дополнительных флагов можно запросить, выполнив CPUID
с EAX=0Dh
и ECX
установив индекс компонента состояния. Это вернет следующие элементы в EAX, EBX и ECX (с зарезервированным EDX):
Кусочек | ЕАХ | EBX | Екб | Кусочек |
---|---|---|---|---|
0 | Размер в байтах компонента состояния | Смещение state-компонента от начала области XSAVE сохраненияXRSTOR (Это смещение равно 0 для компонентов состояния супервизора, поскольку их можно сохранить только с помощью инструкции | Компонент состояния пользователя/супервизора:
| 0 |
1 | При использовании сжатия сохранения состояния включается 64-байтовое выравнивание. Если этот бит установлен для state-component, то при сохранении state с уплотнением, padding будет вставлен между предыдущим state-component и этим state-component по мере необходимости для обеспечения 64-байтового выравнивания. Если этот бит не установлен, state-component будет сохранен непосредственно после предыдущего. | 1 | ||
31:2 | (сдержанный) | 31:2 |
Попытка запросить неподдерживаемый компонент состояния таким образом приводит к тому, что EAX, EBX, ECX и EDX устанавливаются в 0.
Подлистья 0 и 1 CPUID
листа 0Dh
используются для предоставления информации о функциях:
EBX | Екб | EDX:EAX |
---|---|---|
Максимальный размер (в байтах) области сохранения XSAVE для набора компонентов состояния, установленных в данный момент в XCR0 . | Максимальный размер (в байтах) области сохранения XSAVE, если все компоненты состояния, поддерживаемые XCR0 этим ЦП, были включены одновременно. | 64-битная битовая карта компонентов состояния, поддерживаемая XCR0 этим процессором. |
ЕАХ | EBX | EDX:ECX |
---|---|---|
Флаги функций XSAVE (см. таблицу ниже) | Размер (в байтах) области XSAVE, содержащей все установленные в данный момент компоненты состояния XCR0 и IA32_XSS объединенные. | 64-битная битовая карта компонентов состояния, поддерживаемая IA32_XSS этим процессором. |
Кусочек | ЕАХ | |
---|---|---|
Короткий | Особенность | |
0 | xsaveopt | XSAVEOPT инструкция: сохранить компоненты состояния, которые были изменены с момента последнегоXRSTOR |
1 | xsavec | XSAVEC инструкция: сохранить/восстановить состояние с уплотнением |
2 | xgetbv_ecx1 | XGETBV с ECX=1 поддержкой |
3 | хсс | XSAVES и XRSTORS инструкции и IA32_XSS MSR: сохранение/восстановление состояния со сжатием, включая состояние супервизора. |
4 | xfd | Поддерживается XFD (отключение расширенных функций) |
31:5 | (сдержанный) |
По состоянию на июль 2023 года архитектурно определены следующие компоненты состояния XSAVE:
Индекс | Описание | Включено с |
---|---|---|
0 | состояние x87 | XCR0 [а] |
1 | Состояние SSEXMM0 : - XMM15 иMXCSR | XCR0 |
2 | Состояние AVX : верхние половины YMM0 кYMM15 | |
3 | Состояние MPXBND0 : - BND3 регистры границ | |
4 | Состояние MPX: BNDCFGU и BNDSTATUS регистры | |
5 | Состояние AVX-512 : регистры opmask k0 -k7 | |
6 | Состояние AVX-512 "ZMM_Hi256": верхние ZMM0 половиныZMM15 | |
7 | Состояние AVX-512 "Hi16_ZMM": ZMM16 -ZMM31 | |
8 | Состояние трассировки процессора | IA32_XSS |
9 | Реестр ПКРУ (ключей защиты пользователей) | XCR0 |
10 | Состояние PASID (идентификатор адресного пространства процесса) | IA32_XSS |
11 | Состояние CET_U (технология обеспечения потока управления: функциональность пользовательского режима MSR) | |
12 | Состояние CET_S (CET: указатели теневого стека для колец 0,1,2) | |
13 | Состояние HDC (аппаратный циклический режим) | |
14 | Состояние UINTR (прерывания пользовательского режима) | |
15 | Состояние LBR (запись последней ветви) | |
16 | Состояние HWP (аппаратное управление P-состоянием) | |
17 | Состояние конфигурации плитки AMX :TILECFG | XCR0 |
18 | Регистры данных плитки AMX: tmm0 -tmm7 | |
19 | Расширенные регистры общего назначения APXr16 : - r31 [113] | |
20-61 | (сдержанный) | |
62 | Облегченное профилирование (LWP) (только AMD) | XCR0 |
63 | (зарезервировано) [б] |
XCR0
жестко установлен в 1, поэтому инструкции XSAVE всегда будут поддерживать сохранение/восстановление состояния x87.XCR0
и IA32_XSS
бит 63 зарезервирован специально для расширения битового вектора — это исключает существование компонента состояния 63.Этот лист предоставляет информацию о поддерживаемых возможностях функции Intel Software Guard Extensions (SGX). Лист предоставляет несколько подлистов, выбранных с помощью ECX.
Подлист 0 предоставляет информацию о поддерживаемых функциях листа SGX в EAX и максимальных поддерживаемых размерах анклава SGX в EDX; ECX зарезервирован. EBX предоставляет битовую карту битов, которые можно установить в поле MISCSELECT в SECS (структура управления анклавом SGX) — это поле используется для управления информацией, записанной в область MISC SSA (область сохранения состояния SGX), когда происходит AEX (выход из асинхронного анклава SGX).
Кусочек | ЕАХ | EBX | EDX | Кусочек | |||||
---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | ||||
0 | sgx1 | Функции листьев SGX1 | ЭКСИНФО | MISCSELECT: вывести информацию об ошибке страницы и общем исключении защиты, произошедшем внутри анклава | Макс.РазмерАнклава_Не64 | Log2 максимального размера анклава, поддерживаемого в не-64-битном режиме | 0 | ||
1 | sgx2 | Листовые функции SGX2 | CPINFO | MISCSELECT: сообщить информацию об исключении защиты управления, которое произошло внутри анклава | 1 | ||||
2 | (сдержанный) | (сдержанный) | 2 | ||||||
3 | (сдержанный) | (сдержанный) | 3 | ||||||
4 | (сдержанный) | (сдержанный) | 4 | ||||||
5 | осс | ENCLV листья: EINCVIRTCHILD , EDECVIRTCHILD , иESETCONTEXT | (сдержанный) | 5 | |||||
6 | ENCLS листья: ETRACKC , ERDINFO , ELDBC ,ELDUC | (сдержанный) | 6 | ||||||
7 | ENCLU лист:EVERIFYREPORT2 | (сдержанный) | 7 | ||||||
8 | (сдержанный) | (сдержанный) | МаксРазмерАнклава_64 | Log2 максимального размера анклава, поддерживаемого в 64-битном режиме | 8 | ||||
9 | (сдержанный) | (сдержанный) | 9 | ||||||
10 | ENCLS лист:EUPDATESVN | (сдержанный) | 10 | ||||||
11 | ENCLU лист:EDECSSA | (сдержанный) | 11 | ||||||
12 | (сдержанный) | (сдержанный) | 12 | ||||||
13 | (сдержанный) | (сдержанный) | 13 | ||||||
14 | (сдержанный) | (сдержанный) | 14 | ||||||
15 | (сдержанный) | (сдержанный) | 15 | ||||||
31:16 | (сдержанный) | (сдержанный) | (сдержанный) | 31:16 |
Подлист 1 предоставляет битовую карту того, какие биты могут быть установлены в 128-битном поле АТРИБУТЫ SECS в EDX:ECX:EBX:EAX (это относится к копии SECS, используемой в качестве входных данных для ENCLS[ECREATE]
функции листа). Верхние 64 бита (указанные в EDX:ECX) являются битовой картой того, какие биты могут быть установлены в XFRM (маска запроса X-feature) - эта маска является битовой маской того, какие компоненты состояния ЦП (см. лист 0Dh) будут сохранены в SSA в случае AEX; это имеет ту же структуру, что и XCR0
регистр управления. Другие биты указаны в EAX и EBX следующим образом:
Кусочек | ЕАХ | EBX | Кусочек | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
0 | (ИНИТ) | (должно быть 0) [а] | (сдержанный) | 0 | ||
1 | ОТЛАЖИВАТЬ | Разрешить отладчику читать и записывать данные анклава с помощью EDBGRD иEDBGWR | 1 | |||
2 | РЕЖИМ64БИТ | 64-битный режим анклава | 2 | |||
3 | (сдержанный) | 3 | ||||
4 | ПРОВИЖНИЙКЛЮЧ | Ключ обеспечения доступен изEGETKEY | 4 | |||
5 | EINITTOKEN_KEY | EINIT ключ-токен доступен изEGETKEY | 5 | |||
6 | среднеевропейское время | Атрибуты CET (технология обеспечения потока управления) позволяют | 6 | |||
7 | КСС | Разделение и совместное использование ключей | 7 | |||
8 | (сдержанный) | 8 | ||||
9 | (сдержанный) | 9 | ||||
10 | AEXNOTIFY | Потоки внутри анклава могут получать уведомления AEX [119] | 10 | |||
31:11 | (сдержанный) | 31:11 |
ENCLS[EINIT]
. Этот бит должен быть 0 в копии SECS, которая задана как вход для ENCLS[CREATE]
.Подразделы 2 и выше используются для предоставления информации о том, какие области физической памяти доступны для использования в качестве разделов EPC (Enclave Page Cache) в SGX.
Биты | ЕАХ | EBX | Екб | EDX | Биты | |||
---|---|---|---|---|---|---|---|---|
3:0 | Тип подлистника:
| Биты 51:32 физического базового адреса раздела EPC | Свойства раздела EPC:
| Биты 51:32 размера раздела EPC | 3:0 | |||
11:4 | (сдержанный) | (сдержанный) | 11:4 | |||||
19:12 | Биты 31:12 физического базового адреса раздела EPC | Биты 31:12 размера раздела EPC | 19:12 | |||||
31:20 | (сдержанный) | (сдержанный) | 31:20 |
В этом подразделе представлена информация о функциях трассировки процессора Intel (также известной как трассировка инструкций в реальном времени).
Значение, возвращаемое в EAX, является индексом наивысшего подлиста, поддерживаемого для CPUID с EAX=14h. EBX и ECX предоставляют флаги функций, EDX зарезервирован.
Кусочек | EBX | Екб | Кусочек | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
0 | Поддерживается фильтрация CR3 | топоаут | Поддерживается механизм вывода ToPA (таблица физических адресов) для пакетов трассировки | 0 | ||
1 | Поддерживается настраиваемая скорость передачи пакетов PSB (Packet Stream Boundary) и режим Cycle-Accurate (пакеты CYC) | ментри | Таблицы ToPA могут содержать несколько выходных записей. | 1 | ||
2 | Поддерживается фильтрация IP, фильтрация TraceStop и сохранение MSR PT при «горячем» сбросе | snglrngout | Поддерживается схема однодиапазонного выхода | 2 | ||
3 | Поддерживаются пакеты синхронизации MTC (Mini Time Counter), а также подавление пакетов COFI (Change of Flow Instructions). | Поддерживается подсистема вывода в Trace Transport | 3 | |||
4 | ptwrite | PTWRITE инструкция поддерживается | (сдержанный) | 4 | ||
5 | Поддерживается трассировка событий питания | (сдержанный) | 5 | |||
6 | Поддерживается сохранение PSB и PMI (прерывание мониторинга производительности) | (сдержанный) | 6 | |||
7 | Поддерживается генерация пакета Event Trace | (сдержанный) | 7 | |||
8 | Поддерживается отключение генерации пакетов TNT (Branch Taken-Not-Taken). | (сдержанный) | 8 | |||
9 | Поддерживается PTTT (отслеживание триггера трассировки процессора) | (сдержанный) | 9 | |||
30:10 | (сдержанный) | (сдержанный) | 30:10 | |||
31 | (сдержанный) | Формат IP (Instruction Pointer) для пакетов трассировки, содержащих полезную нагрузку IP:
| 31 |
Эти два листа предоставляют информацию о различных частотах ЦП в EAX, EBX и ECX (EDX зарезервирован в обоих листах).
ЕАХ | EBX | Екб |
---|---|---|
Отношение частоты TSC к частоте Core Crystal Clock, знаменатель | Отношение частоты TSC к частоте Core Crystal Clock, числитель [a] | Частота ядра кристалла, в Гц [ a] |
Биты | ЕАХ | EBX | Екб | Биты |
---|---|---|---|---|
15:0 | Базовая частота процессора (в МГц) [a] | Максимальная частота процессора (в МГц) [a] | Частота шины/эталона (в МГц) [a] | 15:0 |
31:16 | (сдержанный) | (сдержанный) | (сдержанный) | 31:16 |
Если возвращаемые значения в EBX и ECX листа 15h оба не равны нулю, то частота TSC ( счетчик отметок времени ) в Гц определяется как TSCFreq = ECX*(EBX/EAX)
.
На некоторых процессорах (например, Intel Skylake ) CPUID_15h_ECX равен нулю, но CPUID_16h_EAX присутствует и не равен нулю. На всех известных процессорах, где это так, [120] частота TSC равна базовой частоте процессора, а тактовая частота кристалла ядра в Гц может быть вычислена как CoreCrystalFreq = (CPUID_16h_EAX * 10000000) * (CPUID_15h_EAX/CPUID_15h_EBX)
.
На процессорах, которые перечисляют отношение TSC/Core Crystal Clock в листе CPUID 15h, частота таймера APIC будет равна частоте Core Crystal Clock, деленной на делитель, указанный в регистре конфигурации деления APIC. [121]
Этот лист присутствует в системах, где ядро IP ЦП x86 реализовано в SoC ( система на чипе ) от другого поставщика - тогда как другие листья CPUID
предоставляют информацию о ядре ЦП x86, этот лист предоставляет информацию о SoC. Этот лист принимает индекс подлиста в ECX.
Подлист 0 возвращает максимальный индекс подлиста в EAX (не менее 3) и идентификационную информацию SoC в EBX/ECX/EDX:
Кусочек | EBX | Екб | EDX | Кусочек | ||
---|---|---|---|---|---|---|
15:0 | Идентификатор поставщика SoC | Идентификатор проекта SoC | Идентификатор шага SoC в проекте SoC | 15:0 | ||
16 | Схема идентификатора поставщика SoC
| 16 | ||||
31:17 | (сдержанный) | 31:17 |
ИДЕНТИФИКАТОР | Продавец |
---|---|
1 | Спредтрум [122] |
Подразделы 1–3 возвращают 48-байтовую строку бренда поставщика SoC в формате UTF-8 . Подраздел 1 возвращает первые 16 байт в EAX, EBX, ECX, EDX (в указанном порядке); подраздел 2 возвращает следующие 16 байт, а подраздел 3 возвращает последние 16 байт. Строка допускается, но не обязательно должна заканчиваться нулем .
В этом листе представлена информация о функциях Intel Key Locker в EAX, EBX и ECX. EDX зарезервирован.
Кусочек | ЕАХ | EBX | Екб | Кусочек | |||||
---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | ||||
0 | Ограничение Key Locker поддерживается только CPL0 | aes_kle | Включены инструкции AES "Key Locker" | Параметр без резервного копирования LOADIWKEY поддерживается | 0 | ||||
1 | Ограничение Key Locker на отсутствие шифрования поддерживается | (сдержанный) | Поддерживается кодировка KeySource 1 (рандомизация внутреннего ключа упаковки) | 1 | |||||
2 | Поддерживается ограничение Key Locker на отсутствие дешифрования | aes_wide_kl | Инструкции AES "Широкий шкафчик с ключом" | (сдержанный) | 2 | ||||
3 | (Ограничение процесса) [a] | (сдержанный) | (сдержанный) | 3 | |||||
4 | (сдержанный) | kl_msrs | MSR «Key Locker» | (сдержанный) | 4 | ||||
31:5 | (сдержанный) | (сдержанный) | (сдержанный) | 31:5 |
Когда ECX=0
, в EAX перечисляется наивысший поддерживаемый "палитра" subleaf. Когда , возвращается ECX≥1
информация о палитре n .
Биты | ЕАХ | EBX | Екб | EDX | Биты | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | |||||
15:0 | общее_количество_байтов_плиток | Размер всех регистров плитки, в байтах (8192) | байт_на_строку | (64) | макс_строк | (16) | (сдержанный) | 15:0 | ||||
31:16 | байт_на_плитку | Размер одной плитки, в байтах (1024) | макс_имена | Количество регистров плитки (8) | (сдержанный) | (сдержанный) | 31:16 |
TMUL
ИнформацияЭтот лист возвращает информацию о TMUL
единице (множителе плитки).
Биты | ЕАХ | EBX | Екб | EDX | Биты | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | |||||
7:0 | (сдержанный) | tmul_maxk | Максимальное количество строк или столбцов (16) | (сдержанный) | (сдержанный) | 7:0 | ||||||
15:8 | (сдержанный) | tmul_maxn | Максимальное количество байтов на столбец (64) | (сдержанный) | (сдержанный) | 15:8 | ||||||
23:16 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 23:16 | |||||||
31:24 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 31:24 |
TMUL
ИнформацияЭтот лист возвращает флаги функций на TMUL
блоке (множитель плитки).
Биты | ЕАХ | EBX | Екб | EDX | Биты | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | |||||
0 | amx-int8 | Поддержка 8-битных целых чисел | (сдержанный) | (сдержанный) | (сдержанный) | 0 | ||||||
1 | amx-bf16 | поддержка bfloat16 | (сдержанный) | (сдержанный) | (сдержанный) | 1 | ||||||
2 | amx-комплекс | Поддержка комплексных чисел | (сдержанный) | (сдержанный) | (сдержанный) | 2 | ||||||
3 | amx-fp16 | поддержка float16 | (сдержанный) | (сдержанный) | (сдержанный) | 3 | ||||||
4 | amx-fp8 | поддержка float8 | (сдержанный) | (сдержанный) | (сдержанный) | 4 | ||||||
5 | amx-транспонирование | Поддержка инструкций по транспонированию | (сдержанный) | (сдержанный) | (сдержанный) | 5 | ||||||
6 | amx-tf32 | поддержка tf32/fp19 | (сдержанный) | (сдержанный) | (сдержанный) | 6 | ||||||
7 | amx-avx512 | Поддержка AMX-AVX512 | (сдержанный) | (сдержанный) | (сдержанный) | 7 | ||||||
8 | amx-movrs | Поддержка AMX-MOVRS | (сдержанный) | (сдержанный) | (сдержанный) | 8 | ||||||
31:9 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 31:9 |
Когда Intel TDX ( Trust Domain Extensions ) активен, попытки выполнить CPUID
инструкцию гостем TD ( Trust Domain ) будут перехвачены модулем TDX. Этот модуль, при CPUID
вызове с помощью EAX=21h
и ECX=0
(leaf 21h
, sub-leaf 0 ), вернет индекс наивысшего поддерживаемого sub-leaf для leaf 21h
in EAX
и строку идентификатора поставщика модуля TDX в виде 12-байтовой строки ASCII в EBX, EDX, ECX (в указанном порядке). Собственная реализация модуля Intel возвращает строку идентификатора поставщика (с четырьмя конечными пробелами) [123] - для этого модуля дополнительная информация о функциях недоступна и должна быть получена через специфичную для TDX инструкцию."IntelTDX "
CPUID
TDCALL
Этот лист зарезервирован в оборудовании и (на процессорах, у которых наивысший базовый лист равен 21h
или выше) вернет 0 в EAX/EBX/ECX/EDX при запуске непосредственно на ЦП.
Это возвращает максимально поддерживаемый подлист в EAX и информацию о функциях AVX10 в EBX. [112] (ECX и EDX зарезервированы.)
Кусочек | EBX | |
---|---|---|
Короткий | Особенность | |
7:0 | Версия AVX10 Converged Vector ISA (≥1) | |
16:8 | (сдержанный) | |
17 | avx10-256 | Присутствует поддержка 256-битных векторов |
18 | avx10-512 | Присутствует поддержка 512-битных векторов. |
31:19 | (сдержанный) |
Subleaf 1 зарезервирован для функций AVX10, не привязанных к версии. В настоящее время не определены.
Самая высокая функция возвращается в EAX. Этот лист присутствует только на процессорах Xeon Phi . [124]
Эта функция возвращает флаги функций.
Кусочек | ЕАХ | EBX | Екб | EDX | Кусочек | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | Короткий | Особенность | |||||
3:0 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 3:0 | |||||||
4 | (сдержанный) | (сдержанный) | (сдержанный) | к1ом | К1ОМ [124] | 4 | ||||||
31:5 | (сдержанный) | (сдержанный) | (сдержанный) | (сдержанный) | 31:5 |
При CPUID
выполнении инструкции в условиях виртуализации Intel VT-x или AMD-v она будет перехвачена гипервизором, что позволит гипервизору вернуть CPUID
флаги функций, которые отличаются от флагов базового оборудования. CPUID
Листья не 40000000h
реализованы 4FFFFFFFh
на аппаратном уровне и зарезервированы для использования гипервизорами для предоставления специфичной для гипервизора идентификации и информации о функциях с помощью этого механизма перехвата.
Для leaf 40000000h
гипервизор должен вернуть индекс самого высокого поддерживаемого листа CPUID гипервизора в EAX и 12-символьную строку идентификатора гипервизора в EBX,ECX,EDX (в указанном порядке). Для leaf 40000001h
гипервизор может вернуть сигнатуру идентификации интерфейса в EAX — например, гипервизоры, желающие объявить о своей совместимости с Hyper-V, могут вернуть 0x31237648
— "Hv#1"
в EAX. [125] [126] Форматы листьев 40000001h
и до самого высокого поддерживаемого листа в остальном зависят от гипервизора. Гипервизоры, реализующие эти листья, обычно также устанавливают бит 31 ECX для листа CPUID 1, чтобы указать на их присутствие.
Гипервизоры, которые предоставляют более одного интерфейса гипервизора, могут предоставлять дополнительные наборы листьев CPUID для дополнительных интерфейсов с интервалом 100h
листьев на интерфейс. Например, когда QEMU настроен на предоставление интерфейсов Hyper-V и KVM , он предоставит информацию Hyper-V, начиная с листа CPUID 40000000h
, и информацию KVM, начиная с листа 40000100h
. [127] [128]
Вот некоторые гипервизоры, которые, как известно, возвращают строку идентификатора гипервизора в листе 40000000h
:
Гипервизор | Строка идентификатора (ASCII) | Примечания |
---|---|---|
Microsoft Hyper-V , виртуальный ПК Windows | "Microsoft Hv" [125] | |
Linux KVM | "KVMKVMKVM\0\0\0" [129] | \0 обозначает символ ASCII NUL. |
"Linux KVM Hv" [130] | Эмуляция Hyper-V [131] | |
бхайв | "BHyVE BHyVE " ,"bhyve bhyve " | В 2013 году строка идентификатора была изменена со смешанного регистра на нижний. [132] Строка в нижнем регистре также используется в гипервизорах, производных от bhyve, таких как xhyve и HyperKit. [133] |
Ксен | "XenVMMXenVMM" [134] | Только при использовании режима HVM (аппаратная виртуальная машина). |
QEMU | "TCGTCGTCGTCG" [135] | Только при включенном TCG (генератор крошечных кодов). |
Параллели | " lrpepyh vr" | (возможно, это должно быть «prl hyperv», но оно закодировано как «lrpepyh vr» из-за несоответствия порядка байтов ) [ необходима цитата ] |
VMware | "VMwareVMware" [136] | |
Проект ACRN | "ACRNACRNACRN" [137] | |
VirtualBox | "VBoxVBoxVBox" [138] | Только при настройке на использование поставщика паравиртуализации «hyperv». |
Гипервизор QNX | "QXNQSBMV" | Метод обнаружения гипервизора QNX, представленный в официальной документации QNX [139], проверяет только первые 8 символов строки, как указано в EBX и ECX (включая изменение порядка байтов) — EDX игнорируется и может принимать любое значение. |
NetBSD NVMM | "___ NVMM ___" [140] | |
OpenBSD VMM | "OpenBSDVMM58" [141] | |
Тюрьма | "Jailhouse\0\0\0" [142] | \0 обозначает символ ASCII NUL. |
Intel HAXM | "HAXMHAXMHAXM" [143] | Проект прекращен. |
Intel KGT (Надежный) | "EVMMEVMMEVMM" [144] | Только ветка "trusty" KGT, которая используется для дистрибутива архитектуры Intel x86 ОС Trusty (архив) (KGT также возвращает подпись в |
Unisys s-Par | "UnisysSpar64" [145] | |
Локхид Мартин LMHS | "SRESRESRESRE" [146] |
Наивысший вызывающий параметр возвращается в EAX.
EBX/ECX/EDX возвращают строку идентификатора производителя (такую же, как EAX=0) на процессорах AMD, но не на процессорах Intel.
Это возвращает флаги расширенных функций в EDX и ECX.
Многие биты EDX
(биты с 0 по 9, с 12 по 17, 23 и 24) являются дубликатами битов EDX
из EAX=1
листа — эти биты выделены светло-желтым цветом. (Эти дублирующиеся биты присутствуют в процессорах AMD, но не в процессорах Intel.)
Флаги функций AMD следующие: [147] [148]
Кусочек | EDX | Екб | Кусочек | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
0 | фпу | Встроенный x87 FPU | lahf_lm | LAHF / SAHF в длинном режиме | 0 | |
1 | вмэ | Расширения виртуального режима (VIF) | cmp_legacy | Гиперпоточность недопустима | 1 | |
2 | де | Отладка расширений ( CR4 бит 3) | свм | Безопасная виртуальная машина | 2 | |
3 | псе | Расширение размера страницы | экстапический | Расширенное пространство APIC | 3 | |
4 | тск | Счетчик отметок времени | cr8_наследие | CR8 в 32-битном режиме | 4 | |
5 | мср | Регистры, специфичные для модели | abm/lzcnt | Расширенная манипуляция битами и )(LZCNT POPCNT | 5 | |
6 | паэ | Расширение физического адреса | sse4a | SSE4a | 6 | |
7 | мсе | Исключение проверки машины | смещение | Неправильно настроенный режим SSE | 7 | |
8 | cx8 | CMPXCHG8B ( сравнить и поменять местами ) инструкция | 3dnowprefetch | PREFETCH и PREFETCHW инструкции | 8 | |
9 | апик | Встроенный усовершенствованный программируемый контроллер прерываний | освв | Видимый обходной путь ОС | 9 | |
10 | (системный вызов) [a] | ( SYSCALL / SYSRET , только K6) | СРК | Выборка на основе инструкций | 10 | |
11 | системный вызов [б] | SYSCALL и SYSRET инструкции | xop | Набор инструкций XOP | 11 | |
12 | мтрр | Тип памяти Диапазон Регистры | скинит | SKINIT / STGI инструкции | 12 | |
13 | стр. | Страница Глобального Разрешения Бита в CR4 | вдт | Таймер сторожевого таймера | 13 | |
14 | МКА | Архитектура машинной проверки | (сдержанный) | 14 | ||
15 | смов | Условный ход и FCMOV инструкции | лвп | Легкое профилирование [152] | 15 | |
16 | погладить [c] | Таблица атрибутов страницы | фма4 | 4-операндные объединенные инструкции умножения-сложения | 16 | |
17 | pse36 | 36-битное расширение размера страницы | тсе | Расширение кэша переводов | 17 | |
18 | (сдержанный) | (сдержанный) | 18 | |||
19 | и т.д. | Идентификация бренда процессора " Athlon MP " / " Sempron " [d] | nodeid_msr | NodeID MSR ( C001_100C ) [157] | 19 | |
20 | нкс | бит NX | (сдержанный) | 20 | ||
21 | (сдержанный) | тбм | Манипуляция с конечным битом | 21 | ||
22 | mmxext | Расширенный ММХ | топографический | Расширения топологии | 22 | |
23 | ммкс | Инструкции MMX | perfctr_core | Расширения счетчика производительности ядра | 23 | |
24 | фкср [с] | FXSAVE , FXRSTOR инструкции, CR4 бит 9 | perfctr_nb | Расширения счетчика производительности северного моста | 24 | |
25 | fxsr_opt | FXSAVE / FXRSTOR оптимизации | (StreamPerfMon) | (Архитектура монитора потоковой производительности) [e] | 25 | |
26 | pdpe1gb | Гигабайт страниц | дбкс | Расширения точек останова данных | 26 | |
27 | rdtscp | RDTSCP инструкция | perftsc | Счетчик временных меток производительности (PTSC) | 27 | |
28 | (сдержанный) | pcx_l2i | Расширения счетчика производительности L2I | 28 | ||
29 | лм | Длинный режим | мониторx | MONITORX и MWAITX инструкции | 29 | |
30 | 3dnowext | Расширенный 3DNow! | addr_mask_ext | Расширение маски адреса до 32 бит для точек останова инструкций | 30 | |
31 | 3dсейчас | 3DСейчас! | (сдержанный) | 31 |
SYSCALL
/ SYSRET
действительно только для процессоров AuthenticAMD
семейства 5 модели 7 ( AMD K6 , 250 нм «Little Foot») — для всех остальных процессоров вместо этого следует использовать бит EDX 11.Эти инструкции были впервые введены в модели 7 [149] — бит CPUID, указывающий на их поддержку, был перемещен [150] в бит EDX 11, начиная с модели 8 ( AMD K6-2 ).
SYSCALL
/ SYSRET
устанавливается только в том случае, если CPUID
инструкция выполняется в 64-битном режиме. [151]FCMOV
Бит 16: поддерживается условное перемещение с плавающей точкой ( )AuthenticAMD
семейства 6 — этот бит в сочетании с сигнатурой процессора и скоростью системной шины используется для идентификации процессоров как многопроцессорных или имеющих торговую марку Sempron . [156]Они возвращают строку марки процессора в EAX, EBX, ECX и EDX. CPUID
необходимо выдавать с каждым параметром по порядку, чтобы получить всю 48-байтовую строку марки процессора ASCII. [159] Необходимо проверить, присутствует ли функция в ЦП, выдав сначала CPUID
with EAX = 80000000h
и проверив, не меньше ли возвращаемое значение 80000004h
.
В документации Intel/AMD указано, что строка должна заканчиваться нулем , однако это не всегда так (например, известно, что DM&P Vortex86DX3 и AMD Ryzen 7 6800HS возвращают строки брендов без завершающего нуля в листьях 80000002h
- 80000004h
[160] [161] ), и программное обеспечение не должно полагаться на это.
#include <stdio.h> #include <string.h> #include <cpuid.h> int main () { unsigned int regs [ 12 ]; char str [ sizeof ( regs ) + 1 ]; __cpuid ( 0x80000000 , регистры [ 0 ], регистры [ 1 ], регистры [ 2 ], регистры [ 3 ]); если ( regs [ 0 ] < 0x80000004 ) вернуть 1 ; __cpuid ( 0x80000002 , регистры [ 0 ], регистры [ 1 ], регистры [ 2 ], регистры [ 3 ]); __cpuid ( 0x80000003 , регистры [ 4 ], регистры [ 5 ], регистры [ 6 ], регистры [ 7 ]); __cpuid ( 0x80000004 , регистры [ 8 ], регистры [ 9 ], регистры [ 10 ], регистры [ 11 ]); memcpy ( str , regs , sizeof ( regs )); str [ sizeof ( regs )] = '\0' ; printf ( "%s \n " , str ); вернуть 0 ; }
На процессорах AMD, начиная с 180 нм Athlon ( AuthenticAMD
семейство 6, модель 2 и более поздние), можно изменить строку бренда процессора, возвращаемую листьями CPUID 80000002h
, 80000004h
используя WRMSR
инструкцию для записи 48-байтовой строки замены в MSR C0010030h
- C0010035h
. [156] [162] Это также можно сделать на AMD Geode GX/LX, хотя и с использованием MSR 300Ah
- 300Fh
. [163]
В некоторых случаях для определения поставщика ЦП требуется изучить не только идентификатор поставщика в CPUID leaf 0 и подпись ЦП в leaf 1, но и строку бренда процессора в leaves 80000002h
- 80000004h
. Известные случаи включают:
Montage
в строке бренда процессоров Montage (например, Montage Jintide C2460 [164] и Intel Xeon Platinum 8160 [165] — оба из которых идентифицируют себя как GenuineIntel
Family 6 Model 55h Stepping 4 — можно отличить таким образом).CentaurHauls
Процессоры семейства 6 могут быть процессорами VIA или Zhaoxin — их можно отличить по наличию подстроки ZHAOXIN
в строке бренда процессоров Zhaoxin (например, Zhaoxin KaiXian ZX-C+ C4580 [166] и VIA Eden X4 C4250 [167] — оба из которых идентифицируют себя как CentaurHauls
семейство 6, модель 0Fh, степпинг 0Eh — можно отличить таким образом).Это предоставляет информацию о характеристиках кэша процессора уровня 1 и TLB в EAX, EBX, ECX и EDX следующим образом: [a]
Биты | ЕАХ | EBX | Екб | EDX | Биты | |
---|---|---|---|---|---|---|
7:0 | Количество записей TLB инструкций [c] | Размер строки кэша в байтах | 7:0 | |||
15:8 | ассоциативность инструкции TLB [d] | Количество строк кэша на тег | 15:8 | |||
23:16 | Количество записей TLB данных [c] | Ассоциативность кэша [d] | 23:16 | |||
31:24 | Ассоциативность данных TLB [d] | Размер кэша в килобайтах | 31:24 |
CyrixInstead
на Geode by NSC
процессорах семейства 5 модели 4) лист 80000005h
существует, но имеет совершенно другой формат, похожий на формат листа 2. [168]0x80000005
в EAX. Это имеет то же значение, что и EAX=0, т. е. нет hugepage TLB.FFh
используется для указания TLB на 256 записей.80000005h
используются следующие значения:Ценить | Значение |
---|---|
0 | (сдержанный) |
1 | Прямое отображение |
2 кFEh | N-канальный набор-ассоциативный (поле кодирует N) |
FFh | Полностью ассоциативный |
Возвращает сведения о кэше L2 в ECX, включая размер строки в байтах (биты 07–00), тип ассоциативности (кодируется 4-битным полем; биты 15–12) и размер кэша в КБ (биты 31–16).
#include <stdio.h> #include <cpuid.h> int main () { беззнаковое целое eax , ebx , ecx , edx ; беззнаковое целое lsize , assoc , cache ; __cpuid ( 0x80000006 , eax , ebx , ecx , edx ); lsize = ecx & 0xff ; assoc = ( ecx >> 12 ) & 0x07 ; cache = ( ecx >> 16 ) & 0xffff ; printf ( "Размер строки: %d Б, Тип ассоц.: %d, Размер кэша: %d КБ. \n " , lsize , assoc , cache ); вернуть 0 ; }
Эта функция предоставляет информацию об управлении питанием, отчетах по питанию и возможностях RAS ( надежность, доступность и удобство обслуживания ) ЦП.
Кусочек | EBX | EDX | Кусочек | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
0 | MCAOverflowRecov | Поддержка восстановления после переполнения MCA (Machine Check Architecture) | ТС | Датчик температуры | 0 | |
1 | ПОМОЩЬ | Возможность локализации и восстановления неисправимых ошибок программного обеспечения | ПИД | Контроль частоты идентификатора | 1 | |
2 | HWA | Поддержка аппаратного подтверждения (MSR C001_10C0 дляC001_10DF | ВИД | Контроль напряжения ID | 2 | |
3 | МасштабируемыйMca | Поддерживается масштабируемая MCA | ТТП | ТЕРМТРИП | 3 | |
4 | (сдержанный) | ТМ | Поддерживается аппаратный термоконтроль (HTC) | 4 | ||
5 | (сдержанный) | СТЦ | Поддерживается программное обеспечение терморегулирования (STC) [170] | 5 | ||
6 | (сдержанный) | Шаги 100 МГц | Управление множителем 100 МГц | 6 | ||
7 | (сдержанный) | HwPstate | Аппаратное управление P-состоянием ( MSR C001_0061 )C001_0063 | 7 | ||
8 | (сдержанный) | TscИнвариант | Инвариантный TSC - скорость TSC ( счетчика временных меток ) гарантированно остается инвариантной для всех P-состояний, C-состояний и переходов грантов sop. | 8 | ||
9 | (сдержанный) | КПБ | Повышение производительности ядра | 9 | ||
10 | (сдержанный) | EffFreqRO | Интерфейс эффективной частоты только для чтения (MSR C000_00E7 и C000_00E8 ) | 10 | ||
11 | (сдержанный) | ProcFeedbackInterface | Поддерживаемый интерфейс обратной связи процессора | 11 | ||
12 | (сдержанный) | ProcPowerReporting | Поддерживается интерфейс отчетности о мощности процессора | 12 | ||
13 | (сдержанный) | ПодключенОжидание | Подключенный режим ожидания [171] | 13 | ||
14 | (сдержанный) | РАПЛ | Предел средней мощности [171] | 14 | ||
15 | (сдержанный) | FastCPPC | Поддерживается быстрый CPPC (совместный контроль производительности процессора) [171] | 15 | ||
31:16 | (сдержанный) | (сдержанный) | 31:16 |
Биты | ЕАХ | Екб | Биты | |||
---|---|---|---|---|---|---|
Короткий | Особенность | Короткий | Особенность | |||
7:0 | Количество мониторов | Количество доступных пар MSR обратной связи процессора, начиная с MSR C001_0080 [ 172] | CpuPwrSampleTimeRatio | Отношение периода выборки накопителя мощности вычислительного блока к периоду счетчика TSC. | 7:0 | |
15:8 | Версия | Версия возможностей обратной связи процессора | 15:8 | |||
31:16 | МаксВремяОбмотки | Максимальное время между чтениями (в миллисекундах), которое должно использовать программное обеспечение, чтобы избежать двух циклов переноса. | 31:16 |
Bit | EBX | |
---|---|---|
Short | Feature | |
0 | clzero | CLZERO instruction |
1 | retired_instr | Retired instruction count MSR (C000_00E9h ) supported |
2 | xrstor_fp_err | XRSTOR restores FP errors |
3 | invlpgb | INVLPGB and TLBSYNC instructions |
4 | rdpru | RDPRU instruction |
5 | (reserved) | |
6 | mbe | Memory Bandwidth Enforcement |
7 | (reserved) | |
8 | mcommit | MCOMMIT instruction |
9 | wbnoinvd | WBNOINVD instruction |
10 | (reserved) | |
11 | (reserved) | |
12 | IBPB | Indirect Branch Prediction Barrier (performed by writing 1 to bit 0 of PRED_CMD (MSR 049h )) |
13 | wbinvd_int | WBINVD and WBNOINVD are interruptible |
14 | IBRS | Indirect Branch Restricted Speculation |
15 | STIBP | Single Thread Indirect Branch Prediction mode |
16 | IbrsAlwaysOn | IBRS mode has enhanced performance and should be left always on |
17 | StibpAlwaysOn | STIBP mode has enhanced performance and should be left always on |
18 | ibrs_preferred | IBRS preferred over software |
19 | ibrs_same_mode_protection | IBRS provides Same Mode Protection |
20 | no_efer_lmsle | EFER.LMSLE is unsupported[a] |
21 | invlpgb_nested | INVLPGB support for nested pages |
22 | (reserved) | |
23 | ppin | Protected Processor Inventory Number -
|
24 | ssbd | Speculative Store Bypass Disable |
25 | ssbd_legacy | Speculative Store Bypass Disable Legacy |
26 | ssbd_no | Speculative Store Bypass Disable Not Required |
27 | cppc | Collaborative Processor Performance Control |
28 | psfd | Predictive Store Forward Disable |
29 | btc_no | Branch Type Confusion: Processor not affected |
30 | IBPB_RET | IBPB (see bit 12) also clears return address predictor |
31 | branch_sampling | Branch Sampling Support[174] |
Bits | EAX | ECX | EDX | Bits | ||
---|---|---|---|---|---|---|
7:0 | Number of Physical Address Bits | Number of Physical Threads in processor (minus 1) | Maximum page count for INVLPGB instruction | 7:0 | ||
11:8 | Number of Linear Address Bits | (reserved) | 11:8 | |||
15:12 | APIC ID Size | 15:12 | ||||
17:16 | Guest Physical Address Size[b] | Performance Timestamp Counter size | Maximum ECX value recognized by RDPRU instruction | 17:16 | ||
23:18 | (reserved) | 23:18 | ||||
31:24 | (reserved) | 31:24 |
AuthenticAMD
Family 0Fh Model 14h[173] (90nm Athlon64/Opteron) CPUs and is present in all later AMD CPUs - except the ones with the 'no_efer_lmsle' flag set.This leaf returns information about AMD SVM (Secure Virtual Machine) features in EAX, EBX and EDX.
Bits | EAX | EBX | ECX | Bits | ||
---|---|---|---|---|---|---|
7:0 | SVM Revision Number | Number of available ASIDs (address space identifiers) | (reserved) | 7:0 | ||
8 | (hypervisor)[a] | 8 | ||||
31:9 | (reserved) | 31:9 |
Bit | EDX | |
---|---|---|
Short | Feature | |
0 | NP | Rapid Virtualization Indexing (Nested Paging) |
1 | LbrVirt | LBR (Last Branch Records) virtualization |
2 | SVML | SVM-Lock |
3 | NRIPS | nRIP (next sequential instruction pointer) save on #VMEXIT supported |
4 | TscRateMsr | MSR-based TSC rate control (MSR C000_0104h ) |
5 | VmcbClean | VMCB (Virtual Machine Control Block) clean bits supported |
6 | FlushByAsid | TLB flush events (e.g. CR3 writes, CR4.PGE toggles) only flush the TLB entries of the current ASID (address space ID) |
7 | DecodeAssist | Decode assists supported |
8 | PmcVirt | PMC (Performance Monitoring Counters) virtualization |
9 | (SseIsa10Compat)[b] | (reserved) |
10 | PauseFilter | PAUSE intercept filter supported |
11 | (reserved) | |
12 | PauseFilterThreshold | PAUSE filter cycle count threshold supported |
13 | AVIC | AMD Advanced Virtualized Interrupt Controller supported |
14 | (reserved) | |
15 | VMSAVEvirt | VMSAVE and VMLOAD virtualization |
16 | VGIF | Global Interrupt Flag (GIF) virtualization |
17 | GMET | Guest Mode Execution Trap |
18 | x2AVIC | x2APIC mode supported for AVIC |
19 | SSSCheck | SVM Supervisor shadow stack restrictions |
20 | SpecCtrl | SPEC_CTRL (MSR 2E0h ) virtualization |
21 | ROGPT | Read-Only Guest Page Table supported |
22 | (reserved) | |
23 | HOST_MCE_OVERRIDE | Guest mode Machine-check exceptions when host CR4.MCE=1 and guest CR4.MCE=0 cause intercepts instead of shutdowns |
24 | TlbiCtl | INVLPGB /TLBSYNC hypervisor enable in VMCB and TLBSYNC intercept support |
25 | VNMI | NMI (Non-Maskable interrupt) virtualization |
26 | IbsVirt | IBS (Instruction-Based Sampling) virtualization |
27 | ExtLvtOffsetFaultChg | Read/Write fault behavior for extended LVT offsets (APIC addresses 0x500-0x530 ) changed to Read Allowed, Write #VMEXIT[181] |
28 | VmcbAddrChkChg | VMCB address check change[181] |
29 | BusLockThreshold | Bus Lock Threshold |
30 | IdleHltIntercept | Idle HLT (HLT instruction executed while no virtual interrupt is pending) intercept |
31 | EnhancedShutdownIntercept | Support for EXITINFO1 on shutdown intercept, and nested shutdown intercepts will result in a non-interceptible shutdown.[182] |
Later AMD documentation, such as #25481 "CPUID specification" rev 2.18[176] and later, only lists the bit as reserved.
In rev 2.30[177] and later, a different bit is listed as reserved for hypervisor use: CPUID.(EAX=1):ECX[bit 31].
Rev 2.28 of #25481 lists the bit as "Ssse3Sse5Dis"[179] - in rev 2.34, it is listed as having been removed from the spec at rev 2.32 under the name "SseIsa10Compat".[180]
Bit | EAX | |
---|---|---|
Short | Feature | |
0 | SME | Secure Memory Encryption |
1 | SEV | Secure Encrypted Virtualization |
2 | PageFlushMSR | Page flush MSR (C001_011Eh ) supported |
3 | SEV-ES | SEV Encrypted State |
4 | SEV-SNP | SEV Secure Nested Paging |
5 | VMPL | VM Privilege Levels |
6 | RMPQUERY | RMPQUERY instruction supported |
7 | VmplSSS | VMPL Supervisor shadow stack supported |
8 | SecureTSC | Secure TSC supported |
9 | TscAuxVirtualization | Virtualization of TSC_AUX MSR (C000_0103 ) supported |
10 | HwEnfCacheCoh | Hardware cache coherency across encryption domains enforced |
11 | 64BitHost | SEV Guest execution only allowed from 64-bit host |
12 | RestrictedInjection | SEV-ES guests can refuse all event-injections except #HV (Hypervisor Injection Exception) |
13 | AlternateInjection | SEV-ES guests can use an encrypted VMCB field for event-injection |
14 | DebugVirt | Full debug state virtualization supported for SEV-ES and SEV-SNP guests |
15 | PreventHostIBS | Prevent host IBS for a SEV-ES guest |
16 | VTE | Virtual Transparent Encryption for SEV |
17 | VmgexitParameter | VMGEXIT parameter is supported (using the RAX register) |
18 | VirtualTomMsr | Virtual TOM (top-of-memory) MSR (C001_0135 ) supported |
19 | IbsVirtGuestCtl | IBS virtualization is supported for SEV-ES and SEV-SNP guests |
20 | PmcVirtGuestCtl | PMC virtualization is supported for SEV-ES and SEV-SNP guests |
21 | RMPREAD | RMPREAD instruction supported |
22 | GuestInterceptControl | Guest Intercept control supported for SEV-ES guests |
23 | SegmentedRmp | Segmented RMP (Reverse-Map Table) supported |
24 | VmsaRegProt | VMSA (VM Save Area) register protection supported |
25 | SmtProtection | SMT Protection supported |
26 | SecureAvic | Secure AVIC supported |
27 | AllowedSEVfeatures | ALLOWED_SEV_FEATURES_MASK field in VMCB (offset 138h ) supported |
28 | SVSMCommPageMSR | SVSM (Secure VM Service Module[183]) communication page MSR (C001_F000h ) supported |
29 | NestedVirtSnpMsr | VIRT_RMPUPDATE (C001_F001h ) and VIRT_PSMASH (C001_F002h ) MSRs supported |
30 | HvInUseWrAllowed | Writes to Hypervisor-owned paged allowed when marked in-use |
31 | IbpbOnEntry | IBPB on entry to virtual machine supported |
Bits | EBX | ECX | EDX | Bits |
---|---|---|---|---|
5:0 | C-bit (encryption enable bit) location in page table entry | Maximum ASID value that can be used for a SEV-enabled guest (maximum number of encrypted guests that can be supported simultaneously) | Minimum ASID value for a guest that is SEV-enabled but not SEV-ES-enabled | 5:0 |
11:6 | Physical address width reduction when memory encryption is enabled | 11:6 | ||
15:12 | Number of VMPLs (VM Privilege Levels) supported | 15:12 | ||
31:16 | (reserved) | 31:16 |
Bit | EAX | |
---|---|---|
Short | Feature | |
0 | NoNestedDataBp | Processor ignores nested data breakpoints |
1 | FsGsKernelGsBaseNonSerializing | WRMSR to the FS_BASE , GS_BASE and KernelGSBase MSRs is non-serializing[184] |
2 | LFenceAlwaysSerializing | LFENCE is always dispatch serializing |
3 | SmmPgCfgLock | SMM paging configuration lock supported |
4 | (reserved) | |
5 | (reserved) | |
6 | NullSelectClearsBase | Null segment selector loads also clear the destination segment register base and limit |
7 | UpperAddressIgnore | Upper Address Ignore is supported |
8 | AutomaticIBRS | Automatic IBRS |
9 | NoSmmCtlMSR | SMM_CTL MSR (C0010116h ) is not supported |
10 | FSRS | Fast short REP STOSB supported |
11 | FSRC | Fast short REPE CMPSB supported |
12 | PMC2PreciseRetire | PreciseRetire performance counter control bit (MSR C0010002h bit 43) supported[182] |
13 | PrefetchCtlMsr | PrefetchControl MSR (C0000108h ) is supported |
14 | L2TlbSIzeX32 | If set, L2 TLB sizes (leaf 80000006h ) are encoded as multiples of 32 |
15 | AMD_ERMSB | Processor supports AMD implementation of Enhanced REP MOVSB and REP STOSB |
16 | OPCODE_0F017_RECLAIM | Reserves opcode 0F 01 /7 for AMD use, returning #UD.[182] |
17 | CpuidUserDis | CPUID disable for non-privileged software (#GP) |
18 | EPSF | Enhanced Predictive Store Forwarding supported[184] |
19 | FAST_REP_SCASB | Fast Short REP SCASB supported |
20 | PREFETCHI | Instruction Cache prefetch instructions supported |
21 | FP512_DOWNGRADE | Downgrade of 512-bit datapath to 256-bit supported.[a] |
22 | WL_CLASS_SUPPORT | Support for workload-based heuristic feedback to OS for scheduling decisions |
23 | (reserved) | |
24 | ERAPS | Enhanced Return Address Predictor Security (see also EBX[23:16] "RapSize") |
25 | (reserved) | |
26 | (reserved) | |
27 | SBPB | Selective Branch Predictor Barrier supported[186] |
28 | IBPB_BRTYPE | IBPB flushes all branch type predictions[186] |
29 | SRSO_NO | CPU is not subject to SRSO (Speculative Return Stack Overflow) vulnerability[186] |
30 | SRSO_USER_KERNEL_NO | CPU is not subject to SRSO vulnerability across user/kernel boundary[186] |
31 | SRSO_MSR_FIX | SRSO can be mitigated by setting bit 4 of BP_CFG (MSR C001_102E )[186] |
Bit | EBX | |
---|---|---|
Short | Feature | |
15:0 | MicrocodePatchSize | The size of the Microcode patch in 16-byte multiples. If 0, the size of the patch is at most 5568 (15C0h) bytes |
23:16 | RapSize | Return Address Predictor Size. RapSize * 8 is the minimum number of CALL instructions without matching RET instructions that are needed to flush the Return Address Predictor. |
31:24 | (reserved) |
Several AMD CPU models will, for CPUID with EAX=8FFFFFFFh
, return an Easter Egg string in EAX, EBX, ECX and EDX.[187][188] Known Easter Egg strings include:
Processor | String |
---|---|
AMD K6 | NexGenerationAMD |
AMD K8 | IT'S HAMMER TIME |
AMD Jaguar[189] | HELLO KITTY! ^-^ |
Returns index of highest Centaur leaf in EAX. If the returned value in EAX is less than C0000001h
, then Centaur extended leaves are not supported.
Present in CPUs from VIA and Zhaoxin.
On IDT WinChip CPUs (CentaurHauls
Family 5), the extended leaves C0000001h-C0000005h
do not encode any Centaur-specific functionality but are instead aliases of leaves 80000001h-80000005h
.[190]
This leaf returns Centaur feature information (mainly VIA PadLock) in EDX.[191][192] (EAX, EBX and ECX are reserved.)
Bit | EDX | |
---|---|---|
Short | Feature | |
0 | sm2[a] | SM2 present |
1 | sm2_en[a] | SM2 enabled |
2 | rng | PadLock RNG present: XSTORE and REP XSTORE instructions |
3 | rng_en | RNG enabled |
4 | ccs[a] | PadLock SM3/SM4 instructions present: CCS_HASH and CCS_ENCRYPT |
5 | ccs_en[a] | SM3/SM4 instructions enabled |
6 | xcrypt | PadLock Advanced Cryptographic Engine (ACE, using AES cipher) present: REP XCRYPT(ECB,CBC,CFB,OFB) instructions |
7 | xcrypt_en | ACE enabled |
8 | ace2 | ACE v2 present: REP XCRYPTCTR instruction, as well as support for digest mode and misaligned data for ACE's REP XCRYPT* instructions. |
9 | ace2_en | ACE v2 enabled |
10 | phe | PadLock Hash Engine (PHE): REP XSHA1 and REP XSHA256 instructions |
11 | phe_en | PHE enabled |
12 | pmm | PadLock Montgomery Multiplier (PMM): REP MONTMUL instruction |
13 | pmm_en | PMM enabled |
14 | (reserved) | |
15 | zx_fma | FMA supported |
16 | parallax | Adaptive P-state control present |
17 | parallax_en | Adaptive P-state control enabled |
18 | overstress | Overstress feature for auto overclock present |
19 | overstress_en | Overstress feature for auto overclock enabled |
20 | tm3 | Thermal Monitor 3 present |
21 | tm3_en | Thermal Monitor 3 enabled |
22 | rng2 | RNG v2: Second generation RNG present |
23 | rng2_en | RNG v2 enabled |
24 | sem | SME feature present |
25 | phe2 | PHE v2: SHA384 and SHA512 present |
26 | phe2_en | PHE v2 enabled |
27 | xmodx | RSA instructions present: XMODEXP and MONTMUL2 |
28 | xmodx_en | RSA instructions enabled |
29 | vex | VEX instructions present |
30 | vex_en | VEX instructions enabled |
31 | stk | STK is present |
CentaurHauls
Family 6 Model 9 only),[193] bits 0,1,4,5 are used differently:0x110A
) presentFEMMS
instruction (opcode 0F 0E
) presentThis information is easy to access from other languages as well. For instance, the C code for gcc below prints the first five values, returned by the cpuid:
#include <stdio.h>#include <cpuid.h>int main(){ unsigned int i, eax, ebx, ecx, edx; for (i = 0; i < 5; i++) { __cpuid(i, eax, ebx, ecx, edx); printf ("InfoType %x\nEAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", i, eax, ebx, ecx, edx); } return 0;}
In MSVC and Borland/Embarcadero C compilers (bcc32) flavored inline assembly, the clobbering information is implicit in the instructions:
#include <stdio.h>int main(){ unsigned int a, b, c, d, i = 0; __asm { /* Do the call. */ mov EAX, i; cpuid; /* Save results. */ mov a, EAX; mov b, EBX; mov c, ECX; mov d, EDX; } printf ("InfoType %x\nEAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", i, a, b, c, d); return 0;}
If either version was written in plain assembly language, the programmer must manually save the results of EAX, EBX, ECX, and EDX elsewhere if they want to keep using the values.
GCC also provides a header called <cpuid.h>
on systems that have CPUID. The __cpuid
is a macro expanding to inline assembly. Typical usage would be:
#include <stdio.h>#include <cpuid.h>int main(){ unsigned int eax, ebx, ecx, edx; __cpuid(0 /* vendor string */, eax, ebx, ecx, edx); printf("EAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", eax, ebx, ecx, edx); return 0;}
But if one requested an extended feature not present on this CPU, they would not notice and might get random, unexpected results. Safer version is also provided in <cpuid.h>
. It checks for extended features and does some more safety checks. The output values are not passed using reference-like macro parameters, but more conventional pointers.
#include <stdio.h>#include <cpuid.h>int main(){ unsigned int eax, ebx, ecx, edx; /* 0x81234567 is nonexistent, but assume it exists */ if (!__get_cpuid (0x81234567, &eax, &ebx, &ecx, &edx)) { printf("Warning: CPUID request 0x81234567 not valid!\n"); return 1; } printf("EAX: %x\nEBX: %x\nECX: %x\nEDX: %x\n", eax, ebx, ecx, edx); return 0;}
Notice the ampersands in &a, &b, &c, &d
and the conditional statement. If the __get_cpuid
call receives a correct request, it will return a non-zero value, if it fails, zero.[194]
Microsoft Visual C compiler has builtin function __cpuid()
so the cpuid instruction may be embedded without using inline assembly, which is handy since the x86-64 version of MSVC does not allow inline assembly at all. The same program for MSVC would be:
#include <stdio.h>#ifdef _MSC_VER #include <intrin.h>#endifint main(){ unsigned int regs[4]; int i; for (i = 0; i < 4; i++) { __cpuid(regs, i); printf("The code %d gives %d, %d, %d, %d", regs[0], regs[1], regs[2], regs[3]); } return 0;}
Many interpreted or compiled scripting languages are capable of using CPUID via an FFI library. One such implementation shows usage of the Ruby FFI module to execute assembly language that includes the CPUID opcode.
.NET 5 and later versions provide the System.Runtime.Intrinsics.X86.X86base.CpuId
method. For instance, the C# code below prints the processor brand if it supports CPUID instruction:
using System.Runtime.InteropServices;using System.Runtime.Intrinsics.X86;using System.Text;namespace X86CPUID { class CPUBrandString { public static void Main(string[] args) { if (!X86Base.IsSupported) { Console.WriteLine("Your CPU does not support CPUID instruction."); } else { Span<int> raw = stackalloc int[12]; (raw[0], raw[1], raw[2], raw[3]) = X86Base.CpuId(unchecked((int)0x80000002), 0); (raw[4], raw[5], raw[6], raw[7]) = X86Base.CpuId(unchecked((int)0x80000003), 0); (raw[8], raw[9], raw[10], raw[11]) = X86Base.CpuId(unchecked((int)0x80000004), 0); Span<byte> bytes = MemoryMarshal.AsBytes(raw); string brand = Encoding.UTF8.GetString(bytes).Trim(); Console.WriteLine(brand); } } }}
Some of the non-x86 CPU architectures also provide certain forms of structured information about the processor's abilities, commonly as a set of special registers:
CPUID
coprocessor register which requires exception level EL1 or above to access.[195]STIDP
) instruction since the 1983 IBM 4381[196] for querying the processor ID.[197]STFLE
) instruction which lists the installed hardware features.[197]PrId
) and a series of daisy-chained Configuration Registers.[198]PVR
) identifying the processor model in use. The instruction requires supervisor access level.[199]DSP and transputer-like chip families have not taken up the instruction in any noticeable way, in spite of having (in relative terms) as many variations in design. Alternate ways of silicon identification might be present; for example, DSPs from Texas Instruments contain a memory-based register set for each functional unit that starts with identifiers determining the unit type and model, its ASIC design revision and features selected at the design phase, and continues with unit-specific control and data registers. Access to these areas is performed by simply using the existing load and store instructions; thus, for such devices, there is no need for extending the register set for device identification purposes.[citation needed]
CPUID
to identify various system settingsIntel and AMD CPUs have reserved bit 31 of ECX of CPUID leaf 0x1 as the hypervisor present bit. This bit allows hypervisors to indicate their presence to the guest operating system. Hypervisors set this bit and physical CPUs (all existing and future CPUs) set this bit to zero. Guest operating systems can test bit 31 to detect if they are running inside a virtual machine.
Bit 31 of ECX of CPUID leaf 0x1. This bit has been reserved by Intel & AMD for use by hypervisors and indicates the presence of a hypervisor. Virtual CPU's (hypervisors) set this bit to 1 and physical CPU's (all existing and future CPU's) set this bit to zero. This bit can be probed by the guest software to detect whether they are running inside a virtual machine.
15.2.2 Guest Mode This new processor mode is entered through the VMRUN instruction. When in guest mode, the behavior of some x86 instructions changes to facilitate virtualization. The CPUID function numbers 4000_0000h-4000_00FFh have been reserved for software use. Hypervisors can use these function numbers to provide an interface to pass information from the hypervisor to the guest. This is similar to extracting information about a physical CPU by using CPUID. Hypervisors use the CPUID Fn 400000[FF:00] bit to denote a virtual platform. Feature bit CPUID Fn0000_0001_ECX[31] has been reserved for use by hypervisors to indicate the presence of a hypervisor. Hypervisors set this bit to 1 and physical CPU's set this bit to zero. This bit can be probed by the guest software to detect whether they are running inside a virtual machine.
8FFFFFFFh
. Retrieved 22 December 2022.