mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-13 17:28:56 +00:00
Merge branch 'x86-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-debug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: Limit number of per cpu TSC sync messages x86: dumpstack, 64-bit: Disable preemption when walking the IRQ/exception stacks x86: dumpstack: Clean up the x86_stack_ids[][] initalization and other details x86, cpu: mv display_cacheinfo -> cpu_detect_cache_sizes x86: Suppress stack overrun message for init_task x86: Fix cpu_devs[] initialization in early_cpu_init() x86: Remove CPU cache size output for non-Intel too x86: Minimise printk spew from per-vendor init code x86: Remove the CPU cache size printk's cpumask: Avoid cpumask_t in arch/x86/kernel/apic/nmi.c x86: Make sure we also print a Code: line for show_regs()
This commit is contained in:
commit
6ec22f9b03
@ -39,7 +39,8 @@
|
|||||||
int unknown_nmi_panic;
|
int unknown_nmi_panic;
|
||||||
int nmi_watchdog_enabled;
|
int nmi_watchdog_enabled;
|
||||||
|
|
||||||
static cpumask_t backtrace_mask __read_mostly;
|
/* For reliability, we're prepared to waste bits here. */
|
||||||
|
static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;
|
||||||
|
|
||||||
/* nmi_active:
|
/* nmi_active:
|
||||||
* >0: the lapic NMI watchdog is active, but can be disabled
|
* >0: the lapic NMI watchdog is active, but can be disabled
|
||||||
@ -414,7 +415,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We can be called before check_nmi_watchdog, hence NULL check. */
|
/* We can be called before check_nmi_watchdog, hence NULL check. */
|
||||||
if (cpumask_test_cpu(cpu, &backtrace_mask)) {
|
if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
|
||||||
static DEFINE_SPINLOCK(lock); /* Serialise the printks */
|
static DEFINE_SPINLOCK(lock); /* Serialise the printks */
|
||||||
|
|
||||||
spin_lock(&lock);
|
spin_lock(&lock);
|
||||||
@ -422,7 +423,7 @@ nmi_watchdog_tick(struct pt_regs *regs, unsigned reason)
|
|||||||
show_regs(regs);
|
show_regs(regs);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
spin_unlock(&lock);
|
spin_unlock(&lock);
|
||||||
cpumask_clear_cpu(cpu, &backtrace_mask);
|
cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask));
|
||||||
|
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
@ -558,14 +559,14 @@ void arch_trigger_all_cpu_backtrace(void)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cpumask_copy(&backtrace_mask, cpu_online_mask);
|
cpumask_copy(to_cpumask(backtrace_mask), cpu_online_mask);
|
||||||
|
|
||||||
printk(KERN_INFO "sending NMI to all CPUs:\n");
|
printk(KERN_INFO "sending NMI to all CPUs:\n");
|
||||||
apic->send_IPI_all(NMI_VECTOR);
|
apic->send_IPI_all(NMI_VECTOR);
|
||||||
|
|
||||||
/* Wait for up to 10 seconds for all CPUs to do the backtrace */
|
/* Wait for up to 10 seconds for all CPUs to do the backtrace */
|
||||||
for (i = 0; i < 10 * 1000; i++) {
|
for (i = 0; i < 10 * 1000; i++) {
|
||||||
if (cpumask_empty(&backtrace_mask))
|
if (cpumask_empty(to_cpumask(backtrace_mask)))
|
||||||
break;
|
break;
|
||||||
mdelay(1);
|
mdelay(1);
|
||||||
}
|
}
|
||||||
|
@ -535,7 +535,7 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
display_cacheinfo(c);
|
cpu_detect_cache_sizes(c);
|
||||||
|
|
||||||
/* Multi core CPU? */
|
/* Multi core CPU? */
|
||||||
if (c->extended_cpuid_level >= 0x80000008) {
|
if (c->extended_cpuid_level >= 0x80000008) {
|
||||||
|
@ -294,7 +294,7 @@ static void __cpuinit init_c3(struct cpuinfo_x86 *c)
|
|||||||
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
|
set_cpu_cap(c, X86_FEATURE_REP_GOOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
display_cacheinfo(c);
|
cpu_detect_cache_sizes(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -61,7 +61,7 @@ void __init setup_cpu_local_masks(void)
|
|||||||
static void __cpuinit default_init(struct cpuinfo_x86 *c)
|
static void __cpuinit default_init(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
display_cacheinfo(c);
|
cpu_detect_cache_sizes(c);
|
||||||
#else
|
#else
|
||||||
/* Not much we can do here... */
|
/* Not much we can do here... */
|
||||||
/* Check if at least it has cpuid */
|
/* Check if at least it has cpuid */
|
||||||
@ -383,7 +383,7 @@ static void __cpuinit get_model_name(struct cpuinfo_x86 *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
|
void __cpuinit cpu_detect_cache_sizes(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
unsigned int n, dummy, ebx, ecx, edx, l2size;
|
unsigned int n, dummy, ebx, ecx, edx, l2size;
|
||||||
|
|
||||||
@ -391,8 +391,6 @@ void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
|
|||||||
|
|
||||||
if (n >= 0x80000005) {
|
if (n >= 0x80000005) {
|
||||||
cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
|
cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
|
||||||
printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
|
|
||||||
edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
|
|
||||||
c->x86_cache_size = (ecx>>24) + (edx>>24);
|
c->x86_cache_size = (ecx>>24) + (edx>>24);
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
/* On K8 L1 TLB is inclusive, so don't count it */
|
/* On K8 L1 TLB is inclusive, so don't count it */
|
||||||
@ -422,9 +420,6 @@ void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
c->x86_cache_size = l2size;
|
c->x86_cache_size = l2size;
|
||||||
|
|
||||||
printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
|
|
||||||
l2size, ecx & 0xFF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuinit detect_ht(struct cpuinfo_x86 *c)
|
void __cpuinit detect_ht(struct cpuinfo_x86 *c)
|
||||||
@ -659,24 +654,31 @@ void __init early_cpu_init(void)
|
|||||||
const struct cpu_dev *const *cdev;
|
const struct cpu_dev *const *cdev;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
#ifdef PROCESSOR_SELECT
|
||||||
printk(KERN_INFO "KERNEL supported cpus:\n");
|
printk(KERN_INFO "KERNEL supported cpus:\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
|
for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
|
||||||
const struct cpu_dev *cpudev = *cdev;
|
const struct cpu_dev *cpudev = *cdev;
|
||||||
unsigned int j;
|
|
||||||
|
|
||||||
if (count >= X86_VENDOR_NUM)
|
if (count >= X86_VENDOR_NUM)
|
||||||
break;
|
break;
|
||||||
cpu_devs[count] = cpudev;
|
cpu_devs[count] = cpudev;
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
for (j = 0; j < 2; j++) {
|
#ifdef PROCESSOR_SELECT
|
||||||
if (!cpudev->c_ident[j])
|
{
|
||||||
continue;
|
unsigned int j;
|
||||||
printk(KERN_INFO " %s %s\n", cpudev->c_vendor,
|
|
||||||
cpudev->c_ident[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for (j = 0; j < 2; j++) {
|
||||||
|
if (!cpudev->c_ident[j])
|
||||||
|
continue;
|
||||||
|
printk(KERN_INFO " %s %s\n", cpudev->c_vendor,
|
||||||
|
cpudev->c_ident[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
early_identify_cpu(&boot_cpu_data);
|
early_identify_cpu(&boot_cpu_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,6 @@ struct cpu_dev {
|
|||||||
extern const struct cpu_dev *const __x86_cpu_dev_start[],
|
extern const struct cpu_dev *const __x86_cpu_dev_start[],
|
||||||
*const __x86_cpu_dev_end[];
|
*const __x86_cpu_dev_end[];
|
||||||
|
|
||||||
extern void display_cacheinfo(struct cpuinfo_x86 *c);
|
extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -373,7 +373,7 @@ static void __cpuinit init_nsc(struct cpuinfo_x86 *c)
|
|||||||
/* Handle the GX (Formally known as the GX2) */
|
/* Handle the GX (Formally known as the GX2) */
|
||||||
|
|
||||||
if (c->x86 == 5 && c->x86_model == 5)
|
if (c->x86 == 5 && c->x86_model == 5)
|
||||||
display_cacheinfo(c);
|
cpu_detect_cache_sizes(c);
|
||||||
else
|
else
|
||||||
init_cyrix(c);
|
init_cyrix(c);
|
||||||
}
|
}
|
||||||
|
@ -488,22 +488,6 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trace)
|
|
||||||
printk(KERN_INFO "CPU: Trace cache: %dK uops", trace);
|
|
||||||
else if (l1i)
|
|
||||||
printk(KERN_INFO "CPU: L1 I cache: %dK", l1i);
|
|
||||||
|
|
||||||
if (l1d)
|
|
||||||
printk(KERN_CONT ", L1 D cache: %dK\n", l1d);
|
|
||||||
else
|
|
||||||
printk(KERN_CONT "\n");
|
|
||||||
|
|
||||||
if (l2)
|
|
||||||
printk(KERN_INFO "CPU: L2 cache: %dK\n", l2);
|
|
||||||
|
|
||||||
if (l3)
|
|
||||||
printk(KERN_INFO "CPU: L3 cache: %dK\n", l3);
|
|
||||||
|
|
||||||
c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
|
c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
|
||||||
|
|
||||||
return l2;
|
return l2;
|
||||||
|
@ -26,7 +26,7 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c)
|
|||||||
|
|
||||||
early_init_transmeta(c);
|
early_init_transmeta(c);
|
||||||
|
|
||||||
display_cacheinfo(c);
|
cpu_detect_cache_sizes(c);
|
||||||
|
|
||||||
/* Print CMS and CPU revision */
|
/* Print CMS and CPU revision */
|
||||||
max = cpuid_eax(0x80860000);
|
max = cpuid_eax(0x80860000);
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/sysfs.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/sysfs.h>
|
|
||||||
|
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
|
||||||
@ -35,6 +35,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
|||||||
|
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
unsigned long dummy;
|
unsigned long dummy;
|
||||||
|
|
||||||
stack = &dummy;
|
stack = &dummy;
|
||||||
if (task && task != current)
|
if (task && task != current)
|
||||||
stack = (unsigned long *)task->thread.sp;
|
stack = (unsigned long *)task->thread.sp;
|
||||||
@ -57,8 +58,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
|||||||
|
|
||||||
context = (struct thread_info *)
|
context = (struct thread_info *)
|
||||||
((unsigned long)stack & (~(THREAD_SIZE - 1)));
|
((unsigned long)stack & (~(THREAD_SIZE - 1)));
|
||||||
bp = print_context_stack(context, stack, bp, ops,
|
bp = print_context_stack(context, stack, bp, ops, data, NULL, &graph);
|
||||||
data, NULL, &graph);
|
|
||||||
|
|
||||||
stack = (unsigned long *)context->previous_esp;
|
stack = (unsigned long *)context->previous_esp;
|
||||||
if (!stack)
|
if (!stack)
|
||||||
@ -72,7 +72,7 @@ EXPORT_SYMBOL(dump_trace);
|
|||||||
|
|
||||||
void
|
void
|
||||||
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||||
unsigned long *sp, unsigned long bp, char *log_lvl)
|
unsigned long *sp, unsigned long bp, char *log_lvl)
|
||||||
{
|
{
|
||||||
unsigned long *stack;
|
unsigned long *stack;
|
||||||
int i;
|
int i;
|
||||||
@ -156,4 +156,3 @@ int is_valid_bugaddr(unsigned long ip)
|
|||||||
|
|
||||||
return ud2 == 0x0b0f;
|
return ud2 == 0x0b0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,26 +10,28 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/sysfs.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
#include <linux/sysfs.h>
|
|
||||||
|
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
|
||||||
#include "dumpstack.h"
|
#include "dumpstack.h"
|
||||||
|
|
||||||
|
#define N_EXCEPTION_STACKS_END \
|
||||||
|
(N_EXCEPTION_STACKS + DEBUG_STKSZ/EXCEPTION_STKSZ - 2)
|
||||||
|
|
||||||
static char x86_stack_ids[][8] = {
|
static char x86_stack_ids[][8] = {
|
||||||
[DEBUG_STACK - 1] = "#DB",
|
[ DEBUG_STACK-1 ] = "#DB",
|
||||||
[NMI_STACK - 1] = "NMI",
|
[ NMI_STACK-1 ] = "NMI",
|
||||||
[DOUBLEFAULT_STACK - 1] = "#DF",
|
[ DOUBLEFAULT_STACK-1 ] = "#DF",
|
||||||
[STACKFAULT_STACK - 1] = "#SS",
|
[ STACKFAULT_STACK-1 ] = "#SS",
|
||||||
[MCE_STACK - 1] = "#MC",
|
[ MCE_STACK-1 ] = "#MC",
|
||||||
#if DEBUG_STKSZ > EXCEPTION_STKSZ
|
#if DEBUG_STKSZ > EXCEPTION_STKSZ
|
||||||
[N_EXCEPTION_STACKS ...
|
[ N_EXCEPTION_STACKS ...
|
||||||
N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
|
N_EXCEPTION_STACKS_END ] = "#DB[?]"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int x86_is_stack_id(int id, char *name)
|
int x86_is_stack_id(int id, char *name)
|
||||||
{
|
{
|
||||||
@ -37,7 +39,7 @@ int x86_is_stack_id(int id, char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
||||||
unsigned *usedp, char **idp)
|
unsigned *usedp, char **idp)
|
||||||
{
|
{
|
||||||
unsigned k;
|
unsigned k;
|
||||||
|
|
||||||
@ -202,21 +204,24 @@ EXPORT_SYMBOL(dump_trace);
|
|||||||
|
|
||||||
void
|
void
|
||||||
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||||
unsigned long *sp, unsigned long bp, char *log_lvl)
|
unsigned long *sp, unsigned long bp, char *log_lvl)
|
||||||
{
|
{
|
||||||
|
unsigned long *irq_stack_end;
|
||||||
|
unsigned long *irq_stack;
|
||||||
unsigned long *stack;
|
unsigned long *stack;
|
||||||
|
int cpu;
|
||||||
int i;
|
int i;
|
||||||
const int cpu = smp_processor_id();
|
|
||||||
unsigned long *irq_stack_end =
|
preempt_disable();
|
||||||
(unsigned long *)(per_cpu(irq_stack_ptr, cpu));
|
cpu = smp_processor_id();
|
||||||
unsigned long *irq_stack =
|
|
||||||
(unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE);
|
irq_stack_end = (unsigned long *)(per_cpu(irq_stack_ptr, cpu));
|
||||||
|
irq_stack = (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debugging aid: "show_stack(NULL, NULL);" prints the
|
* Debugging aid: "show_stack(NULL, NULL);" prints the
|
||||||
* back trace for this cpu.
|
* back trace for this cpu:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (sp == NULL) {
|
if (sp == NULL) {
|
||||||
if (task)
|
if (task)
|
||||||
sp = (unsigned long *)task->thread.sp;
|
sp = (unsigned long *)task->thread.sp;
|
||||||
@ -240,6 +245,8 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
|||||||
printk(" %016lx", *stack++);
|
printk(" %016lx", *stack++);
|
||||||
touch_nmi_watchdog();
|
touch_nmi_watchdog();
|
||||||
}
|
}
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
printk("\n");
|
printk("\n");
|
||||||
show_trace_log_lvl(task, regs, sp, bp, log_lvl);
|
show_trace_log_lvl(task, regs, sp, bp, log_lvl);
|
||||||
}
|
}
|
||||||
@ -303,4 +310,3 @@ int is_valid_bugaddr(unsigned long ip)
|
|||||||
|
|
||||||
return ud2 == 0x0b0f;
|
return ud2 == 0x0b0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ void __show_regs(struct pt_regs *regs, int all)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
__show_regs(regs, 1);
|
show_registers(regs);
|
||||||
show_trace(NULL, regs, ®s->sp, regs->bp);
|
show_trace(NULL, regs, ®s->sp, regs->bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,8 +227,7 @@ void __show_regs(struct pt_regs *regs, int all)
|
|||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
printk(KERN_INFO "CPU %d:", smp_processor_id());
|
show_registers(regs);
|
||||||
__show_regs(regs, 1);
|
|
||||||
show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
|
show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,13 +114,12 @@ void __cpuinit check_tsc_sync_source(int cpu)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) {
|
if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) {
|
||||||
printk_once(KERN_INFO "Skipping synchronization checks as TSC is reliable.\n");
|
if (cpu == (nr_cpu_ids-1) || system_state != SYSTEM_BOOTING)
|
||||||
|
pr_info(
|
||||||
|
"Skipped synchronization checks as TSC is reliable.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_info("checking TSC synchronization [CPU#%d -> CPU#%d]:",
|
|
||||||
smp_processor_id(), cpu);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset it - in case this is a second bootup:
|
* Reset it - in case this is a second bootup:
|
||||||
*/
|
*/
|
||||||
@ -142,12 +141,14 @@ void __cpuinit check_tsc_sync_source(int cpu)
|
|||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
|
||||||
if (nr_warps) {
|
if (nr_warps) {
|
||||||
printk("\n");
|
pr_warning("TSC synchronization [CPU#%d -> CPU#%d]:\n",
|
||||||
|
smp_processor_id(), cpu);
|
||||||
pr_warning("Measured %Ld cycles TSC warp between CPUs, "
|
pr_warning("Measured %Ld cycles TSC warp between CPUs, "
|
||||||
"turning off TSC clock.\n", max_warp);
|
"turning off TSC clock.\n", max_warp);
|
||||||
mark_tsc_unstable("check_tsc_sync_source failed");
|
mark_tsc_unstable("check_tsc_sync_source failed");
|
||||||
} else {
|
} else {
|
||||||
printk(" passed.\n");
|
pr_debug("TSC synchronization [CPU#%d -> CPU#%d]: passed\n",
|
||||||
|
smp_processor_id(), cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -659,7 +659,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
|
|||||||
show_fault_oops(regs, error_code, address);
|
show_fault_oops(regs, error_code, address);
|
||||||
|
|
||||||
stackend = end_of_stack(tsk);
|
stackend = end_of_stack(tsk);
|
||||||
if (*stackend != STACK_END_MAGIC)
|
if (tsk != &init_task && *stackend != STACK_END_MAGIC)
|
||||||
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
||||||
|
|
||||||
tsk->thread.cr2 = address;
|
tsk->thread.cr2 = address;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user