ACPI / OSL: Improve initrd override mechanism
cover ACPI / OSL: Improve initrd override mechanism
This patchset improves initrd override mechanism.
Lv Zheng (2):
ACPI / OSL: Cleanup initrd table override code ACPI / OSL: Add support to install tables via initrd
drivers/acpi/internal.h | 1 + drivers/acpi/osl.c | 158 +++++++++++++++++++++++++++++------------------ drivers/acpi/tables.c | 2 + 3 files changed, 101 insertions(+), 60 deletions(-)
Signature · 1 line
1.7.10
PATCH 1/2 ACPI / OSL: Cleanup initrd table override code
This patch cleans up initrd table override code, merging redundant logics and re-ordering code blocks. No functional changes.
--- drivers/acpi/osl.c | 114 ++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 62 deletions(-)
drivers/acpi/osl.c +52 -62
@@ -602,6 +602,14 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val,return AE_OK ; } +static void acpi_table_taint (struct acpi_table_header *table) +{ +pr_warn (PREFIX +"Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n" , + table->signature, table->oem_table_id); +add_taint (TAINT_OVERRIDDEN_ACPI_TABLE ,LOCKDEP_NOW_UNRELIABLE ); +} +#ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE #include <linux/earlycpio.h> #include <linux/memblock.h>
@@ -746,96 +754,78 @@ void __init acpi_initrd_override(void *data, size_t size) } } } -#endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */ - -static void acpi_table_taint (struct acpi_table_header *table) -{ -pr_warn (PREFIX -"Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n" , - table->signature, table->oem_table_id); -add_taint (TAINT_OVERRIDDEN_ACPI_TABLE ,LOCKDEP_NOW_UNRELIABLE ); -} - - -acpi_status -acpi_os_table_override (struct acpi_table_header * existing_table, -struct acpi_table_header ** new_table) -{ -if (!existing_table || !new_table) -return AE_BAD_PARAMETER ; - - *new_table =NULL ; - -#ifdef CONFIG_ACPI_CUSTOM_DSDT -if (strncmp (existing_table->signature,"DSDT" ,4 ) ==0 ) - *new_table = (struct acpi_table_header *)AmlCode; -#endif -if (*new_table !=NULL ) -acpi_table_taint (existing_table); -return AE_OK ; -}acpi_status acpi_os_physical_table_override (struct acpi_table_header *existing_table, -acpi_physical_address *address, -u32 *table_length) +acpi_physical_address *address,u32 *length) { -#ifndef CONFIG_ACPI_INITRD_TABLE_OVERRIDE - *table_length =0 ; - *address =0 ; -return AE_OK ; -#else int table_offset =0 ;struct acpi_table_header *table; +u32 table_length; - *table_length =0 ; + *length =0 ; *address =0 ; -if (!acpi_tables_addr)return AE_OK ; -do { -if (table_offset +ACPI_HEADER_SIZE > all_tables_size) { -WARN_ON (1 ); -return AE_OK ; - } - +while (table_offset +ACPI_HEADER_SIZE <= all_tables_size) { table =acpi_os_map_memory (acpi_tables_addr + table_offset,ACPI_HEADER_SIZE ); -if (table_offset + table->length > all_tables_size) {acpi_os_unmap_memory (table,ACPI_HEADER_SIZE );WARN_ON (1 );return AE_OK ; } - table_offset += table->length; + table_length = table->length; -if (memcmp (existing_table->signature, table->signature,4 )) { -acpi_os_unmap_memory (table, -ACPI_HEADER_SIZE ); -continue ; - } - -/* Only override tables with matching oem id */ -if (memcmp (table->oem_table_id, existing_table->oem_table_id, +/* Only override tables matched */ +if (memcmp (existing_table->signature, table->signature,4 ) || +memcmp (table->oem_table_id, existing_table->oem_table_id,ACPI_OEM_TABLE_ID_SIZE )) { -acpi_os_unmap_memory (table, -ACPI_HEADER_SIZE ); -continue ; +acpi_os_unmap_memory (table,ACPI_HEADER_SIZE ); + goto next_table; } - table_offset -= table->length; - *table_length = table->length; -acpi_os_unmap_memory (table,ACPI_HEADER_SIZE ); + *length = table_length; *address = acpi_tables_addr + table_offset; +acpi_table_taint (existing_table); +acpi_os_unmap_memory (table,ACPI_HEADER_SIZE );break ; - }while (table_offset +ACPI_HEADER_SIZE < all_tables_size); -if (*address !=0 ) -acpi_table_taint (existing_table); +next_table: + table_offset += table_length; + }return AE_OK ; +} +#else +acpi_status +acpi_os_physical_table_override (struct acpi_table_header *existing_table, +acpi_physical_address *address, +u32 *table_length) +{ + *table_length =0 ; + *address =0 ; +return AE_OK ; +} +#endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */ + +acpi_status +acpi_os_table_override (struct acpi_table_header *existing_table, +struct acpi_table_header **new_table) +{ +if (!existing_table || !new_table) +return AE_BAD_PARAMETER ; + + *new_table =NULL ; + +#ifdef CONFIG_ACPI_CUSTOM_DSDT +if (strncmp (existing_table->signature,"DSDT" ,4 ) ==0 ) + *new_table = (struct acpi_table_header *)AmlCode;#endif +if (*new_table !=NULL ) +acpi_table_taint (existing_table); +return AE_OK ; }static irqreturn_t acpi_irq (int irq,void *dev_id)
Signature · 1 line
1.7.10
PATCH 2/2 ACPI / OSL: Add support to install tables via initrd
In reply to Lv ZhengThis patch adds support to install tables from initrd.
If a table in the initrd wasn't used by the override mechanism, the table would be installed after initializing all RSDT/XSDT tables.
Reference: https://lkml.org/lkml/2014/2/28/368
--- drivers/acpi/internal.h | 1 + drivers/acpi/osl.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++- drivers/acpi/tables.c | 2 ++ 3 files changed, 52 insertions(+), 1 deletion(-)
drivers/acpi/internal.h +1 -0
@@ -20,6 +20,7 @@#define PREFIX "ACPI: " +void acpi_initrd_initialize_tables (void );acpi_status acpi_os_initialize1 (void );void init_acpi_device_notify (void );int acpi_scan_init (void );
drivers/acpi/osl.c +49 -1
87 lines not on this page · raw message
drivers/acpi/tables.c +2 -0
@@ -32,6 +32,7 @@#include <linux/errno.h> #include <linux/acpi.h> #include <linux/bootmem.h> +#include "internal.h" #define ACPI_MAX_TABLES 128
@@ -456,6 +457,7 @@ int __init acpi_table_init(void) status =acpi_initialize_tables (initial_tables,ACPI_MAX_TABLES ,0 );if (ACPI_FAILURE (status))return -EINVAL ; +acpi_initrd_initialize_tables ();check_multiple_madt ();return 0 ;
Signature · 1 line
1.7.10
Quoted 10 lines · Lv Zheng
This patchset improves initrd override mechanism.
Lv Zheng (2):
ACPI / OSL: Cleanup initrd table override code ACPI / OSL: Add support to install tables via initrddrivers/acpi/internal.h | 1 + drivers/acpi/osl.c | 158 +++++++++++++++++++++++++++++------------------ drivers/acpi/tables.c | 2 + 3 files changed, 101 insertions(+), 60 deletions(-)
Both applied, thanks!
Rafael