From: Arjan v. de V. <fe...@us...> - 2001-11-03 23:15:12
|
Update of /cvsroot/mini-acpi/mini-acpi/arch/i386/kernel In directory usw-pr-cvs1:/tmp/cvs-serv5267 Modified Files: acpitable.c Log Message: Unwind a complex if() into 3 simple ones Index: acpitable.c =================================================================== RCS file: /cvsroot/mini-acpi/mini-acpi/arch/i386/kernel/acpitable.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- acpitable.c 2001/11/03 22:41:34 1.4 +++ acpitable.c 2001/11/03 23:15:08 1.5 @@ -123,13 +123,11 @@ /******************************************************************************* * - * FUNCTION: acpi_tb_find_rsdp + * FUNCTION: acpi_find_root_pointer * - * PARAMETERS: *Table_info - Where the table info is returned - * Flags - Current memory mode (logical vs. - * physical addressing) + * PARAMETERS: none * - * RETURN: Status + * RETURN: pointer to the RSDP * * DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor * pointer structure. If it is found, set *RSDP to point to it. @@ -215,7 +213,6 @@ static int __init acpi_tables_init(void) { int result = -ENODEV; - int status = AE_OK; acpi_table_header *header = NULL; struct acpi_table_rsdp *rsdp = NULL; struct acpi_table_rsdt *rsdt = NULL; @@ -241,34 +238,31 @@ rsdt = (struct acpi_table_rsdt *) __va_range(rsdp->rsdt_address, sizeof(struct acpi_table_rsdt)); - if (rsdt) { - header = & rsdt->header; - acpi_print_table_header(header); - if (strncmp(header->signature, RSDT_SIG, strlen(RSDT_SIG))) { - printk(KERN_WARNING "ACPI: RSDT signature incorrect\n"); - return -ENODEV; - } - - /* - * The number of tables is computed by taking the - * size of all entries (header size minus total - * size of RSDT) divided by the size of each entry - * (4-byte table pointers). - */ - tables = - (header->length - sizeof(acpi_table_header)) / 4; - - } else { - printk(KERN_WARNING - "ACPI: Invalid root system description tables (RSDT)\n"); + if (!rsdt) { + printk(KERN_WARNING "ACPI: Invalid root system description tables (RSDT)\n"); return -ENODEV; } - + + header = & rsdt->header; + acpi_print_table_header(header); + + if (strncmp(header->signature, RSDT_SIG, strlen(RSDT_SIG))) { + printk(KERN_WARNING "ACPI: RSDT signature incorrect\n"); + return -ENODEV; + } + + /* + * The number of tables is computed by taking the + * size of all entries (header size minus total + * size of RSDT) divided by the size of each entry + * (4-byte table pointers). + */ + tables = (header->length - sizeof(acpi_table_header)) / 4; + memcpy(&saved_rsdt, rsdt, sizeof(saved_rsdt)); if (saved_rsdt.header.length > sizeof(saved_rsdt)) { - printk(KERN_WARNING "ACPI: Too big length in RSDT: %d\n", - saved_rsdt.header.length); + printk(KERN_WARNING "ACPI: Too big length in RSDT: %d\n", saved_rsdt.header.length); return -ENODEV; } @@ -282,7 +276,13 @@ break; acpi_print_table_header(header); - + + if (acpi_checksum(header,header->length)) { + printk(KERN_WARNING "ACPI %s has invalid checksum\n", + acpi_table_signatures[i]); + continue; + } + for (type = 0; type < ACPI_TABLE_COUNT; type++) if (!strncmp((char *) &header->signature, acpi_table_signatures[type],strlen(acpi_table_signatures[type]))) @@ -294,15 +294,9 @@ continue; } - if (acpi_checksum(header,header->length)) { - printk(KERN_WARNING "ACPI %s has invalid checksum\n", - acpi_table_signatures[i]); - continue; - } if (acpi_boot_ops[type]) - result = - acpi_boot_ops[type] (header, + result = acpi_boot_ops[type] (header, (unsigned long) saved_rsdt. entry[i]); } |