On 08/28/2015 10:06 PM, Vladislav Yasevich wrote:
> In standard operation mode, when the receive ring buffer
> is full, the buffer actually appears empty to the driver since
> the RxBufAddr (the location we wirte new data to) and RxBufPtr
> (the location guest would stat reading from) are the same.
> As a result, the call to rtl8139_RxBufferEmpty ends up
> returning true indicating that the receive buffer is empty.
> This would result in the next packet overwriting the recevie buffer
> again and stalling receive operations.
>
> This patch tracks the number of unread bytes in the rxbuffer
> using an unused C+ register. On every read and write, the
> number is adjsted and the special case of a full buffer is also
> trapped.
>
> The C+ register trick is used to simplify migration and not require
> a new machine type. This register is not used in regular mode
> and C+ mode doesn't have the same issue.
>
> Signed-off-by: Vladislav Yasevich <[email protected]>
> ---
> hw/net/rtl8139.c | 45 +++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 41 insertions(+), 4 deletions(-)
I'm not sure this can happen. For example, looks like the following
check in rtl8139_do_receive():
if (avail != 0 && size + 8 >= avail)
{
can guarantee there's no overwriting?