Project

General

Profile

Ассемблер и замена инструкций

Added by paul7 about 6 years ago

Добрый день.

Обнаружил, что в режиме --fix-hardware-errors ассемблер производит некоторые замены инструкций по неочевидным для меня причинам.

Например

getl #0          =>        orl @0, #0

setl #0, 0       =>        orl @0, 0 
                           setl #0, @1

С первого взгляда замена функционально эквивалентна оригиналу, на моих простых примерах разницы в поведении не видно.

Не понимаю, какую аппаратную ошибку из описанных в Errata ассемблер пытается таким образом обойти и при каких условиях такие замены будут важны.
Подскажите, пожалуйста.

Целевая платформа - R1.


Replies (6)

RE: Ассемблер и замена инструкций - Added by ak_multiclet about 6 years ago

Данная замена "обходит" баг 204.
Дело в том, что инструкции getl #0 и setl #0, 0 выполняются на этапе декодирования, и, при возникновении прерывания, могут привести к "зависанию" последующих инструкций чтения из памяти, и, в конечном итоге, всего процессора.

RE: Ассемблер и замена инструкций - Added by paul7 about 6 years ago

Спасибо.

Если я правильно понял, то опасные с точки зрения ошибки №204 ситуации описаны следующим параграфом мануала:

В ряде случаев устройство управления может самостоятельно выполнить команду без
помещения ее в буфер в команд:
1. Если выбранная команда — чтение регистра.
2. Если для выбранной команды требуется только константа и/или значение регистра
( команды SET, GET, JMP или IRM).
3. Если выбранная команда — чтение из памяти по известному адресу, содержащемуся
в константе и/или регистре, и блок DMS не занят.

По всей видимости, следующая замена обусловлена теми же причинами.

jmp XXX       =>   orl @0,@0
                   jmp @1,XXX

Хотелось бы уточнить вот какие два момента:
1. Что такое чтение регистра в первом пункте, если не GET из второго пункта?
2. Замену в примере с jmp я наблюдаю и при косвенной адресации, т.е. когда XXX = [some_address]. Правильно ли я понял, что это не подпадает под условия возникновения ошибки?

RE: Ассемблер и замена инструкций - Added by ak_multiclet about 6 years ago

Здесь возникает небольшая путаница. Действительно, в мануале описаны инструкции, "выполняемые" на этапе декодирования. Но не все из них могут вызывать ошибку. Например, "чтение из памяти по известному адресу" ошибки 204 не вызывает (фактически, на этапе декодирования чтение только запускается в блок DMS, минуя буфер; непосредственно же выполняет её блок DMS, и результат даёт он же.
Теперь по пунктам:
  1. Не совсем. get ведь может принимать форму не только get #R, но и get V. Но, согласен, по большому счёту, первый пункт из мануала -- лишний.
  2. Здесь обходится ошибка №303 (проблемы с косвенной адресацией в инструкциях jxx).

RE: Ассемблер и замена инструкций - Added by paul7 about 6 years ago

2. Но ведь в errata написано, что jxx [v] работает правильно. Или с точки зрения ассемблера это jxx [@0 + v] и он перестраховывается?

В общем, прояснилось, спасибо!

RE: Ассемблер и замена инструкций - Added by ak_multiclet about 6 years ago

Действительно, посмотрел внимательнее на пример с jmp, и понял, что наврал Вам.
Ассемблер, действительно, обходит ошибку 204, но не учитывает, что jmp [addr] этой ошибки не вызывает. И 303-й ошибки не вызывает тоже (до тех пор, пока переход безусловный и адрес не берётся из коммутатора). Т.е. условие в ассемблере слишком слабое. Поправим.

RE: Ассемблер и замена инструкций - Added by ak_multiclet almost 6 years ago

Дополнительный анализ показал, что при некоторых условиях (а именно, занятость блока DMS в момент декодирования инструкции) jmp [addr] тоже может вызывать ошибку 204, и заранее это предсказать невозможно. Так что ассемблер тут прав, а errata -- нет.

    (1-6/6)