hw/acpi/nvdimm: Fix for NVDIMM incorrect DSM output buffer length
commit71b0269ae9a80cfd28c3b5946748b92ac8821334
authorShameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Tue, 21 Apr 2020 12:59:28 +0000 (21 13:59 +0100)
committerMichael S. Tsirkin <mst@redhat.com>
Mon, 4 May 2020 14:25:02 +0000 (4 10:25 -0400)
treec4f5164229076a6b10db54df2d9189dcef8f7dd0
parente3a99063af7bc78e51c19cb007acb646d381a9c7
hw/acpi/nvdimm: Fix for NVDIMM incorrect DSM output buffer length

As per ACPI spec 6.3, Table 19-419 Object Conversion Rules, if
the Buffer Field <= to the size of an Integer (in bits), it will
be treated as an integer. Moreover, the integer size depends on
DSDT tables revision number. If revision number is < 2, integer
size is 32 bits, otherwise it is 64 bits. Current NVDIMM common
DSM aml code (NCAL) uses CreateField() for creating DSM output
buffer. This creates an issue in arm/virt platform where DSDT
revision number is 2 and results in DSM buffer with a wrong
size(8 bytes) gets returned when actual length is < 8 bytes.
This causes guest kernel to report,

"nfit ACPI0012:00: found a zero length table '0' parsing nfit"

In order to fix this, aml code is now modified such that it builds
the DSM output buffer in a byte by byte fashion when length is
smaller than Integer size.

Suggested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <20200421125934.14952-2-shameerali.kolothum.thodi@huawei.com>
Acked-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
hw/acpi/nvdimm.c
tests/qtest/bios-tables-test-allowed-diff.h