On Thu, 2013-08-01 at 15:06 +0800, Tang Chen wrote:
> In acpi_initrd_override(), it checks several things to ensure the
> table it found is valid. In later patches, we need to do these check
> somewhere else. So this patch introduces a common function
> acpi_invalid_table() to do all these checks, and reuse it in different
> places. The function will be used in the subsequent patches.
> 
> Signed-off-by: Tang Chen <tangc...@cn.fujitsu.com>
> Reviewed-by: Zhang Yanfei <zhangyan...@cn.fujitsu.com>
> ---
>  drivers/acpi/osl.c |   86 
> +++++++++++++++++++++++++++++++++++++---------------
>  1 files changed, 61 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 91d9f54..8df8a93 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -572,9 +572,68 @@ static const char * const table_sigs[] = {
>  /* Must not increase 10 or needs code modification below */
>  #define ACPI_OVERRIDE_TABLES 10
>  
> +/*******************************************************************************
> + *
> + * FUNCTION:    acpi_invalid_table
> + *
> + * PARAMETERS:  File               - The initrd file
> + *              Path               - Path to acpi overriding tables in cpio 
> file
> + *              Signature          - Signature of the table
> + *
> + * RETURN:      0 if it passes all the checks, -EINVAL if any check fails.
> + *
> + * DESCRIPTION: Check if an acpi table found in initrd is invalid.
> + *              @signature can be NULL. If it is NULL, the function will 
> check
> + *              if the table signature matches any signature in table_sigs[].
> + *
> + 
> ******************************************************************************/
> +int __init acpi_invalid_table(struct cpio_data *file,
> +                           const char *path, const char *signature)

Since this function verifies a given acpi table in initrd (not that the
table is invalid), I'd suggest to rename it something like
acpi_verify_initrd().  Otherwise, it looks good to me.

Acked-by: Toshi Kani <toshi.k...@hp.com>

Thanks,
-Toshi


> +{
> +     int idx;
> +     struct acpi_table_header *table = file->data;
> +
> +     if (file->size < sizeof(struct acpi_table_header)) {
> +             INVALID_TABLE("Table smaller than ACPI header",
> +                           path, file->name);
> +             return -EINVAL;
> +     }
> +
> +     if (signature) {
> +             if (memcmp(table->signature, signature, 4)) {
> +                     INVALID_TABLE("Table signature does not match",
> +                                   path, file->name);
> +                     return -EINVAL;
> +             }
> +     } else {
> +             for (idx = 0; table_sigs[idx]; idx++)
> +                     if (!memcmp(table->signature, table_sigs[idx], 4))
> +                             break;
> +
> +             if (!table_sigs[idx]) {
> +                     INVALID_TABLE("Unknown signature", path, file->name);
> +                     return -EINVAL;
> +             }
> +     }
> +
> +     if (file->size != table->length) {
> +             INVALID_TABLE("File length does not match table length",
> +                           path, file->name);
> +             return -EINVAL;
> +     }
> +
> +     if (acpi_table_checksum(file->data, table->length)) {
> +             INVALID_TABLE("Bad table checksum",
> +                           path, file->name);
> +             return -EINVAL;
> +     }
> +
> +     return 0;
> +}
> +
>  void __init acpi_initrd_override(void *data, size_t size)
>  {
> -     int sig, no, table_nr = 0, total_offset = 0;
> +     int no, table_nr = 0, total_offset = 0;
>       long offset = 0;
>       struct acpi_table_header *table;
>       char cpio_path[32] = "kernel/firmware/acpi/";
> @@ -593,33 +652,10 @@ void __init acpi_initrd_override(void *data, size_t 
> size)
>               data += offset;
>               size -= offset;
>  
> -             if (file.size < sizeof(struct acpi_table_header)) {
> -                     INVALID_TABLE("Table smaller than ACPI header",
> -                                   cpio_path, file.name);
> -                     continue;
> -             }
> -
>               table = file.data;
>  
> -             for (sig = 0; table_sigs[sig]; sig++)
> -                     if (!memcmp(table->signature, table_sigs[sig], 4))
> -                             break;
> -
> -             if (!table_sigs[sig]) {
> -                     INVALID_TABLE("Unknown signature",
> -                                   cpio_path, file.name);
> +             if (acpi_invalid_table(&file, cpio_path, NULL))
>                       continue;
> -             }
> -             if (file.size != table->length) {
> -                     INVALID_TABLE("File length does not match table length",
> -                                   cpio_path, file.name);
> -                     continue;
> -             }
> -             if (acpi_table_checksum(file.data, table->length)) {
> -                     INVALID_TABLE("Bad table checksum",
> -                                   cpio_path, file.name);
> -                     continue;
> -             }
>  
>               pr_info("%4.4s ACPI table found in initrd [%s%s][0x%x]\n",
>                       table->signature, cpio_path, file.name, table->length);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to