Skip to content

Commit

Permalink
tests/qtest/ide-test: Verify READ NATIVE MAX ADDRESS is not limited
Browse files Browse the repository at this point in the history
Verify that the ATA command READ NATIVE MAX ADDRESS returns the last
valid CHS tuple for the native device rather than any limit
established by INITIALIZE DEVICE PARAMETERS.

Signed-off-by: Lev Kujawski <lkujaw@mailbox.org>
Message-ID: <20221010085229.2431276-2-lkujaw@mailbox.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
  • Loading branch information
Lev Kujawski authored and huth committed Apr 30, 2024
1 parent 8682ff6 commit 622f8eb
Showing 1 changed file with 46 additions and 1 deletion.
47 changes: 46 additions & 1 deletion tests/qtest/ide-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
#include "hw/pci/pci_ids.h"
#include "hw/pci/pci_regs.h"

#define TEST_IMAGE_SIZE 64 * 1024 * 1024
/* Specified by ATA (physical) CHS geometry for ~64 MiB device. */
#define TEST_IMAGE_SIZE ((130 * 16 * 63) * 512)

#define IDE_PCI_DEV 1
#define IDE_PCI_FUNC 1
Expand Down Expand Up @@ -88,11 +89,13 @@ enum {
enum {
CMD_DSM = 0x06,
CMD_DIAGNOSE = 0x90,
CMD_INIT_DP = 0x91, /* INITIALIZE DEVICE PARAMETERS */
CMD_READ_DMA = 0xc8,
CMD_WRITE_DMA = 0xca,
CMD_FLUSH_CACHE = 0xe7,
CMD_IDENTIFY = 0xec,
CMD_PACKET = 0xa0,
CMD_READ_NATIVE = 0xf8, /* READ NATIVE MAX ADDRESS */

CMDF_ABORT = 0x100,
CMDF_NO_BM = 0x200,
Expand Down Expand Up @@ -560,6 +563,46 @@ static void string_cpu_to_be16(uint16_t *s, size_t bytes)
}
}

static void test_specify(void)
{
QTestState *qts;
QPCIDevice *dev;
QPCIBar bmdma_bar, ide_bar;
uint16_t cyls;
uint8_t heads, spt;

qts = ide_test_start(
"-blockdev driver=file,node-name=hda,filename=%s "
"-device ide-hd,drive=hda,bus=ide.0,unit=0 ",
tmp_path[0]);

dev = get_pci_device(qts, &bmdma_bar, &ide_bar);

/* Initialize drive with zero sectors per track and one head. */
qpci_io_writeb(dev, ide_bar, reg_nsectors, 0);
qpci_io_writeb(dev, ide_bar, reg_device, 0);
qpci_io_writeb(dev, ide_bar, reg_command, CMD_INIT_DP);

/* READ NATIVE MAX ADDRESS (CHS mode). */
qpci_io_writeb(dev, ide_bar, reg_device, 0xa0);
qpci_io_writeb(dev, ide_bar, reg_command, CMD_READ_NATIVE);

heads = qpci_io_readb(dev, ide_bar, reg_device) & 0xf;
++heads;
g_assert_cmpint(heads, ==, 16);

cyls = qpci_io_readb(dev, ide_bar, reg_lba_high) << 8;
cyls |= qpci_io_readb(dev, ide_bar, reg_lba_middle);
++cyls;
g_assert_cmpint(cyls, ==, 130);

spt = qpci_io_readb(dev, ide_bar, reg_lba_low);
g_assert_cmpint(spt, ==, 63);

ide_test_quit(qts);
free_pci_device(dev);
}

static void test_identify(void)
{
QTestState *qts;
Expand Down Expand Up @@ -1077,6 +1120,8 @@ int main(int argc, char **argv)
/* Run the tests */
g_test_init(&argc, &argv, NULL);

qtest_add_func("/ide/read_native", test_specify);

qtest_add_func("/ide/identify", test_identify);

qtest_add_func("/ide/diagnostic", test_diagnostic);
Expand Down

0 comments on commit 622f8eb

Please sign in to comment.