- •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.5 Плохой pfs, используемый переходом возврата
Если при выполнении br.ret, прикладной регистрPFSзадает выходную область, которая больше, чем количество реализованных стековых регистров минус размер грязного раздела ((AR[PFS].sof–AR[PFS].sol) > (RSE.N_STACKED_PHYS–RSE.ndirty)), то при возврате,CFMне восстановится изAR[PFS].pfm(нормальное поведение); вместо этого, все поляCFM(процедуры, в которую происходит возвращение) будут установлены в ноль.
Типичные последовательности вызова процедуры и возврата из нее, сохраняющие значения PFS, и которые не используют инструкцииcoverиloadrs,не будут сталкиваться с этой ситуацией.
Механизм RSEобнаружит вbr.retупомянутые выше условия, и изменит свое состояние следующим образом:
База переименования регистров (RSE.BOF),AR[BSP] иAR[BSPSTORE] изменятся так, как это требуется для возврата.
Регистр CFM(после возврата) принудительно установится в ноль; т.е. все поляCFM(включаяCFM.sofиCFM.sol) установится в ноль.
Регистры окна, из которого возвращаемся, и сохраненные регистры окна, в которое возвращаемся, добавляются в недействительный раздел регистрового стека.
Грязный раздел регистрового стека сокращается до AR[PFS].pfm.sol.
Чистый раздел регистрового стека остается без изменений. RSE.BspLoadиRSE.Loadregостаются без изменений.
Никаких других указаний, не дается программному обеспечению.
Поскольку размер текущего окна устанавливается в ноль, то содержимое некоторых (а возможно и всех) стековых регистров может быть перезаписано последующими активными RSEоперациями, либо последующими инструкциями выделения нового стекового окна и дальнейшего планирования стековых регистров. Поэтому, последовательности явного управления регистровым стеком, которые управляютPFS, используют инструкциюcoverили инструкциюloadrsдолжны избегать этой ситуации, путем выполнения одной или двух следующих кодовых последовательностей, перед инструкциейbr.ret:
Использовать инструкцию flushrsперед инструкциейbr.ret. Это сохранит все грязные регистры в памяти и установитRSE.ndirtyв ноль, тем самым мы обходим условие.
Использовать инструкцию loadrsсо значениемAR[RSC].loadrsв следующем диапазоне:
AR[RSC].loadrs <= 8 * (ndirty_max + ((62 – AR[BSP]{8:3} + ndirty_max) / 63)) ,
где ndirty_max = (RSE.N_STACKED_PHYS – (AR[PFS].sof – AR[PFS].sol))
Это корректирует размер грязного раздела так, чтобы избежать условия. Инструкция loadrsсRSC.loadrs=0, работает на всех моделях процессоров, не зависимо от количества реализованных физических стековых регистров. Обратите внимание, чтоloadrsможет привести к потере регистров в грязном разделе.
6.6. Прерывания rse
Хотя RSEработает асинхронно по отношению к работе процессора, но прерывания, связанные сRSE, вызываются синхронно с потоком инструкций. ЭтиRSEпрерывания являются прямым следствием инструкций, связанных со стеком регистров, таких как:alloc, br.ret, rfi, flushrs, loadrs, а такжеmovв/из BSP, BSPSTORE, RSC, PFS, IFS или RNAT. Сливания и заливания регистров, выполняемые механизмомRSEв фоновом режиме (активныеRSEзагрузки и сохранения), не вызывают прерываний. Если операция сливания или заливания регистра, вызывающая ошибку или ловушку, требуется программе для продвижения вперед (принудительнаяRSEзагрузка или сохранение), тоRSEвызовет прерывание.
Принудительные RSEсохранения происходят только в контексте инструкцийalloc иflushrs. Любые ошибки, вызванные этими инструкциями, возникают на запущенной инструкции. Ошибки, вызванные принудительнымиRSEзагрузками из-за инструкцииloadrs, возникают на запущенной инструкции. ПринудительныеRSEзагрузки, которые привели к ошибке в процессе восстановления окна инструкциямиbr.ret и rfi, возбуждают ошибку на целевой инструкции, при этом устанавливается битISR.ir(неполное регистровое окно). Если принудительнаяRSEзагрузка вызвала ошибку, то значениеAR[BSPSTORE] указывает на место во вспомогательной памяти выше ошибочного адреса сообщенного вCR[IFA]. Это позволяет обработчикам, обслуживающим ошибкиRSEзагрузки, использовать подпрограмму переключения вспомогательной памяти описанную в разделе 6.11.1 «Переключение из прерванного контекста».
Инструкции br.ret и rfiустанавливаютRSEбит разрешения загрузки текущего окна (RSE.CFLE–CurrentFrameLoadEnable) в 1, если окно регистрового стека было возвращено в файл регистрового стека, не полностью. Это позволяетRSEвосстановить регистры для текущего окна целевой инструкции. Если битRSE.CFLEустановлен, то выполнение инструкции останавливается до тех пор, покаRSEполностью не восстановит текущее окно или не произойдет прерывания. Это единственный момент, когдаRSEзапускает какой-то обмен памяти для текущего окна. Возникновение прерывания очищаетRSE.CFLE, который позволяет обработчику прерывания в неполном окне (например, обработать ошибку, вызванную принудительнойRSEзагрузкой). БитRSE.CFLEотносится к внутреннему состояниюRSEи не является архитектурно видимым.
Табл. 6.6 обобщает прерывания, вызванные RSE.
Табл. 6.6. Обобщение RSEпрерываний
Инструкция |
Прерывание |
Описание |
alloc |
Нелегальная операция |
Плохое непосредственное значение alloc |
alloc |
Зарезервированный регистр/поле |
Инструкция alloc, которая пыталась заменить размер ротируемого региона, когда одно или более значенийRRBвCFM, не равны нулю. |
alloc, flushrs, loadrs |
Нереализованный адрес данных |
AR[BSPSTORE] содержит нереализов.адрес |
Вложенные данные TLB Альтернативные данные TLB Данные VHPT Данные TLB Не представленная страница данных |
| |
|
Употребление страницы NaTданных |
AR[BSPSTORE] на страницуNaTValданных |
|
Промах ключа данных Разрешение ключа данных Права доступа к данным Бит грязных данных Бит доступа к данным Отладка данных |
|
br.call, brl.call |
Нет прерываний, связанных с RSE
|
|
br.ret |
Нет ошибок, связанных с RSEзагрузками |
Ошибки, связанные с RSEзагрузками, возникают на целевой инструкции |
rfi |
Нет прерываний, связанных с RSE |
Ошибки, связанные с RSEзагрузками, возникают на целевой инструкции |
Адресат br.ret или rfi |
IRНереализованный адрес данных |
Принудительная RSEзагрузка нацелена на нереализованный адрес |
IRВложенные данныеTLB |
br.ret приPSR.ic=0 илиrfi,выполняемое, когдаIPSR.ic=0 | |
|
IRАльтернативные данныеTLB IRДанныеVHPT IRДанныеTLB IRОтсутствующая страница данных |
|
|
IRУпотребление стр-цыNaTданных |
RSE.BspLoadуказывает наNaTPage |
|
IRПромах ключа данных IRРазрешение ключа данных IRПрава доступа к данным IRБит грязных данных IRБит доступа к данным IRОтладка данных |
|