nfit_test: improve structure offset handling
authorRoss Zwisler <ross.zwisler@linux.intel.com>
Tue, 27 Feb 2018 17:29:50 +0000 (10:29 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 6 Mar 2018 19:05:08 +0000 (11:05 -0800)
In nfit_test0_setup() and nfit_test1_setup() we keep an 'offset' value
which we use to calculate where in our 'nfit_buf' we will place our next
structure.  The handling of 'offset' and the calculation of the placement
of the next structure is a bit inconsistent, though.  We don't update
'offset' after we insert each structure, sometimes causing us to update it
for multiple structures' sizes at once.  When calculating the position of
the next structure we aren't always able to just use 'offset', but
sometimes have to add in other structure sizes as well.

Fix this by updating 'offset' after each structure insertion in a
consistent way, allowing us to always calculate the position of the next
structure to be inserted by just using 'nfit_buf + offset'.

Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
tools/testing/nvdimm/test/nfit.c

index 620fa78b3b1b33ab7e87f20e076bc6323b68e41f..1376fc95c33aafaaf754a4a1f709d7c1487e1bad 100644 (file)
@@ -1366,7 +1366,7 @@ static void nfit_test0_setup(struct nfit_test *t)
        struct acpi_nfit_data_region *bdw;
        struct acpi_nfit_flush_address *flush;
        struct acpi_nfit_capabilities *pcap;
-       unsigned int offset, i;
+       unsigned int offset = 0, i;
 
        /*
         * spa0 (interleave first half of dimm0 and dimm1, note storage
@@ -1380,93 +1380,102 @@ static void nfit_test0_setup(struct nfit_test *t)
        spa->range_index = 0+1;
        spa->address = t->spa_set_dma[0];
        spa->length = SPA0_SIZE;
+       offset += spa->header.length;
 
        /*
         * spa1 (interleave last half of the 4 DIMMS, note storage
         * does not actually alias the related block-data-window
         * regions)
         */
-       spa = nfit_buf + sizeof(*spa);
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
        spa->range_index = 1+1;
        spa->address = t->spa_set_dma[1];
        spa->length = SPA1_SIZE;
+       offset += spa->header.length;
 
        /* spa2 (dcr0) dimm0 */
-       spa = nfit_buf + sizeof(*spa) * 2;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 2+1;
        spa->address = t->dcr_dma[0];
        spa->length = DCR_SIZE;
+       offset += spa->header.length;
 
        /* spa3 (dcr1) dimm1 */
-       spa = nfit_buf + sizeof(*spa) * 3;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 3+1;
        spa->address = t->dcr_dma[1];
        spa->length = DCR_SIZE;
+       offset += spa->header.length;
 
        /* spa4 (dcr2) dimm2 */
-       spa = nfit_buf + sizeof(*spa) * 4;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 4+1;
        spa->address = t->dcr_dma[2];
        spa->length = DCR_SIZE;
+       offset += spa->header.length;
 
        /* spa5 (dcr3) dimm3 */
-       spa = nfit_buf + sizeof(*spa) * 5;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_DCR), 16);
        spa->range_index = 5+1;
        spa->address = t->dcr_dma[3];
        spa->length = DCR_SIZE;
+       offset += spa->header.length;
 
        /* spa6 (bdw for dcr0) dimm0 */
-       spa = nfit_buf + sizeof(*spa) * 6;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 6+1;
        spa->address = t->dimm_dma[0];
        spa->length = DIMM_SIZE;
+       offset += spa->header.length;
 
        /* spa7 (bdw for dcr1) dimm1 */
-       spa = nfit_buf + sizeof(*spa) * 7;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 7+1;
        spa->address = t->dimm_dma[1];
        spa->length = DIMM_SIZE;
+       offset += spa->header.length;
 
        /* spa8 (bdw for dcr2) dimm2 */
-       spa = nfit_buf + sizeof(*spa) * 8;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 8+1;
        spa->address = t->dimm_dma[2];
        spa->length = DIMM_SIZE;
+       offset += spa->header.length;
 
        /* spa9 (bdw for dcr3) dimm3 */
-       spa = nfit_buf + sizeof(*spa) * 9;
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
        spa->range_index = 9+1;
        spa->address = t->dimm_dma[3];
        spa->length = DIMM_SIZE;
+       offset += spa->header.length;
 
-       offset = sizeof(*spa) * 10;
        /* mem-region0 (spa0, dimm0) */
        memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
