- •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.11.2. Возврат в прерванный контекст
Для возврата к вспомогательной памяти прерванного контекста:
Выделяем окно нулевого размера.
Вычитаем значение BSPSTORE, записанное в шаге 6 раздела 6.11.1, из значенияBSP, прочитанного в шаге 7 раздела 6.11.1, и помещаем разницу вRSC.loadrs, аRSC.modeпомещаем ноль (переводяRSEв режим ленивого слежения).
Запускаем инструкцию loadrs, чтобы убедится, что любые регистры из прерванного контекста, которые были сохранены в новом стеке, загружены в стековые регистры.
Восстанавливаем BSPSTOREиз прерванного контекста (сохраненный на шаге 5 раздела 6.11.1).
Восстанавливаем RNATиз прерванного контекста (сохраненный на шаге 5 раздела 6.11.1).
Восстанавливаем PSFиIFSиз прерванного контекста (сохраненные на шагах 1 и 3 раздела 6.11.1).
Восстанавливаем RSCиз прерванного контекста (сохраненный на шаге 1 раздела 6.11.1). Это восстановление устанавливает биты режимаRSE, а также уровень привилегий и упорядочивание байтов.
Запускаем инструкцию rfi(IFS.ifmперейдет вCFM).
6.11.3. Синхронное переключение вспомогательной памяти.
Не вытесненное, синхронное переключение вспомогательной памяти на любом уровне привилегий может быть достигнуто следующим образом:
Читаем и сохраняем прикладные регистры RSC,BSPиPFS.
Запускаем инструкцию flushrs, чтобы смыть грязные регистры во внешнюю память.
Переводим RSEв режим ленивого слежения, путем очистки обоих битовRSC.mode.
Читаем и сохраняем прикладной регистр RNAT.
Аннулируем ALAT, используя инструкциюinvala, когда переключение из кода, который не восстанавливаетRSE.BOFк первоначальным установкам. ОтличиеRSE.BOFвынудит поместить программные значения в новом контексте в различные физические регистры. Детали см. в разделе 6.9 «ВзаимодействиеRSEиALAT».
Записываем BSPSTOREнового контекста (былоBSPпослеflushrs, когда переключение кончилось).
Записываем PFSиRNATнового контекста.
Записываем RSCнового контекста, который установит режимRSE, уровень привилегий и упорядочивание байтов.
6.12. Инициализация rse
При сбросе процессора RSEустанавливается в режим ленивого слежения, т.е. оба битаRSC.modeустанавливаются в ноль. Уровень привилегийRSE(RSE.pl) устанавливается в ноль. ЗначениеRSE.BOFуказывает на физический регистр 32. ЗначенияAR[PFS].pfmиCR[IFS] являются не определенными. Маркер текущего окна (CFM) устанавливается так:sof=96,sol=0,sor=0,rrb.gr=0,rrb.fr=0 иrrb.pr=0. Это дает процессору доступ к 96 стековым регистрам.
Механизм RSEне выполняет операции сливания/заливания до тех пор, пока инструкцииalloc, br.ret, rfi, flushrsилиloadrsне потребуют принудительныхRSEопераций, либо пока программное обеспечение явно не позволит активныеRSEоперации. Программное обеспечение должно снабдитьRSEадресом правильной вспомогательной памяти в прикладном регистреBSPSTOREдо возникновения любыхRSEопераций сливания/заливания. Неверная инициализацияBSPSTOREприведет к неопределенному поведению.