- •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.10. Когерентность вспомогательной памяти и упорядочивание памяти
Загрузки и сохранения RSE, всегда являются когерентными относительно кэна данных процессора. Вспомогательная память ниже BSPSTORE определятся, как содержащая стек регистров (образ памяти содержит последовательные значения регистров и NaT совокупностей). Механизм RSE не изменяет адреса ниже BSPSTORE, до тех пор, пока br.ret, rfi или запись в BSPSTORE, опуститься ниже первоначального значения BSPSTORE. Механизм RSE никогда не записывает по адресу памяти большему или равному BSP.
Для того чтобы программа изменила значение вспомогательной памяти и гарантировала, что оно было загружено механизмом RSE, программа должна сначала перевести RSE в режим ленивого слежения (RSC.mode=0), а затем прочитать BSP и BSPSTORE для того, чтобы определить положение указателя RSE сохранения. Если место, которое будет изменено, лежит между BSPSTORE и BSP, то программа должна запустить flushrs, обновить место во вспомогательной памяти и запустить инструкцию loadrs с RSC.loadrs установленным в 0 (это аннулирует текущее содержимое физических стековых регистров, кроме текущего окна, что вынудит RSE перезагрузить регистры из вспомогательной памяти). Если место, которое будет изменено, лежит ниже BSPSTORE, то можно избежать ненужного движения памяти следующим образом: программа должна прочитать прикладной регистр RNAT, изменить место во вспомогательной памяти, перезаписать BSPSTORE первоначальным значением, а затем перезаписать RNAT.
Загрузки и сохранения RSE, упорядочены слабо. Инструкции flushrs и loadrs не включают в себя неявный забор (fence) памяти. Включение и выключение RSE не влияет на упорядочивание памяти. Чтобы гарантировать упорядочивание RSE загрузок и сохранений в мультипроцессорной системе, программному обеспечению требуется запустить инструкции явного забора памяти (mf).
6.11. Переключения внешней памяти rse
Реализация системных вызовов, переключений контекста операционной системы, упаковок нитей уровня пользователя, отладочных программ, а также некоторых типов обработки исключения (например, setjmp/longjmp, структурированной обработки исключения и развертывания стека вызова) требует явного управления уровня пользователя для RSE и/или знаний формата вспомогательной памяти. Поэтому, RSE и вспомогательная память могут управляться на всех уровнях привилегий.
Здесь описаны три переключения вспомогательной памяти RSE:
Переключение из прерванного контекста (как часть обработчика прерывания или кода всплывающего (bubble-up) прерывания).
Возвращение к предыдущему прерванному контексту.
Не вытесненное, синхронное переключение вспомогательной памяти (охватывает системные вызовы, переключения контекста нитей уровня пользователя и операционной системы).
Неудача при следовании этим последовательностям, может вызвать неопределенное поведение RSE или процессора.
6.11.1 Переключение из прерванного контекста
Для переключения от вспомогательной памяти прерванного контекста к новой вспомогательной памяти:
Читаем и сохраняем прикладные регистры RSC и PFS.
Запускаем инструкцию cover для прерванного окна.
Читаем и сохраняем управляющий регистр IFS.
Переводим RSE в режим ленивого слежения, путем очистки битов RSC.mode.
Читаем и сохраняем прикладные регистры BSPSTORE и RNAT.
Записываем BSPSTORE с новым адресом вспомогательной памяти.
Читаем и сохраняем новый BSP для вычисления количества грязных регистров.
Выбираем желаемые установки RSE (режим, уровень привилегий и порядок байт).
