My best approach is this:
- Setup a DMA memory region. lets say it's address 0x2 to 0x1000
- The serial device writes bytes in this region, as a circular buffer
- Each time the serial device writes, it updates it's "write pointer" and saves in bytes 0x0 and 0x1
- The PC Host can dma the write pointer, and compare with it's own read pointer. The read pointer can be kept on the pc host and not deal with DMA at all. Then the PC knows how much memory to read, and it also knows if there has been an underflow or overflow.
This should be a good starting point for what you want.