diff options
| author | David S. Miller <davem@davemloft.net> | 2009-12-03 15:51:21 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2009-12-03 15:51:21 -0500 |
| commit | a6c872afb2536f47285e6643f4629dec7520041d (patch) | |
| tree | 4b54e69fc6594f9afc1277520a350db04e578e77 /arch/x86/kernel | |
| parent | 9fe02668fe48a1d546196bc1392330ff28d9bd57 (diff) | |
| parent | 22763c5cf3690a681551162c15d34d935308c8d7 (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/acpi/processor.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/realmode/wakeup.lds.S | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 24 | ||||
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 23 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/longhaul.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/cleanup.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/crash_dump_32.c | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/efi.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/microcode_amd.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-dma.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 7 | ||||
| -rw-r--r-- | arch/x86/kernel/tlb_uv.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux.lds.S | 3 |
20 files changed, 118 insertions, 38 deletions
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c index d296f4a195c9..d85d1b2432ba 100644 --- a/arch/x86/kernel/acpi/processor.c +++ b/arch/x86/kernel/acpi/processor.c | |||
| @@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr) | |||
| 79 | struct cpuinfo_x86 *c = &cpu_data(pr->id); | 79 | struct cpuinfo_x86 *c = &cpu_data(pr->id); |
| 80 | 80 | ||
| 81 | pr->pdc = NULL; | 81 | pr->pdc = NULL; |
| 82 | if (c->x86_vendor == X86_VENDOR_INTEL) | 82 | if (c->x86_vendor == X86_VENDOR_INTEL || |
| 83 | c->x86_vendor == X86_VENDOR_CENTAUR) | ||
| 83 | init_intel_pdc(pr, c); | 84 | init_intel_pdc(pr, c); |
| 84 | 85 | ||
| 85 | return; | 86 | return; |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S b/arch/x86/kernel/acpi/realmode/wakeup.lds.S index 7da00b799cda..060fff8f5c5b 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S | |||
| @@ -57,5 +57,8 @@ SECTIONS | |||
| 57 | *(.note*) | 57 | *(.note*) |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | /* | ||
| 61 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 62 | */ | ||
| 60 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); | 63 | . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!"); |
| 61 | } | 64 | } |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 98f230f6a28d..0285521e0a99 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1220,6 +1220,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid) | |||
| 1220 | amd_iommu_dev_table[devid].data[1] = 0; | 1220 | amd_iommu_dev_table[devid].data[1] = 0; |
| 1221 | amd_iommu_dev_table[devid].data[2] = 0; | 1221 | amd_iommu_dev_table[devid].data[2] = 0; |
| 1222 | 1222 | ||
| 1223 | amd_iommu_apply_erratum_63(devid); | ||
| 1224 | |||
| 1223 | /* decrease reference counter */ | 1225 | /* decrease reference counter */ |
| 1224 | domain->dev_cnt -= 1; | 1226 | domain->dev_cnt -= 1; |
| 1225 | 1227 | ||
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index b4b61d462dcc..c20001e4f556 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit) | |||
| 240 | writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); | 240 | writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET); |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit) | 243 | static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit) |
| 244 | { | 244 | { |
| 245 | u32 ctrl; | 245 | u32 ctrl; |
| 246 | 246 | ||
| @@ -519,6 +519,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit) | |||
| 519 | amd_iommu_dev_table[devid].data[i] |= (1 << _bit); | 519 | amd_iommu_dev_table[devid].data[i] |= (1 << _bit); |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | static int get_dev_entry_bit(u16 devid, u8 bit) | ||
| 523 | { | ||
| 524 | int i = (bit >> 5) & 0x07; | ||
| 525 | int _bit = bit & 0x1f; | ||
| 526 | |||
| 527 | return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit; | ||
| 528 | } | ||
| 529 | |||
| 530 | |||
| 531 | void amd_iommu_apply_erratum_63(u16 devid) | ||
| 532 | { | ||
| 533 | int sysmgt; | ||
| 534 | |||
| 535 | sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) | | ||
| 536 | (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1); | ||
| 537 | |||
| 538 | if (sysmgt == 0x01) | ||
| 539 | set_dev_entry_bit(devid, DEV_ENTRY_IW); | ||
| 540 | } | ||
| 541 | |||
| 522 | /* Writes the specific IOMMU for a device into the rlookup table */ | 542 | /* Writes the specific IOMMU for a device into the rlookup table */ |
| 523 | static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) | 543 | static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid) |
| 524 | { | 544 | { |
| @@ -547,6 +567,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu, | |||
| 547 | if (flags & ACPI_DEVFLAG_LINT1) | 567 | if (flags & ACPI_DEVFLAG_LINT1) |
| 548 | set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); | 568 | set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); |
| 549 | 569 | ||
| 570 | amd_iommu_apply_erratum_63(devid); | ||
| 571 | |||
| 550 | set_iommu_for_device(iommu, devid); | 572 | set_iommu_for_device(iommu, devid); |
| 551 | } | 573 | } |
| 552 | 574 | ||
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index f5f5886a6b53..326c25477d3d 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -352,14 +352,14 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) | |||
| 352 | 352 | ||
| 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { | 353 | for (i = 0; i < ARRAY_SIZE(redir_addrs); i++) { |
| 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); | 354 | alias.v = uv_read_local_mmr(redir_addrs[i].alias); |
| 355 | if (alias.s.base == 0) { | 355 | if (alias.s.enable && alias.s.base == 0) { |
| 356 | *size = (1UL << alias.s.m_alias); | 356 | *size = (1UL << alias.s.m_alias); |
| 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); | 357 | redirect.v = uv_read_local_mmr(redir_addrs[i].redirect); |
| 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; | 358 | *base = (unsigned long)redirect.s.dest_base << DEST_SHIFT; |
| 359 | return; | 359 | return; |
| 360 | } | 360 | } |
| 361 | } | 361 | } |
| 362 | BUG(); | 362 | *base = *size = 0; |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | enum map_type {map_wb, map_uc}; | 365 | enum map_type {map_wb, map_uc}; |
| @@ -619,12 +619,12 @@ void __init uv_system_init(void) | |||
| 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; | 619 | uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base; |
| 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; | 620 | uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size; |
| 621 | uv_cpu_hub_info(cpu)->m_val = m_val; | 621 | uv_cpu_hub_info(cpu)->m_val = m_val; |
| 622 | uv_cpu_hub_info(cpu)->n_val = m_val; | 622 | uv_cpu_hub_info(cpu)->n_val = n_val; |
| 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; | 623 | uv_cpu_hub_info(cpu)->numa_blade_id = blade; |
| 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; | 624 | uv_cpu_hub_info(cpu)->blade_processor_id = lcpu; |
| 625 | uv_cpu_hub_info(cpu)->pnode = pnode; | 625 | uv_cpu_hub_info(cpu)->pnode = pnode; |
| 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; | 626 | uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask; |
| 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1; | 627 | uv_cpu_hub_info(cpu)->gpa_mask = (1UL << (m_val + n_val)) - 1; |
| 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; | 628 | uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper; |
| 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; | 629 | uv_cpu_hub_info(cpu)->gnode_extra = gnode_extra; |
| 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; | 630 | uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 7d5c3b0ea8da..8b581d3905cb 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
| @@ -526,15 +526,21 @@ static const struct dmi_system_id sw_any_bug_dmi_table[] = { | |||
| 526 | 526 | ||
| 527 | static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) | 527 | static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c) |
| 528 | { | 528 | { |
| 529 | /* http://www.intel.com/Assets/PDF/specupdate/314554.pdf | 529 | /* Intel Xeon Processor 7100 Series Specification Update |
| 530 | * http://www.intel.com/Assets/PDF/specupdate/314554.pdf | ||
| 530 | * AL30: A Machine Check Exception (MCE) Occurring during an | 531 | * AL30: A Machine Check Exception (MCE) Occurring during an |
| 531 | * Enhanced Intel SpeedStep Technology Ratio Change May Cause | 532 | * Enhanced Intel SpeedStep Technology Ratio Change May Cause |
| 532 | * Both Processor Cores to Lock Up when HT is enabled*/ | 533 | * Both Processor Cores to Lock Up. */ |
| 533 | if (c->x86_vendor == X86_VENDOR_INTEL) { | 534 | if (c->x86_vendor == X86_VENDOR_INTEL) { |
| 534 | if ((c->x86 == 15) && | 535 | if ((c->x86 == 15) && |
| 535 | (c->x86_model == 6) && | 536 | (c->x86_model == 6) && |
| 536 | (c->x86_mask == 8) && smt_capable()) | 537 | (c->x86_mask == 8)) { |
| 538 | printk(KERN_INFO "acpi-cpufreq: Intel(R) " | ||
| 539 | "Xeon(R) 7100 Errata AL30, processors may " | ||
| 540 | "lock up on frequency changes: disabling " | ||
| 541 | "acpi-cpufreq.\n"); | ||
| 537 | return -ENODEV; | 542 | return -ENODEV; |
| 543 | } | ||
| 538 | } | 544 | } |
| 539 | return 0; | 545 | return 0; |
| 540 | } | 546 | } |
| @@ -549,13 +555,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 549 | unsigned int result = 0; | 555 | unsigned int result = 0; |
| 550 | struct cpuinfo_x86 *c = &cpu_data(policy->cpu); | 556 | struct cpuinfo_x86 *c = &cpu_data(policy->cpu); |
| 551 | struct acpi_processor_performance *perf; | 557 | struct acpi_processor_performance *perf; |
| 558 | #ifdef CONFIG_SMP | ||
| 559 | static int blacklisted; | ||
| 560 | #endif | ||
| 552 | 561 | ||
| 553 | dprintk("acpi_cpufreq_cpu_init\n"); | 562 | dprintk("acpi_cpufreq_cpu_init\n"); |
| 554 | 563 | ||
| 555 | #ifdef CONFIG_SMP | 564 | #ifdef CONFIG_SMP |
| 556 | result = acpi_cpufreq_blacklist(c); | 565 | if (blacklisted) |
| 557 | if (result) | 566 | return blacklisted; |
| 558 | return result; | 567 | blacklisted = acpi_cpufreq_blacklist(c); |
| 568 | if (blacklisted) | ||
| 569 | return blacklisted; | ||
| 559 | #endif | 570 | #endif |
| 560 | 571 | ||
| 561 | data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); | 572 | data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); |
diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index ce2ed3e4aad9..cabd2fa3fc93 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -813,7 +813,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
| 813 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); | 813 | memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr)); |
| 814 | break; | 814 | break; |
| 815 | case 1 ... 15: | 815 | case 1 ... 15: |
| 816 | longhaul_version = TYPE_LONGHAUL_V1; | 816 | longhaul_version = TYPE_LONGHAUL_V2; |
| 817 | if (c->x86_mask < 8) { | 817 | if (c->x86_mask < 8) { |
| 818 | cpu_model = CPU_SAMUEL2; | 818 | cpu_model = CPU_SAMUEL2; |
| 819 | cpuname = "C3 'Samuel 2' [C5B]"; | 819 | cpuname = "C3 'Samuel 2' [C5B]"; |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 6394aa5c7985..3f12dabeab52 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1022,7 +1022,7 @@ static int get_transition_latency(struct powernow_k8_data *data) | |||
| 1022 | * set it to 1 to avoid problems in the future. | 1022 | * set it to 1 to avoid problems in the future. |
| 1023 | * For all others it's a BIOS bug. | 1023 | * For all others it's a BIOS bug. |
| 1024 | */ | 1024 | */ |
| 1025 | if (!boot_cpu_data.x86 == 0x11) | 1025 | if (boot_cpu_data.x86 != 0x11) |
| 1026 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " | 1026 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " |
| 1027 | "latency\n"); | 1027 | "latency\n"); |
| 1028 | max_latency = 1; | 1028 | max_latency = 1; |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index 6911e91fb4f6..3ae5a7a3a500 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | |||
| @@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void) | |||
| 232 | return 0; | 232 | return 0; |
| 233 | } | 233 | } |
| 234 | 234 | ||
| 235 | struct get_freq_data { | 235 | static void get_freq_data(void *_speed) |
| 236 | unsigned int speed; | ||
| 237 | unsigned int processor; | ||
| 238 | }; | ||
| 239 | |||
| 240 | static void get_freq_data(void *_data) | ||
| 241 | { | 236 | { |
| 242 | struct get_freq_data *data = _data; | 237 | unsigned int *speed = _speed; |
| 243 | 238 | ||
| 244 | data->speed = speedstep_get_frequency(data->processor); | 239 | *speed = speedstep_get_frequency(speedstep_processor); |
| 245 | } | 240 | } |
| 246 | 241 | ||
| 247 | static unsigned int speedstep_get(unsigned int cpu) | 242 | static unsigned int speedstep_get(unsigned int cpu) |
| 248 | { | 243 | { |
| 249 | struct get_freq_data data = { .processor = cpu }; | 244 | unsigned int speed; |
| 250 | 245 | ||
| 251 | /* You're supposed to ensure CPU is online. */ | 246 | /* You're supposed to ensure CPU is online. */ |
| 252 | if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) | 247 | if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0) |
| 253 | BUG(); | 248 | BUG(); |
| 254 | 249 | ||
| 255 | dprintk("detected %u kHz as current frequency\n", data.speed); | 250 | dprintk("detected %u kHz as current frequency\n", speed); |
| 256 | return data.speed; | 251 | return speed; |
| 257 | } | 252 | } |
| 258 | 253 | ||
| 259 | /** | 254 | /** |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index b1598a9436d0..721a77ca8115 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
| @@ -1214,7 +1214,8 @@ static int __cpuinit mce_cap_init(void) | |||
| 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); | 1214 | rdmsrl(MSR_IA32_MCG_CAP, cap); |
| 1215 | 1215 | ||
| 1216 | b = cap & MCG_BANKCNT_MASK; | 1216 | b = cap & MCG_BANKCNT_MASK; |
| 1217 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | 1217 | if (!banks) |
| 1218 | printk(KERN_INFO "mce: CPU supports %d MCE banks\n", b); | ||
| 1218 | 1219 | ||
| 1219 | if (b > MAX_NR_BANKS) { | 1220 | if (b > MAX_NR_BANKS) { |
| 1220 | printk(KERN_WARNING | 1221 | printk(KERN_WARNING |
diff --git a/arch/x86/kernel/cpu/mtrr/cleanup.c b/arch/x86/kernel/cpu/mtrr/cleanup.c index 315738c74aad..73c86db5acbe 100644 --- a/arch/x86/kernel/cpu/mtrr/cleanup.c +++ b/arch/x86/kernel/cpu/mtrr/cleanup.c | |||
| @@ -846,7 +846,7 @@ int __init mtrr_cleanup(unsigned address_bits) | |||
| 846 | sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL); | 846 | sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL); |
| 847 | 847 | ||
| 848 | range_sums = sum_ranges(range, nr_range); | 848 | range_sums = sum_ranges(range, nr_range); |
| 849 | printk(KERN_INFO "total RAM coverred: %ldM\n", | 849 | printk(KERN_INFO "total RAM covered: %ldM\n", |
| 850 | range_sums >> (20 - PAGE_SHIFT)); | 850 | range_sums >> (20 - PAGE_SHIFT)); |
| 851 | 851 | ||
| 852 | if (mtrr_chunk_size && mtrr_gran_size) { | 852 | if (mtrr_chunk_size && mtrr_gran_size) { |
diff --git a/arch/x86/kernel/crash_dump_32.c b/arch/x86/kernel/crash_dump_32.c index f7cdb3b457aa..cd97ce18c29d 100644 --- a/arch/x86/kernel/crash_dump_32.c +++ b/arch/x86/kernel/crash_dump_32.c | |||
| @@ -16,6 +16,22 @@ static void *kdump_buf_page; | |||
| 16 | /* Stores the physical address of elf header of crash image. */ | 16 | /* Stores the physical address of elf header of crash image. */ |
| 17 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; | 17 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; |
| 18 | 18 | ||
| 19 | static inline bool is_crashed_pfn_valid(unsigned long pfn) | ||
| 20 | { | ||
| 21 | #ifndef CONFIG_X86_PAE | ||
| 22 | /* | ||
| 23 | * non-PAE kdump kernel executed from a PAE one will crop high pte | ||
| 24 | * bits and poke unwanted space counting again from address 0, we | ||
| 25 | * don't want that. pte must fit into unsigned long. In fact the | ||
| 26 | * test checks high 12 bits for being zero (pfn will be shifted left | ||
| 27 | * by PAGE_SHIFT). | ||
| 28 | */ | ||
| 29 | return pte_pfn(pfn_pte(pfn, __pgprot(0))) == pfn; | ||
| 30 | #else | ||
| 31 | return true; | ||
| 32 | #endif | ||
| 33 | } | ||
| 34 | |||
| 19 | /** | 35 | /** |
| 20 | * copy_oldmem_page - copy one page from "oldmem" | 36 | * copy_oldmem_page - copy one page from "oldmem" |
| 21 | * @pfn: page frame number to be copied | 37 | * @pfn: page frame number to be copied |
| @@ -41,6 +57,9 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 41 | if (!csize) | 57 | if (!csize) |
| 42 | return 0; | 58 | return 0; |
| 43 | 59 | ||
| 60 | if (!is_crashed_pfn_valid(pfn)) | ||
| 61 | return -EFAULT; | ||
| 62 | |||
| 44 | vaddr = kmap_atomic_pfn(pfn, KM_PTE0); | 63 | vaddr = kmap_atomic_pfn(pfn, KM_PTE0); |
| 45 | 64 | ||
| 46 | if (!userbuf) { | 65 | if (!userbuf) { |
diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index ad5bd988fb79..cdcfb122f256 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -454,8 +454,10 @@ void __init efi_init(void) | |||
| 454 | if (add_efi_memmap) | 454 | if (add_efi_memmap) |
| 455 | do_add_efi_memmap(); | 455 | do_add_efi_memmap(); |
| 456 | 456 | ||
| 457 | #ifdef CONFIG_X86_32 | ||
| 457 | x86_platform.get_wallclock = efi_get_time; | 458 | x86_platform.get_wallclock = efi_get_time; |
| 458 | x86_platform.set_wallclock = efi_set_rtc_mmss; | 459 | x86_platform.set_wallclock = efi_set_rtc_mmss; |
| 460 | #endif | ||
| 459 | 461 | ||
| 460 | /* Setup for EFI runtime service */ | 462 | /* Setup for EFI runtime service */ |
| 461 | reboot_type = BOOT_EFI; | 463 | reboot_type = BOOT_EFI; |
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/pci-dma.c b/arch/x86/kernel/pci-dma.c index b2a71dca5642..a6e804d16c35 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -45,12 +45,10 @@ int iommu_pass_through __read_mostly; | |||
| 45 | dma_addr_t bad_dma_address __read_mostly = 0; | 45 | dma_addr_t bad_dma_address __read_mostly = 0; |
| 46 | EXPORT_SYMBOL(bad_dma_address); | 46 | EXPORT_SYMBOL(bad_dma_address); |
| 47 | 47 | ||
| 48 | /* Dummy device used for NULL arguments (normally ISA). Better would | 48 | /* Dummy device used for NULL arguments (normally ISA). */ |
| 49 | be probably a smaller DMA mask, but this is bug-to-bug compatible | ||
| 50 | to older i386. */ | ||
| 51 | struct device x86_dma_fallback_dev = { | 49 | struct device x86_dma_fallback_dev = { |
| 52 | .init_name = "fallback device", | 50 | .init_name = "fallback device", |
| 53 | .coherent_dma_mask = DMA_BIT_MASK(32), | 51 | .coherent_dma_mask = ISA_DMA_BIT_MASK, |
| 54 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, | 52 | .dma_mask = &x86_dma_fallback_dev.coherent_dma_mask, |
| 55 | }; | 53 | }; |
| 56 | EXPORT_SYMBOL(x86_dma_fallback_dev); | 54 | EXPORT_SYMBOL(x86_dma_fallback_dev); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ad535b683170..eb62cbcaa490 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -664,3 +664,8 @@ long sys_arch_prctl(int code, unsigned long addr) | |||
| 664 | return do_arch_prctl(current, code, addr); | 664 | return do_arch_prctl(current, code, addr); |
| 665 | } | 665 | } |
| 666 | 666 | ||
| 667 | unsigned long KSTK_ESP(struct task_struct *task) | ||
| 668 | { | ||
| 669 | return (test_tsk_thread_flag(task, TIF_IA32)) ? | ||
| 670 | (task_pt_regs(task)->sp) : ((task)->thread.usersp); | ||
| 671 | } | ||
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index a1a3cdda06e1..f93078746e00 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -436,6 +436,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = { | |||
| 436 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"), | 436 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"), |
| 437 | }, | 437 | }, |
| 438 | }, | 438 | }, |
| 439 | { /* Handle problems with rebooting on Apple Macmini3,1 */ | ||
| 440 | .callback = set_pci_reboot, | ||
| 441 | .ident = "Apple Macmini3,1", | ||
| 442 | .matches = { | ||
| 443 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
| 444 | DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"), | ||
| 445 | }, | ||
| 446 | }, | ||
| 439 | { } | 447 | { } |
| 440 | }; | 448 | }; |
| 441 | 449 | ||
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/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 503c1f2e8835..1740c85e24bb 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | static struct bau_control **uv_bau_table_bases __read_mostly; | 23 | static struct bau_control **uv_bau_table_bases __read_mostly; |
| 24 | static int uv_bau_retry_limit __read_mostly; | 24 | static int uv_bau_retry_limit __read_mostly; |
| 25 | 25 | ||
| 26 | /* position of pnode (which is nasid>>1): */ | ||
| 27 | static int uv_nshift __read_mostly; | ||
| 28 | /* base pnode in this partition */ | 26 | /* base pnode in this partition */ |
| 29 | static int uv_partition_base_pnode __read_mostly; | 27 | static int uv_partition_base_pnode __read_mostly; |
| 30 | 28 | ||
| @@ -723,7 +721,7 @@ uv_activation_descriptor_init(int node, int pnode) | |||
| 723 | BUG_ON(!adp); | 721 | BUG_ON(!adp); |
| 724 | 722 | ||
| 725 | pa = uv_gpa(adp); /* need the real nasid*/ | 723 | pa = uv_gpa(adp); /* need the real nasid*/ |
| 726 | n = pa >> uv_nshift; | 724 | n = uv_gpa_to_pnode(pa); |
| 727 | m = pa & uv_mmask; | 725 | m = pa & uv_mmask; |
| 728 | 726 | ||
| 729 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, | 727 | uv_write_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE, |
| @@ -778,7 +776,7 @@ uv_payload_queue_init(int node, int pnode, struct bau_control *bau_tablesp) | |||
| 778 | * need the pnode of where the memory was really allocated | 776 | * need the pnode of where the memory was really allocated |
| 779 | */ | 777 | */ |
| 780 | pa = uv_gpa(pqp); | 778 | pa = uv_gpa(pqp); |
| 781 | pn = pa >> uv_nshift; | 779 | pn = uv_gpa_to_pnode(pa); |
| 782 | uv_write_global_mmr64(pnode, | 780 | uv_write_global_mmr64(pnode, |
| 783 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, | 781 | UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST, |
| 784 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | | 782 | ((unsigned long)pn << UV_PAYLOADQ_PNODE_SHIFT) | |
| @@ -843,8 +841,7 @@ static int __init uv_bau_init(void) | |||
| 843 | GFP_KERNEL, cpu_to_node(cur_cpu)); | 841 | GFP_KERNEL, cpu_to_node(cur_cpu)); |
| 844 | 842 | ||
| 845 | uv_bau_retry_limit = 1; | 843 | uv_bau_retry_limit = 1; |
| 846 | uv_nshift = uv_hub_info->n_val; | 844 | uv_mmask = (1UL << uv_hub_info->m_val) - 1; |
| 847 | uv_mmask = (1UL << uv_hub_info->n_val) - 1; | ||
| 848 | nblades = uv_num_possible_blades(); | 845 | nblades = uv_num_possible_blades(); |
| 849 | 846 | ||
| 850 | uv_bau_table_bases = (struct bau_control **) | 847 | uv_bau_table_bases = (struct bau_control **) |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 92929fb3f9fa..3c68fe2d46cf 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -305,6 +305,9 @@ SECTIONS | |||
| 305 | 305 | ||
| 306 | 306 | ||
| 307 | #ifdef CONFIG_X86_32 | 307 | #ifdef CONFIG_X86_32 |
| 308 | /* | ||
| 309 | * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility: | ||
| 310 | */ | ||
| 308 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), | 311 | . = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE), |
| 309 | "kernel image bigger than KERNEL_IMAGE_SIZE"); | 312 | "kernel image bigger than KERNEL_IMAGE_SIZE"); |
| 310 | #else | 313 | #else |
