tests/qtest/ide-test: Verify READ NATIVE MAX ADDRESS is not limited

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>
This commit is contained in:
Lev Kujawski 2022-10-10 08:52:29 +00:00 committed by Thomas Huth
parent 8682ff6960
commit 622f8eb158
1 changed files with 46 additions and 1 deletions

View File

@ -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
@ -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,
@ -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;
@ -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);