]> err.no Git - linux-2.6/commitdiff
[PATCH] x86_64: Do more checking in the SRAT header code
authorAndi Kleen <ak@suse.de>
Fri, 3 Feb 2006 20:51:26 +0000 (21:51 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 5 Feb 2006 00:43:14 +0000 (16:43 -0800)
 - Check if the processor/memory affinity entries are long enough
   according to the ACPI 3.0 spec.
 - Ignore memory affinity entries that define a zero length region.

All based on BIOS issues found in the field @)

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/x86_64/mm/srat.c

index 3bd827f5611f481f4fcaeea46941c47fd062e7a2..cd25300726fc7ac184009b3cf926f758eeb4c1bb 100644 (file)
@@ -135,7 +135,12 @@ void __init
 acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
 {
        int pxm, node;
-       if (srat_disabled() || pa->flags.enabled == 0)
+       if (srat_disabled())
+               return;
+       if (pa->header.length != sizeof(struct acpi_table_processor_affinity)) {                bad_srat();
+               return;
+       }
+       if (pa->flags.enabled == 0)
                return;
        pxm = pa->proximity_domain;
        node = setup_node(pxm);
@@ -159,8 +164,16 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
        int node, pxm;
        int i;
 
-       if (srat_disabled() || ma->flags.enabled == 0)
+       if (srat_disabled())
                return;
+       if (ma->header.length != sizeof(struct acpi_table_memory_affinity)) {
+               bad_srat();
+               return;
+       }
+       if (ma->flags.enabled == 0)
+               return;
+       start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32);
+       end = start + (ma->length_lo | ((u64)ma->length_hi << 32));
        pxm = ma->proximity_domain;
        node = setup_node(pxm);
        if (node < 0) {
@@ -168,8 +181,6 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
                bad_srat();
                return;
        }
-       start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32);
-       end = start + (ma->length_lo | ((u64)ma->length_hi << 32));
        /* It is fine to add this area to the nodes data it will be used later*/
        if (ma->flags.hot_pluggable == 1)
                printk(KERN_INFO "SRAT: hot plug zone found %lx - %lx \n",