Am 09.04.2011 12:36, schrieb Amit Shah: > On (Fri) 08 Apr 2011 [15:31:49], Kevin Wolf wrote: >> Am 08.04.2011 09:15, schrieb Amit Shah: >>> Handle GET_EVENT_STATUS_NOTIFICATION's No Event Available status in its >>> own function. >>> >>> Also ensure the buffer the driver sent us is big enough to fill in all >>> the data we have -- else just fill in as much as the buffer can hold. >> >> This is unnecessary and in fact none of the IDE code does this. >> s->io_buffer isn't guest memory, but an internal buffer that is >> allocated like this: >> >> s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4); > > OK - so all the code paths will be much easier then. > > But by my reading of (the kernel) code, it looks as if the kernel > allocates the memory and passes it on. What am I missing?
That the data is copied. All command work on the internal s->io_buffer. Once the command is completed, the response can be transferred to the guest, either using DMA (see bmdma_rw_buf) or PIO (ide_data_readl). >> So that's more than enough for storing four bytes. ide_atapi_cmd_reply() >> takes care of making only max_size bytes visible to the guest. > > OK - but in some cases we just do a ide_set_irq() instead of > ide_atapi_cmd_reply() so what happens in that case? I can't find any ATAPI command that calls ide_set_irq directly. Anyway, the important thing is that s->io_buffer_size is set correctly. Kevin