- •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 приведет к неопределенному поведению.
