Обработка исключений MIPS (в частности, интервалы задержки ветвления) - PullRequest
1 голос
/ 03 января 2011

Скажем, исключение достигнуто в слоте задержки перехода условной ветви

например,

    BEQ a0, zero, _true
    BREAK (0000)
    sw a0, 0000(t0)
_true:
    sw a1, 0000(t0)

Мой обработчик исключений выберет исключение тип 9 из инструкции BREAK и установите бит BD регистра CAUSE равным 1, так как он имеет значение задержки ветвления, а EPC будет адресом ветвления.

В документации сказано, что это потребует сложной обработки, которая не описана.т.е. получение цели перехода / перехода, выполнение любого необходимого сравнения, а затем установка ПК на истинный или ложный адрес.

Мое решение обойти сложную обработку (что немного похоже на взлом)следует:

  1. Сохранить инструкцию в слоте задержки перехода
  2. NOP инструкцию в слоте задержки перехода
  3. Возврат из обработчика исключений, восстанавливающего все регистры
  4. повторно выполнить * BEQ a0, zero, _true *, и задержка перехода будет nop, поэтому она не будет иметь никакого эффекта
  5. Поместите точку останова sw в цель (ы) ветви и установитефлаг
  6. после нажатия на точку останова sw восстановите ячейку задержки ветвления и удалите следы точек останова sw.

Разбор веток и скачков - это хорошо (поэтому я могу получить цели) но в условных ветвях, после того, как я проанализировал, я должен был сделать сравнения, чтобы определить, переходить ли к истинной части перехода к ложному (следующая строка), что, по моему мнению, является более трудоемким.хан, я бы хотел. Разве я не ??

Моя проблема с моим хакерским методом заключается в следующем:

Будет ли процессор уже запомнил, что он достиг условной ветви, и определил, что послеСлот задержки ветвления был выполнен независимо от того, собирается ли он брать ветку или нет, поэтому, как только я указываю Program Counter обратно на ветку, и он выполняется вместо правильного выполнения, он думает, что должен перейти к истине.или ложная часть ветки, которая была предопределена до возникновения исключения?(попробуйте двойной прыжок)

1 Ответ

1 голос
/ 03 января 2011

у вас есть документы для программистов MIPS? если вы хотите получить 100% точный ответ, прочитайте их - если нет, я просто расскажу вам о важных моментах, которые я помню.

Короче

- да, вам нужно загрузить инструкцию из памяти, проанализировать ее и интерпретировать результат, чтобы выяснить, где вы должны продолжить. «Исправление» кода, как вы выразились, также будет работать, но вы должны убедиться, что кэш инструкций становится недействительным, иначе вы будете работать из кеша и завершаться бесконечным циклом.

обновление ПК следует после того, как слот задержки был выполнен, до тех пор, пока оно не будет указывать на ветвь. нет особой обработки во время исключения, за исключением того, что у вас есть регистр, в котором указано, находитесь ли вы в слоте задержки или нет. вам нужно эмулировать все инструкции, которые могут условно вызвать исключение в вашем обработчике (загрузить / сохранить) вместе с инструкциями ветвления. если это другой вид инструкций в DS, вы можете просто перезапустить его в филиале (исключение составляло внешнее прерывание в этом случае).

если вы беспокоитесь о производительности, просто не помещайте инструкции по сбору исключений в интервал задержки.

edit: и нет, MIPS ничего не хранит в прерванных инструкциях, но предлагаемый вами метод, вероятно, будет медленнее из-за необходимости дважды аннулировать ICache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...