@@ -1481,9 +1490,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 2;
+       offset += memdev->header.length;
 
        /* mem-region1 (spa0, dimm1) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map);
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[1];
@@ -1497,9 +1507,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->interleave_index = 0;
        memdev->interleave_ways = 2;
        memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
+       offset += memdev->header.length;
 
        /* mem-region2 (spa1, dimm0) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 2;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[0];
@@ -1513,9 +1524,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->interleave_index = 0;
        memdev->interleave_ways = 4;
        memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
+       offset += memdev->header.length;
 
        /* mem-region3 (spa1, dimm1) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 3;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[1];
@@ -1528,9 +1540,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = SPA0_SIZE/2;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 4;
+       offset += memdev->header.length;
 
        /* mem-region4 (spa1, dimm2) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 4;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[2];
@@ -1544,9 +1557,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->interleave_index = 0;
        memdev->interleave_ways = 4;
        memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
+       offset += memdev->header.length;
 
        /* mem-region5 (spa1, dimm3) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 5;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[3];
@@ -1559,9 +1573,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = SPA0_SIZE/2;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 4;
+       offset += memdev->header.length;
 
        /* mem-region6 (spa/dcr0, dimm0) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 6;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[0];
@@ -1574,9 +1589,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region7 (spa/dcr1, dimm1) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 7;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[1];
@@ -1589,9 +1605,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region8 (spa/dcr2, dimm2) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 8;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[2];
@@ -1604,9 +1621,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region9 (spa/dcr3, dimm3) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 9;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[3];
@@ -1619,9 +1637,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region10 (spa/bdw0, dimm0) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 10;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[0];
@@ -1634,9 +1653,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region11 (spa/bdw1, dimm1) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 11;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[1];
@@ -1649,9 +1669,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region12 (spa/bdw2, dimm2) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 12;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[2];
@@ -1664,9 +1685,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->address = 0;
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
+       offset += memdev->header.length;
 
        /* mem-region13 (spa/dcr3, dimm3) */
-       memdev = nfit_buf + offset + sizeof(struct acpi_nfit_memory_map) * 13;
+       memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
        memdev->device_handle = handle[3];
@@ -1680,12 +1702,12 @@ static void nfit_test0_setup(struct nfit_test *t)
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
        memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
+       offset += memdev->header.length;
 
-       offset = offset + sizeof(struct acpi_nfit_memory_map) * 14;
        /* dcr-descriptor0: blk */
        dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
-       dcr->header.length = sizeof(struct acpi_nfit_control_region);
+       dcr->header.length = sizeof(*dcr);
        dcr->region_index = 0+1;
        dcr_common_init(dcr);
        dcr->serial_number = ~handle[0];
@@ -1696,11 +1718,12 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->command_size = 8;
        dcr->status_offset = 8;
        dcr->status_size = 4;
+       offset += dcr->header.length;
 
        /* dcr-descriptor1: blk */
-       dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region);
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
-       dcr->header.length = sizeof(struct acpi_nfit_control_region);
+       dcr->header.length = sizeof(*dcr);
        dcr->region_index = 1+1;
        dcr_common_init(dcr);
        dcr->serial_number = ~handle[1];
@@ -1711,11 +1734,12 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->command_size = 8;
        dcr->status_offset = 8;
        dcr->status_size = 4;
+       offset += dcr->header.length;
 
        /* dcr-descriptor2: blk */
-       dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 2;
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
-       dcr->header.length = sizeof(struct acpi_nfit_control_region);
+       dcr->header.length = sizeof(*dcr);
        dcr->region_index = 2+1;
        dcr_common_init(dcr);
        dcr->serial_number = ~handle[2];
@@ -1726,11 +1750,12 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->command_size = 8;
        dcr->status_offset = 8;
        dcr->status_size = 4;
+       offset += dcr->header.length;
 
        /* dcr-descriptor3: blk */
-       dcr = nfit_buf + offset + sizeof(struct acpi_nfit_control_region) * 3;
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
-       dcr->header.length = sizeof(struct acpi_nfit_control_region);
+       dcr->header.length = sizeof(*dcr);
        dcr->region_index = 3+1;
        dcr_common_init(dcr);
        dcr->serial_number = ~handle[3];
@@ -1741,8 +1766,8 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->command_size = 8;
        dcr->status_offset = 8;
        dcr->status_size = 4;
+       offset += dcr->header.length;
 
-       offset = offset + sizeof(struct acpi_nfit_control_region) * 4;
        /* dcr-descriptor0: pmem */
        dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
@@ -1753,10 +1778,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[0];
        dcr->code = NFIT_FIC_BYTEN;
        dcr->windows = 0;
+       offset += dcr->header.length;
 
        /* dcr-descriptor1: pmem */
-       dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
-                       window_size);
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
        dcr->header.length = offsetof(struct acpi_nfit_control_region,
                        window_size);
