diff options
Diffstat (limited to 'arch/x86')
35 files changed, 299 insertions, 222 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ba397bde7948..0dc9d0144a27 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -857,7 +857,7 @@ source "kernel/Kconfig.preempt" | |||
| 857 | 857 | ||
| 858 | config X86_UP_APIC | 858 | config X86_UP_APIC |
| 859 | bool "Local APIC support on uniprocessors" | 859 | bool "Local APIC support on uniprocessors" |
| 860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD && !PCI_MSI | 860 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD |
| 861 | ---help--- | 861 | ---help--- |
| 862 | A local APIC (Advanced Programmable Interrupt Controller) is an | 862 | A local APIC (Advanced Programmable Interrupt Controller) is an |
| 863 | integrated interrupt controller in the CPU. If you have a single-CPU | 863 | integrated interrupt controller in the CPU. If you have a single-CPU |
| @@ -868,6 +868,10 @@ config X86_UP_APIC | |||
| 868 | performance counters), and the NMI watchdog which detects hard | 868 | performance counters), and the NMI watchdog which detects hard |
| 869 | lockups. | 869 | lockups. |
| 870 | 870 | ||
| 871 | config X86_UP_APIC_MSI | ||
| 872 | def_bool y | ||
| 873 | select X86_UP_APIC if X86_32 && !SMP && !X86_32_NON_STANDARD && PCI_MSI | ||
| 874 | |||
| 871 | config X86_UP_IOAPIC | 875 | config X86_UP_IOAPIC |
| 872 | bool "IO-APIC support on uniprocessors" | 876 | bool "IO-APIC support on uniprocessors" |
| 873 | depends on X86_UP_APIC | 877 | depends on X86_UP_APIC |
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index d999398928bc..ad754b4411f7 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile | |||
| @@ -90,7 +90,7 @@ suffix-$(CONFIG_KERNEL_LZO) := lzo | |||
| 90 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 | 90 | suffix-$(CONFIG_KERNEL_LZ4) := lz4 |
| 91 | 91 | ||
| 92 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ | 92 | RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \ |
| 93 | perl $(srctree)/arch/x86/tools/calc_run_size.pl) | 93 | $(CONFIG_SHELL) $(srctree)/arch/x86/tools/calc_run_size.sh) |
| 94 | quiet_cmd_mkpiggy = MKPIGGY $@ | 94 | quiet_cmd_mkpiggy = MKPIGGY $@ |
| 95 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) | 95 | cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false ) |
| 96 | 96 | ||
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index dcc1c536cc21..a950864a64da 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
| @@ -373,6 +373,8 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
| 373 | unsigned long output_len, | 373 | unsigned long output_len, |
| 374 | unsigned long run_size) | 374 | unsigned long run_size) |
| 375 | { | 375 | { |
| 376 | unsigned char *output_orig = output; | ||
| 377 | |||
| 376 | real_mode = rmode; | 378 | real_mode = rmode; |
| 377 | 379 | ||
| 378 | sanitize_boot_params(real_mode); | 380 | sanitize_boot_params(real_mode); |
| @@ -421,7 +423,12 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
| 421 | debug_putstr("\nDecompressing Linux... "); | 423 | debug_putstr("\nDecompressing Linux... "); |
| 422 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | 424 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); |
| 423 | parse_elf(output); | 425 | parse_elf(output); |
| 424 | handle_relocations(output, output_len); | 426 | /* |
| 427 | * 32-bit always performs relocations. 64-bit relocations are only | ||
| 428 | * needed if kASLR has chosen a different load address. | ||
| 429 | */ | ||
| 430 | if (!IS_ENABLED(CONFIG_X86_64) || output != output_orig) | ||
| 431 | handle_relocations(output, output_len); | ||
| 425 | debug_putstr("done.\nBooting the kernel.\n"); | 432 | debug_putstr("done.\nBooting the kernel.\n"); |
| 426 | return output; | 433 | return output; |
| 427 | } | 434 | } |
diff --git a/arch/x86/crypto/sha-mb/sha1_mb.c b/arch/x86/crypto/sha-mb/sha1_mb.c index a225a5ca1037..fd9f6b035b16 100644 --- a/arch/x86/crypto/sha-mb/sha1_mb.c +++ b/arch/x86/crypto/sha-mb/sha1_mb.c | |||
| @@ -931,4 +931,4 @@ module_exit(sha1_mb_mod_fini); | |||
| 931 | MODULE_LICENSE("GPL"); | 931 | MODULE_LICENSE("GPL"); |
| 932 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, multi buffer accelerated"); | 932 | MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, multi buffer accelerated"); |
| 933 | 933 | ||
| 934 | MODULE_ALIAS("sha1"); | 934 | MODULE_ALIAS_CRYPTO("sha1"); |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 0ab4f9fd2687..3a45668f6dc3 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
| @@ -50,6 +50,7 @@ void acpi_pic_sci_set_trigger(unsigned int, u16); | |||
| 50 | 50 | ||
| 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, |
| 52 | int trigger, int polarity); | 52 | int trigger, int polarity); |
| 53 | extern void (*__acpi_unregister_gsi)(u32 gsi); | ||
| 53 | 54 | ||
| 54 | static inline void disable_acpi(void) | 55 | static inline void disable_acpi(void) |
| 55 | { | 56 | { |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 50d033a8947d..a94b82e8f156 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
| @@ -251,7 +251,8 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | #define _LDT_empty(info) \ | 254 | /* This intentionally ignores lm, since 32-bit apps don't have that field. */ |
| 255 | #define LDT_empty(info) \ | ||
| 255 | ((info)->base_addr == 0 && \ | 256 | ((info)->base_addr == 0 && \ |
| 256 | (info)->limit == 0 && \ | 257 | (info)->limit == 0 && \ |
| 257 | (info)->contents == 0 && \ | 258 | (info)->contents == 0 && \ |
| @@ -261,11 +262,18 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 261 | (info)->seg_not_present == 1 && \ | 262 | (info)->seg_not_present == 1 && \ |
| 262 | (info)->useable == 0) | 263 | (info)->useable == 0) |
| 263 | 264 | ||
| 264 | #ifdef CONFIG_X86_64 | 265 | /* Lots of programs expect an all-zero user_desc to mean "no segment at all". */ |
| 265 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) | 266 | static inline bool LDT_zero(const struct user_desc *info) |
| 266 | #else | 267 | { |
| 267 | #define LDT_empty(info) (_LDT_empty(info)) | 268 | return (info->base_addr == 0 && |
| 268 | #endif | 269 | info->limit == 0 && |
| 270 | info->contents == 0 && | ||
| 271 | info->read_exec_only == 0 && | ||
| 272 | info->seg_32bit == 0 && | ||
| 273 | info->limit_in_pages == 0 && | ||
| 274 | info->seg_not_present == 0 && | ||
| 275 | info->useable == 0); | ||
| 276 | } | ||
| 269 | 277 | ||
| 270 | static inline void clear_LDT(void) | 278 | static inline void clear_LDT(void) |
| 271 | { | 279 | { |
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 40269a2bf6f9..4b75d591eb5e 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
| @@ -130,7 +130,25 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, | |||
| 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, | 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, |
| 131 | unsigned long start, unsigned long end) | 131 | unsigned long start, unsigned long end) |
| 132 | { | 132 | { |
| 133 | mpx_notify_unmap(mm, vma, start, end); | 133 | /* |
| 134 | * mpx_notify_unmap() goes and reads a rarely-hot | ||
| 135 | * cacheline in the mm_struct. That can be expensive | ||
| 136 | * enough to be seen in profiles. | ||
| 137 | * | ||
| 138 | * The mpx_notify_unmap() call and its contents have been | ||
| 139 | * observed to affect munmap() performance on hardware | ||
| 140 | * where MPX is not present. | ||
| 141 | * | ||
| 142 | * The unlikely() optimizes for the fast case: no MPX | ||
| 143 | * in the CPU, or no MPX use in the process. Even if | ||
| 144 | * we get this wrong (in the unlikely event that MPX | ||
| 145 | * is widely enabled on some system) the overhead of | ||
| 146 | * MPX itself (reading bounds tables) is expected to | ||
| 147 | * overwhelm the overhead of getting this unlikely() | ||
| 148 | * consistently wrong. | ||
| 149 | */ | ||
| 150 | if (unlikely(cpu_feature_enabled(X86_FEATURE_MPX))) | ||
| 151 | mpx_notify_unmap(mm, vma, start, end); | ||
| 134 | } | 152 | } |
| 135 | 153 | ||
| 136 | #endif /* _ASM_X86_MMU_CONTEXT_H */ | 154 | #endif /* _ASM_X86_MMU_CONTEXT_H */ |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d1626364a28a..b9e30daa0881 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -611,20 +611,20 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
| 611 | 611 | ||
| 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) | 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) |
| 613 | { | 613 | { |
| 614 | int irq; | 614 | int rc, irq, trigger, polarity; |
| 615 | 615 | ||
| 616 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 616 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); |
| 617 | *irqp = gsi; | 617 | if (rc == 0) { |
| 618 | } else { | 618 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; |
| 619 | mutex_lock(&acpi_ioapic_lock); | 619 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; |
| 620 | irq = mp_map_gsi_to_irq(gsi, | 620 | irq = acpi_register_gsi(NULL, gsi, trigger, polarity); |
| 621 | IOAPIC_MAP_ALLOC | IOAPIC_MAP_CHECK); | 621 | if (irq >= 0) { |
| 622 | mutex_unlock(&acpi_ioapic_lock); | 622 | *irqp = irq; |
| 623 | if (irq < 0) | 623 | return 0; |
| 624 | return -1; | 624 | } |
| 625 | *irqp = irq; | ||
| 626 | } | 625 | } |
| 627 | return 0; | 626 | |
| 627 | return -1; | ||
| 628 | } | 628 | } |
| 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); | 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); |
| 630 | 630 | ||
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index 15c29096136b..36a83617eb21 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c | |||
| @@ -552,7 +552,7 @@ static int __init microcode_init(void) | |||
| 552 | int error; | 552 | int error; |
| 553 | 553 | ||
| 554 | if (paravirt_enabled() || dis_ucode_ldr) | 554 | if (paravirt_enabled() || dis_ucode_ldr) |
| 555 | return 0; | 555 | return -EINVAL; |
| 556 | 556 | ||
| 557 | if (c->x86_vendor == X86_VENDOR_INTEL) | 557 | if (c->x86_vendor == X86_VENDOR_INTEL) |
| 558 | microcode_ops = init_intel_microcode(); | 558 | microcode_ops = init_intel_microcode(); |
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index a450373e8e91..939155ffdece 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c | |||
| @@ -107,6 +107,7 @@ static struct clocksource hyperv_cs = { | |||
| 107 | .rating = 400, /* use this when running on Hyperv*/ | 107 | .rating = 400, /* use this when running on Hyperv*/ |
| 108 | .read = read_hv_clock, | 108 | .read = read_hv_clock, |
| 109 | .mask = CLOCKSOURCE_MASK(64), | 109 | .mask = CLOCKSOURCE_MASK(64), |
| 110 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | static void __init ms_hyperv_init_platform(void) | 113 | static void __init ms_hyperv_init_platform(void) |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 944bf019b74f..498b6d967138 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -2431,6 +2431,7 @@ __init int intel_pmu_init(void) | |||
| 2431 | break; | 2431 | break; |
| 2432 | 2432 | ||
| 2433 | case 55: /* 22nm Atom "Silvermont" */ | 2433 | case 55: /* 22nm Atom "Silvermont" */ |
| 2434 | case 76: /* 14nm Atom "Airmont" */ | ||
| 2434 | case 77: /* 22nm Atom "Silvermont Avoton/Rangely" */ | 2435 | case 77: /* 22nm Atom "Silvermont Avoton/Rangely" */ |
| 2435 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, | 2436 | memcpy(hw_cache_event_ids, slm_hw_cache_event_ids, |
| 2436 | sizeof(hw_cache_event_ids)); | 2437 | sizeof(hw_cache_event_ids)); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 3c895d480cd7..073983398364 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
| @@ -568,8 +568,8 @@ struct event_constraint intel_atom_pebs_event_constraints[] = { | |||
| 568 | }; | 568 | }; |
| 569 | 569 | ||
| 570 | struct event_constraint intel_slm_pebs_event_constraints[] = { | 570 | struct event_constraint intel_slm_pebs_event_constraints[] = { |
| 571 | /* UOPS_RETIRED.ALL, inv=1, cmask=16 (cycles:p). */ | 571 | /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ |
| 572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108001c2, 0xf), | 572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x1), |
| 573 | /* Allow all events as PEBS with no flags */ | 573 | /* Allow all events as PEBS with no flags */ |
| 574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), | 574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), |
| 575 | EVENT_CONSTRAINT_END | 575 | EVENT_CONSTRAINT_END |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index 673f930c700f..c4bb8b8e5017 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
| @@ -103,6 +103,13 @@ static struct kobj_attribute format_attr_##_var = \ | |||
| 103 | 103 | ||
| 104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ | 104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ |
| 105 | 105 | ||
| 106 | #define RAPL_EVENT_ATTR_STR(_name, v, str) \ | ||
| 107 | static struct perf_pmu_events_attr event_attr_##v = { \ | ||
| 108 | .attr = __ATTR(_name, 0444, rapl_sysfs_show, NULL), \ | ||
| 109 | .id = 0, \ | ||
| 110 | .event_str = str, \ | ||
| 111 | }; | ||
| 112 | |||
| 106 | struct rapl_pmu { | 113 | struct rapl_pmu { |
| 107 | spinlock_t lock; | 114 | spinlock_t lock; |
| 108 | int hw_unit; /* 1/2^hw_unit Joule */ | 115 | int hw_unit; /* 1/2^hw_unit Joule */ |
| @@ -135,7 +142,7 @@ static inline u64 rapl_scale(u64 v) | |||
| 135 | * or use ldexp(count, -32). | 142 | * or use ldexp(count, -32). |
| 136 | * Watts = Joules/Time delta | 143 | * Watts = Joules/Time delta |
| 137 | */ | 144 | */ |
| 138 | return v << (32 - __this_cpu_read(rapl_pmu->hw_unit)); | 145 | return v << (32 - __this_cpu_read(rapl_pmu)->hw_unit); |
| 139 | } | 146 | } |
| 140 | 147 | ||
| 141 | static u64 rapl_event_update(struct perf_event *event) | 148 | static u64 rapl_event_update(struct perf_event *event) |
| @@ -379,23 +386,36 @@ static struct attribute_group rapl_pmu_attr_group = { | |||
| 379 | .attrs = rapl_pmu_attrs, | 386 | .attrs = rapl_pmu_attrs, |
| 380 | }; | 387 | }; |
| 381 | 388 | ||
| 382 | EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | 389 | static ssize_t rapl_sysfs_show(struct device *dev, |
| 383 | EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | 390 | struct device_attribute *attr, |
| 384 | EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | 391 | char *page) |
| 385 | EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | 392 | { |
| 393 | struct perf_pmu_events_attr *pmu_attr = \ | ||
| 394 | container_of(attr, struct perf_pmu_events_attr, attr); | ||
| 395 | |||
| 396 | if (pmu_attr->event_str) | ||
| 397 | return sprintf(page, "%s", pmu_attr->event_str); | ||
| 398 | |||
| 399 | return 0; | ||
| 400 | } | ||
| 401 | |||
| 402 | RAPL_EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | ||
| 403 | RAPL_EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | ||
| 404 | RAPL_EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | ||
| 405 | RAPL_EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | ||
| 386 | 406 | ||
| 387 | EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); | 407 | RAPL_EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); |
| 388 | EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); | 408 | RAPL_EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); |
| 389 | EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); | 409 | RAPL_EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); |
| 390 | EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); | 410 | RAPL_EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); |
| 391 | 411 | ||
| 392 | /* | 412 | /* |
| 393 | * we compute in 0.23 nJ increments regardless of MSR | 413 | * we compute in 0.23 nJ increments regardless of MSR |
| 394 | */ | 414 | */ |
| 395 | EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); | 415 | RAPL_EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); |
| 396 | EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); | 416 | RAPL_EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); |
| 397 | EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); | 417 | RAPL_EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); |
| 398 | EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); | 418 | RAPL_EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); |
| 399 | 419 | ||
| 400 | static struct attribute *rapl_events_srv_attr[] = { | 420 | static struct attribute *rapl_events_srv_attr[] = { |
| 401 | EVENT_PTR(rapl_cores), | 421 | EVENT_PTR(rapl_cores), |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 10b8d3eaaf15..c635b8b49e93 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -840,7 +840,6 @@ static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id | |||
| 840 | box->phys_id = phys_id; | 840 | box->phys_id = phys_id; |
| 841 | box->pci_dev = pdev; | 841 | box->pci_dev = pdev; |
| 842 | box->pmu = pmu; | 842 | box->pmu = pmu; |
| 843 | uncore_box_init(box); | ||
| 844 | pci_set_drvdata(pdev, box); | 843 | pci_set_drvdata(pdev, box); |
| 845 | 844 | ||
| 846 | raw_spin_lock(&uncore_box_lock); | 845 | raw_spin_lock(&uncore_box_lock); |
| @@ -1004,10 +1003,8 @@ static int uncore_cpu_starting(int cpu) | |||
| 1004 | pmu = &type->pmus[j]; | 1003 | pmu = &type->pmus[j]; |
| 1005 | box = *per_cpu_ptr(pmu->box, cpu); | 1004 | box = *per_cpu_ptr(pmu->box, cpu); |
| 1006 | /* called by uncore_cpu_init? */ | 1005 | /* called by uncore_cpu_init? */ |
| 1007 | if (box && box->phys_id >= 0) { | 1006 | if (box && box->phys_id >= 0) |
| 1008 | uncore_box_init(box); | ||
| 1009 | continue; | 1007 | continue; |
| 1010 | } | ||
| 1011 | 1008 | ||
| 1012 | for_each_online_cpu(k) { | 1009 | for_each_online_cpu(k) { |
| 1013 | exist = *per_cpu_ptr(pmu->box, k); | 1010 | exist = *per_cpu_ptr(pmu->box, k); |
| @@ -1023,10 +1020,8 @@ static int uncore_cpu_starting(int cpu) | |||
| 1023 | } | 1020 | } |
| 1024 | } | 1021 | } |
| 1025 | 1022 | ||
| 1026 | if (box) { | 1023 | if (box) |
| 1027 | box->phys_id = phys_id; | 1024 | box->phys_id = phys_id; |
| 1028 | uncore_box_init(box); | ||
| 1029 | } | ||
| 1030 | } | 1025 | } |
| 1031 | } | 1026 | } |
| 1032 | return 0; | 1027 | return 0; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h index 863d9b02563e..6c8c1e7e69d8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h | |||
| @@ -257,6 +257,14 @@ static inline int uncore_num_counters(struct intel_uncore_box *box) | |||
| 257 | return box->pmu->type->num_counters; | 257 | return box->pmu->type->num_counters; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | static inline void uncore_box_init(struct intel_uncore_box *box) | ||
| 261 | { | ||
| 262 | if (!test_and_set_bit(UNCORE_BOX_FLAG_INITIATED, &box->flags)) { | ||
| 263 | if (box->pmu->type->ops->init_box) | ||
| 264 | box->pmu->type->ops->init_box(box); | ||
| 265 | } | ||
| 266 | } | ||
| 267 | |||
| 260 | static inline void uncore_disable_box(struct intel_uncore_box *box) | 268 | static inline void uncore_disable_box(struct intel_uncore_box *box) |
| 261 | { | 269 | { |
| 262 | if (box->pmu->type->ops->disable_box) | 270 | if (box->pmu->type->ops->disable_box) |
| @@ -265,6 +273,8 @@ static inline void uncore_disable_box(struct intel_uncore_box *box) | |||
| 265 | 273 | ||
| 266 | static inline void uncore_enable_box(struct intel_uncore_box *box) | 274 | static inline void uncore_enable_box(struct intel_uncore_box *box) |
| 267 | { | 275 | { |
| 276 | uncore_box_init(box); | ||
| 277 | |||
| 268 | if (box->pmu->type->ops->enable_box) | 278 | if (box->pmu->type->ops->enable_box) |
| 269 | box->pmu->type->ops->enable_box(box); | 279 | box->pmu->type->ops->enable_box(box); |
| 270 | } | 280 | } |
| @@ -287,14 +297,6 @@ static inline u64 uncore_read_counter(struct intel_uncore_box *box, | |||
| 287 | return box->pmu->type->ops->read_counter(box, event); | 297 | return box->pmu->type->ops->read_counter(box, event); |
| 288 | } | 298 | } |
| 289 | 299 | ||
| 290 | static inline void uncore_box_init(struct intel_uncore_box *box) | ||
| 291 | { | ||
| 292 | if (!test_and_set_bit(UNCORE_BOX_FLAG_INITIATED, &box->flags)) { | ||
| 293 | if (box->pmu->type->ops->init_box) | ||
| 294 | box->pmu->type->ops->init_box(box); | ||
| 295 | } | ||
| 296 | } | ||
| 297 | |||
| 298 | static inline bool uncore_box_is_fake(struct intel_uncore_box *box) | 300 | static inline bool uncore_box_is_fake(struct intel_uncore_box *box) |
| 299 | { | 301 | { |
| 300 | return (box->phys_id < 0); | 302 | return (box->phys_id < 0); |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 2142376dc8c6..8b7b0a51e742 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -674,7 +674,7 @@ static inline void *alloc_tramp(unsigned long size) | |||
| 674 | } | 674 | } |
| 675 | static inline void tramp_free(void *tramp) | 675 | static inline void tramp_free(void *tramp) |
| 676 | { | 676 | { |
| 677 | module_free(NULL, tramp); | 677 | module_memfree(tramp); |
| 678 | } | 678 | } |
| 679 | #else | 679 | #else |
| 680 | /* Trampolines can only be created if modules are supported */ | 680 | /* Trampolines can only be created if modules are supported */ |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 6307a0f0cf17..705ef8d48e2d 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -127,7 +127,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
| 127 | seq_puts(p, " Machine check polls\n"); | 127 | seq_puts(p, " Machine check polls\n"); |
| 128 | #endif | 128 | #endif |
| 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) | 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) |
| 130 | seq_printf(p, "%*s: ", prec, "THR"); | 130 | seq_printf(p, "%*s: ", prec, "HYP"); |
| 131 | for_each_online_cpu(j) | 131 | for_each_online_cpu(j) |
| 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); | 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); |
| 133 | seq_puts(p, " Hypervisor callback interrupts\n"); | 133 | seq_puts(p, " Hypervisor callback interrupts\n"); |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index f7e3cd50ece0..98f654d466e5 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
| @@ -1020,6 +1020,15 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 1020 | regs->flags &= ~X86_EFLAGS_IF; | 1020 | regs->flags &= ~X86_EFLAGS_IF; |
| 1021 | trace_hardirqs_off(); | 1021 | trace_hardirqs_off(); |
| 1022 | regs->ip = (unsigned long)(jp->entry); | 1022 | regs->ip = (unsigned long)(jp->entry); |
| 1023 | |||
| 1024 | /* | ||
| 1025 | * jprobes use jprobe_return() which skips the normal return | ||
| 1026 | * path of the function, and this messes up the accounting of the | ||
| 1027 | * function graph tracer to get messed up. | ||
| 1028 | * | ||
| 1029 | * Pause function graph tracing while performing the jprobe function. | ||
| 1030 | */ | ||
| 1031 | pause_graph_tracing(); | ||
| 1023 | return 1; | 1032 | return 1; |
| 1024 | } | 1033 | } |
| 1025 | NOKPROBE_SYMBOL(setjmp_pre_handler); | 1034 | NOKPROBE_SYMBOL(setjmp_pre_handler); |
| @@ -1048,24 +1057,25 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 1048 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 1057 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
| 1049 | u8 *addr = (u8 *) (regs->ip - 1); | 1058 | u8 *addr = (u8 *) (regs->ip - 1); |
| 1050 | struct jprobe *jp = container_of(p, struct jprobe, kp); | 1059 | struct jprobe *jp = container_of(p, struct jprobe, kp); |
| 1060 | void *saved_sp = kcb->jprobe_saved_sp; | ||
| 1051 | 1061 | ||
| 1052 | if ((addr > (u8 *) jprobe_return) && | 1062 | if ((addr > (u8 *) jprobe_return) && |
| 1053 | (addr < (u8 *) jprobe_return_end)) { | 1063 | (addr < (u8 *) jprobe_return_end)) { |
| 1054 | if (stack_addr(regs) != kcb->jprobe_saved_sp) { | 1064 | if (stack_addr(regs) != saved_sp) { |
| 1055 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | 1065 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; |
| 1056 | printk(KERN_ERR | 1066 | printk(KERN_ERR |
| 1057 | "current sp %p does not match saved sp %p\n", | 1067 | "current sp %p does not match saved sp %p\n", |
| 1058 | stack_addr(regs), kcb->jprobe_saved_sp); | 1068 | stack_addr(regs), saved_sp); |
| 1059 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | 1069 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); |
| 1060 | show_regs(saved_regs); | 1070 | show_regs(saved_regs); |
| 1061 | printk(KERN_ERR "Current registers\n"); | 1071 | printk(KERN_ERR "Current registers\n"); |
| 1062 | show_regs(regs); | 1072 | show_regs(regs); |
| 1063 | BUG(); | 1073 | BUG(); |
| 1064 | } | 1074 | } |
| 1075 | /* It's OK to start function graph tracing again */ | ||
| 1076 | unpause_graph_tracing(); | ||
| 1065 | *regs = kcb->jprobe_saved_regs; | 1077 | *regs = kcb->jprobe_saved_regs; |
| 1066 | memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | 1078 | memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); |
| 1067 | kcb->jprobes_stack, | ||
| 1068 | MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
| 1069 | preempt_enable_no_resched(); | 1079 | preempt_enable_no_resched(); |
| 1070 | return 1; | 1080 | return 1; |
| 1071 | } | 1081 | } |
diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 4e942f31b1a7..7fc5e843f247 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
| @@ -29,7 +29,28 @@ static int get_free_idx(void) | |||
| 29 | 29 | ||
| 30 | static bool tls_desc_okay(const struct user_desc *info) | 30 | static bool tls_desc_okay(const struct user_desc *info) |
| 31 | { | 31 | { |
| 32 | if (LDT_empty(info)) | 32 | /* |
| 33 | * For historical reasons (i.e. no one ever documented how any | ||
| 34 | * of the segmentation APIs work), user programs can and do | ||
| 35 | * assume that a struct user_desc that's all zeros except for | ||
| 36 | * entry_number means "no segment at all". This never actually | ||
| 37 | * worked. In fact, up to Linux 3.19, a struct user_desc like | ||
| 38 | * this would create a 16-bit read-write segment with base and | ||
| 39 | * limit both equal to zero. | ||
| 40 | * | ||
| 41 | * That was close enough to "no segment at all" until we | ||
| 42 | * hardened this function to disallow 16-bit TLS segments. Fix | ||
| 43 | * it up by interpreting these zeroed segments the way that they | ||
| 44 | * were almost certainly intended to be interpreted. | ||
| 45 | * | ||
| 46 | * The correct way to ask for "no segment at all" is to specify | ||
| 47 | * a user_desc that satisfies LDT_empty. To keep everything | ||
| 48 | * working, we accept both. | ||
| 49 | * | ||
| 50 | * Note that there's a similar kludge in modify_ldt -- look at | ||
| 51 | * the distinction between modes 1 and 0x11. | ||
| 52 | */ | ||
| 53 | if (LDT_empty(info) || LDT_zero(info)) | ||
| 33 | return true; | 54 | return true; |
| 34 | 55 | ||
| 35 | /* | 56 | /* |
| @@ -71,7 +92,7 @@ static void set_tls_desc(struct task_struct *p, int idx, | |||
| 71 | cpu = get_cpu(); | 92 | cpu = get_cpu(); |
| 72 | 93 | ||
| 73 | while (n-- > 0) { | 94 | while (n-- > 0) { |
| 74 | if (LDT_empty(info)) | 95 | if (LDT_empty(info) || LDT_zero(info)) |
| 75 | desc->a = desc->b = 0; | 96 | desc->a = desc->b = 0; |
| 76 | else | 97 | else |
| 77 | fill_ldt(desc, info); | 98 | fill_ldt(desc, info); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index b7e50bba3bbb..505449700e0c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -617,7 +617,7 @@ static unsigned long quick_pit_calibrate(void) | |||
| 617 | goto success; | 617 | goto success; |
| 618 | } | 618 | } |
| 619 | } | 619 | } |
| 620 | pr_err("Fast TSC calibration failed\n"); | 620 | pr_info("Fast TSC calibration failed\n"); |
| 621 | return 0; | 621 | return 0; |
| 622 | 622 | ||
| 623 | success: | 623 | success: |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 169b09d76ddd..de12c1d379f1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -2348,7 +2348,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
| 2348 | * Not recognized on AMD in compat mode (but is recognized in legacy | 2348 | * Not recognized on AMD in compat mode (but is recognized in legacy |
| 2349 | * mode). | 2349 | * mode). |
| 2350 | */ | 2350 | */ |
| 2351 | if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA) | 2351 | if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA) |
| 2352 | && !vendor_intel(ctxt)) | 2352 | && !vendor_intel(ctxt)) |
| 2353 | return emulate_ud(ctxt); | 2353 | return emulate_ud(ctxt); |
| 2354 | 2354 | ||
| @@ -2359,25 +2359,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
| 2359 | setup_syscalls_segments(ctxt, &cs, &ss); | 2359 | setup_syscalls_segments(ctxt, &cs, &ss); |
| 2360 | 2360 | ||
| 2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); | 2361 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data); |
| 2362 | switch (ctxt->mode) { | 2362 | if ((msr_data & 0xfffc) == 0x0) |
| 2363 | case X86EMUL_MODE_PROT32: | 2363 | return emulate_gp(ctxt, 0); |
| 2364 | if ((msr_data & 0xfffc) == 0x0) | ||
| 2365 | return emulate_gp(ctxt, 0); | ||
| 2366 | break; | ||
| 2367 | case X86EMUL_MODE_PROT64: | ||
| 2368 | if (msr_data == 0x0) | ||
| 2369 | return emulate_gp(ctxt, 0); | ||
| 2370 | break; | ||
| 2371 | default: | ||
| 2372 | break; | ||
| 2373 | } | ||
| 2374 | 2364 | ||
| 2375 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); | 2365 | ctxt->eflags &= ~(EFLG_VM | EFLG_IF); |
| 2376 | cs_sel = (u16)msr_data; | 2366 | cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK; |
| 2377 | cs_sel &= ~SELECTOR_RPL_MASK; | ||
| 2378 | ss_sel = cs_sel + 8; | 2367 | ss_sel = cs_sel + 8; |
| 2379 | ss_sel &= ~SELECTOR_RPL_MASK; | 2368 | if (efer & EFER_LMA) { |
| 2380 | if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) { | ||
| 2381 | cs.d = 0; | 2369 | cs.d = 0; |
| 2382 | cs.l = 1; | 2370 | cs.l = 1; |
| 2383 | } | 2371 | } |
| @@ -2386,10 +2374,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt) | |||
| 2386 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); | 2374 | ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS); |
| 2387 | 2375 | ||
| 2388 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); | 2376 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data); |
| 2389 | ctxt->_eip = msr_data; | 2377 | ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data; |
| 2390 | 2378 | ||
| 2391 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); | 2379 | ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data); |
| 2392 | *reg_write(ctxt, VCPU_REGS_RSP) = msr_data; | 2380 | *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data : |
| 2381 | (u32)msr_data; | ||
| 2393 | 2382 | ||
| 2394 | return X86EMUL_CONTINUE; | 2383 | return X86EMUL_CONTINUE; |
| 2395 | } | 2384 | } |
| @@ -3791,8 +3780,8 @@ static const struct opcode group5[] = { | |||
| 3791 | }; | 3780 | }; |
| 3792 | 3781 | ||
| 3793 | static const struct opcode group6[] = { | 3782 | static const struct opcode group6[] = { |
| 3794 | DI(Prot, sldt), | 3783 | DI(Prot | DstMem, sldt), |
| 3795 | DI(Prot, str), | 3784 | DI(Prot | DstMem, str), |
| 3796 | II(Prot | Priv | SrcMem16, em_lldt, lldt), | 3785 | II(Prot | Priv | SrcMem16, em_lldt, lldt), |
| 3797 | II(Prot | Priv | SrcMem16, em_ltr, ltr), | 3786 | II(Prot | Priv | SrcMem16, em_ltr, ltr), |
| 3798 | N, N, N, N, | 3787 | N, N, N, N, |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 4f0c0b954686..d52dcf0776ea 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -192,6 +192,9 @@ static void recalculate_apic_map(struct kvm *kvm) | |||
| 192 | u16 cid, lid; | 192 | u16 cid, lid; |
| 193 | u32 ldr, aid; | 193 | u32 ldr, aid; |
| 194 | 194 | ||
| 195 | if (!kvm_apic_present(vcpu)) | ||
| 196 | continue; | ||
| 197 | |||
| 195 | aid = kvm_apic_id(apic); | 198 | aid = kvm_apic_id(apic); |
| 196 | ldr = kvm_apic_get_reg(apic, APIC_LDR); | 199 | ldr = kvm_apic_get_reg(apic, APIC_LDR); |
| 197 | cid = apic_cluster_id(new, ldr); | 200 | cid = apic_cluster_id(new, ldr); |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 38dcec403b46..e3ff27a5b634 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -898,6 +898,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, | |||
| 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| | 898 | if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON| |
| 899 | VM_FAULT_HWPOISON_LARGE)) | 899 | VM_FAULT_HWPOISON_LARGE)) |
| 900 | do_sigbus(regs, error_code, address, fault); | 900 | do_sigbus(regs, error_code, address, fault); |
| 901 | else if (fault & VM_FAULT_SIGSEGV) | ||
| 902 | bad_area_nosemaphore(regs, error_code, address); | ||
| 901 | else | 903 | else |
| 902 | BUG(); | 904 | BUG(); |
| 903 | } | 905 | } |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 08a7d313538a..079c3b6a3ff1 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
| @@ -43,7 +43,7 @@ uint16_t __cachemode2pte_tbl[_PAGE_CACHE_MODE_NUM] = { | |||
| 43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, | 43 | [_PAGE_CACHE_MODE_WT] = _PAGE_PCD, |
| 44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, | 44 | [_PAGE_CACHE_MODE_WP] = _PAGE_PCD, |
| 45 | }; | 45 | }; |
| 46 | EXPORT_SYMBOL_GPL(__cachemode2pte_tbl); | 46 | EXPORT_SYMBOL(__cachemode2pte_tbl); |
| 47 | uint8_t __pte2cachemode_tbl[8] = { | 47 | uint8_t __pte2cachemode_tbl[8] = { |
| 48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, | 48 | [__pte2cm_idx(0)] = _PAGE_CACHE_MODE_WB, |
| 49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, | 49 | [__pte2cm_idx(_PAGE_PWT)] = _PAGE_CACHE_MODE_WC, |
| @@ -54,7 +54,7 @@ uint8_t __pte2cachemode_tbl[8] = { | |||
| 54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, | 54 | [__pte2cm_idx(_PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC_MINUS, |
| 55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, | 55 | [__pte2cm_idx(_PAGE_PWT | _PAGE_PCD | _PAGE_PAT)] = _PAGE_CACHE_MODE_UC, |
| 56 | }; | 56 | }; |
| 57 | EXPORT_SYMBOL_GPL(__pte2cachemode_tbl); | 57 | EXPORT_SYMBOL(__pte2cachemode_tbl); |
| 58 | 58 | ||
| 59 | static unsigned long __initdata pgt_buf_start; | 59 | static unsigned long __initdata pgt_buf_start; |
| 60 | static unsigned long __initdata pgt_buf_end; | 60 | static unsigned long __initdata pgt_buf_end; |
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index 67ebf5751222..c439ec478216 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
| @@ -349,6 +349,12 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk) | |||
| 349 | return MPX_INVALID_BOUNDS_DIR; | 349 | return MPX_INVALID_BOUNDS_DIR; |
| 350 | 350 | ||
| 351 | /* | 351 | /* |
| 352 | * 32-bit binaries on 64-bit kernels are currently | ||
| 353 | * unsupported. | ||
| 354 | */ | ||
| 355 | if (IS_ENABLED(CONFIG_X86_64) && test_thread_flag(TIF_IA32)) | ||
| 356 | return MPX_INVALID_BOUNDS_DIR; | ||
| 357 | /* | ||
| 352 | * The bounds directory pointer is stored in a register | 358 | * The bounds directory pointer is stored in a register |
| 353 | * only accessible if we first do an xsave. | 359 | * only accessible if we first do an xsave. |
| 354 | */ | 360 | */ |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index edf299c8ff6c..7ac68698406c 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -234,8 +234,13 @@ void pat_init(void) | |||
| 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); | 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); |
| 235 | 235 | ||
| 236 | /* Boot CPU check */ | 236 | /* Boot CPU check */ |
| 237 | if (!boot_pat_state) | 237 | if (!boot_pat_state) { |
| 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); | 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); |
| 239 | if (!boot_pat_state) { | ||
| 240 | pat_disable("PAT read returns always zero, disabled."); | ||
| 241 | return; | ||
| 242 | } | ||
| 243 | } | ||
| 239 | 244 | ||
| 240 | wrmsrl(MSR_IA32_CR_PAT, pat); | 245 | wrmsrl(MSR_IA32_CR_PAT, pat); |
| 241 | 246 | ||
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 7b20bccf3648..2fb384724ebb 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
| @@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] __initconst = { | |||
| 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), | 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), |
| 449 | }, | 449 | }, |
| 450 | }, | 450 | }, |
| 451 | { | ||
| 452 | .callback = set_scan_all, | ||
| 453 | .ident = "Stratus/NEC ftServer", | ||
| 454 | .matches = { | ||
| 455 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
| 456 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), | ||
| 457 | }, | ||
| 458 | }, | ||
| 459 | { | ||
| 460 | .callback = set_scan_all, | ||
| 461 | .ident = "Stratus/NEC ftServer", | ||
| 462 | .matches = { | ||
| 463 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
| 464 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), | ||
| 465 | }, | ||
| 466 | }, | ||
| 451 | {} | 467 | {} |
| 452 | }; | 468 | }; |
| 453 | 469 | ||
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c index 9b18ef315a55..349c0d32cc0b 100644 --- a/arch/x86/pci/i386.c +++ b/arch/x86/pci/i386.c | |||
| @@ -216,7 +216,7 @@ static void pcibios_allocate_bridge_resources(struct pci_dev *dev) | |||
| 216 | continue; | 216 | continue; |
| 217 | if (r->parent) /* Already allocated */ | 217 | if (r->parent) /* Already allocated */ |
| 218 | continue; | 218 | continue; |
| 219 | if (!r->start || pci_claim_resource(dev, idx) < 0) { | 219 | if (!r->start || pci_claim_bridge_resource(dev, idx) < 0) { |
| 220 | /* | 220 | /* |
| 221 | * Something is wrong with the region. | 221 | * Something is wrong with the region. |
| 222 | * Invalidate the resource to prevent | 222 | * Invalidate the resource to prevent |
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index c489ef2c1a39..9098d880c476 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -458,6 +458,7 @@ int __init pci_xen_hvm_init(void) | |||
| 458 | * just how GSIs get registered. | 458 | * just how GSIs get registered. |
| 459 | */ | 459 | */ |
| 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; | 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; |
| 461 | __acpi_unregister_gsi = NULL; | ||
| 461 | #endif | 462 | #endif |
| 462 | 463 | ||
| 463 | #ifdef CONFIG_PCI_MSI | 464 | #ifdef CONFIG_PCI_MSI |
| @@ -471,52 +472,6 @@ int __init pci_xen_hvm_init(void) | |||
| 471 | } | 472 | } |
| 472 | 473 | ||
| 473 | #ifdef CONFIG_XEN_DOM0 | 474 | #ifdef CONFIG_XEN_DOM0 |
| 474 | static __init void xen_setup_acpi_sci(void) | ||
| 475 | { | ||
| 476 | int rc; | ||
| 477 | int trigger, polarity; | ||
| 478 | int gsi = acpi_sci_override_gsi; | ||
| 479 | int irq = -1; | ||
| 480 | int gsi_override = -1; | ||
| 481 | |||
| 482 | if (!gsi) | ||
| 483 | return; | ||
| 484 | |||
| 485 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); | ||
| 486 | if (rc) { | ||
| 487 | printk(KERN_WARNING "xen: acpi_get_override_irq failed for acpi" | ||
| 488 | " sci, rc=%d\n", rc); | ||
| 489 | return; | ||
| 490 | } | ||
| 491 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | ||
| 492 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | ||
| 493 | |||
| 494 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | ||
| 495 | "polarity=%d\n", gsi, trigger, polarity); | ||
| 496 | |||
| 497 | /* Before we bind the GSI to a Linux IRQ, check whether | ||
| 498 | * we need to override it with bus_irq (IRQ) value. Usually for | ||
| 499 | * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: | ||
| 500 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) | ||
| 501 | * but there are oddballs where the IRQ != GSI: | ||
| 502 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) | ||
| 503 | * which ends up being: gsi_to_irq[9] == 20 | ||
| 504 | * (which is what acpi_gsi_to_irq ends up calling when starting the | ||
| 505 | * the ACPI interpreter and keels over since IRQ 9 has not been | ||
| 506 | * setup as we had setup IRQ 20 for it). | ||
| 507 | */ | ||
| 508 | if (acpi_gsi_to_irq(gsi, &irq) == 0) { | ||
| 509 | /* Use the provided value if it's valid. */ | ||
| 510 | if (irq >= 0) | ||
| 511 | gsi_override = irq; | ||
| 512 | } | ||
| 513 | |||
| 514 | gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); | ||
| 515 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | ||
| 516 | |||
| 517 | return; | ||
| 518 | } | ||
| 519 | |||
| 520 | int __init pci_xen_initial_domain(void) | 475 | int __init pci_xen_initial_domain(void) |
| 521 | { | 476 | { |
| 522 | int irq; | 477 | int irq; |
| @@ -527,8 +482,8 @@ int __init pci_xen_initial_domain(void) | |||
| 527 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; | 482 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; |
| 528 | pci_msi_ignore_mask = 1; | 483 | pci_msi_ignore_mask = 1; |
| 529 | #endif | 484 | #endif |
| 530 | xen_setup_acpi_sci(); | ||
| 531 | __acpi_register_gsi = acpi_register_gsi_xen; | 485 | __acpi_register_gsi = acpi_register_gsi_xen; |
| 486 | __acpi_unregister_gsi = NULL; | ||
| 532 | /* Pre-allocate legacy irqs */ | 487 | /* Pre-allocate legacy irqs */ |
| 533 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { | 488 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { |
| 534 | int trigger, polarity; | 489 | int trigger, polarity; |
diff --git a/arch/x86/tools/calc_run_size.pl b/arch/x86/tools/calc_run_size.pl deleted file mode 100644 index 23210baade2d..000000000000 --- a/arch/x86/tools/calc_run_size.pl +++ /dev/null | |||
| @@ -1,39 +0,0 @@ | |||
| 1 | #!/usr/bin/perl | ||
| 2 | # | ||
| 3 | # Calculate the amount of space needed to run the kernel, including room for | ||
| 4 | # the .bss and .brk sections. | ||
| 5 | # | ||
| 6 | # Usage: | ||
| 7 | # objdump -h a.out | perl calc_run_size.pl | ||
| 8 | use strict; | ||
| 9 | |||
| 10 | my $mem_size = 0; | ||
| 11 | my $file_offset = 0; | ||
| 12 | |||
| 13 | my $sections=" *[0-9]+ \.(?:bss|brk) +"; | ||
| 14 | while (<>) { | ||
| 15 | if (/^$sections([0-9a-f]+) +(?:[0-9a-f]+ +){2}([0-9a-f]+)/) { | ||
| 16 | my $size = hex($1); | ||
| 17 | my $offset = hex($2); | ||
| 18 | $mem_size += $size; | ||
| 19 | if ($file_offset == 0) { | ||
| 20 | $file_offset = $offset; | ||
| 21 | } elsif ($file_offset != $offset) { | ||
| 22 | # BFD linker shows the same file offset in ELF. | ||
| 23 | # Gold linker shows them as consecutive. | ||
| 24 | next if ($file_offset + $mem_size == $offset + $size); | ||
| 25 | |||
| 26 | printf STDERR "file_offset: 0x%lx\n", $file_offset; | ||
| 27 | printf STDERR "mem_size: 0x%lx\n", $mem_size; | ||
| 28 | printf STDERR "offset: 0x%lx\n", $offset; | ||
| 29 | printf STDERR "size: 0x%lx\n", $size; | ||
| 30 | |||
| 31 | die ".bss and .brk are non-contiguous\n"; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | |||
| 36 | if ($file_offset == 0) { | ||
| 37 | die "Never found .bss or .brk file offset\n"; | ||
| 38 | } | ||
| 39 | printf("%d\n", $mem_size + $file_offset); | ||
diff --git a/arch/x86/tools/calc_run_size.sh b/arch/x86/tools/calc_run_size.sh new file mode 100644 index 000000000000..1a4c17bb3910 --- /dev/null +++ b/arch/x86/tools/calc_run_size.sh | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # | ||
| 3 | # Calculate the amount of space needed to run the kernel, including room for | ||
| 4 | # the .bss and .brk sections. | ||
| 5 | # | ||
| 6 | # Usage: | ||
| 7 | # objdump -h a.out | sh calc_run_size.sh | ||
| 8 | |||
| 9 | NUM='\([0-9a-fA-F]*[ \t]*\)' | ||
| 10 | OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p') | ||
| 11 | if [ -z "$OUT" ] ; then | ||
| 12 | echo "Never found .bss or .brk file offset" >&2 | ||
| 13 | exit 1 | ||
| 14 | fi | ||
| 15 | |||
| 16 | OUT=$(echo ${OUT# }) | ||
| 17 | sizeA=$(printf "%d" 0x${OUT%% *}) | ||
| 18 | OUT=${OUT#* } | ||
| 19 | offsetA=$(printf "%d" 0x${OUT%% *}) | ||
| 20 | OUT=${OUT#* } | ||
| 21 | sizeB=$(printf "%d" 0x${OUT%% *}) | ||
| 22 | OUT=${OUT#* } | ||
| 23 | offsetB=$(printf "%d" 0x${OUT%% *}) | ||
| 24 | |||
| 25 | run_size=$(( $offsetA + $sizeA + $sizeB )) | ||
| 26 | |||
| 27 | # BFD linker shows the same file offset in ELF. | ||
| 28 | if [ "$offsetA" -ne "$offsetB" ] ; then | ||
| 29 | # Gold linker shows them as consecutive. | ||
| 30 | endB=$(( $offsetB + $sizeB )) | ||
| 31 | if [ "$endB" != "$run_size" ] ; then | ||
| 32 | printf "sizeA: 0x%x\n" $sizeA >&2 | ||
| 33 | printf "offsetA: 0x%x\n" $offsetA >&2 | ||
| 34 | printf "sizeB: 0x%x\n" $sizeB >&2 | ||
| 35 | printf "offsetB: 0x%x\n" $offsetB >&2 | ||
| 36 | echo ".bss and .brk are non-contiguous" >&2 | ||
| 37 | exit 1 | ||
| 38 | fi | ||
| 39 | fi | ||
| 40 | |||
| 41 | printf "%d\n" $run_size | ||
| 42 | exit 0 | ||
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 6bf3a13e3e0f..78a881b7fc41 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <xen/interface/physdev.h> | 40 | #include <xen/interface/physdev.h> |
| 41 | #include <xen/interface/vcpu.h> | 41 | #include <xen/interface/vcpu.h> |
| 42 | #include <xen/interface/memory.h> | 42 | #include <xen/interface/memory.h> |
| 43 | #include <xen/interface/nmi.h> | ||
| 43 | #include <xen/interface/xen-mca.h> | 44 | #include <xen/interface/xen-mca.h> |
| 44 | #include <xen/features.h> | 45 | #include <xen/features.h> |
| 45 | #include <xen/page.h> | 46 | #include <xen/page.h> |
| @@ -66,6 +67,7 @@ | |||
| 66 | #include <asm/reboot.h> | 67 | #include <asm/reboot.h> |
| 67 | #include <asm/stackprotector.h> | 68 | #include <asm/stackprotector.h> |
| 68 | #include <asm/hypervisor.h> | 69 | #include <asm/hypervisor.h> |
| 70 | #include <asm/mach_traps.h> | ||
| 69 | #include <asm/mwait.h> | 71 | #include <asm/mwait.h> |
| 70 | #include <asm/pci_x86.h> | 72 | #include <asm/pci_x86.h> |
| 71 | #include <asm/pat.h> | 73 | #include <asm/pat.h> |
| @@ -1351,6 +1353,21 @@ static const struct machine_ops xen_machine_ops __initconst = { | |||
| 1351 | .emergency_restart = xen_emergency_restart, | 1353 | .emergency_restart = xen_emergency_restart, |
| 1352 | }; | 1354 | }; |
| 1353 | 1355 | ||
| 1356 | static unsigned char xen_get_nmi_reason(void) | ||
| 1357 | { | ||
| 1358 | unsigned char reason = 0; | ||
| 1359 | |||
| 1360 | /* Construct a value which looks like it came from port 0x61. */ | ||
| 1361 | if (test_bit(_XEN_NMIREASON_io_error, | ||
| 1362 | &HYPERVISOR_shared_info->arch.nmi_reason)) | ||
| 1363 | reason |= NMI_REASON_IOCHK; | ||
| 1364 | if (test_bit(_XEN_NMIREASON_pci_serr, | ||
| 1365 | &HYPERVISOR_shared_info->arch.nmi_reason)) | ||
| 1366 | reason |= NMI_REASON_SERR; | ||
| 1367 | |||
| 1368 | return reason; | ||
| 1369 | } | ||
| 1370 | |||
| 1354 | static void __init xen_boot_params_init_edd(void) | 1371 | static void __init xen_boot_params_init_edd(void) |
| 1355 | { | 1372 | { |
| 1356 | #if IS_ENABLED(CONFIG_EDD) | 1373 | #if IS_ENABLED(CONFIG_EDD) |
| @@ -1535,9 +1552,12 @@ asmlinkage __visible void __init xen_start_kernel(void) | |||
| 1535 | pv_info = xen_info; | 1552 | pv_info = xen_info; |
| 1536 | pv_init_ops = xen_init_ops; | 1553 | pv_init_ops = xen_init_ops; |
| 1537 | pv_apic_ops = xen_apic_ops; | 1554 | pv_apic_ops = xen_apic_ops; |
| 1538 | if (!xen_pvh_domain()) | 1555 | if (!xen_pvh_domain()) { |
| 1539 | pv_cpu_ops = xen_cpu_ops; | 1556 | pv_cpu_ops = xen_cpu_ops; |
| 1540 | 1557 | ||
| 1558 | x86_platform.get_nmi_reason = xen_get_nmi_reason; | ||
| 1559 | } | ||
| 1560 | |||
| 1541 | if (xen_feature(XENFEAT_auto_translated_physmap)) | 1561 | if (xen_feature(XENFEAT_auto_translated_physmap)) |
| 1542 | x86_init.resources.memory_setup = xen_auto_xlated_memory_setup; | 1562 | x86_init.resources.memory_setup = xen_auto_xlated_memory_setup; |
| 1543 | else | 1563 | else |
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index edbc7a63fd73..70fb5075c901 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
| @@ -167,10 +167,13 @@ static void * __ref alloc_p2m_page(void) | |||
| 167 | return (void *)__get_free_page(GFP_KERNEL | __GFP_REPEAT); | 167 | return (void *)__get_free_page(GFP_KERNEL | __GFP_REPEAT); |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | /* Only to be called in case of a race for a page just allocated! */ | 170 | static void __ref free_p2m_page(void *p) |
| 171 | static void free_p2m_page(void *p) | ||
| 172 | { | 171 | { |
| 173 | BUG_ON(!slab_is_available()); | 172 | if (unlikely(!slab_is_available())) { |
| 173 | free_bootmem((unsigned long)p, PAGE_SIZE); | ||
| 174 | return; | ||
| 175 | } | ||
| 176 | |||
| 174 | free_page((unsigned long)p); | 177 | free_page((unsigned long)p); |
| 175 | } | 178 | } |
| 176 | 179 | ||
| @@ -375,7 +378,7 @@ static void __init xen_rebuild_p2m_list(unsigned long *p2m) | |||
| 375 | p2m_missing_pte : p2m_identity_pte; | 378 | p2m_missing_pte : p2m_identity_pte; |
| 376 | for (i = 0; i < PMDS_PER_MID_PAGE; i++) { | 379 | for (i = 0; i < PMDS_PER_MID_PAGE; i++) { |
| 377 | pmdp = populate_extra_pmd( | 380 | pmdp = populate_extra_pmd( |
| 378 | (unsigned long)(p2m + pfn + i * PTRS_PER_PTE)); | 381 | (unsigned long)(p2m + pfn) + i * PMD_SIZE); |
| 379 | set_pmd(pmdp, __pmd(__pa(ptep) | _KERNPG_TABLE)); | 382 | set_pmd(pmdp, __pmd(__pa(ptep) | _KERNPG_TABLE)); |
| 380 | } | 383 | } |
| 381 | } | 384 | } |
| @@ -436,10 +439,9 @@ EXPORT_SYMBOL_GPL(get_phys_to_machine); | |||
| 436 | * a new pmd is to replace p2m_missing_pte or p2m_identity_pte by a individual | 439 | * a new pmd is to replace p2m_missing_pte or p2m_identity_pte by a individual |
| 437 | * pmd. In case of PAE/x86-32 there are multiple pmds to allocate! | 440 | * pmd. In case of PAE/x86-32 there are multiple pmds to allocate! |
| 438 | */ | 441 | */ |
| 439 | static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | 442 | static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *pte_pg) |
| 440 | { | 443 | { |
| 441 | pte_t *ptechk; | 444 | pte_t *ptechk; |
| 442 | pte_t *pteret = ptep; | ||
| 443 | pte_t *pte_newpg[PMDS_PER_MID_PAGE]; | 445 | pte_t *pte_newpg[PMDS_PER_MID_PAGE]; |
| 444 | pmd_t *pmdp; | 446 | pmd_t *pmdp; |
| 445 | unsigned int level; | 447 | unsigned int level; |
| @@ -473,8 +475,6 @@ static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | |||
| 473 | if (ptechk == pte_pg) { | 475 | if (ptechk == pte_pg) { |
| 474 | set_pmd(pmdp, | 476 | set_pmd(pmdp, |
| 475 | __pmd(__pa(pte_newpg[i]) | _KERNPG_TABLE)); | 477 | __pmd(__pa(pte_newpg[i]) | _KERNPG_TABLE)); |
| 476 | if (vaddr == (addr & ~(PMD_SIZE - 1))) | ||
| 477 | pteret = pte_offset_kernel(pmdp, addr); | ||
| 478 | pte_newpg[i] = NULL; | 478 | pte_newpg[i] = NULL; |
| 479 | } | 479 | } |
| 480 | 480 | ||
| @@ -488,7 +488,7 @@ static pte_t *alloc_p2m_pmd(unsigned long addr, pte_t *ptep, pte_t *pte_pg) | |||
| 488 | vaddr += PMD_SIZE; | 488 | vaddr += PMD_SIZE; |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | return pteret; | 491 | return lookup_address(addr, &level); |
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | /* | 494 | /* |
| @@ -517,7 +517,7 @@ static bool alloc_p2m(unsigned long pfn) | |||
| 517 | 517 | ||
| 518 | if (pte_pg == p2m_missing_pte || pte_pg == p2m_identity_pte) { | 518 | if (pte_pg == p2m_missing_pte || pte_pg == p2m_identity_pte) { |
| 519 | /* PMD level is missing, allocate a new one */ | 519 | /* PMD level is missing, allocate a new one */ |
| 520 | ptep = alloc_p2m_pmd(addr, ptep, pte_pg); | 520 | ptep = alloc_p2m_pmd(addr, pte_pg); |
| 521 | if (!ptep) | 521 | if (!ptep) |
| 522 | return false; | 522 | return false; |
| 523 | } | 523 | } |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index dfd77dec8e2b..865e56cea7a0 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -140,7 +140,7 @@ static void __init xen_del_extra_mem(u64 start, u64 size) | |||
| 140 | unsigned long __ref xen_chk_extra_mem(unsigned long pfn) | 140 | unsigned long __ref xen_chk_extra_mem(unsigned long pfn) |
| 141 | { | 141 | { |
| 142 | int i; | 142 | int i; |
| 143 | unsigned long addr = PFN_PHYS(pfn); | 143 | phys_addr_t addr = PFN_PHYS(pfn); |
| 144 | 144 | ||
| 145 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { | 145 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { |
| 146 | if (addr >= xen_extra_mem[i].start && | 146 | if (addr >= xen_extra_mem[i].start && |
| @@ -160,6 +160,8 @@ void __init xen_inv_extra_mem(void) | |||
| 160 | int i; | 160 | int i; |
| 161 | 161 | ||
| 162 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { | 162 | for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) { |
| 163 | if (!xen_extra_mem[i].size) | ||
| 164 | continue; | ||
| 163 | pfn_s = PFN_DOWN(xen_extra_mem[i].start); | 165 | pfn_s = PFN_DOWN(xen_extra_mem[i].start); |
| 164 | pfn_e = PFN_UP(xen_extra_mem[i].start + xen_extra_mem[i].size); | 166 | pfn_e = PFN_UP(xen_extra_mem[i].start + xen_extra_mem[i].size); |
| 165 | for (pfn = pfn_s; pfn < pfn_e; pfn++) | 167 | for (pfn = pfn_s; pfn < pfn_e; pfn++) |
| @@ -229,15 +231,14 @@ static int __init xen_free_mfn(unsigned long mfn) | |||
| 229 | * as a fallback if the remapping fails. | 231 | * as a fallback if the remapping fails. |
| 230 | */ | 232 | */ |
| 231 | static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, | 233 | static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, |
| 232 | unsigned long end_pfn, unsigned long nr_pages, unsigned long *identity, | 234 | unsigned long end_pfn, unsigned long nr_pages, unsigned long *released) |
| 233 | unsigned long *released) | ||
| 234 | { | 235 | { |
| 235 | unsigned long len = 0; | ||
| 236 | unsigned long pfn, end; | 236 | unsigned long pfn, end; |
| 237 | int ret; | 237 | int ret; |
| 238 | 238 | ||
| 239 | WARN_ON(start_pfn > end_pfn); | 239 | WARN_ON(start_pfn > end_pfn); |
| 240 | 240 | ||
| 241 | /* Release pages first. */ | ||
| 241 | end = min(end_pfn, nr_pages); | 242 | end = min(end_pfn, nr_pages); |
| 242 | for (pfn = start_pfn; pfn < end; pfn++) { | 243 | for (pfn = start_pfn; pfn < end; pfn++) { |
| 243 | unsigned long mfn = pfn_to_mfn(pfn); | 244 | unsigned long mfn = pfn_to_mfn(pfn); |
| @@ -250,16 +251,14 @@ static void __init xen_set_identity_and_release_chunk(unsigned long start_pfn, | |||
| 250 | WARN(ret != 1, "Failed to release pfn %lx err=%d\n", pfn, ret); | 251 | WARN(ret != 1, "Failed to release pfn %lx err=%d\n", pfn, ret); |
| 251 | 252 | ||
| 252 | if (ret == 1) { | 253 | if (ret == 1) { |
| 254 | (*released)++; | ||
| 253 | if (!__set_phys_to_machine(pfn, INVALID_P2M_ENTRY)) | 255 | if (!__set_phys_to_machine(pfn, INVALID_P2M_ENTRY)) |
| 254 | break; | 256 | break; |
| 255 | len++; | ||
| 256 | } else | 257 | } else |
| 257 | break; | 258 | break; |
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | /* Need to release pages first */ | 261 | set_phys_range_identity(start_pfn, end_pfn); |
| 261 | *released += len; | ||
| 262 | *identity += set_phys_range_identity(start_pfn, end_pfn); | ||
| 263 | } | 262 | } |
| 264 | 263 | ||
| 265 | /* | 264 | /* |
| @@ -287,7 +286,7 @@ static void __init xen_update_mem_tables(unsigned long pfn, unsigned long mfn) | |||
| 287 | } | 286 | } |
| 288 | 287 | ||
| 289 | /* Update kernel mapping, but not for highmem. */ | 288 | /* Update kernel mapping, but not for highmem. */ |
| 290 | if ((pfn << PAGE_SHIFT) >= __pa(high_memory)) | 289 | if (pfn >= PFN_UP(__pa(high_memory - 1))) |
| 291 | return; | 290 | return; |
| 292 | 291 | ||
| 293 | if (HYPERVISOR_update_va_mapping((unsigned long)__va(pfn << PAGE_SHIFT), | 292 | if (HYPERVISOR_update_va_mapping((unsigned long)__va(pfn << PAGE_SHIFT), |
| @@ -318,7 +317,6 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 318 | unsigned long ident_pfn_iter, remap_pfn_iter; | 317 | unsigned long ident_pfn_iter, remap_pfn_iter; |
| 319 | unsigned long ident_end_pfn = start_pfn + size; | 318 | unsigned long ident_end_pfn = start_pfn + size; |
| 320 | unsigned long left = size; | 319 | unsigned long left = size; |
| 321 | unsigned long ident_cnt = 0; | ||
| 322 | unsigned int i, chunk; | 320 | unsigned int i, chunk; |
| 323 | 321 | ||
| 324 | WARN_ON(size == 0); | 322 | WARN_ON(size == 0); |
| @@ -347,8 +345,7 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 347 | xen_remap_mfn = mfn; | 345 | xen_remap_mfn = mfn; |
| 348 | 346 | ||
| 349 | /* Set identity map */ | 347 | /* Set identity map */ |
| 350 | ident_cnt += set_phys_range_identity(ident_pfn_iter, | 348 | set_phys_range_identity(ident_pfn_iter, ident_pfn_iter + chunk); |
| 351 | ident_pfn_iter + chunk); | ||
| 352 | 349 | ||
| 353 | left -= chunk; | 350 | left -= chunk; |
| 354 | } | 351 | } |
| @@ -371,7 +368,7 @@ static void __init xen_do_set_identity_and_remap_chunk( | |||
| 371 | static unsigned long __init xen_set_identity_and_remap_chunk( | 368 | static unsigned long __init xen_set_identity_and_remap_chunk( |
| 372 | const struct e820entry *list, size_t map_size, unsigned long start_pfn, | 369 | const struct e820entry *list, size_t map_size, unsigned long start_pfn, |
| 373 | unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn, | 370 | unsigned long end_pfn, unsigned long nr_pages, unsigned long remap_pfn, |
| 374 | unsigned long *identity, unsigned long *released) | 371 | unsigned long *released, unsigned long *remapped) |
| 375 | { | 372 | { |
| 376 | unsigned long pfn; | 373 | unsigned long pfn; |
| 377 | unsigned long i = 0; | 374 | unsigned long i = 0; |
| @@ -386,8 +383,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 386 | /* Do not remap pages beyond the current allocation */ | 383 | /* Do not remap pages beyond the current allocation */ |
| 387 | if (cur_pfn >= nr_pages) { | 384 | if (cur_pfn >= nr_pages) { |
| 388 | /* Identity map remaining pages */ | 385 | /* Identity map remaining pages */ |
| 389 | *identity += set_phys_range_identity(cur_pfn, | 386 | set_phys_range_identity(cur_pfn, cur_pfn + size); |
| 390 | cur_pfn + size); | ||
| 391 | break; | 387 | break; |
| 392 | } | 388 | } |
| 393 | if (cur_pfn + size > nr_pages) | 389 | if (cur_pfn + size > nr_pages) |
| @@ -398,7 +394,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 398 | if (!remap_range_size) { | 394 | if (!remap_range_size) { |
| 399 | pr_warning("Unable to find available pfn range, not remapping identity pages\n"); | 395 | pr_warning("Unable to find available pfn range, not remapping identity pages\n"); |
| 400 | xen_set_identity_and_release_chunk(cur_pfn, | 396 | xen_set_identity_and_release_chunk(cur_pfn, |
| 401 | cur_pfn + left, nr_pages, identity, released); | 397 | cur_pfn + left, nr_pages, released); |
| 402 | break; | 398 | break; |
| 403 | } | 399 | } |
| 404 | /* Adjust size to fit in current e820 RAM region */ | 400 | /* Adjust size to fit in current e820 RAM region */ |
| @@ -410,7 +406,7 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 410 | /* Update variables to reflect new mappings. */ | 406 | /* Update variables to reflect new mappings. */ |
| 411 | i += size; | 407 | i += size; |
| 412 | remap_pfn += size; | 408 | remap_pfn += size; |
| 413 | *identity += size; | 409 | *remapped += size; |
| 414 | } | 410 | } |
| 415 | 411 | ||
| 416 | /* | 412 | /* |
| @@ -427,13 +423,13 @@ static unsigned long __init xen_set_identity_and_remap_chunk( | |||
| 427 | 423 | ||
| 428 | static void __init xen_set_identity_and_remap( | 424 | static void __init xen_set_identity_and_remap( |
| 429 | const struct e820entry *list, size_t map_size, unsigned long nr_pages, | 425 | const struct e820entry *list, size_t map_size, unsigned long nr_pages, |
| 430 | unsigned long *released) | 426 | unsigned long *released, unsigned long *remapped) |
| 431 | { | 427 | { |
| 432 | phys_addr_t start = 0; | 428 | phys_addr_t start = 0; |
| 433 | unsigned long identity = 0; | ||
| 434 | unsigned long last_pfn = nr_pages; | 429 | unsigned long last_pfn = nr_pages; |
| 435 | const struct e820entry *entry; | 430 | const struct e820entry *entry; |
| 436 | unsigned long num_released = 0; | 431 | unsigned long num_released = 0; |
| 432 | unsigned long num_remapped = 0; | ||
| 437 | int i; | 433 | int i; |
| 438 | 434 | ||
| 439 | /* | 435 | /* |
| @@ -460,14 +456,14 @@ static void __init xen_set_identity_and_remap( | |||
| 460 | last_pfn = xen_set_identity_and_remap_chunk( | 456 | last_pfn = xen_set_identity_and_remap_chunk( |
| 461 | list, map_size, start_pfn, | 457 | list, map_size, start_pfn, |
| 462 | end_pfn, nr_pages, last_pfn, | 458 | end_pfn, nr_pages, last_pfn, |
| 463 | &identity, &num_released); | 459 | &num_released, &num_remapped); |
| 464 | start = end; | 460 | start = end; |
| 465 | } | 461 | } |
| 466 | } | 462 | } |
| 467 | 463 | ||
| 468 | *released = num_released; | 464 | *released = num_released; |
| 465 | *remapped = num_remapped; | ||
| 469 | 466 | ||
| 470 | pr_info("Set %ld page(s) to 1-1 mapping\n", identity); | ||
| 471 | pr_info("Released %ld page(s)\n", num_released); | 467 | pr_info("Released %ld page(s)\n", num_released); |
| 472 | } | 468 | } |
| 473 | 469 | ||
| @@ -586,6 +582,7 @@ char * __init xen_memory_setup(void) | |||
| 586 | struct xen_memory_map memmap; | 582 | struct xen_memory_map memmap; |
| 587 | unsigned long max_pages; | 583 | unsigned long max_pages; |
| 588 | unsigned long extra_pages = 0; | 584 | unsigned long extra_pages = 0; |
| 585 | unsigned long remapped_pages; | ||
| 589 | int i; | 586 | int i; |
| 590 | int op; | 587 | int op; |
| 591 | 588 | ||
| @@ -635,9 +632,10 @@ char * __init xen_memory_setup(void) | |||
| 635 | * underlying RAM. | 632 | * underlying RAM. |
| 636 | */ | 633 | */ |
| 637 | xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn, | 634 | xen_set_identity_and_remap(map, memmap.nr_entries, max_pfn, |
| 638 | &xen_released_pages); | 635 | &xen_released_pages, &remapped_pages); |
| 639 | 636 | ||
| 640 | extra_pages += xen_released_pages; | 637 | extra_pages += xen_released_pages; |
| 638 | extra_pages += remapped_pages; | ||
| 641 | 639 | ||
| 642 | /* | 640 | /* |
| 643 | * Clamp the amount of extra memory to a EXTRA_MEM_RATIO | 641 | * Clamp the amount of extra memory to a EXTRA_MEM_RATIO |
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index f473d268d387..69087341d9ae 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c | |||
| @@ -391,7 +391,7 @@ static const struct clock_event_device *xen_clockevent = | |||
| 391 | 391 | ||
| 392 | struct xen_clock_event_device { | 392 | struct xen_clock_event_device { |
| 393 | struct clock_event_device evt; | 393 | struct clock_event_device evt; |
| 394 | char *name; | 394 | char name[16]; |
| 395 | }; | 395 | }; |
| 396 | static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = { .evt.irq = -1 }; | 396 | static DEFINE_PER_CPU(struct xen_clock_event_device, xen_clock_events) = { .evt.irq = -1 }; |
| 397 | 397 | ||
| @@ -420,46 +420,38 @@ void xen_teardown_timer(int cpu) | |||
| 420 | if (evt->irq >= 0) { | 420 | if (evt->irq >= 0) { |
| 421 | unbind_from_irqhandler(evt->irq, NULL); | 421 | unbind_from_irqhandler(evt->irq, NULL); |
| 422 | evt->irq = -1; | 422 | evt->irq = -1; |
| 423 | kfree(per_cpu(xen_clock_events, cpu).name); | ||
| 424 | per_cpu(xen_clock_events, cpu).name = NULL; | ||
| 425 | } | 423 | } |
| 426 | } | 424 | } |
| 427 | 425 | ||
| 428 | void xen_setup_timer(int cpu) | 426 | void xen_setup_timer(int cpu) |
| 429 | { | 427 | { |
| 430 | char *name; | 428 | struct xen_clock_event_device *xevt = &per_cpu(xen_clock_events, cpu); |
| 431 | struct clock_event_device *evt; | 429 | struct clock_event_device *evt = &xevt->evt; |
| 432 | int irq; | 430 | int irq; |
| 433 | 431 | ||
| 434 | evt = &per_cpu(xen_clock_events, cpu).evt; | ||
| 435 | WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu); | 432 | WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu); |
| 436 | if (evt->irq >= 0) | 433 | if (evt->irq >= 0) |
| 437 | xen_teardown_timer(cpu); | 434 | xen_teardown_timer(cpu); |
| 438 | 435 | ||
| 439 | printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu); | 436 | printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu); |
| 440 | 437 | ||
| 441 | name = kasprintf(GFP_KERNEL, "timer%d", cpu); | 438 | snprintf(xevt->name, sizeof(xevt->name), "timer%d", cpu); |
| 442 | if (!name) | ||
| 443 | name = "<timer kasprintf failed>"; | ||
| 444 | 439 | ||
| 445 | irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt, | 440 | irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt, |
| 446 | IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER| | 441 | IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER| |
| 447 | IRQF_FORCE_RESUME|IRQF_EARLY_RESUME, | 442 | IRQF_FORCE_RESUME|IRQF_EARLY_RESUME, |
| 448 | name, NULL); | 443 | xevt->name, NULL); |
| 449 | (void)xen_set_irq_priority(irq, XEN_IRQ_PRIORITY_MAX); | 444 | (void)xen_set_irq_priority(irq, XEN_IRQ_PRIORITY_MAX); |
| 450 | 445 | ||
| 451 | memcpy(evt, xen_clockevent, sizeof(*evt)); | 446 | memcpy(evt, xen_clockevent, sizeof(*evt)); |
| 452 | 447 | ||
| 453 | evt->cpumask = cpumask_of(cpu); | 448 | evt->cpumask = cpumask_of(cpu); |
| 454 | evt->irq = irq; | 449 | evt->irq = irq; |
| 455 | per_cpu(xen_clock_events, cpu).name = name; | ||
| 456 | } | 450 | } |
| 457 | 451 | ||
| 458 | 452 | ||
| 459 | void xen_setup_cpu_clockevents(void) | 453 | void xen_setup_cpu_clockevents(void) |
| 460 | { | 454 | { |
| 461 | BUG_ON(preemptible()); | ||
| 462 | |||
| 463 | clockevents_register_device(this_cpu_ptr(&xen_clock_events.evt)); | 455 | clockevents_register_device(this_cpu_ptr(&xen_clock_events.evt)); |
| 464 | } | 456 | } |
| 465 | 457 | ||
