Merge commit 'v2.6.29' into timers/core
This commit is contained in:
@@ -973,6 +973,29 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
|
||||
nr_ioapics++;
|
||||
}
|
||||
|
||||
int __init acpi_probe_gsi(void)
|
||||
{
|
||||
int idx;
|
||||
int gsi;
|
||||
int max_gsi = 0;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
if (!acpi_ioapic)
|
||||
return 0;
|
||||
|
||||
max_gsi = 0;
|
||||
for (idx = 0; idx < nr_ioapics; idx++) {
|
||||
gsi = mp_ioapic_routing[idx].gsi_end;
|
||||
|
||||
if (gsi > max_gsi)
|
||||
max_gsi = gsi;
|
||||
}
|
||||
|
||||
return max_gsi + 1;
|
||||
}
|
||||
|
||||
static void assign_to_mp_irq(struct mp_config_intsrc *m,
|
||||
struct mp_config_intsrc *mp_irq)
|
||||
{
|
||||
|
@@ -156,11 +156,11 @@ static int __init acpi_sleep_setup(char *str)
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
if (strncmp(str, "s4_nohwsig", 10) == 0)
|
||||
acpi_no_s4_hw_signature();
|
||||
if (strncmp(str, "s4_nonvs", 8) == 0)
|
||||
acpi_s4_no_nvs();
|
||||
#endif
|
||||
if (strncmp(str, "old_ordering", 12) == 0)
|
||||
acpi_old_suspend_ordering();
|
||||
if (strncmp(str, "s4_nonvs", 8) == 0)
|
||||
acpi_s4_no_nvs();
|
||||
str = strchr(str, ',');
|
||||
if (str != NULL)
|
||||
str += strspn(str, ", \t");
|
||||
|
@@ -13,7 +13,6 @@
|
||||
* Hooray, we are in Long 64-bit mode (but still running in low memory)
|
||||
*/
|
||||
ENTRY(wakeup_long64)
|
||||
wakeup_long64:
|
||||
movq saved_magic, %rax
|
||||
movq $0x123456789abcdef0, %rdx
|
||||
cmpq %rdx, %rax
|
||||
@@ -34,16 +33,12 @@ wakeup_long64:
|
||||
|
||||
movq saved_rip, %rax
|
||||
jmp *%rax
|
||||
ENDPROC(wakeup_long64)
|
||||
|
||||
bogus_64_magic:
|
||||
jmp bogus_64_magic
|
||||
|
||||
.align 2
|
||||
.p2align 4,,15
|
||||
.globl do_suspend_lowlevel
|
||||
.type do_suspend_lowlevel,@function
|
||||
do_suspend_lowlevel:
|
||||
.LFB5:
|
||||
ENTRY(do_suspend_lowlevel)
|
||||
subq $8, %rsp
|
||||
xorl %eax, %eax
|
||||
call save_processor_state
|
||||
@@ -67,7 +62,7 @@ do_suspend_lowlevel:
|
||||
pushfq
|
||||
popq pt_regs_flags(%rax)
|
||||
|
||||
movq $.L97, saved_rip(%rip)
|
||||
movq $resume_point, saved_rip(%rip)
|
||||
|
||||
movq %rsp, saved_rsp
|
||||
movq %rbp, saved_rbp
|
||||
@@ -78,14 +73,12 @@ do_suspend_lowlevel:
|
||||
addq $8, %rsp
|
||||
movl $3, %edi
|
||||
xorl %eax, %eax
|
||||
jmp acpi_enter_sleep_state
|
||||
.L97:
|
||||
.p2align 4,,7
|
||||
.L99:
|
||||
.align 4
|
||||
movl $24, %eax
|
||||
movw %ax, %ds
|
||||
call acpi_enter_sleep_state
|
||||
/* in case something went wrong, restore the machine status and go on */
|
||||
jmp resume_point
|
||||
|
||||
.align 4
|
||||
resume_point:
|
||||
/* We don't restore %rax, it must be 0 anyway */
|
||||
movq $saved_context, %rax
|
||||
movq saved_context_cr4(%rax), %rbx
|
||||
@@ -117,12 +110,9 @@ do_suspend_lowlevel:
|
||||
xorl %eax, %eax
|
||||
addq $8, %rsp
|
||||
jmp restore_processor_state
|
||||
.LFE5:
|
||||
.Lfe5:
|
||||
.size do_suspend_lowlevel, .Lfe5-do_suspend_lowlevel
|
||||
|
||||
ENDPROC(do_suspend_lowlevel)
|
||||
|
||||
.data
|
||||
ALIGN
|
||||
ENTRY(saved_rbp) .quad 0
|
||||
ENTRY(saved_rsi) .quad 0
|
||||
ENTRY(saved_rdi) .quad 0
|
||||
|
@@ -862,7 +862,7 @@ void clear_local_APIC(void)
|
||||
}
|
||||
|
||||
/* lets not touch this if we didn't frob it */
|
||||
#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(X86_MCE_INTEL)
|
||||
#if defined(CONFIG_X86_MCE_P4THERMAL) || defined(CONFIG_X86_MCE_INTEL)
|
||||
if (maxlvt >= 5) {
|
||||
v = apic_read(APIC_LVTTHMR);
|
||||
apic_write(APIC_LVTTHMR, v | APIC_LVT_MASKED);
|
||||
|
@@ -1192,6 +1192,7 @@ static int suspend(int vetoable)
|
||||
device_suspend(PMSG_SUSPEND);
|
||||
local_irq_disable();
|
||||
device_power_down(PMSG_SUSPEND);
|
||||
sysdev_suspend(PMSG_SUSPEND);
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
@@ -1208,6 +1209,7 @@ static int suspend(int vetoable)
|
||||
if (err != APM_SUCCESS)
|
||||
apm_error("suspend", err);
|
||||
err = (err == APM_SUCCESS) ? 0 : -EIO;
|
||||
sysdev_resume();
|
||||
device_power_up(PMSG_RESUME);
|
||||
local_irq_enable();
|
||||
device_resume(PMSG_RESUME);
|
||||
@@ -1228,6 +1230,7 @@ static void standby(void)
|
||||
|
||||
local_irq_disable();
|
||||
device_power_down(PMSG_SUSPEND);
|
||||
sysdev_suspend(PMSG_SUSPEND);
|
||||
local_irq_enable();
|
||||
|
||||
err = set_system_power_state(APM_STATE_STANDBY);
|
||||
@@ -1235,6 +1238,7 @@ static void standby(void)
|
||||
apm_error("standby", err);
|
||||
|
||||
local_irq_disable();
|
||||
sysdev_resume();
|
||||
device_power_up(PMSG_RESUME);
|
||||
local_irq_enable();
|
||||
}
|
||||
|
@@ -245,17 +245,6 @@ config X86_E_POWERSAVER
|
||||
|
||||
comment "shared options"
|
||||
|
||||
config X86_ACPI_CPUFREQ_PROC_INTF
|
||||
bool "/proc/acpi/processor/../performance interface (deprecated)"
|
||||
depends on PROC_FS
|
||||
depends on X86_ACPI_CPUFREQ || X86_POWERNOW_K7_ACPI || X86_POWERNOW_K8_ACPI
|
||||
help
|
||||
This enables the deprecated /proc/acpi/processor/../performance
|
||||
interface. While it is helpful for debugging, the generic,
|
||||
cross-architecture cpufreq interfaces should be used.
|
||||
|
||||
If in doubt, say N.
|
||||
|
||||
config X86_SPEEDSTEP_LIB
|
||||
tristate
|
||||
default (X86_SPEEDSTEP_ICH || X86_SPEEDSTEP_SMI || X86_P4_CLOCKMOD)
|
||||
|
@@ -277,7 +277,6 @@ static struct cpufreq_driver p4clockmod_driver = {
|
||||
.name = "p4-clockmod",
|
||||
.owner = THIS_MODULE,
|
||||
.attr = p4clockmod_attr,
|
||||
.hide_interface = 1,
|
||||
};
|
||||
|
||||
|
||||
|
@@ -939,10 +939,25 @@ static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
|
||||
free_cpumask_var(data->acpi_data.shared_cpu_map);
|
||||
}
|
||||
|
||||
static int get_transition_latency(struct powernow_k8_data *data)
|
||||
{
|
||||
int max_latency = 0;
|
||||
int i;
|
||||
for (i = 0; i < data->acpi_data.state_count; i++) {
|
||||
int cur_latency = data->acpi_data.states[i].transition_latency
|
||||
+ data->acpi_data.states[i].bus_master_latency;
|
||||
if (cur_latency > max_latency)
|
||||
max_latency = cur_latency;
|
||||
}
|
||||
/* value in usecs, needs to be in nanoseconds */
|
||||
return 1000 * max_latency;
|
||||
}
|
||||
|
||||
#else
|
||||
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
|
||||
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
|
||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
|
||||
static int get_transition_latency(struct powernow_k8_data *data) { return 0; }
|
||||
#endif /* CONFIG_X86_POWERNOW_K8_ACPI */
|
||||
|
||||
/* Take a frequency, and issue the fid/vid transition command */
|
||||
@@ -1142,8 +1157,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
data->cpu = pol->cpu;
|
||||
data->currpstate = HW_PSTATE_INVALID;
|
||||
|
||||
rc = powernow_k8_cpu_init_acpi(data);
|
||||
if (rc) {
|
||||
if (powernow_k8_cpu_init_acpi(data)) {
|
||||
/*
|
||||
* Use the PSB BIOS structure. This is only availabe on
|
||||
* an UP version, and is deprecated by AMD.
|
||||
@@ -1161,19 +1175,28 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
"ACPI maintainers and complain to your BIOS "
|
||||
"vendor.\n");
|
||||
#endif
|
||||
goto err_out;
|
||||
kfree(data);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (pol->cpu != 0) {
|
||||
printk(KERN_ERR FW_BUG PFX "No ACPI _PSS objects for "
|
||||
"CPU other than CPU0. Complain to your BIOS "
|
||||
"vendor.\n");
|
||||
goto err_out;
|
||||
kfree(data);
|
||||
return -ENODEV;
|
||||
}
|
||||
rc = find_psb_table(data);
|
||||
if (rc) {
|
||||
goto err_out;
|
||||
kfree(data);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
/* Take a crude guess here.
|
||||
* That guess was in microseconds, so multiply with 1000 */
|
||||
pol->cpuinfo.transition_latency = (
|
||||
((data->rvo + 8) * data->vstable * VST_UNITS_20US) +
|
||||
((1 << data->irt) * 30)) * 1000;
|
||||
} else /* ACPI _PSS objects available */
|
||||
pol->cpuinfo.transition_latency = get_transition_latency(data);
|
||||
|
||||
/* only run on specific CPU from here on */
|
||||
oldmask = current->cpus_allowed;
|
||||
@@ -1204,11 +1227,6 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
cpumask_copy(pol->cpus, &per_cpu(cpu_core_map, pol->cpu));
|
||||
data->available_cores = pol->cpus;
|
||||
|
||||
/* Take a crude guess here.
|
||||
* That guess was in microseconds, so multiply with 1000 */
|
||||
pol->cpuinfo.transition_latency = (((data->rvo + 8) * data->vstable * VST_UNITS_20US)
|
||||
+ (3 * (1 << data->irt) * 10)) * 1000;
|
||||
|
||||
if (cpu_family == CPU_HW_PSTATE)
|
||||
pol->cur = find_khz_freq_from_pstate(data->powernow_table, data->currpstate);
|
||||
else
|
||||
|
@@ -291,6 +291,9 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
|
||||
ds_init_intel(c);
|
||||
}
|
||||
|
||||
if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush)
|
||||
set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
if (c->x86 == 15)
|
||||
c->x86_cache_alignment = c->x86_clflush_size * 2;
|
||||
|
@@ -295,11 +295,11 @@ void do_machine_check(struct pt_regs * regs, long error_code)
|
||||
* If we know that the error was in user space, send a
|
||||
* SIGBUS. Otherwise, panic if tolerance is low.
|
||||
*
|
||||
* do_exit() takes an awful lot of locks and has a slight
|
||||
* force_sig() takes an awful lot of locks and has a slight
|
||||
* risk of deadlocking.
|
||||
*/
|
||||
if (user_space) {
|
||||
do_exit(SIGBUS);
|
||||
force_sig(SIGBUS, current);
|
||||
} else if (panic_on_oops || tolerant < 2) {
|
||||
mce_panic("Uncorrected machine check",
|
||||
&panicm, mcestart);
|
||||
@@ -490,7 +490,7 @@ static void __cpuinit mce_cpu_quirks(struct cpuinfo_x86 *c)
|
||||
|
||||
}
|
||||
|
||||
static void __cpuinit mce_cpu_features(struct cpuinfo_x86 *c)
|
||||
static void mce_cpu_features(struct cpuinfo_x86 *c)
|
||||
{
|
||||
switch (c->x86_vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
@@ -734,6 +734,7 @@ __setup("mce=", mcheck_enable);
|
||||
static int mce_resume(struct sys_device *dev)
|
||||
{
|
||||
mce_init(NULL);
|
||||
mce_cpu_features(¤t_cpu_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -121,7 +121,7 @@ static long threshold_restart_bank(void *_tr)
|
||||
}
|
||||
|
||||
/* cpu init entry point, called from mce.c with preempt off */
|
||||
void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
|
||||
void mce_amd_feature_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int bank, block;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
@@ -30,7 +30,7 @@ asmlinkage void smp_thermal_interrupt(void)
|
||||
irq_exit();
|
||||
}
|
||||
|
||||
static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
|
||||
static void intel_init_thermal(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 l, h;
|
||||
int tm2 = 0;
|
||||
@@ -84,7 +84,7 @@ static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c)
|
||||
return;
|
||||
}
|
||||
|
||||
void __cpuinit mce_intel_feature_init(struct cpuinfo_x86 *c)
|
||||
void mce_intel_feature_init(struct cpuinfo_x86 *c)
|
||||
{
|
||||
intel_init_thermal(c);
|
||||
}
|
||||
|
@@ -729,7 +729,7 @@ struct pebs_tracer *ds_request_pebs(struct task_struct *task,
|
||||
|
||||
spin_unlock_irqrestore(&ds_lock, irq);
|
||||
|
||||
ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_bts);
|
||||
ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_pebs);
|
||||
ds_resume_pebs(tracer);
|
||||
|
||||
return tracer;
|
||||
@@ -1029,5 +1029,4 @@ void ds_copy_thread(struct task_struct *tsk, struct task_struct *father)
|
||||
|
||||
void ds_exit_thread(struct task_struct *tsk)
|
||||
{
|
||||
WARN_ON(tsk->thread.ds_ctx);
|
||||
}
|
||||
|
@@ -467,7 +467,7 @@ void __init efi_enter_virtual_mode(void)
|
||||
efi_memory_desc_t *md;
|
||||
efi_status_t status;
|
||||
unsigned long size;
|
||||
u64 end, systab, addr, npages;
|
||||
u64 end, systab, addr, npages, end_pfn;
|
||||
void *p, *va;
|
||||
|
||||
efi.systab = NULL;
|
||||
@@ -479,7 +479,10 @@ void __init efi_enter_virtual_mode(void)
|
||||
size = md->num_pages << EFI_PAGE_SHIFT;
|
||||
end = md->phys_addr + size;
|
||||
|
||||
if (PFN_UP(end) <= max_low_pfn_mapped)
|
||||
end_pfn = PFN_UP(end);
|
||||
if (end_pfn <= max_low_pfn_mapped
|
||||
|| (end_pfn > (1UL << (32 - PAGE_SHIFT))
|
||||
&& end_pfn <= max_pfn_mapped))
|
||||
va = __va(md->phys_addr);
|
||||
else
|
||||
va = efi_ioremap(md->phys_addr, size);
|
||||
|
@@ -99,24 +99,11 @@ void __init efi_call_phys_epilog(void)
|
||||
|
||||
void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
static unsigned pages_mapped __initdata;
|
||||
unsigned i, pages;
|
||||
unsigned long offset;
|
||||
unsigned long last_map_pfn;
|
||||
|
||||
pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr);
|
||||
offset = phys_addr & ~PAGE_MASK;
|
||||
phys_addr &= PAGE_MASK;
|
||||
|
||||
if (pages_mapped + pages > MAX_EFI_IO_PAGES)
|
||||
last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
|
||||
if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < pages; i++) {
|
||||
__set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
|
||||
phys_addr, PAGE_KERNEL);
|
||||
phys_addr += PAGE_SIZE;
|
||||
pages_mapped++;
|
||||
}
|
||||
|
||||
return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
|
||||
(pages_mapped - pages)) + offset;
|
||||
return (void __iomem *)__va(phys_addr);
|
||||
}
|
||||
|
@@ -488,20 +488,21 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr)
|
||||
* ignore such a protection.
|
||||
*/
|
||||
asm volatile(
|
||||
"1: " _ASM_MOV " (%[parent_old]), %[old]\n"
|
||||
"2: " _ASM_MOV " %[return_hooker], (%[parent_replaced])\n"
|
||||
"1: " _ASM_MOV " (%[parent]), %[old]\n"
|
||||
"2: " _ASM_MOV " %[return_hooker], (%[parent])\n"
|
||||
" movl $0, %[faulted]\n"
|
||||
"3:\n"
|
||||
|
||||
".section .fixup, \"ax\"\n"
|
||||
"3: movl $1, %[faulted]\n"
|
||||
"4: movl $1, %[faulted]\n"
|
||||
" jmp 3b\n"
|
||||
".previous\n"
|
||||
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
_ASM_EXTABLE(2b, 3b)
|
||||
_ASM_EXTABLE(1b, 4b)
|
||||
_ASM_EXTABLE(2b, 4b)
|
||||
|
||||
: [parent_replaced] "=r" (parent), [old] "=r" (old),
|
||||
[faulted] "=r" (faulted)
|
||||
: [parent_old] "0" (parent), [return_hooker] "r" (return_hooker)
|
||||
: [old] "=r" (old), [faulted] "=r" (faulted)
|
||||
: [parent] "r" (parent), [return_hooker] "r" (return_hooker)
|
||||
: "memory"
|
||||
);
|
||||
|
||||
|
@@ -269,6 +269,8 @@ static void hpet_set_mode(enum clock_event_mode mode,
|
||||
now = hpet_readl(HPET_COUNTER);
|
||||
cmp = now + (unsigned long) delta;
|
||||
cfg = hpet_readl(HPET_Tn_CFG(timer));
|
||||
/* Make sure we use edge triggered interrupts */
|
||||
cfg &= ~HPET_TN_LEVEL;
|
||||
cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
|
||||
HPET_TN_SETVAL | HPET_TN_32BIT;
|
||||
hpet_writel(cfg, HPET_Tn_CFG(timer));
|
||||
|
@@ -136,7 +136,7 @@ int init_fpu(struct task_struct *tsk)
|
||||
#ifdef CONFIG_X86_32
|
||||
if (!HAVE_HWFP) {
|
||||
memset(tsk->thread.xstate, 0, xstate_size);
|
||||
finit();
|
||||
finit_task(tsk);
|
||||
set_stopped_child_used_math(tsk);
|
||||
return 0;
|
||||
}
|
||||
|
@@ -28,10 +28,10 @@ static int i8237A_resume(struct sys_device *dev)
|
||||
|
||||
flags = claim_dma_lock();
|
||||
|
||||
dma_outb(DMA1_RESET_REG, 0);
|
||||
dma_outb(DMA2_RESET_REG, 0);
|
||||
dma_outb(0, DMA1_RESET_REG);
|
||||
dma_outb(0, DMA2_RESET_REG);
|
||||
|
||||
for (i = 0;i < 8;i++) {
|
||||
for (i = 0; i < 8; i++) {
|
||||
set_dma_addr(i, 0x000000);
|
||||
/* DMA count is a bit weird so this is not 0 */
|
||||
set_dma_count(i, 1);
|
||||
@@ -51,14 +51,14 @@ static int i8237A_suspend(struct sys_device *dev, pm_message_t state)
|
||||
}
|
||||
|
||||
static struct sysdev_class i8237_sysdev_class = {
|
||||
.name = "i8237",
|
||||
.suspend = i8237A_suspend,
|
||||
.resume = i8237A_resume,
|
||||
.name = "i8237",
|
||||
.suspend = i8237A_suspend,
|
||||
.resume = i8237A_resume,
|
||||
};
|
||||
|
||||
static struct sys_device device_i8237A = {
|
||||
.id = 0,
|
||||
.cls = &i8237_sysdev_class,
|
||||
.id = 0,
|
||||
.cls = &i8237_sysdev_class,
|
||||
};
|
||||
|
||||
static int __init i8237A_init_sysfs(void)
|
||||
@@ -68,5 +68,4 @@ static int __init i8237A_init_sysfs(void)
|
||||
error = sysdev_register(&device_i8237A);
|
||||
return error;
|
||||
}
|
||||
|
||||
device_initcall(i8237A_init_sysfs);
|
||||
|
@@ -3841,14 +3841,24 @@ int __init io_apic_get_redir_entries (int ioapic)
|
||||
|
||||
void __init probe_nr_irqs_gsi(void)
|
||||
{
|
||||
int idx;
|
||||
int nr = 0;
|
||||
|
||||
for (idx = 0; idx < nr_ioapics; idx++)
|
||||
nr += io_apic_get_redir_entries(idx) + 1;
|
||||
|
||||
if (nr > nr_irqs_gsi)
|
||||
nr = acpi_probe_gsi();
|
||||
if (nr > nr_irqs_gsi) {
|
||||
nr_irqs_gsi = nr;
|
||||
} else {
|
||||
/* for acpi=off or acpi is not compiled in */
|
||||
int idx;
|
||||
|
||||
nr = 0;
|
||||
for (idx = 0; idx < nr_ioapics; idx++)
|
||||
nr += io_apic_get_redir_entries(idx) + 1;
|
||||
|
||||
if (nr > nr_irqs_gsi)
|
||||
nr_irqs_gsi = nr;
|
||||
}
|
||||
|
||||
printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
|
@@ -193,6 +193,9 @@ static int __kprobes can_boost(kprobe_opcode_t *opcodes)
|
||||
kprobe_opcode_t opcode;
|
||||
kprobe_opcode_t *orig_opcodes = opcodes;
|
||||
|
||||
if (search_exception_tables(opcodes))
|
||||
return 0; /* Page fault may occur on this address. */
|
||||
|
||||
retry:
|
||||
if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)
|
||||
return 0;
|
||||
|
@@ -203,7 +203,7 @@ static void __init platform_detect(void)
|
||||
static void __init platform_detect(void)
|
||||
{
|
||||
/* stopgap until OFW support is added to the kernel */
|
||||
olpc_platform_info.boardrev = 0xc2;
|
||||
olpc_platform_info.boardrev = olpc_board(0xc2);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -268,6 +268,32 @@ enum paravirt_lazy_mode paravirt_get_lazy_mode(void)
|
||||
return __get_cpu_var(paravirt_lazy_mode);
|
||||
}
|
||||
|
||||
void arch_flush_lazy_mmu_mode(void)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
|
||||
WARN_ON(preempt_count() == 1);
|
||||
arch_leave_lazy_mmu_mode();
|
||||
arch_enter_lazy_mmu_mode();
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
void arch_flush_lazy_cpu_mode(void)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) {
|
||||
WARN_ON(preempt_count() == 1);
|
||||
arch_leave_lazy_cpu_mode();
|
||||
arch_enter_lazy_cpu_mode();
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
struct pv_info pv_info = {
|
||||
.name = "bare hardware",
|
||||
.paravirt_enabled = 0,
|
||||
|
@@ -180,6 +180,9 @@ void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
|
||||
|
||||
trace_power_start(&it, POWER_CSTATE, (ax>>4)+1);
|
||||
if (!need_resched()) {
|
||||
if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
||||
clflush((void *)¤t_thread_info()->flags);
|
||||
|
||||
__monitor((void *)¤t_thread_info()->flags, 0, 0);
|
||||
smp_mb();
|
||||
if (!need_resched())
|
||||
@@ -194,6 +197,9 @@ static void mwait_idle(void)
|
||||
struct power_trace it;
|
||||
if (!need_resched()) {
|
||||
trace_power_start(&it, POWER_CSTATE, 1);
|
||||
if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
||||
clflush((void *)¤t_thread_info()->flags);
|
||||
|
||||
__monitor((void *)¤t_thread_info()->flags, 0, 0);
|
||||
smp_mb();
|
||||
if (!need_resched())
|
||||
|
@@ -104,9 +104,6 @@ void cpu_idle(void)
|
||||
check_pgt_cache();
|
||||
rmb();
|
||||
|
||||
if (rcu_pending(cpu))
|
||||
rcu_check_callbacks(cpu, 0);
|
||||
|
||||
if (cpu_is_offline(cpu))
|
||||
play_dead();
|
||||
|
||||
|
@@ -40,6 +40,7 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/system.h>
|
||||
@@ -151,14 +152,18 @@ void __show_regs(struct pt_regs *regs, int all)
|
||||
unsigned long d0, d1, d2, d3, d6, d7;
|
||||
unsigned int fsindex, gsindex;
|
||||
unsigned int ds, cs, es;
|
||||
const char *board;
|
||||
|
||||
printk("\n");
|
||||
print_modules();
|
||||
printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s\n",
|
||||
board = dmi_get_system_info(DMI_PRODUCT_NAME);
|
||||
if (!board)
|
||||
board = "";
|
||||
printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s %s\n",
|
||||
current->pid, current->comm, print_tainted(),
|
||||
init_utsname()->release,
|
||||
(int)strcspn(init_utsname()->version, " "),
|
||||
init_utsname()->version);
|
||||
init_utsname()->version, board);
|
||||
printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
|
||||
printk_address(regs->ip, 1);
|
||||
printk(KERN_INFO "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss,
|
||||
|
@@ -810,12 +810,16 @@ static void ptrace_bts_untrace(struct task_struct *child)
|
||||
|
||||
static void ptrace_bts_detach(struct task_struct *child)
|
||||
{
|
||||
if (unlikely(child->bts)) {
|
||||
ds_release_bts(child->bts);
|
||||
child->bts = NULL;
|
||||
|
||||
ptrace_bts_free_buffer(child);
|
||||
}
|
||||
/*
|
||||
* Ptrace_detach() races with ptrace_untrace() in case
|
||||
* the child dies and is reaped by another thread.
|
||||
*
|
||||
* We only do the memory accounting at this point and
|
||||
* leave the buffer deallocation and the bts tracer
|
||||
* release to ptrace_bts_untrace() which will be called
|
||||
* later on with tasklist_lock held.
|
||||
*/
|
||||
release_locked_buffer(child->bts_buffer, child->bts_size);
|
||||
}
|
||||
#else
|
||||
static inline void ptrace_bts_fork(struct task_struct *tsk) {}
|
||||
@@ -1384,7 +1388,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
|
||||
#ifdef CONFIG_X86_32
|
||||
# define IS_IA32 1
|
||||
#elif defined CONFIG_IA32_EMULATION
|
||||
# define IS_IA32 test_thread_flag(TIF_IA32)
|
||||
# define IS_IA32 is_compat_task()
|
||||
#else
|
||||
# define IS_IA32 0
|
||||
#endif
|
||||
|
@@ -217,6 +217,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on Dell XPS710 */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "Dell XPS710",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@@ -607,7 +607,7 @@ struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
|
||||
static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
|
||||
{
|
||||
printk(KERN_NOTICE
|
||||
"%s detected: BIOS may corrupt low RAM, working it around.\n",
|
||||
"%s detected: BIOS may corrupt low RAM, working around it.\n",
|
||||
d->ident);
|
||||
|
||||
e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
|
||||
@@ -770,6 +770,9 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
finish_e820_parsing();
|
||||
|
||||
if (efi_enabled)
|
||||
efi_init();
|
||||
|
||||
dmi_scan_machine();
|
||||
|
||||
dmi_check_system(bad_bios_dmi_table);
|
||||
@@ -789,8 +792,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
insert_resource(&iomem_resource, &data_resource);
|
||||
insert_resource(&iomem_resource, &bss_resource);
|
||||
|
||||
if (efi_enabled)
|
||||
efi_init();
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
if (ppro_with_ram_bug()) {
|
||||
|
@@ -115,7 +115,7 @@ unsigned long __init calibrate_cpu(void)
|
||||
|
||||
static struct irqaction irq0 = {
|
||||
.handler = timer_interrupt,
|
||||
.flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
||||
.flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING | IRQF_TIMER,
|
||||
.mask = CPU_MASK_NONE,
|
||||
.name = "timer"
|
||||
};
|
||||
|
@@ -99,6 +99,12 @@ static inline void preempt_conditional_sti(struct pt_regs *regs)
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static inline void conditional_cli(struct pt_regs *regs)
|
||||
{
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
static inline void preempt_conditional_cli(struct pt_regs *regs)
|
||||
{
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
@@ -626,8 +632,10 @@ clear_dr7:
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
debug_vm86:
|
||||
/* reenable preemption: handle_vm86_trap() might sleep */
|
||||
dec_preempt_count();
|
||||
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
|
||||
preempt_conditional_cli(regs);
|
||||
conditional_cli(regs);
|
||||
return;
|
||||
#endif
|
||||
|
||||
@@ -896,7 +904,7 @@ asmlinkage void math_state_restore(void)
|
||||
EXPORT_SYMBOL_GPL(math_state_restore);
|
||||
|
||||
#ifndef CONFIG_MATH_EMULATION
|
||||
asmlinkage void math_emulate(long arg)
|
||||
void math_emulate(struct math_emu_info *info)
|
||||
{
|
||||
printk(KERN_EMERG
|
||||
"math-emulation not enabled and no coprocessor found.\n");
|
||||
@@ -906,16 +914,19 @@ asmlinkage void math_emulate(long arg)
|
||||
}
|
||||
#endif /* CONFIG_MATH_EMULATION */
|
||||
|
||||
dotraplinkage void __kprobes
|
||||
do_device_not_available(struct pt_regs *regs, long error)
|
||||
dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs)
|
||||
{
|
||||
#ifdef CONFIG_X86_32
|
||||
if (read_cr0() & X86_CR0_EM) {
|
||||
conditional_sti(regs);
|
||||
math_emulate(0);
|
||||
struct math_emu_info info = { };
|
||||
|
||||
conditional_sti(®s);
|
||||
|
||||
info.regs = ®s;
|
||||
math_emulate(&info);
|
||||
} else {
|
||||
math_state_restore(); /* interrupts still off */
|
||||
conditional_sti(regs);
|
||||
conditional_sti(®s);
|
||||
}
|
||||
#else
|
||||
math_state_restore();
|
||||
|
@@ -273,30 +273,43 @@ static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin)
|
||||
* use the TSC value at the transitions to calculate a pretty
|
||||
* good value for the TSC frequencty.
|
||||
*/
|
||||
static inline int pit_expect_msb(unsigned char val)
|
||||
static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
|
||||
{
|
||||
int count = 0;
|
||||
int count;
|
||||
u64 tsc = 0;
|
||||
|
||||
for (count = 0; count < 50000; count++) {
|
||||
/* Ignore LSB */
|
||||
inb(0x42);
|
||||
if (inb(0x42) != val)
|
||||
break;
|
||||
tsc = get_cycles();
|
||||
}
|
||||
return count > 50;
|
||||
*deltap = get_cycles() - tsc;
|
||||
*tscp = tsc;
|
||||
|
||||
/*
|
||||
* We require _some_ success, but the quality control
|
||||
* will be based on the error terms on the TSC values.
|
||||
*/
|
||||
return count > 5;
|
||||
}
|
||||
|
||||
/*
|
||||
* How many MSB values do we want to see? We aim for a
|
||||
* 15ms calibration, which assuming a 2us counter read
|
||||
* error should give us roughly 150 ppm precision for
|
||||
* the calibration.
|
||||
* How many MSB values do we want to see? We aim for
|
||||
* a maximum error rate of 500ppm (in practice the
|
||||
* real error is much smaller), but refuse to spend
|
||||
* more than 25ms on it.
|
||||
*/
|
||||
#define QUICK_PIT_MS 15
|
||||
#define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
|
||||
#define MAX_QUICK_PIT_MS 25
|
||||
#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
|
||||
|
||||
static unsigned long quick_pit_calibrate(void)
|
||||
{
|
||||
int i;
|
||||
u64 tsc, delta;
|
||||
unsigned long d1, d2;
|
||||
|
||||
/* Set the Gate high, disable speaker */
|
||||
outb((inb(0x61) & ~0x02) | 0x01, 0x61);
|
||||
|
||||
@@ -315,45 +328,52 @@ static unsigned long quick_pit_calibrate(void)
|
||||
outb(0xff, 0x42);
|
||||
outb(0xff, 0x42);
|
||||
|
||||
if (pit_expect_msb(0xff)) {
|
||||
int i;
|
||||
u64 t1, t2, delta;
|
||||
unsigned char expect = 0xfe;
|
||||
/*
|
||||
* The PIT starts counting at the next edge, so we
|
||||
* need to delay for a microsecond. The easiest way
|
||||
* to do that is to just read back the 16-bit counter
|
||||
* once from the PIT.
|
||||
*/
|
||||
inb(0x42);
|
||||
inb(0x42);
|
||||
|
||||
t1 = get_cycles();
|
||||
for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) {
|
||||
if (!pit_expect_msb(expect))
|
||||
goto failed;
|
||||
if (pit_expect_msb(0xff, &tsc, &d1)) {
|
||||
for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
|
||||
if (!pit_expect_msb(0xff-i, &delta, &d2))
|
||||
break;
|
||||
|
||||
/*
|
||||
* Iterate until the error is less than 500 ppm
|
||||
*/
|
||||
delta -= tsc;
|
||||
if (d1+d2 < delta >> 11)
|
||||
goto success;
|
||||
}
|
||||
t2 = get_cycles();
|
||||
|
||||
/*
|
||||
* Make sure we can rely on the second TSC timestamp:
|
||||
*/
|
||||
if (!pit_expect_msb(expect))
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
* Ok, if we get here, then we've seen the
|
||||
* MSB of the PIT decrement QUICK_PIT_ITERATIONS
|
||||
* times, and each MSB had many hits, so we never
|
||||
* had any sudden jumps.
|
||||
*
|
||||
* As a result, we can depend on there not being
|
||||
* any odd delays anywhere, and the TSC reads are
|
||||
* reliable.
|
||||
*
|
||||
* kHz = ticks / time-in-seconds / 1000;
|
||||
* kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000
|
||||
* kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000)
|
||||
*/
|
||||
delta = (t2 - t1)*PIT_TICK_RATE;
|
||||
do_div(delta, QUICK_PIT_ITERATIONS*256*1000);
|
||||
printk("Fast TSC calibration using PIT\n");
|
||||
return delta;
|
||||
}
|
||||
failed:
|
||||
printk("Fast TSC calibration failed\n");
|
||||
return 0;
|
||||
|
||||
success:
|
||||
/*
|
||||
* Ok, if we get here, then we've seen the
|
||||
* MSB of the PIT decrement 'i' times, and the
|
||||
* error has shrunk to less than 500 ppm.
|
||||
*
|
||||
* As a result, we can depend on there not being
|
||||
* any odd delays anywhere, and the TSC reads are
|
||||
* reliable (within the error). We also adjust the
|
||||
* delta to the middle of the error bars, just
|
||||
* because it looks nicer.
|
||||
*
|
||||
* kHz = ticks / time-in-seconds / 1000;
|
||||
* kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
|
||||
* kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
|
||||
*/
|
||||
delta += (long)(d2 - d1)/2;
|
||||
delta *= PIT_TICK_RATE;
|
||||
do_div(delta, i*256*1000);
|
||||
printk("Fast TSC calibration using PIT\n");
|
||||
return delta;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -320,6 +320,16 @@ static void vmi_release_pmd(unsigned long pfn)
|
||||
vmi_ops.release_page(pfn, VMI_PAGE_L2);
|
||||
}
|
||||
|
||||
/*
|
||||
* We use the pgd_free hook for releasing the pgd page:
|
||||
*/
|
||||
static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||
{
|
||||
unsigned long pfn = __pa(pgd) >> PAGE_SHIFT;
|
||||
|
||||
vmi_ops.release_page(pfn, VMI_PAGE_L2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper macros for MMU update flags. We can defer updates until a flush
|
||||
* or page invalidation only if the update is to the current address space
|
||||
@@ -762,6 +772,7 @@ static inline int __init activate_vmi(void)
|
||||
if (vmi_ops.release_page) {
|
||||
pv_mmu_ops.release_pte = vmi_release_pte;
|
||||
pv_mmu_ops.release_pmd = vmi_release_pmd;
|
||||
pv_mmu_ops.pgd_free = vmi_pgd_free;
|
||||
}
|
||||
|
||||
/* Set linear is needed in all cases */
|
||||
|
@@ -202,7 +202,7 @@ static irqreturn_t vmi_timer_interrupt(int irq, void *dev_id)
|
||||
static struct irqaction vmi_clock_action = {
|
||||
.name = "vmi-timer",
|
||||
.handler = vmi_timer_interrupt,
|
||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING,
|
||||
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER,
|
||||
.mask = CPU_MASK_ALL,
|
||||
};
|
||||
|
||||
@@ -283,10 +283,13 @@ void __devinit vmi_time_ap_init(void)
|
||||
#endif
|
||||
|
||||
/** vmi clocksource */
|
||||
static struct clocksource clocksource_vmi;
|
||||
|
||||
static cycle_t read_real_cycles(void)
|
||||
{
|
||||
return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
|
||||
cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
|
||||
return ret >= clocksource_vmi.cycle_last ?
|
||||
ret : clocksource_vmi.cycle_last;
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_vmi = {
|
||||
|
Reference in New Issue
Block a user