diff options
Diffstat (limited to 'drivers/acpi/tables.c')
| -rw-r--r-- | drivers/acpi/tables.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index a8852952fac4..fec1ae36d431 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c | |||
| @@ -181,14 +181,15 @@ acpi_table_parse_entries(char *id, | |||
| 181 | struct acpi_subtable_header *entry; | 181 | struct acpi_subtable_header *entry; |
| 182 | unsigned int count = 0; | 182 | unsigned int count = 0; |
| 183 | unsigned long table_end; | 183 | unsigned long table_end; |
| 184 | acpi_size tbl_size; | ||
| 184 | 185 | ||
| 185 | if (!handler) | 186 | if (!handler) |
| 186 | return -EINVAL; | 187 | return -EINVAL; |
| 187 | 188 | ||
| 188 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 189 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
| 189 | acpi_get_table(id, acpi_apic_instance, &table_header); | 190 | acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size); |
| 190 | else | 191 | else |
| 191 | acpi_get_table(id, 0, &table_header); | 192 | acpi_get_table_with_size(id, 0, &table_header, &tbl_size); |
| 192 | 193 | ||
| 193 | if (!table_header) { | 194 | if (!table_header) { |
| 194 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); | 195 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); |
| @@ -206,8 +207,10 @@ acpi_table_parse_entries(char *id, | |||
| 206 | table_end) { | 207 | table_end) { |
| 207 | if (entry->type == entry_id | 208 | if (entry->type == entry_id |
| 208 | && (!max_entries || count++ < max_entries)) | 209 | && (!max_entries || count++ < max_entries)) |
| 209 | if (handler(entry, table_end)) | 210 | if (handler(entry, table_end)) { |
| 211 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
| 210 | return -EINVAL; | 212 | return -EINVAL; |
| 213 | } | ||
| 211 | 214 | ||
| 212 | entry = (struct acpi_subtable_header *) | 215 | entry = (struct acpi_subtable_header *) |
| 213 | ((unsigned long)entry + entry->length); | 216 | ((unsigned long)entry + entry->length); |
| @@ -217,6 +220,7 @@ acpi_table_parse_entries(char *id, | |||
| 217 | "%i found\n", id, entry_id, count - max_entries, count); | 220 | "%i found\n", id, entry_id, count - max_entries, count); |
| 218 | } | 221 | } |
| 219 | 222 | ||
| 223 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
| 220 | return count; | 224 | return count; |
| 221 | } | 225 | } |
| 222 | 226 | ||
| @@ -241,17 +245,19 @@ acpi_table_parse_madt(enum acpi_madt_type id, | |||
| 241 | int __init acpi_table_parse(char *id, acpi_table_handler handler) | 245 | int __init acpi_table_parse(char *id, acpi_table_handler handler) |
| 242 | { | 246 | { |
| 243 | struct acpi_table_header *table = NULL; | 247 | struct acpi_table_header *table = NULL; |
| 248 | acpi_size tbl_size; | ||
| 244 | 249 | ||
| 245 | if (!handler) | 250 | if (!handler) |
| 246 | return -EINVAL; | 251 | return -EINVAL; |
| 247 | 252 | ||
| 248 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 253 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
| 249 | acpi_get_table(id, acpi_apic_instance, &table); | 254 | acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size); |
| 250 | else | 255 | else |
| 251 | acpi_get_table(id, 0, &table); | 256 | acpi_get_table_with_size(id, 0, &table, &tbl_size); |
| 252 | 257 | ||
| 253 | if (table) { | 258 | if (table) { |
| 254 | handler(table); | 259 | handler(table); |
| 260 | early_acpi_os_unmap_memory(table, tbl_size); | ||
| 255 | return 0; | 261 | return 0; |
| 256 | } else | 262 | } else |
| 257 | return 1; | 263 | return 1; |
| @@ -265,8 +271,9 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler) | |||
| 265 | static void __init check_multiple_madt(void) | 271 | static void __init check_multiple_madt(void) |
| 266 | { | 272 | { |
| 267 | struct acpi_table_header *table = NULL; | 273 | struct acpi_table_header *table = NULL; |
| 274 | acpi_size tbl_size; | ||
| 268 | 275 | ||
| 269 | acpi_get_table(ACPI_SIG_MADT, 2, &table); | 276 | acpi_get_table_with_size(ACPI_SIG_MADT, 2, &table, &tbl_size); |
| 270 | if (table) { | 277 | if (table) { |
| 271 | printk(KERN_WARNING PREFIX | 278 | printk(KERN_WARNING PREFIX |
| 272 | "BIOS bug: multiple APIC/MADT found," | 279 | "BIOS bug: multiple APIC/MADT found," |
| @@ -275,6 +282,7 @@ static void __init check_multiple_madt(void) | |||
| 275 | "If \"acpi_apic_instance=%d\" works better, " | 282 | "If \"acpi_apic_instance=%d\" works better, " |
| 276 | "notify linux-acpi@vger.kernel.org\n", | 283 | "notify linux-acpi@vger.kernel.org\n", |
| 277 | acpi_apic_instance ? 0 : 2); | 284 | acpi_apic_instance ? 0 : 2); |
| 285 | early_acpi_os_unmap_memory(table, tbl_size); | ||
| 278 | 286 | ||
| 279 | } else | 287 | } else |
| 280 | acpi_apic_instance = 0; | 288 | acpi_apic_instance = 0; |
