[PATCH 1/2] acpi: acpidump: fix dump offsets in various table dumps (LP: #1293613)
Colin King
colin.king at canonical.com
Mon Mar 17 15:33:25 UTC 2014
From: Colin Ian King <colin.king at canonical.com>
fwts acpidump is reporting incorrect table offset addresses
for several tables: BERT, CPEP, BGRT, GTDT, RASF and PCCT. I
unfortunately kept on repeating the same bug as I introduced
new tables. The index offset for these should always be zero.
When testing this on ARM I also hit a Bus Error because of an
unaligned 64 bit access when fetching data from some of these
tables, so memcpy the data to the uin64_t target because the
source 64 bit value is possibly not naturally aligned on some
platforms
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/acpi/acpidump/acpidump.c | 22 ++++++++--------------
1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/src/acpi/acpidump/acpidump.c b/src/acpi/acpidump/acpidump.c
index 4bcf935..95c91ad 100644
--- a/src/acpi/acpidump/acpidump.c
+++ b/src/acpi/acpidump/acpidump.c
@@ -125,22 +125,16 @@ static uint64_t apci_dump_get_uint64_t(
const fwts_acpidump_field *info,
const void *data)
{
- uint64_t ret;
+ uint64_t ret = 0;
uint64_t mask = (1ULL << (uint64_t)info->bit_field_nbits) - 1;
int i;
switch (info->size) {
case 1:
- ret = (uint64_t)*(uint8_t *)data;
- break;
case 2:
- ret = (uint64_t)*(uint16_t *)data;
- break;
case 4:
- ret = (uint64_t)*(uint32_t *)data;
- break;
case 8:
- ret = (uint64_t)*(uint64_t *)data;
+ memcpy(&ret, data, info->size);
break;
default:
ret = 0;
@@ -443,7 +437,7 @@ static void acpidump_bert(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, table->data, fields, table->length, table->length);
+ acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
}
static void acpidump_cpep(fwts_framework *fw, const fwts_acpi_table_info *table)
@@ -1117,7 +1111,7 @@ static void acpidump_tcpa(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, table->data, fields, table->length, table->length);
+ acpi_dump_table_fields(fw, table->data, fields, 0, table->length);
}
/*
@@ -1527,7 +1521,7 @@ static void acpidump_bgrt(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, table->data, bgrt_fields, table->length, table->length);
+ acpi_dump_table_fields(fw, table->data, bgrt_fields, 0, table->length);
}
/*
@@ -1551,7 +1545,7 @@ static void acpidump_gtdt(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, table->data, gtdt_fields, table->length, table->length);
+ acpi_dump_table_fields(fw, table->data, gtdt_fields, 0, table->length);
}
/*
@@ -1648,7 +1642,7 @@ static void acpidump_rasf(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, table->data, rasf_fields, table->length, table->length);
+ acpi_dump_table_fields(fw, table->data, rasf_fields, 0, table->length);
/* No idea how to dump rest of table, spec is a rather poor */
acpi_dump_raw_table(fw, table);
@@ -1682,7 +1676,7 @@ static void acpidump_pcct(fwts_framework *fw, const fwts_acpi_table_info *table)
FIELD_END
};
- acpi_dump_table_fields(fw, data, pcct_fields, table->length, table->length);
+ acpi_dump_table_fields(fw, data, pcct_fields, 0, table->length);
ptr += sizeof(fwts_acpi_table_pcct);
--
1.9.0
More information about the fwts-devel
mailing list