qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [SeaBIOS] [PATCH v7 8/8] hd-geo-test: Add tests for lchs override


From: John Snow
Subject: Re: [SeaBIOS] [PATCH v7 8/8] hd-geo-test: Add tests for lchs override
Date: Thu, 26 Sep 2019 14:19:36 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.0


On 9/26/19 6:00 AM, Philippe Mathieu-Daudé wrote:
> On 9/25/19 1:06 PM, Sam Eiderman wrote:
>> From: Sam Eiderman <address@hidden>
>>
>> Add QTest tests to check the logical geometry override option.
>>
>> The tests in hd-geo-test are out of date - they only test IDE and do not
>> test interesting MBRs.
>>
>> I added a few helper functions which will make adding more tests easier.
>>
>> QTest's fw_cfg helper functions support only legacy fw_cfg, so I had to
>> read the new fw_cfg layout on my own.
>>
>> Creating qcow2 disks with specific size and MBR layout is currently
>> unused - we only use a default empty MBR.
>>
>> Reviewed-by: Karl Heubaum <address@hidden>
>> Reviewed-by: Arbel Moshe <address@hidden>
>> Signed-off-by: Sam Eiderman <address@hidden>
>> ---
>>  tests/Makefile.include |   2 +-
>>  tests/hd-geo-test.c    | 589 +++++++++++++++++++++++++++++++++++++++++
>>  2 files changed, 590 insertions(+), 1 deletion(-)
>>
>> diff --git a/tests/Makefile.include b/tests/Makefile.include
>> index 479664f899..a5b92fea6a 100644
>> --- a/tests/Makefile.include
>> +++ b/tests/Makefile.include
>> @@ -780,7 +780,7 @@ tests/ide-test$(EXESUF): tests/ide-test.o 
>> $(libqos-pc-obj-y)
>>  tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) 
>> qemu-img$(EXESUF)
>>  tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o
>>  tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o
>> -tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o
>> +tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o $(libqos-obj-y)
>>  tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
>>  tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
>>  tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
>> diff --git a/tests/hd-geo-test.c b/tests/hd-geo-test.c
>> index 62eb624726..458de99c31 100644
>> --- a/tests/hd-geo-test.c
>> +++ b/tests/hd-geo-test.c
>> @@ -17,7 +17,12 @@
>>  
>>  #include "qemu/osdep.h"
>>  #include "qemu-common.h"
>> +#include "qemu/bswap.h"
>> +#include "qapi/qmp/qlist.h"
>>  #include "libqtest.h"
>> +#include "libqos/fw_cfg.h"
>> +#include "libqos/libqos.h"
>> +#include "standard-headers/linux/qemu_fw_cfg.h"
>>  
>>  #define ARGV_SIZE 256
>>  
>> @@ -388,6 +393,575 @@ static void test_ide_drive_cd_0(void)
>>      qtest_quit(qts);
>>  }
>>  
>> +typedef struct {
>> +    bool active;
>> +    uint32_t head;
>> +    uint32_t sector;
>> +    uint32_t cyl;
>> +    uint32_t end_head;
>> +    uint32_t end_sector;
>> +    uint32_t end_cyl;
>> +    uint32_t start_sect;
>> +    uint32_t nr_sects;
>> +} MBRpartitions[4];
>> +
>> +static MBRpartitions empty_mbr = { {false, 0, 0, 0, 0, 0, 0, 0, 0},
>> +                                   {false, 0, 0, 0, 0, 0, 0, 0, 0},
>> +                                   {false, 0, 0, 0, 0, 0, 0, 0, 0},
>> +                                   {false, 0, 0, 0, 0, 0, 0, 0, 0} };
>> +
>> +static char *create_qcow2_with_mbr(MBRpartitions mbr, uint64_t sectors)
>> +{
>> +    const char *template = "/tmp/qtest.XXXXXX";
>> +    char *raw_path = strdup(template);
>> +    char *qcow2_path = strdup(template);
>> +    char cmd[100 + 2 * PATH_MAX];
>> +    uint8_t buf[512];
>> +    int i, ret, fd, offset;
>> +    uint64_t qcow2_size = sectors * 512;
>> +    uint8_t status, parttype, head, sector, cyl;
>> +    char *qemu_img_path;
>> +    char *qemu_img_abs_path;
>> +
>> +    offset = 0xbe;
>> +
>> +    for (i = 0; i < 4; i++) {
>> +        status = mbr[i].active ? 0x80 : 0x00;
>> +        g_assert(mbr[i].head < 256);
>> +        g_assert(mbr[i].sector < 64);
>> +        g_assert(mbr[i].cyl < 1024);
>> +        head = mbr[i].head;
>> +        sector = mbr[i].sector + ((mbr[i].cyl & 0x300) >> 2);
>> +        cyl = mbr[i].cyl & 0xff;
>> +
>> +        buf[offset + 0x0] = status;
>> +        buf[offset + 0x1] = head;
>> +        buf[offset + 0x2] = sector;
>> +        buf[offset + 0x3] = cyl;
>> +
>> +        parttype = 0;
>> +        g_assert(mbr[i].end_head < 256);
>> +        g_assert(mbr[i].end_sector < 64);
>> +        g_assert(mbr[i].end_cyl < 1024);
>> +        head = mbr[i].end_head;
>> +        sector = mbr[i].end_sector + ((mbr[i].end_cyl & 0x300) >> 2);
>> +        cyl = mbr[i].end_cyl & 0xff;
>> +
>> +        buf[offset + 0x4] = parttype;
>> +        buf[offset + 0x5] = head;
>> +        buf[offset + 0x6] = sector;
>> +        buf[offset + 0x7] = cyl;
>> +
>> +        (*(uint32_t *)&buf[offset + 0x8]) = cpu_to_le32(mbr[i].start_sect);
>> +        (*(uint32_t *)&buf[offset + 0xc]) = cpu_to_le32(mbr[i].nr_sects);
>> +
>> +        offset += 0x10;
>> +    }
>> +
>> +    fd = mkstemp(raw_path);
>> +    g_assert(fd);
>> +    close(fd);
>> +
>> +    fd = open(raw_path, O_WRONLY);
>> +    g_assert(fd >= 0);
>> +    ret = write(fd, buf, sizeof(buf));
>> +    g_assert(ret == sizeof(buf));
>> +    close(fd);
>> +
>> +    fd = mkstemp(qcow2_path);
>> +    g_assert(fd);
>> +    close(fd);
>> +
>> +    qemu_img_path = getenv("QTEST_QEMU_IMG");
>> +    g_assert(qemu_img_path);
>> +    qemu_img_abs_path = realpath(qemu_img_path, NULL);
>> +    g_assert(qemu_img_abs_path);
>> +
>> +    ret = snprintf(cmd, sizeof(cmd),
>> +                   "%s convert -f raw -O qcow2 %s %s > /dev/null",
>> +                   qemu_img_abs_path,
>> +                   raw_path, qcow2_path);
>> +    g_assert((0 < ret) && (ret <= sizeof(cmd)));
>> +    ret = system(cmd);
>> +    g_assert(ret == 0);
>> +
>> +    ret = snprintf(cmd, sizeof(cmd),
>> +                   "%s resize %s %" PRIu64 " > /dev/null",
>> +                   qemu_img_abs_path,
>> +                   qcow2_path, qcow2_size);
>> +    g_assert((0 < ret) && (ret <= sizeof(cmd)));
>> +    ret = system(cmd);
>> +    g_assert(ret == 0);
>> +
>> +    free(qemu_img_abs_path);
>> +
>> +    unlink(raw_path);
>> +    free(raw_path);
>> +
>> +    return qcow2_path;
>> +}
>> +
>> +struct QemuCfgFile {
>> +    uint32_t  size;        /* file size */
>> +    uint16_t  select;      /* write this to 0x510 to read it */
>> +    uint16_t  reserved;
>> +    char name[56];
>> +};
>> +
>> +static uint16_t find_fw_cfg_file(QFWCFG *fw_cfg,
>> +                                 const char *filename)
>> +{
>> +    struct QemuCfgFile qfile;
>> +    uint32_t count, e;
>> +    uint16_t select;
>> +
>> +    count = qfw_cfg_get_u32(fw_cfg, FW_CFG_FILE_DIR);
>> +    count = be32_to_cpu(count);
>> +    for (select = 0, e = 0; e < count; e++) {
>> +        qfw_cfg_read_data(fw_cfg, &qfile, sizeof(qfile));
>> +        if (!strcmp(filename, qfile.name)) {
>> +            select = be16_to_cpu(qfile.select);
>> +        }
>> +    }
>> +
>> +    return select;
>> +}
>> +
>> +static void read_fw_cfg_file(QFWCFG *fw_cfg,
>> +                             const char *filename,
>> +                             void *data,
>> +                             size_t len)
>> +{
>> +    uint16_t select = find_fw_cfg_file(fw_cfg, filename);
>> +
>> +    g_assert(select);
>> +
>> +    qfw_cfg_get(fw_cfg, select, data, len);
>> +}
>> +
>> +#define BIOS_GEOMETRY_MAX_SIZE 10000
>> +
>> +typedef struct {
>> +    uint32_t c;
>> +    uint32_t h;
>> +    uint32_t s;
>> +} CHS;
>> +
>> +typedef struct {
>> +    const char *dev_path;
>> +    CHS chs;
>> +} CHSResult;
>> +
>> +static void read_bootdevices(QFWCFG *fw_cfg, CHSResult expected[])
>> +{
>> +    char *buf = g_malloc0(BIOS_GEOMETRY_MAX_SIZE);
>> +    char *cur;
>> +    GList *results = NULL, *cur_result;
>> +    CHSResult *r;
>> +    int i;
>> +    int res;
>> +    bool found;
>> +
>> +    read_fw_cfg_file(fw_cfg, "bios-geometry", buf, BIOS_GEOMETRY_MAX_SIZE);
> 
> Oh I'm glad to see the test I requested while reviewing the previous
> patch! I'll have a look at it, but John 589 LoC I doubt I can do it for
> Friday.
> 

It's just a test, even so -- we can amend it. There's no real hurry.

--js



reply via email to

[Prev in Thread] Current Thread [Next in Thread]