@@ -1765,10 +1790,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[1];
        dcr->code = NFIT_FIC_BYTEN;
        dcr->windows = 0;
+       offset += dcr->header.length;
 
        /* dcr-descriptor2: pmem */
-       dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
-                       window_size) * 2;
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
        dcr->header.length = offsetof(struct acpi_nfit_control_region,
                        window_size);
@@ -1777,10 +1802,10 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[2];
        dcr->code = NFIT_FIC_BYTEN;
        dcr->windows = 0;
+       offset += dcr->header.length;
 
        /* dcr-descriptor3: pmem */
-       dcr = nfit_buf + offset + offsetof(struct acpi_nfit_control_region,
-                       window_size) * 3;
+       dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
        dcr->header.length = offsetof(struct acpi_nfit_control_region,
                        window_size);
@@ -1789,54 +1814,56 @@ static void nfit_test0_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[3];
        dcr->code = NFIT_FIC_BYTEN;
        dcr->windows = 0;
+       offset += dcr->header.length;
 
-       offset = offset + offsetof(struct acpi_nfit_control_region,
-                       window_size) * 4;
        /* bdw0 (spa/dcr0, dimm0) */
        bdw = nfit_buf + offset;
        bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
-       bdw->header.length = sizeof(struct acpi_nfit_data_region);
+       bdw->header.length = sizeof(*bdw);
        bdw->region_index = 0+1;
        bdw->windows = 1;
        bdw->offset = 0;
        bdw->size = BDW_SIZE;
        bdw->capacity = DIMM_SIZE;
        bdw->start_address = 0;
+       offset += bdw->header.length;
 
        /* bdw1 (spa/dcr1, dimm1) */
-       bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region);
+       bdw = nfit_buf + offset;
        bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
-       bdw->header.length = sizeof(struct acpi_nfit_data_region);
+       bdw->header.length = sizeof(*bdw);
        bdw->region_index = 1+1;
        bdw->windows = 1;
        bdw->offset = 0;
        bdw->size = BDW_SIZE;
        bdw->capacity = DIMM_SIZE;
        bdw->start_address = 0;
+       offset += bdw->header.length;
 
        /* bdw2 (spa/dcr2, dimm2) */
-       bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region) * 2;
+       bdw = nfit_buf + offset;
        bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
-       bdw->header.length = sizeof(struct acpi_nfit_data_region);
+       bdw->header.length = sizeof(*bdw);
        bdw->region_index = 2+1;
        bdw->windows = 1;
        bdw->offset = 0;
        bdw->size = BDW_SIZE;
        bdw->capacity = DIMM_SIZE;
        bdw->start_address = 0;
+       offset += bdw->header.length;
 
        /* bdw3 (spa/dcr3, dimm3) */
-       bdw = nfit_buf + offset + sizeof(struct acpi_nfit_data_region) * 3;
+       bdw = nfit_buf + offset;
        bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
-       bdw->header.length = sizeof(struct acpi_nfit_data_region);
+       bdw->header.length = sizeof(*bdw);
        bdw->region_index = 3+1;
        bdw->windows = 1;
        bdw->offset = 0;
        bdw->size = BDW_SIZE;
        bdw->capacity = DIMM_SIZE;
        bdw->start_address = 0;
+       offset += bdw->header.length;
 
-       offset = offset + sizeof(struct acpi_nfit_data_region) * 4;
        /* flush0 (dimm0) */
        flush = nfit_buf + offset;
        flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
@@ -1845,48 +1872,52 @@ static void nfit_test0_setup(struct nfit_test *t)
        flush->hint_count = NUM_HINTS;
        for (i = 0; i < NUM_HINTS; i++)
                flush->hint_address[i] = t->flush_dma[0] + i * sizeof(u64);
+       offset += flush->header.length;
 
        /* flush1 (dimm1) */
-       flush = nfit_buf + offset + flush_hint_size * 1;
+       flush = nfit_buf + offset;
        flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
        flush->header.length = flush_hint_size;
        flush->device_handle = handle[1];
        flush->hint_count = NUM_HINTS;
        for (i = 0; i < NUM_HINTS; i++)
                flush->hint_address[i] = t->flush_dma[1] + i * sizeof(u64);
+       offset += flush->header.length;
 
        /* flush2 (dimm2) */
-       flush = nfit_buf + offset + flush_hint_size  * 2;
+       flush = nfit_buf + offset;
        flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
        flush->header.length = flush_hint_size;
        flush->device_handle = handle[2];
        flush->hint_count = NUM_HINTS;
        for (i = 0; i < NUM_HINTS; i++)
                flush->hint_address[i] = t->flush_dma[2] + i * sizeof(u64);
