- •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 – Current Frame Load Enable) в 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 Отладка данных |
|
