К сожалению, QEMU не предоставляет ничего, что могло бы сделать это за вас в качестве API, который вы можете вызывать из кода QEMU C. Есть пара проблем:
QEMU не обновляет все состояние ЦП для каждой инструкции, и, в частности, не обновляет значение P C до тех пор, пока это не будет абсолютно необходимо. , потому что постоянная запись «добавить 4 к полю P C в структуре состояния ЦП» стоит дорого. Таким образом, текущий P C не очень удобно доступен из функции чтения / записи MMIO устройства.
QEMU не имеет кода, который знает, как выполнить обратную трассировку гостевого стека. Это сравнительно сложно сделать правильно (вы, конечно, найдете код для этого в отладчиках).
Думаю, если бы я проектировал что-то для этой цели, я бы, наверное, попытаться предоставить устройству способ инициировать остановку гостя, чтобы gdb с целевой архитектурой, подключенный к gdbstub QEMU, мог проверять регистры и выполнять обратную трассировку. Затем вы можете написать сценарий отладчика, если хотите «напечатать обратную трассировку и продолжить гостевое выполнение».
Тем не менее, вот несколько предложений, которые вы можете попробовать: вам повезло, тогда установка контрольных точек из gdb целевой архитектуры в gdbstub QEMU для адресов регистров устройства позволит вам получить контроль в gdb, когда гость выполняет доступ к устройству, чтобы вы могли выполнить обратную трассировку. Я даю этому примерно 50% шанс сработать, потому что я не уверен, насколько надежной будет поддержка точек наблюдения большой площади; также вам необходимо установить точки наблюдения на виртуальном адресе, с которым ядро сопоставило устройство, что может быть сложно определить.
Мой опыт написания моделей устройств показал, что это обычно довольно очевидно, просто взглянув на исходный код драйвера устройства, что он делал, когда делал MMIO-доступ к устройству. Вы знаете, в какой регистр была записана запись и с каким значением, чего часто бывает достаточно, чтобы сузить круг, какой бит драйвера сделал доступ. Это, конечно, зависит от сложности аппаратного обеспечения и драйвера.
Использование опций QEMU -d и -D для регистрации комбинации c событий трассировки устройства и общих Информация о выполнении / потоке управления гостевым процессором - еще один прием, который я нашел полезным при попытке выяснить, что гость делал с устройством.