[PATCH 3/5] ACPI tables: when bodging up an RSDP, do the right thing for the arch
Al Stone
al.stone at linaro.org
Thu Jan 28 17:50:25 UTC 2016
On 01/26/2016 08:01 PM, Alex Hung wrote:
> On 2016-01-22 09:14 AM, Al Stone wrote:
>> If it is necessary to create an RSDP table because there is none that
>> can be read, add in only the RSDT or XSDT pointers as needed. For x86,
>> it can be either, but for arm64 it should only be the XSDT address that
>> is used in the RSDP.
>>
>> Signed-off-by: Al Stone <al.stone at linaro.org>
>> ---
>> src/lib/src/fwts_acpi_tables.c | 19 +++++++++++--------
>> 1 file changed, 11 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
>> index 0191b6b..83bd1dd 100644
>> --- a/src/lib/src/fwts_acpi_tables.c
>> +++ b/src/lib/src/fwts_acpi_tables.c
>> @@ -1101,14 +1101,17 @@ static int fwts_acpi_load_tables_fixup(fwts_framework
>> *fw)
>> }
>>
>> /* Now we have all the tables, final fix up is required */
>> - if (rsdp->rsdt_address != rsdt_fake_addr) {
>> - rsdp->rsdt_address = rsdt_fake_addr;
>> - redo_rsdp_checksum = true;
>> - }
>> - if ((rsdp->revision > 0) && (rsdp->length >= 36) &&
>> - (rsdp->xsdt_address != xsdt_fake_addr)) {
>> - rsdp->xsdt_address = xsdt_fake_addr;
>> - redo_rsdp_checksum = true;
>> + if (fw->target_arch == FWTS_ARCH_ARM64) {
>> + if ((rsdp->revision > 0) && (rsdp->length >= 36) &&
>> + (rsdp->xsdt_address != xsdt_fake_addr)) {
>> + rsdp->xsdt_address = xsdt_fake_addr;
>> + redo_rsdp_checksum = true;
>> + }
>> + } else {
>> + if (rsdp->rsdt_address != rsdt_fake_addr) {
>> + rsdp->rsdt_address = rsdt_fake_addr;
>> + redo_rsdp_checksum = true;
>> + }
>
> Since non-ARM (ex. x86) can have either RSDP or XSDP, should the below
I assume that's a typo and RSDT or XSDT was meant...
> statements be included here as well?
>
> if ((rsdp->revision > 0) && (rsdp->length >= 36) &&
> (rsdp->xsdt_address != xsdt_fake_addr)) {
> rsdp->xsdt_address = xsdt_fake_addr;
> redo_rsdp_checksum = true;
> }
That's a good question. For 6.0 and later, either RSDT or XSDT can
be used but only one is supposed to be used at a time. Unfortunately,
the spec has been really bad about aligning table revisions with spec
revisions. And as a practical matter, many vendors fill in both of
the fields on x86, and a lot of them tend to use whatever table version
they like, even if it's inconsistent with the length.
Should the check be on the FADT major/minor numbers instead? I think
that might be a more reliable check.
>> }
>> /* And update checksum if we've updated the rsdp */
>> if (redo_rsdp_checksum) {
>>
>
>
--
ciao,
al
-----------------------------------
Al Stone
Software Engineer
Linaro Enterprise Group
al.stone at linaro.org
-----------------------------------
More information about the fwts-devel
mailing list