+       offset += flush->header.length;
 
        /* flush3 (dimm3) */
-       flush = nfit_buf + offset + flush_hint_size * 3;
+       flush = nfit_buf + offset;
        flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
        flush->header.length = flush_hint_size;
        flush->device_handle = handle[3];
        flush->hint_count = NUM_HINTS;
        for (i = 0; i < NUM_HINTS; i++)
                flush->hint_address[i] = t->flush_dma[3] + i * sizeof(u64);
+       offset += flush->header.length;
 
        /* platform capabilities */
-       pcap = nfit_buf + offset + flush_hint_size * 4;
+       pcap = nfit_buf + offset;
        pcap->header.type = ACPI_NFIT_TYPE_CAPABILITIES;
        pcap->header.length = sizeof(*pcap);
        pcap->highest_capability = 1;
        pcap->capabilities = ACPI_NFIT_CAPABILITY_CACHE_FLUSH |
                ACPI_NFIT_CAPABILITY_MEM_FLUSH;
+       offset += pcap->header.length;
 
        if (t->setup_hotplug) {
-               offset = offset + flush_hint_size * 4 + sizeof(*pcap);
                /* dcr-descriptor4: blk */
                dcr = nfit_buf + offset;
                dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
-               dcr->header.length = sizeof(struct acpi_nfit_control_region);
+               dcr->header.length = sizeof(*dcr);
                dcr->region_index = 8+1;
                dcr_common_init(dcr);
                dcr->serial_number = ~handle[4];
@@ -1897,8 +1928,8 @@ static void nfit_test0_setup(struct nfit_test *t)
                dcr->command_size = 8;
                dcr->status_offset = 8;
                dcr->status_size = 4;
+               offset += dcr->header.length;
 
-               offset = offset + sizeof(struct acpi_nfit_control_region);
                /* dcr-descriptor4: pmem */
                dcr = nfit_buf + offset;
                dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
@@ -1909,21 +1940,20 @@ static void nfit_test0_setup(struct nfit_test *t)
                dcr->serial_number = ~handle[4];
                dcr->code = NFIT_FIC_BYTEN;
                dcr->windows = 0;
+               offset += dcr->header.length;
 
-               offset = offset + offsetof(struct acpi_nfit_control_region,
-                               window_size);
                /* bdw4 (spa/dcr4, dimm4) */
                bdw = nfit_buf + offset;
                bdw->header.type = ACPI_NFIT_TYPE_DATA_REGION;
-               bdw->header.length = sizeof(struct acpi_nfit_data_region);
+               bdw->header.length = sizeof(*bdw);
                bdw->region_index = 8+1;
                bdw->windows = 1;
                bdw->offset = 0;
                bdw->size = BDW_SIZE;
                bdw->capacity = DIMM_SIZE;
                bdw->start_address = 0;
+               offset += bdw->header.length;
 
-               offset = offset + sizeof(struct acpi_nfit_data_region);
                /* spa10 (dcr4) dimm4 */
                spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
@@ -1932,30 +1962,32 @@ static void nfit_test0_setup(struct nfit_test *t)
                spa->range_index = 10+1;
                spa->address = t->dcr_dma[4];
                spa->length = DCR_SIZE;
+               offset += spa->header.length;
 
                /*
                 * spa11 (single-dimm interleave for hotplug, note storage
                 * does not actually alias the related block-data-window
                 * regions)
                 */
-               spa = nfit_buf + offset + sizeof(*spa);
+               spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
                spa->header.length = sizeof(*spa);
                memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_PM), 16);
                spa->range_index = 11+1;
                spa->address = t->spa_set_dma[2];
                spa->length = SPA0_SIZE;
+               offset += spa->header.length;
 
                /* spa12 (bdw for dcr4) dimm4 */
-               spa = nfit_buf + offset + sizeof(*spa) * 2;
+               spa = nfit_buf + offset;
                spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
                spa->header.length = sizeof(*spa);
                memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_BDW), 16);
                spa->range_index = 12+1;
                spa->address = t->dimm_dma[4];
                spa->length = DIMM_SIZE;
+               offset += spa->header.length;
 
-               offset = offset + sizeof(*spa) * 3;
                /* mem-region14 (spa/dcr4, dimm4) */
                memdev = nfit_buf + offset;
                memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
@@ -1970,10 +2002,10 @@ static void nfit_test0_setup(struct nfit_test *t)
                memdev->address = 0;
                memdev->interleave_index = 0;
                memdev->interleave_ways = 1;
+               offset += memdev->header.length;
 
