- •6. Механизм стека регистров (rse)
- •6.1. Обзор rse и вспомогательной памяти
- •6.2. Внутреннее состояние rse
- •6.3. Разделы стека регистров
- •6.4. Работа rse
- •6.5. Управление rse
- •6.5.1. Регистр конфигурации стека регистров (rsc)
- •6.5.2. Регистр NaT совокупности регистрового стека (rnat)
- •6.5.3. Прикладные регистры указатели вспомогательной памяти (bspstore и bsp)
- •6.5.4. Инструкции управления rse
- •6.5.5 Плохой pfs, используемый переходом возврата
- •6.6. Прерывания rse
- •6.7. Поведение rse при прерываниях
- •6.8. Поведение rse в неполном регистровом окне
- •6.9. Взаимодействие rse и alat
- •6.10. Когерентность вспомогательной памяти и упорядочивание памяти
- •6.11. Переключения внешней памяти rse
- •6.11.1 Переключение из прерванного контекста
- •6.11.2. Возврат в прерванный контекст
- •6.11.3. Синхронное переключение вспомогательной памяти.
- •6.12. Инициализация rse
6.5. Управление rse
Механизм RSE может управляться на всех уровнях привилегий с помощью трех инструкций (cover, flushrs и loadrs) и обращения к четырем прикладным регистрам (mov в/из RSC, BSP, BSPSTORE и RNAT). Этот раздел сначала описывает каждый прикладной регистр RSE, а затем, обсуждает три управляющие инструкции.
6.5.1. Регистр конфигурации стека регистров (rsc)
Схема прикладного регистра RSC (Register Stack Configuration) описана в разделе первого тома 3.1.8.2. Этот раздел описывает семантику режима, уровень привилегий и поля порядка байт для RSC. Поле loadrs описано как часть инструкции loadrs в разделе 6.5.4.
Режимы RSC. В регистре RSC, два бита задают режим (mode), когда RSE генерирует операции сливания/заливания регистров. Когда оба бита нулевые (режим ленивого слежения), RSE запускает только принудительные загрузки и сохранения (когда инструкции alloc, flushrs, loadrs, br.ret или rfi требуют сливания или заливания регистров). Бит 0 поля RSE.mode, разрешает активные RSE загрузки. Табл. 6.3 определяет все четыре возможных режима RSE. Для будущей информации о RSE режимах реализованных в конкретном Itanium процессоре, посмотрите документацию, специфицирующую процессор.
Табл. 6.3. Режимы RSE (RSE.mode)
Режим |
Загрузки RSE |
Сохранения RSE |
RSE.mode |
Ленивое слежение |
Только принудительные |
Только принудительные |
00 |
Интенсивное сохран-е |
Только принудительные |
Активные и принудительные |
01 |
Интенсивная загрузка |
Активные и принудительные |
Только принудительные |
10 |
Активность |
Активные и принудительные |
Активные и принудительные |
11 |
Алгоритм, который решает, нужно ли и когда нужно спекулятивно выполнить активные операции сливания и заливания, является зависимым от реализации. Если RSE.mode не равно нулю, то программное обеспечение не может делать произвольные предположения о поведении RSE загрузок и сохранений. Кроме того, доступ к прикладным регистрам BSPSTORE и RNAT, и выполнение инструкций loadrs требует, чтобы RSE.mode был равен нулю (режим ленивого слежения). Если инструкция loadrs, либо перемещение в/из BSPSTORE, либо перемещение в/из RNAT, выполнено, когда RSE.mode не равно нулю, то вызывается ошибка «Нелегальная операция». Активные сливания/заливания регистра RNAT в/из вспомогательной памяти, являются разрешенными, только если механизм RSE находится в режиме интенсивных или активных загрузок/сохранений. В режиме ленивого слежения, механизм RSE может сливать/заливать регистр RNAT, только если требуется принудительно слить/залить последующий регистр.
Уровень привилегий RSE. Если допускается трансляция адреса (PSR.rt=1), то механизм RSE работает на уровне привилегий, определяемом двумя битами уровня привилегий в регистре конфигурации регистрового стека (RSC.pl). Проверки всех уровней привилегий для виртуальных обращений RSE, выполняются, используя уровень привилегий RSC.pl. Если RSC записывается, то биты уровня привилегий урезаются до текущего уровня привилегий процесса, то есть до числового максимума от текущего уровня привилегий и уровня привилегий в исходном регистре, записанном в RSC.pl.
Защита, также проверяется на основании текущих элементов в данных TLB. Механизм RSE всегда остается когерентным по отношению к данным TLB. Если трансляция, которая используется RSE, изменена или сброшена, то RSE немедленно начнет использование новой трансляции, либо удовлетворится промахом TLB. Только принудительные загрузки и сохранения могут вызвать ошибки RSE связанные с памятью. Детали о выдаче ошибок RSE, описаны в разделе 6.6 «Прерывания RSE». Хотя активные RSE загрузки и сохранения не вызывают прерываний, но при некоторых условиях, они могут вызвать обход VHPT и вставку TLB. Детали о том, когда RSE загрузки и сохранения могут вызвать обход VHPT, описаны в разделе 4.1.7 «Среда VHPT».
Механизм RSE ожидает, что его вспомогательная память отображается в кэшируемую спекулятивную память. Если транзакции RSE сливания/заливания выполнены в не спекулятивной памяти, которая может содержать устройства ввода/вывода, то поведение системы не предсказуемо.
Порядок байт (byte order) RSE. Поскольку, RSE работает асинхронно с процессором, то он может работать от имени контекста с упорядочением байтов, которое отличается от текущего. Поэтому RSE имеет бит, определяющий свое собственное упорядочивание байтов: RSC.be. Если RSC.be=0, то регистры запоминаются с упорядочиванием байтов по убыванию (самые младшие по значимости байты располагаются в младших адресах). Если RSC.be=1, то регистры запоминаются с упорядочиванием байтов по возрастанию (самые старшие по значимости байты располагаются в младших адресах). Кроме того, значение RSC.be определяет порядок байт при сливании/заливании NaT совокупности механизмом RSE. Код может быть записан в RSC.be на любом уровне привилегий. Изменения в RSC.be могут быть сделаны программой только, если RSC.mode=0. Если изменения не удачны, то в результате содержимое вспомогательной памяти будет не определено.
