- •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.7. Поведение rse при прерываниях
Когда процессор вызывает прерывание, окно текущего регистрового стека остается неизменным. Если PSR.ic=1, то очищается бит действительности регистра состояния функции прерывания (IFS.v). Когда бит IFS.v очищен, содержимое поля маркера окна прерывания (IFS.ifm) не определено.
Пока выполняется обработчик прерывания и RSE находится в режиме интенсивной или активной загрузки/восстановления, механизм RSE продолжает сливания/заливания регистров в/из внешней памяти от имени прерванного контекста, пока регистры не являются частью текущего окна определенного CFM.
Последовательность принудительных RSE загрузок или сохранений (из alloc, flushrs, loadrs, br.ret или rfi) может быть прервана внешним прерыванием. Если PSR.ic=0, то ошибки сделанные на принудительных RSE операциях, не могут быть исправлены.
6.8. Поведение rse в неполном регистровом окне
Текущее регистровое окно полагается неполным (incomplete), когда одна из необходимых RSE загрузок после ошибок br.ret или rfi, оставляет BSPSTORE указывающим на место выше, чем BSP (т.е. RSE.ndirty_words является отрицательным). Окно становится полным, когда RSE.ndirty_words становится не отрицательным, а также при выполнении инструкции cover, либо при обработке ошибки и завершении первоначальной последовательности необходимых RSE загрузок.
Когда текущее окно неполное, следующие инструкции имеют неопределенное поведение: alloc, br.call, brl.call, br.ret, flushrs, loadrs и запись в BSPSTORE. Программное обеспечение должно гарантировать, что текущее окно является полным перед выполнением этих инструкций.
6.9. Взаимодействие rse и alat
Таблица ALAT (см. раздел первого тома 4.4.5 «Спекуляция по данным») использует адреса физических регистров для отслеживания предварительных загрузок. Значение RSE.BOF может измениться только в результате инструкций br.call (через CFM.sol), cover (через CFM.sof), br.ret (через AR[PFM].sol) или rfi (через CR[IFS].ifm.sof, когда CR[IFS].v=1). Это гарантирует для целей аннулирования ALAT, что аппаратура не меняет схему отображения адресов регистров из виртуальных в физические, если программное обеспечение явно не потребовало сделать это.
Если программное обеспечение выполняет переключение вспомогательной памяти, которое заставило поместить программные значения в различные физические регистры, то ALAT должна быть явно аннулирована инструкцией invala. Обычно это случается, как часть процесса или нити (thread) переключения контекста, разворачивания стека вызовов и длинных переходов, когда программное обеспечение перезаписывает AR[BSPSTORE], но не может гарантировать, что сохраняется RSE.BOF.
Стековый регистр называются освобожденным (deallocated), когда инструкция alloc, br.ret или rfi изменяет вершину текущего окна так, что регистр больше не является частью текущего окна. С момента освобождения стекового регистра, его значение, его NaT бит и соответствующий ему ALAT, не определены. Если этот регистр, впоследствии станет частью текущего окна (либо через другую инструкцию alloc, либо через br.ret или rfi для предыдущего окна, которое содержит этот регистр), то значение, сохраненное в регистре, NaT бит регистра и соответствующий ALAT элемент для регистра, окажутся неопределенными.
Сохранения RSE не аннулируют элементы ALAT. Поэтому программное обеспечение не может использовать ALAT для трассировки RSE сохранений во вспомогательной памяти.
Примечание. Хотя реализации позволено удалять элементы из ALAT в любое время, но соображения эффективности настоятельно рекомендуют не аннулировать элементы ALAT из-за RSE сохранений.
