Разница между переменными "singlestep" и "singlestep_enabled" в QEMU

Итак, я интегрирую новую конкретную арку в эмулятор QEMU (реализация в QEMU похожа на арку OpenRISC, так что вы можете положиться на нее при ответе), и я запускаю некоторые тесты.
QEMU имеет версию 2.0.93

  1. Когда я запускаю тест в обычном режиме, QEMU заканчивается с неправильным ответом
  2. Когда я бегу в -singlestep В этом режиме QEMU не работает с моим утверждением о получении более 1 команды в TargetBlock при запуске в режиме одиночного шага
  3. Когда я бегу 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.

Другие вопросы по тегам