-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQIcBAABAgAGBQJVEEShAAoJEH3vgQaq/DkOHiIP/inqwTB/M24pkh9LFs2beXGZ ZDObIqPlM47UO0525Fvx6/Xy5j/q8Xbkq8GhJtlkvkbje1LiodlSoBPMuvVI3Y9l 0Tu0IhBFscfe2tip++/19/RjJIOo9TJWJOeG5V1psvriFehaIwTJnZ8hw12Dg5+w BBxu+EK7Tn52UsFD82EINGSC49NObVFC8LvnOJPk2Hmf/dA5j1Ctx6WbpIGH4uED QMn5yNyIRtCmWfTqfBSLcC79ElEk/U3YK3HMHg2RmC2pDCkitj+SGprvu/pWg+jp EY8/JHxU4qu8ht2KbMFXykWYpEdiyvTuTC4z5QmSvdsw6tEBtj/i9lj9t1kF3rzc 5vzikAYeDdH8kd3/dUZuwbZ7g+FMwfbcqMx+j6c5s5YcmoIz71jgcHiy28EPCS6f dbWEzyUouMWXTXQ+lAZwEcfPLNAfkw1SdfXBkBzw3w3Sk4+YXqdsBo5XhugVCg6P zMF+Fu1zpJEgQ78TEMzvjVsyIb2nn5KLjO7VbTYYhItFLd6BD1SqozWpgLVgaqWe plvSVFr73Zzui5O34wMVo7Ky/pZH/wmmToOQ8is6J4/nz8YEa/0xl23YVj9zAOk1 7UeK1GKx50C+uf8NpWmKpMBy+k3vIgyW1I59nJmadRoDTFojolta0R7fsqgpDf1f lcKG04a3nBNXwXoPkSNj =Do0W -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jnsnow/tags/ide-pull-request' into staging # gpg: Signature made Mon Mar 23 16:51:45 2015 GMT using RSA key ID AAFC390E # gpg: Can't check signature: public key not found * remotes/jnsnow/tags/ide-pull-request: ahci-test: improve rw buffer patterns ahci: Fix sglist offset manipulation for BE machines ide: fix cmd_read_pio when nsectors > 1 ide: fix cmd_write_pio when nsectors > 1 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
362ca922ee
@ -799,7 +799,7 @@ static int ahci_populate_sglist(AHCIDevice *ad, QEMUSGList *sglist,
|
|||||||
|
|
||||||
qemu_sglist_init(sglist, qbus->parent, (sglist_alloc_hint - off_idx),
|
qemu_sglist_init(sglist, qbus->parent, (sglist_alloc_hint - off_idx),
|
||||||
ad->hba->as);
|
ad->hba->as);
|
||||||
qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos),
|
qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr) + off_pos,
|
||||||
prdt_tbl_entry_size(&tbl[off_idx]) - off_pos);
|
prdt_tbl_entry_size(&tbl[off_idx]) - off_pos);
|
||||||
|
|
||||||
for (i = off_idx + 1; i < sglist_alloc_hint; i++) {
|
for (i = off_idx + 1; i < sglist_alloc_hint; i++) {
|
||||||
|
@ -587,14 +587,12 @@ static void ide_sector_read_cb(void *opaque, int ret)
|
|||||||
n = s->req_nb_sectors;
|
n = s->req_nb_sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow the guest to read the io_buffer */
|
|
||||||
ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
|
|
||||||
|
|
||||||
ide_set_irq(s->bus);
|
|
||||||
|
|
||||||
ide_set_sector(s, ide_get_sector(s) + n);
|
ide_set_sector(s, ide_get_sector(s) + n);
|
||||||
s->nsector -= n;
|
s->nsector -= n;
|
||||||
|
/* Allow the guest to read the io_buffer */
|
||||||
|
ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
|
||||||
s->io_buffer_offset += 512 * n;
|
s->io_buffer_offset += 512 * n;
|
||||||
|
ide_set_irq(s->bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_sector_read(IDEState *s)
|
static void ide_sector_read(IDEState *s)
|
||||||
@ -846,6 +844,7 @@ static void ide_sector_write_cb(void *opaque, int ret)
|
|||||||
s->nsector -= n;
|
s->nsector -= n;
|
||||||
s->io_buffer_offset += 512 * n;
|
s->io_buffer_offset += 512 * n;
|
||||||
|
|
||||||
|
ide_set_sector(s, ide_get_sector(s) + n);
|
||||||
if (s->nsector == 0) {
|
if (s->nsector == 0) {
|
||||||
/* no more sectors to write */
|
/* no more sectors to write */
|
||||||
ide_transfer_stop(s);
|
ide_transfer_stop(s);
|
||||||
@ -857,7 +856,6 @@ static void ide_sector_write_cb(void *opaque, int ret)
|
|||||||
ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
|
ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
|
||||||
ide_sector_write);
|
ide_sector_write);
|
||||||
}
|
}
|
||||||
ide_set_sector(s, ide_get_sector(s) + n);
|
|
||||||
|
|
||||||
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
|
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
|
||||||
/* It seems there is a bug in the Windows 2000 installer HDD
|
/* It seems there is a bug in the Windows 2000 installer HDD
|
||||||
|
@ -68,6 +68,32 @@ static void string_bswap16(uint16_t *s, size_t bytes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void generate_pattern(void *buffer, size_t len, size_t cycle_len)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
unsigned char *tx = (unsigned char *)buffer;
|
||||||
|
unsigned char p;
|
||||||
|
size_t *sx;
|
||||||
|
|
||||||
|
/* Write an indicative pattern that varies and is unique per-cycle */
|
||||||
|
p = rand() % 256;
|
||||||
|
for (i = j = 0; i < len; i++, j++) {
|
||||||
|
tx[i] = p;
|
||||||
|
if (j % cycle_len == 0) {
|
||||||
|
p = rand() % 256;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* force uniqueness by writing an id per-cycle */
|
||||||
|
for (i = 0; i < len / cycle_len; i++) {
|
||||||
|
j = i * cycle_len;
|
||||||
|
if (j + sizeof(*sx) <= len) {
|
||||||
|
sx = (size_t *)&tx[j];
|
||||||
|
*sx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*** Test Setup & Teardown ***/
|
/*** Test Setup & Teardown ***/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -736,7 +762,6 @@ static void ahci_test_io_rw_simple(AHCIQState *ahci, unsigned bufsize,
|
|||||||
{
|
{
|
||||||
uint64_t ptr;
|
uint64_t ptr;
|
||||||
uint8_t port;
|
uint8_t port;
|
||||||
unsigned i;
|
|
||||||
unsigned char *tx = g_malloc(bufsize);
|
unsigned char *tx = g_malloc(bufsize);
|
||||||
unsigned char *rx = g_malloc0(bufsize);
|
unsigned char *rx = g_malloc0(bufsize);
|
||||||
|
|
||||||
@ -752,9 +777,7 @@ static void ahci_test_io_rw_simple(AHCIQState *ahci, unsigned bufsize,
|
|||||||
g_assert(ptr);
|
g_assert(ptr);
|
||||||
|
|
||||||
/* Write some indicative pattern to our buffer. */
|
/* Write some indicative pattern to our buffer. */
|
||||||
for (i = 0; i < bufsize; i++) {
|
generate_pattern(tx, bufsize, AHCI_SECTOR_SIZE);
|
||||||
tx[i] = (bufsize - i);
|
|
||||||
}
|
|
||||||
memwrite(ptr, tx, bufsize);
|
memwrite(ptr, tx, bufsize);
|
||||||
|
|
||||||
/* Write this buffer to disk, then read it back to the DMA buffer. */
|
/* Write this buffer to disk, then read it back to the DMA buffer. */
|
||||||
@ -865,7 +888,6 @@ static void test_dma_fragmented(void)
|
|||||||
size_t bufsize = 4096;
|
size_t bufsize = 4096;
|
||||||
unsigned char *tx = g_malloc(bufsize);
|
unsigned char *tx = g_malloc(bufsize);
|
||||||
unsigned char *rx = g_malloc0(bufsize);
|
unsigned char *rx = g_malloc0(bufsize);
|
||||||
unsigned i;
|
|
||||||
uint64_t ptr;
|
uint64_t ptr;
|
||||||
|
|
||||||
ahci = ahci_boot_and_enable();
|
ahci = ahci_boot_and_enable();
|
||||||
@ -873,9 +895,7 @@ static void test_dma_fragmented(void)
|
|||||||
ahci_port_clear(ahci, px);
|
ahci_port_clear(ahci, px);
|
||||||
|
|
||||||
/* create pattern */
|
/* create pattern */
|
||||||
for (i = 0; i < bufsize; i++) {
|
generate_pattern(tx, bufsize, AHCI_SECTOR_SIZE);
|
||||||
tx[i] = (bufsize - i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a DMA buffer in guest memory, and write our pattern to it. */
|
/* Create a DMA buffer in guest memory, and write our pattern to it. */
|
||||||
ptr = guest_alloc(ahci->parent->alloc, bufsize);
|
ptr = guest_alloc(ahci->parent->alloc, bufsize);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user