SPARC window_overflow - PullRequest
       6

SPARC window_overflow

4 голосов
/ 08 декабря 2010

Предположим, у меня есть 8 окон, подобных этой: http://www.sics.se/~psm/sparcwin.gif

И я в этой ситуации прав, WIM указывает на w7, и я нахожусь в окне w0.

Предположим, что в этом окне я собираюсь вызвать некоторую функцию, которая получает один параметр. Поэтому я установил значение параметра в% o1 (чтобы функция могла получить его в% i0).

Хорошо, тогда я звоню, и функция выполняет «сохранение». WIM в этом бите окна равен 1, поэтому window_overflow запускается. Что я понял по этому поводу, так это то, что обработчик сохраняет в стеке окна w7 (% sp) регистры% i1, ..,% i7,% l0, ..,% l7, чтобы затем «возвращаться» в window_underflow восстановите это окно.

У меня вопрос ... когда окно сохранено, оригиналы% i0, ...,% i7 из w7, утерянные из-за этого, являются параметрами функции, которую вызвала программа в w0 (поскольку я установил% o0, .. в w0 перед вызовом, а затем сделайте ошибку 'save'). Так что эта «система» не имеет смысла, так что, думаю, я что-то упустил.

Еще один похожий вопрос. Предположим, что моя программа в w0 не вызывает функцию, но использует% o0,% o1, .. в качестве "локальных" переменных, у меня возникла бы та же проблема, даже не зная, что я убил% i0,% i1, .. из w7.

ОТВЕТ: Я обнаружил, что недопустимые окна уже сохранены в стеке, поэтому, когда 'save' будет выполнено, обработчик window_overflow сохранит w6 в стеке (и установит WIM в w6). Это, очевидно, объясняет все о моем вопросе. Наверное, я перепутал myselft, когда увидел пример обработчика этой ловушки и не вспомнил, что в V8 он всегда уменьшает CWP без проверки WIM.

...