-               /* mem-region15 (spa0, dimm4) */
-               memdev = nfit_buf + offset +
-                               sizeof(struct acpi_nfit_memory_map);
+               /* mem-region15 (spa11, dimm4) */
+               memdev = nfit_buf + offset;
                memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
                memdev->header.length = sizeof(*memdev);
                memdev->device_handle = handle[4];
@@ -1987,10 +2019,10 @@ static void nfit_test0_setup(struct nfit_test *t)
                memdev->interleave_index = 0;
                memdev->interleave_ways = 1;
                memdev->flags = ACPI_NFIT_MEM_HEALTH_ENABLED;
+               offset += memdev->header.length;
 
                /* mem-region16 (spa/bdw4, dimm4) */
-               memdev = nfit_buf + offset +
-                               sizeof(struct acpi_nfit_memory_map) * 2;
+               memdev = nfit_buf + offset;
                memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
                memdev->header.length = sizeof(*memdev);
                memdev->device_handle = handle[4];
@@ -2003,8 +2035,8 @@ static void nfit_test0_setup(struct nfit_test *t)
                memdev->address = 0;
                memdev->interleave_index = 0;
                memdev->interleave_ways = 1;
+               offset += memdev->header.length;
 
-               offset = offset + sizeof(struct acpi_nfit_memory_map) * 3;
                /* flush3 (dimm4) */
                flush = nfit_buf + offset;
                flush->header.type = ACPI_NFIT_TYPE_FLUSH_ADDRESS;
@@ -2014,6 +2046,7 @@ static void nfit_test0_setup(struct nfit_test *t)
                for (i = 0; i < NUM_HINTS; i++)
                        flush->hint_address[i] = t->flush_dma[4]
                                + i * sizeof(u64);
+               offset += flush->header.length;
        }
 
        post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0],
@@ -2061,17 +2094,18 @@ static void nfit_test1_setup(struct nfit_test *t)
        spa->range_index = 0+1;
        spa->address = t->spa_set_dma[0];
        spa->length = SPA2_SIZE;
+       offset += spa->header.length;
 
        /* virtual cd region */
-       spa = nfit_buf + sizeof(*spa);
+       spa = nfit_buf + offset;
        spa->header.type = ACPI_NFIT_TYPE_SYSTEM_ADDRESS;
        spa->header.length = sizeof(*spa);
        memcpy(spa->range_guid, to_nfit_uuid(NFIT_SPA_VCD), 16);
        spa->range_index = 0;
        spa->address = t->spa_set_dma[1];
        spa->length = SPA_VCD_SIZE;
+       offset += spa->header.length;
 
-       offset += sizeof(*spa) * 2;
        /* mem-region0 (spa0, dimm0) */
        memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
@@ -2089,8 +2123,8 @@ static void nfit_test1_setup(struct nfit_test *t)
        memdev->flags = ACPI_NFIT_MEM_SAVE_FAILED | ACPI_NFIT_MEM_RESTORE_FAILED
                | ACPI_NFIT_MEM_FLUSH_FAILED | ACPI_NFIT_MEM_HEALTH_OBSERVED
                | ACPI_NFIT_MEM_NOT_ARMED;
+       offset += memdev->header.length;
 
-       offset += sizeof(*memdev);
        /* dcr-descriptor0 */
        dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
@@ -2101,8 +2135,8 @@ static void nfit_test1_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[5];
        dcr->code = NFIT_FIC_BYTE;
        dcr->windows = 0;
-
        offset += dcr->header.length;
+
        memdev = nfit_buf + offset;
        memdev->header.type = ACPI_NFIT_TYPE_MEMORY_MAP;
        memdev->header.length = sizeof(*memdev);
@@ -2117,9 +2151,9 @@ static void nfit_test1_setup(struct nfit_test *t)
        memdev->interleave_index = 0;
        memdev->interleave_ways = 1;
        memdev->flags = ACPI_NFIT_MEM_MAP_FAILED;
+       offset += memdev->header.length;
 
        /* dcr-descriptor1 */
-       offset += sizeof(*memdev);
        dcr = nfit_buf + offset;
        dcr->header.type = ACPI_NFIT_TYPE_CONTROL_REGION;
        dcr->header.length = offsetof(struct acpi_nfit_control_region,
@@ -2129,6 +2163,7 @@ static void nfit_test1_setup(struct nfit_test *t)
        dcr->serial_number = ~handle[6];
        dcr->code = NFIT_FIC_BYTE;
        dcr->windows = 0;
+       offset += dcr->header.length;
 
        post_ars_status(&t->ars_state, &t->badrange, t->spa_set_dma[0],
                        SPA2_SIZE);