Лекція №13. Виключення у системі машинного контролю для процесорів Pentium. Глобальність системи машинного контролю. Регістровий банк повідомлення про помилки. Ініціалізація та увімкнення системи машинного контролю.
Родина процесорів P6 має систему машинного контролю, що забезпечує механізм для визначення і повідомлення про апаратні помилки, такі як помилки системної шини, помилки парнрсті, помилки кеша, помилки TLB. Ця система складається з множини машинно-залежних регістрів(Model Specific Registers - MSR), що використовуються для встановлення машиної перевірки і додаткові банки MSR для запису помилок, що знайдено. Реалізація архітектури машинного контролю дозволяє процесору рестартувати неординарно після генерування виключення машинної перевірки; але, обробник виключеня машинної перевірки може збирати інформацію про помилки машиної перевірки з MSR.
На рисунку зображені MSR.
EMBED PBrush
MCG_CAP – регістр тільки для читання, що забезпечує інформацією про реалізацію архітектури машинної перевірки процесора. Він вміщує наступні поля:
Count fieldб біти від 0 до 7. Показують кількість апаратних банків для репортування про помилки в біжучій реалізації процесора.
MCG_CTL_P, біт 8. Вказує, що регістр MCG_CTL присутній.
Біти з 9 до 63 зарезервовано. Ефект після запису в регістр MCG_CAP не визначений.
MCG_STATUS – описує біжучий стан процесора після виключення машинної перевірки. Регістр містить наступні прапорці:
RIPV, біт 0 – вказує, що виконання програми може бути рестартоване
EIPV, біт 1 – вказує, що інструкція, на яку вказує IP, що поміщений в стек при виникненні виключення машинної перевірки безпосередньо пов’язана з помилкою.
MCIP, біт 2 – вказує, що було згенероване виключення машинної перевірки. Програмне забезпечення може встановлювати або обнулювати цей прапорець.
Біти з 3 по 63 зарезервовані.
MCG_CTL – присутній, якщо прапорець MCG_CTL_P в регістрі MCG_CAP встановлений. Регістр MCG_CTL контролює виключення машинної перевірки. Якщо він присутній, запис 1 до всіх бітів дозволяє всі риси машинної перевірки. Всі інші значення не визначені і залежать від конкретної реалізації.
Кожен банк регістрів повідомлення про помилки повинен вміщати MCi_CTL, MCi_STATUS, MCi_ADDR, і MCi_MISC MSR. Процесори родини P6 забезпечують 5 банків регістрів повідомлення про помилки. Перший регістр повідомлення про помилки (MC0_CTL) завжди починається з адреси 400H.
Mci_CTL контролюють репортування про специфічні помилки, що продукуються певним блоком апаратури(або групою блоків). Кожен з 64 прапорців представляють потенційну помилку. Встановлення цих прапорців дозволяє репортування про відповідну помилку. Запис 64-бітового значення FFFFFFFFFFFFFFFFH дозволяє відслідковувати всі помилки.
Mci_STATUS – містить інформацію, що пов’язана з помилкою перевірки машини, якщо її прапорець VAL встановлений. Програмне забезпечення відповідає за обнулення цього регістру записом в нього 0. Запис всіх 1 призведе до генерації виключення загального захисту
EMBED PBrush
MСi_ADDR – містить адресу коду або даних в пам’яті, що продукуються помилкою машинної перевірки при встановленому прапорці ADDRV в регістрі MСi_STATUS. Адреса повериається в якості 32-бітового зміщення в сегменті, 32-бітової лінійної адреси або 36-бітової фізичної адреси в залежності від типа помилки, що виникла.
MCi_MISC – містить додаткову інформацію, що описує помилку машинної перевірки.
Для використання архітектури машинної перевірки програмне забезпечення повинне ініціалізувати процесор для активізації виключень машинної перевірки і механізму повідомлення про помилки. Нижченаведений псевдокод перевіряє наявність архітектури машинної перевірки і виключень в процесорі, дозволяє виколючення машинної перевірки і регістрові банки повідомлень про помилки. Процедура ініціалізації сумісна з проесорами родин Pentium і P6.
EXECUTE the CPUID instruction;
READ bits 7 (MCE) and 14 (MCA) of the EDX register;
IF CPU supports MCE
THEN
IF CPU supports MCA
THEN
IF MCG_CAP.MCG_CTL_P = 1 (* MCG_CTL register is present *)
Set MCG_CTL register to all 1s; (* enables all MCA features *)
FI;
COUNT ??MCG_CAP.Count;
(* determine number of error-reporting banks supported *)
FOR error-reporting banks (1 through COUNT) DO
Set MC i_CTL register to all 1s;
(* enables logging of all errors except for the MC0_CTL register *)
OD
FOR error-reporting banks (0 through COUNT) DO
Set MC i_STATUS register to all 0s; (* clears all errors *)
OD
FI;
Set the MCE flag (bit 6) in CR4 register to enable machine-check exceptions;
FI;