serial.c - SerialState 中的寄存器变量如何映射到客户机内存?
serial.c - How do register variables in SerialState get mapped to guest memory?
我目前正在诊断一个问题,我的来宾正在尝试轮询 LSR 以清除 THRE,以便它可以输出到 UART 设备。但是,LSR 永远不会更新,因此它会无限期地轮询。我在我的轻度定制 mipssim 板上使用 serial_mm_init()
。
我正在尝试追溯源代码以找到应该更新 LSR 的位置,但我所看到的与该寄存器相关的所有内容都是 SerialState
结构中的 uint8_t lsr
;我找不到将该变量映射到来宾内存的任何内容。
有人可以解释一下 SerialState
的值是如何映射到来宾内存的吗?
好吧,经过大量的努力,我让 UART 工作了。问题的答案在于 serial_ioport_read()
和 serial_ioport_write()
函数。这两个方法被分配为 QEMU 在读取数据或将数据写入串行设备的 MemoryRegion
时调用的回调(在 serial_init()
或 serial_mm_init()
中初始化)。这些函数对地址(作为 addr
传递到函数中)做一些掩码以确定正在引用哪个寄存器,然后 return 来自与该寄存器对应的 SerialState
结构的值.它非常简单,但我想一旦你弄明白了,一切似乎都很简单。最大的转折点是认识到 QEMU 有效地将串行设备实现为具有在内存操作时触发的特殊功能的 MemoryRegion
。
无论如何,希望这能帮助将来的人避免我经历的噩梦。干杯!
我目前正在诊断一个问题,我的来宾正在尝试轮询 LSR 以清除 THRE,以便它可以输出到 UART 设备。但是,LSR 永远不会更新,因此它会无限期地轮询。我在我的轻度定制 mipssim 板上使用 serial_mm_init()
。
我正在尝试追溯源代码以找到应该更新 LSR 的位置,但我所看到的与该寄存器相关的所有内容都是 SerialState
结构中的 uint8_t lsr
;我找不到将该变量映射到来宾内存的任何内容。
有人可以解释一下 SerialState
的值是如何映射到来宾内存的吗?
好吧,经过大量的努力,我让 UART 工作了。问题的答案在于 serial_ioport_read()
和 serial_ioport_write()
函数。这两个方法被分配为 QEMU 在读取数据或将数据写入串行设备的 MemoryRegion
时调用的回调(在 serial_init()
或 serial_mm_init()
中初始化)。这些函数对地址(作为 addr
传递到函数中)做一些掩码以确定正在引用哪个寄存器,然后 return 来自与该寄存器对应的 SerialState
结构的值.它非常简单,但我想一旦你弄明白了,一切似乎都很简单。最大的转折点是认识到 QEMU 有效地将串行设备实现为具有在内存操作时触发的特殊功能的 MemoryRegion
。
无论如何,希望这能帮助将来的人避免我经历的噩梦。干杯!