serial.c - Как регистровые переменные в SerialState отображаются в гостевую память? - PullRequest
0 голосов
/ 29 октября 2019

В настоящее время я диагностирую проблему, когда мой гость пытается опросить LSR, чтобы очистить THRE, чтобы он мог выводить на устройство UART. Тем не менее, LSR никогда не обновляется и поэтому опрашивается бесконечно. Я использую serial_mm_init() на своей слегка настроенной плате mipssim.

Я пытаюсь проследить через источник, чтобы найти, где должен быть обновлен LSR, но все, что я вижу в отношении этого регистра, это uint8_t lsr в структуре SerialState;Я не могу найти ничего, что отображает эту переменную в гостевую память.

Может ли кто-нибудь объяснить, как значения SerialState отображаются в гостевую память?

1 Ответ

0 голосов
/ 01 ноября 2019

Ну, после тяжелой работы я получил UART. Ответ на вопрос лежит в функциях serial_ioport_read() и serial_ioport_write(). Эти два метода назначаются в качестве обратных вызовов, которые QEMU вызывает, когда данные считываются или записываются в MemoryRegion для последовательного устройства (которое инициализируется в serial_init() или serial_mm_init()). Эти функции немного маскируют адрес (передаваемый в функции как addr), чтобы определить, на какой регистр ссылаются, а затем возвращают значение из структуры SerialState, соответствующей этому регистру. Это удивительно просто, но я думаю, что все кажется простым, как только вы это поняли. Большим поворотным моментом стало осознание того, что QEMU эффективно реализует последовательное устройство как MemoryRegion со специальной функциональностью, которая запускается при операции с памятью.

В любом случае, надеюсь, это поможет кому-нибудь в будущем избежать кошмара, через который я прошел. Ура!

...