diff options
Diffstat (limited to 'arch/x86')
| -rw-r--r-- | arch/x86/kernel/acpi/cstate.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c | 41 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 11 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/hpet.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/i8259.c | 25 | ||||
| -rw-r--r-- | arch/x86/kernel/kgdb.c | 9 | ||||
| -rw-r--r-- | arch/x86/kvm/paging_tmpl.h | 1 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 4 |
10 files changed, 69 insertions, 46 deletions
diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c index 2e837f5080fe..fb7a5f052e2b 100644 --- a/arch/x86/kernel/acpi/cstate.c +++ b/arch/x86/kernel/acpi/cstate.c | |||
| @@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, | |||
| 145 | percpu_entry->states[cx->index].eax = cx->address; | 145 | percpu_entry->states[cx->index].eax = cx->address; |
| 146 | percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; | 146 | percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; |
| 147 | } | 147 | } |
| 148 | |||
| 149 | /* | ||
| 150 | * For _CST FFH on Intel, if GAS.access_size bit 1 is cleared, | ||
| 151 | * then we should skip checking BM_STS for this C-state. | ||
| 152 | * ref: "Intel Processor Vendor-Specific ACPI Interface Specification" | ||
| 153 | */ | ||
| 154 | if ((c->x86_vendor == X86_VENDOR_INTEL) && !(reg->access_size & 0x2)) | ||
| 155 | cx->bm_sts_skip = 1; | ||
| 156 | |||
| 148 | return retval; | 157 | return retval; |
| 149 | } | 158 | } |
| 150 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); | 159 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index 82e508677b91..fcc3c61fdecc 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -157,9 +157,14 @@ static int __init acpi_sleep_setup(char *str) | |||
| 157 | #ifdef CONFIG_HIBERNATION | 157 | #ifdef CONFIG_HIBERNATION |
| 158 | if (strncmp(str, "s4_nohwsig", 10) == 0) | 158 | if (strncmp(str, "s4_nohwsig", 10) == 0) |
| 159 | acpi_no_s4_hw_signature(); | 159 | acpi_no_s4_hw_signature(); |
| 160 | if (strncmp(str, "s4_nonvs", 8) == 0) | 160 | if (strncmp(str, "s4_nonvs", 8) == 0) { |
| 161 | acpi_s4_no_nvs(); | 161 | pr_warning("ACPI: acpi_sleep=s4_nonvs is deprecated, " |
| 162 | "please use acpi_sleep=nonvs instead"); | ||
| 163 | acpi_nvs_nosave(); | ||
| 164 | } | ||
| 162 | #endif | 165 | #endif |
| 166 | if (strncmp(str, "nonvs", 5) == 0) | ||
| 167 | acpi_nvs_nosave(); | ||
| 163 | if (strncmp(str, "old_ordering", 12) == 0) | 168 | if (strncmp(str, "old_ordering", 12) == 0) |
| 164 | acpi_old_suspend_ordering(); | 169 | acpi_old_suspend_ordering(); |
| 165 | str = strchr(str, ','); | 170 | str = strchr(str, ','); |
diff --git a/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c index ce7cde713e71..a36de5bbb622 100644 --- a/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/pcc-cpufreq.c | |||
| @@ -368,22 +368,16 @@ static int __init pcc_cpufreq_do_osc(acpi_handle *handle) | |||
| 368 | return -ENODEV; | 368 | return -ENODEV; |
| 369 | 369 | ||
| 370 | out_obj = output.pointer; | 370 | out_obj = output.pointer; |
| 371 | if (out_obj->type != ACPI_TYPE_BUFFER) { | 371 | if (out_obj->type != ACPI_TYPE_BUFFER) |
| 372 | ret = -ENODEV; | 372 | return -ENODEV; |
| 373 | goto out_free; | ||
| 374 | } | ||
| 375 | 373 | ||
| 376 | errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0); | 374 | errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0); |
| 377 | if (errors) { | 375 | if (errors) |
| 378 | ret = -ENODEV; | 376 | return -ENODEV; |
| 379 | goto out_free; | ||
| 380 | } | ||
| 381 | 377 | ||
| 382 | supported = *((u32 *)(out_obj->buffer.pointer + 4)); | 378 | supported = *((u32 *)(out_obj->buffer.pointer + 4)); |
| 383 | if (!(supported & 0x1)) { | 379 | if (!(supported & 0x1)) |
| 384 | ret = -ENODEV; | 380 | return -ENODEV; |
| 385 | goto out_free; | ||
| 386 | } | ||
| 387 | 381 | ||
| 388 | out_free: | 382 | out_free: |
| 389 | kfree(output.pointer); | 383 | kfree(output.pointer); |
| @@ -397,13 +391,17 @@ static int __init pcc_cpufreq_probe(void) | |||
| 397 | struct pcc_memory_resource *mem_resource; | 391 | struct pcc_memory_resource *mem_resource; |
| 398 | struct pcc_register_resource *reg_resource; | 392 | struct pcc_register_resource *reg_resource; |
| 399 | union acpi_object *out_obj, *member; | 393 | union acpi_object *out_obj, *member; |
| 400 | acpi_handle handle, osc_handle; | 394 | acpi_handle handle, osc_handle, pcch_handle; |
| 401 | int ret = 0; | 395 | int ret = 0; |
| 402 | 396 | ||
| 403 | status = acpi_get_handle(NULL, "\\_SB", &handle); | 397 | status = acpi_get_handle(NULL, "\\_SB", &handle); |
| 404 | if (ACPI_FAILURE(status)) | 398 | if (ACPI_FAILURE(status)) |
| 405 | return -ENODEV; | 399 | return -ENODEV; |
| 406 | 400 | ||
| 401 | status = acpi_get_handle(handle, "PCCH", &pcch_handle); | ||
| 402 | if (ACPI_FAILURE(status)) | ||
| 403 | return -ENODEV; | ||
| 404 | |||
| 407 | status = acpi_get_handle(handle, "_OSC", &osc_handle); | 405 | status = acpi_get_handle(handle, "_OSC", &osc_handle); |
| 408 | if (ACPI_SUCCESS(status)) { | 406 | if (ACPI_SUCCESS(status)) { |
| 409 | ret = pcc_cpufreq_do_osc(&osc_handle); | 407 | ret = pcc_cpufreq_do_osc(&osc_handle); |
| @@ -543,13 +541,13 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 543 | 541 | ||
| 544 | if (!pcch_virt_addr) { | 542 | if (!pcch_virt_addr) { |
| 545 | result = -1; | 543 | result = -1; |
| 546 | goto pcch_null; | 544 | goto out; |
| 547 | } | 545 | } |
| 548 | 546 | ||
| 549 | result = pcc_get_offset(cpu); | 547 | result = pcc_get_offset(cpu); |
| 550 | if (result) { | 548 | if (result) { |
| 551 | dprintk("init: PCCP evaluation failed\n"); | 549 | dprintk("init: PCCP evaluation failed\n"); |
| 552 | goto free; | 550 | goto out; |
| 553 | } | 551 | } |
| 554 | 552 | ||
| 555 | policy->max = policy->cpuinfo.max_freq = | 553 | policy->max = policy->cpuinfo.max_freq = |
| @@ -558,14 +556,15 @@ static int pcc_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 558 | ioread32(&pcch_hdr->minimum_frequency) * 1000; | 556 | ioread32(&pcch_hdr->minimum_frequency) * 1000; |
| 559 | policy->cur = pcc_get_freq(cpu); | 557 | policy->cur = pcc_get_freq(cpu); |
| 560 | 558 | ||
| 559 | if (!policy->cur) { | ||
| 560 | dprintk("init: Unable to get current CPU frequency\n"); | ||
| 561 | result = -EINVAL; | ||
| 562 | goto out; | ||
| 563 | } | ||
| 564 | |||
| 561 | dprintk("init: policy->max is %d, policy->min is %d\n", | 565 | dprintk("init: policy->max is %d, policy->min is %d\n", |
| 562 | policy->max, policy->min); | 566 | policy->max, policy->min); |
| 563 | 567 | out: | |
| 564 | return 0; | ||
| 565 | free: | ||
| 566 | pcc_clear_mapping(); | ||
| 567 | free_percpu(pcc_cpu_info); | ||
| 568 | pcch_null: | ||
| 569 | return result; | 568 | return result; |
| 570 | } | 569 | } |
| 571 | 570 | ||
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 7ec2123838e6..3e90cce3dc8b 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
| @@ -1023,13 +1023,12 @@ static int get_transition_latency(struct powernow_k8_data *data) | |||
| 1023 | } | 1023 | } |
| 1024 | if (max_latency == 0) { | 1024 | if (max_latency == 0) { |
| 1025 | /* | 1025 | /* |
| 1026 | * Fam 11h always returns 0 as transition latency. | 1026 | * Fam 11h and later may return 0 as transition latency. This |
| 1027 | * This is intended and means "very fast". While cpufreq core | 1027 | * is intended and means "very fast". While cpufreq core and |
| 1028 | * and governors currently can handle that gracefully, better | 1028 | * governors currently can handle that gracefully, better set it |
| 1029 | * set it to 1 to avoid problems in the future. | 1029 | * to 1 to avoid problems in the future. |
| 1030 | * For all others it's a BIOS bug. | ||
| 1031 | */ | 1030 | */ |
| 1032 | if (boot_cpu_data.x86 != 0x11) | 1031 | if (boot_cpu_data.x86 < 0x11) |
| 1033 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " | 1032 | printk(KERN_ERR FW_WARN PFX "Invalid zero transition " |
| 1034 | "latency\n"); | 1033 | "latency\n"); |
| 1035 | max_latency = 1; | 1034 | max_latency = 1; |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 0697ff139837..4db7c4d12ffa 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -571,8 +571,8 @@ auditsys: | |||
| 571 | * masked off. | 571 | * masked off. |
| 572 | */ | 572 | */ |
| 573 | sysret_audit: | 573 | sysret_audit: |
| 574 | movq %rax,%rsi /* second arg, syscall return value */ | 574 | movq RAX-ARGOFFSET(%rsp),%rsi /* second arg, syscall return value */ |
| 575 | cmpq $0,%rax /* is it < 0? */ | 575 | cmpq $0,%rsi /* is it < 0? */ |
| 576 | setl %al /* 1 if so, 0 if not */ | 576 | setl %al /* 1 if so, 0 if not */ |
| 577 | movzbl %al,%edi /* zero-extend that into %edi */ | 577 | movzbl %al,%edi /* zero-extend that into %edi */ |
| 578 | inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */ | 578 | inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */ |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index a198b7c87a12..ba390d731175 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
| @@ -964,7 +964,7 @@ fs_initcall(hpet_late_init); | |||
| 964 | 964 | ||
| 965 | void hpet_disable(void) | 965 | void hpet_disable(void) |
| 966 | { | 966 | { |
| 967 | if (is_hpet_capable()) { | 967 | if (is_hpet_capable() && hpet_virt_address) { |
| 968 | unsigned int cfg = hpet_readl(HPET_CFG); | 968 | unsigned int cfg = hpet_readl(HPET_CFG); |
| 969 | 969 | ||
| 970 | if (hpet_legacy_int_enabled) { | 970 | if (hpet_legacy_int_enabled) { |
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c index 7c9f02c130f3..cafa7c80ac95 100644 --- a/arch/x86/kernel/i8259.c +++ b/arch/x86/kernel/i8259.c | |||
| @@ -276,16 +276,6 @@ static struct sys_device device_i8259A = { | |||
| 276 | .cls = &i8259_sysdev_class, | 276 | .cls = &i8259_sysdev_class, |
| 277 | }; | 277 | }; |
| 278 | 278 | ||
| 279 | static int __init i8259A_init_sysfs(void) | ||
| 280 | { | ||
| 281 | int error = sysdev_class_register(&i8259_sysdev_class); | ||
| 282 | if (!error) | ||
| 283 | error = sysdev_register(&device_i8259A); | ||
| 284 | return error; | ||
| 285 | } | ||
| 286 | |||
| 287 | device_initcall(i8259A_init_sysfs); | ||
| 288 | |||
| 289 | static void mask_8259A(void) | 279 | static void mask_8259A(void) |
| 290 | { | 280 | { |
| 291 | unsigned long flags; | 281 | unsigned long flags; |
| @@ -407,3 +397,18 @@ struct legacy_pic default_legacy_pic = { | |||
| 407 | }; | 397 | }; |
| 408 | 398 | ||
| 409 | struct legacy_pic *legacy_pic = &default_legacy_pic; | 399 | struct legacy_pic *legacy_pic = &default_legacy_pic; |
| 400 | |||
| 401 | static int __init i8259A_init_sysfs(void) | ||
| 402 | { | ||
| 403 | int error; | ||
| 404 | |||
| 405 | if (legacy_pic != &default_legacy_pic) | ||
| 406 | return 0; | ||
| 407 | |||
| 408 | error = sysdev_class_register(&i8259_sysdev_class); | ||
| 409 | if (!error) | ||
| 410 | error = sysdev_register(&device_i8259A); | ||
| 411 | return error; | ||
| 412 | } | ||
| 413 | |||
| 414 | device_initcall(i8259A_init_sysfs); | ||
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 4f4af75b9482..01ab17ae2ae7 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
| @@ -572,7 +572,6 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd) | |||
| 572 | return NOTIFY_STOP; | 572 | return NOTIFY_STOP; |
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | #ifdef CONFIG_KGDB_LOW_LEVEL_TRAP | ||
| 576 | int kgdb_ll_trap(int cmd, const char *str, | 575 | int kgdb_ll_trap(int cmd, const char *str, |
| 577 | struct pt_regs *regs, long err, int trap, int sig) | 576 | struct pt_regs *regs, long err, int trap, int sig) |
| 578 | { | 577 | { |
| @@ -590,7 +589,6 @@ int kgdb_ll_trap(int cmd, const char *str, | |||
| 590 | 589 | ||
| 591 | return __kgdb_notify(&args, cmd); | 590 | return __kgdb_notify(&args, cmd); |
| 592 | } | 591 | } |
| 593 | #endif /* CONFIG_KGDB_LOW_LEVEL_TRAP */ | ||
| 594 | 592 | ||
| 595 | static int | 593 | static int |
| 596 | kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) | 594 | kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr) |
| @@ -625,6 +623,12 @@ int kgdb_arch_init(void) | |||
| 625 | return register_die_notifier(&kgdb_notifier); | 623 | return register_die_notifier(&kgdb_notifier); |
| 626 | } | 624 | } |
| 627 | 625 | ||
| 626 | static void kgdb_hw_overflow_handler(struct perf_event *event, int nmi, | ||
| 627 | struct perf_sample_data *data, struct pt_regs *regs) | ||
| 628 | { | ||
| 629 | kgdb_ll_trap(DIE_DEBUG, "debug", regs, 0, 0, SIGTRAP); | ||
| 630 | } | ||
| 631 | |||
| 628 | void kgdb_arch_late(void) | 632 | void kgdb_arch_late(void) |
| 629 | { | 633 | { |
| 630 | int i, cpu; | 634 | int i, cpu; |
| @@ -655,6 +659,7 @@ void kgdb_arch_late(void) | |||
| 655 | for_each_online_cpu(cpu) { | 659 | for_each_online_cpu(cpu) { |
| 656 | pevent = per_cpu_ptr(breakinfo[i].pev, cpu); | 660 | pevent = per_cpu_ptr(breakinfo[i].pev, cpu); |
| 657 | pevent[0]->hw.sample_period = 1; | 661 | pevent[0]->hw.sample_period = 1; |
| 662 | pevent[0]->overflow_handler = kgdb_hw_overflow_handler; | ||
| 658 | if (pevent[0]->destroy != NULL) { | 663 | if (pevent[0]->destroy != NULL) { |
| 659 | pevent[0]->destroy = NULL; | 664 | pevent[0]->destroy = NULL; |
| 660 | release_bp_slot(*pevent); | 665 | release_bp_slot(*pevent); |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 89d66ca4d87c..2331bdc2b549 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -342,6 +342,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 342 | /* advance table_gfn when emulating 1gb pages with 4k */ | 342 | /* advance table_gfn when emulating 1gb pages with 4k */ |
| 343 | if (delta == 0) | 343 | if (delta == 0) |
| 344 | table_gfn += PT_INDEX(addr, level); | 344 | table_gfn += PT_INDEX(addr, level); |
| 345 | access &= gw->pte_access; | ||
| 345 | } else { | 346 | } else { |
| 346 | direct = 0; | 347 | direct = 0; |
| 347 | table_gfn = gw->table_gfn[level - 2]; | 348 | table_gfn = gw->table_gfn[level - 2]; |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 05d571f6f196..7fa89c39c64f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -1562,7 +1562,7 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs, | |||
| 1562 | 1562 | ||
| 1563 | r = -ENOMEM; | 1563 | r = -ENOMEM; |
| 1564 | size = sizeof(struct kvm_msr_entry) * msrs.nmsrs; | 1564 | size = sizeof(struct kvm_msr_entry) * msrs.nmsrs; |
| 1565 | entries = vmalloc(size); | 1565 | entries = kmalloc(size, GFP_KERNEL); |
| 1566 | if (!entries) | 1566 | if (!entries) |
| 1567 | goto out; | 1567 | goto out; |
| 1568 | 1568 | ||
| @@ -1581,7 +1581,7 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs, | |||
| 1581 | r = n; | 1581 | r = n; |
| 1582 | 1582 | ||
| 1583 | out_free: | 1583 | out_free: |
| 1584 | vfree(entries); | 1584 | kfree(entries); |
| 1585 | out: | 1585 | out: |
| 1586 | return r; | 1586 | return r; |
| 1587 | } | 1587 | } |
