Разница между переменными "singlestep" и "singlestep_enabled" в QEMU
Итак, я интегрирую новую конкретную арку в эмулятор QEMU (реализация в QEMU похожа на арку OpenRISC, так что вы можете положиться на нее при ответе), и я запускаю некоторые тесты.
QEMU имеет версию 2.0.93
- Когда я запускаю тест в обычном режиме, QEMU заканчивается с неправильным ответом
- Когда я бегу в
-singlestep
В этом режиме QEMU не работает с моим утверждением о получении более 1 команды в TargetBlock при запуске в режиме одиночного шага - Когда я бегу QEMU с GDB, который обеспечивает
singlestep_enabled
mode, var равно 7 (то естьSSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER
), я получаю правильный ответ для теста.
Вопрос в том, почему это так, и какова реальная разница между этими двумя режимами? Я не нашел много в сети, так как пока что нет документации по QEMU
1 ответ
Эти два флага выполняют разные функции.
'singlestep'- это bool, который указывает, была ли указана опция командной строки '-singlestep'. Это в основном переводит QEMU в режим, в котором в каждом ТБ помещается только одна гостевая инструкция. Мы не останавливаемся после каждой инструкции.
'singlestep_enabled' является для каждого процессора и устанавливается (с помощью функции cpu_single_step()), когда заглушка gdb хочет выполнить одиночный шаг. Затем целевой интерфейс генерирует код, который выполняет одну инструкцию и вызывает исключение отладки. (Затем заглушка GDB обработает это исключение и вернет управление отладчику.)
Третий вид одиночного шага, который вы можете увидеть в коде, это эмуляция встроенного в отладку поведения одиночного шага целевого процессора, который мы реализуем как минимум на x86 и ARM. Как правило, это обрабатывается целевым образом, чтобы обеспечить требуемую семантику шага гостевого процессора.
Если ваш код генерирует разные ответы для одношаговой и нормальной работы, это, вероятно, означает, что у вас есть ошибка в том, как вы генерируете код TCG: возможно, нет правильных флагов на вспомогательной функции или неправильно обрабатывается локальные адреса TCG. Или вы можете неправильно восстанавливать состояние при возникновении исключения загрузки / сохранения.
Примечание: 2.0.93 - это старая версия QEMU, и даже не релизная версия (это релиз-кандидат для 2.1). Если вы разрабатываете новый целевой интерфейс, вы должны работать с текущим git master.