Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Системная архитектура часть 6..doc
Скачиваний:
47
Добавлен:
16.04.2013
Размер:
271 Кб
Скачать

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 Отладка данных