diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-11 14:29:10 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-11-11 14:29:10 -0500 |
| commit | 605f37504f3afb590bf852bae4da5af8e462688e (patch) | |
| tree | 63032ec80554fd50d97639d8380cfa962fc3a721 | |
| parent | 16fe4101ae265e908615702806ee3b28ab1c8370 (diff) | |
| parent | 506f90eeae682dc96c11c7aefac0262b3a560b49 (diff) | |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, amd-ucode: Check UCODE_MAGIC before loading the container file
x86: Fix error return sequence in __ioremap_caller()
x86: Add Phoenix/MSC BIOSes to lowmem corruption list
| -rw-r--r-- | arch/x86/kernel/microcode_amd.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 7 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 24 |
3 files changed, 24 insertions, 13 deletions
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 366baa179913..f4c538b681ca 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
| @@ -317,6 +317,12 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device) | |||
| 317 | return UCODE_NFOUND; | 317 | return UCODE_NFOUND; |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | if (*(u32 *)firmware->data != UCODE_MAGIC) { | ||
| 321 | printk(KERN_ERR "microcode: invalid UCODE_MAGIC (0x%08x)\n", | ||
| 322 | *(u32 *)firmware->data); | ||
| 323 | return UCODE_ERROR; | ||
| 324 | } | ||
| 325 | |||
| 320 | ret = generic_load_microcode(cpu, firmware->data, firmware->size); | 326 | ret = generic_load_microcode(cpu, firmware->data, firmware->size); |
| 321 | 327 | ||
| 322 | release_firmware(firmware); | 328 | release_firmware(firmware); |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index e09f0e2c14b5..2a34f9c5be21 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -660,6 +660,13 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = { | |||
| 660 | }, | 660 | }, |
| 661 | }, | 661 | }, |
| 662 | { | 662 | { |
| 663 | .callback = dmi_low_memory_corruption, | ||
| 664 | .ident = "Phoenix/MSC BIOS", | ||
| 665 | .matches = { | ||
| 666 | DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix/MSC"), | ||
| 667 | }, | ||
| 668 | }, | ||
| 669 | { | ||
| 663 | /* | 670 | /* |
| 664 | * AMI BIOS with low memory corruption was found on Intel DG45ID board. | 671 | * AMI BIOS with low memory corruption was found on Intel DG45ID board. |
| 665 | * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will | 672 | * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 334e63ca7b2b..2feb9bdedaaf 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -170,8 +170,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 170 | (unsigned long long)phys_addr, | 170 | (unsigned long long)phys_addr, |
| 171 | (unsigned long long)(phys_addr + size), | 171 | (unsigned long long)(phys_addr + size), |
| 172 | prot_val, new_prot_val); | 172 | prot_val, new_prot_val); |
| 173 | free_memtype(phys_addr, phys_addr + size); | 173 | goto err_free_memtype; |
| 174 | return NULL; | ||
| 175 | } | 174 | } |
| 176 | prot_val = new_prot_val; | 175 | prot_val = new_prot_val; |
| 177 | } | 176 | } |
| @@ -197,26 +196,25 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 197 | */ | 196 | */ |
| 198 | area = get_vm_area_caller(size, VM_IOREMAP, caller); | 197 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
| 199 | if (!area) | 198 | if (!area) |
| 200 | return NULL; | 199 | goto err_free_memtype; |
| 201 | area->phys_addr = phys_addr; | 200 | area->phys_addr = phys_addr; |
| 202 | vaddr = (unsigned long) area->addr; | 201 | vaddr = (unsigned long) area->addr; |
| 203 | 202 | ||
| 204 | if (kernel_map_sync_memtype(phys_addr, size, prot_val)) { | 203 | if (kernel_map_sync_memtype(phys_addr, size, prot_val)) |
| 205 | free_memtype(phys_addr, phys_addr + size); | 204 | goto err_free_area; |
| 206 | free_vm_area(area); | ||
| 207 | return NULL; | ||
| 208 | } | ||
| 209 | 205 | ||
| 210 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) { | 206 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) |
| 211 | free_memtype(phys_addr, phys_addr + size); | 207 | goto err_free_area; |
| 212 | free_vm_area(area); | ||
| 213 | return NULL; | ||
| 214 | } | ||
| 215 | 208 | ||
| 216 | ret_addr = (void __iomem *) (vaddr + offset); | 209 | ret_addr = (void __iomem *) (vaddr + offset); |
| 217 | mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr); | 210 | mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr); |
| 218 | 211 | ||
| 219 | return ret_addr; | 212 | return ret_addr; |
| 213 | err_free_area: | ||
| 214 | free_vm_area(area); | ||
| 215 | err_free_memtype: | ||
| 216 | free_memtype(phys_addr, phys_addr + size); | ||
| 217 | return NULL; | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | /** | 220 | /** |
