diff options
Diffstat (limited to 'arch/i386/kernel/crash.c')
-rw-r--r-- | arch/i386/kernel/crash.c | 47 |
1 files changed, 3 insertions, 44 deletions
diff --git a/arch/i386/kernel/crash.c b/arch/i386/kernel/crash.c index f1e65c2ead6e..d49dbe8dc96b 100644 --- a/arch/i386/kernel/crash.c +++ b/arch/i386/kernel/crash.c | |||
@@ -82,53 +82,12 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu) | |||
82 | final_note(buf); | 82 | final_note(buf); |
83 | } | 83 | } |
84 | 84 | ||
85 | static void crash_get_current_regs(struct pt_regs *regs) | 85 | static void crash_save_self(struct pt_regs *regs) |
86 | { | 86 | { |
87 | __asm__ __volatile__("movl %%ebx,%0" : "=m"(regs->ebx)); | ||
88 | __asm__ __volatile__("movl %%ecx,%0" : "=m"(regs->ecx)); | ||
89 | __asm__ __volatile__("movl %%edx,%0" : "=m"(regs->edx)); | ||
90 | __asm__ __volatile__("movl %%esi,%0" : "=m"(regs->esi)); | ||
91 | __asm__ __volatile__("movl %%edi,%0" : "=m"(regs->edi)); | ||
92 | __asm__ __volatile__("movl %%ebp,%0" : "=m"(regs->ebp)); | ||
93 | __asm__ __volatile__("movl %%eax,%0" : "=m"(regs->eax)); | ||
94 | __asm__ __volatile__("movl %%esp,%0" : "=m"(regs->esp)); | ||
95 | __asm__ __volatile__("movw %%ss, %%ax;" :"=a"(regs->xss)); | ||
96 | __asm__ __volatile__("movw %%cs, %%ax;" :"=a"(regs->xcs)); | ||
97 | __asm__ __volatile__("movw %%ds, %%ax;" :"=a"(regs->xds)); | ||
98 | __asm__ __volatile__("movw %%es, %%ax;" :"=a"(regs->xes)); | ||
99 | __asm__ __volatile__("pushfl; popl %0" :"=m"(regs->eflags)); | ||
100 | |||
101 | regs->eip = (unsigned long)current_text_addr(); | ||
102 | } | ||
103 | |||
104 | /* CPU does not save ss and esp on stack if execution is already | ||
105 | * running in kernel mode at the time of NMI occurrence. This code | ||
106 | * fixes it. | ||
107 | */ | ||
108 | static void crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs) | ||
109 | { | ||
110 | memcpy(newregs, oldregs, sizeof(*newregs)); | ||
111 | newregs->esp = (unsigned long)&(oldregs->esp); | ||
112 | __asm__ __volatile__( | ||
113 | "xorl %%eax, %%eax\n\t" | ||
114 | "movw %%ss, %%ax\n\t" | ||
115 | :"=a"(newregs->xss)); | ||
116 | } | ||
117 | |||
118 | /* We may have saved_regs from where the error came from | ||
119 | * or it is NULL if via a direct panic(). | ||
120 | */ | ||
121 | static void crash_save_self(struct pt_regs *saved_regs) | ||
122 | { | ||
123 | struct pt_regs regs; | ||
124 | int cpu; | 87 | int cpu; |
125 | 88 | ||
126 | cpu = smp_processor_id(); | 89 | cpu = smp_processor_id(); |
127 | if (saved_regs) | 90 | crash_save_this_cpu(regs, cpu); |
128 | crash_setup_regs(®s, saved_regs); | ||
129 | else | ||
130 | crash_get_current_regs(®s); | ||
131 | crash_save_this_cpu(®s, cpu); | ||
132 | } | 91 | } |
133 | 92 | ||
134 | #ifdef CONFIG_SMP | 93 | #ifdef CONFIG_SMP |
@@ -147,7 +106,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu) | |||
147 | local_irq_disable(); | 106 | local_irq_disable(); |
148 | 107 | ||
149 | if (!user_mode(regs)) { | 108 | if (!user_mode(regs)) { |
150 | crash_setup_regs(&fixed_regs, regs); | 109 | crash_fixup_ss_esp(&fixed_regs, regs); |
151 | regs = &fixed_regs; | 110 | regs = &fixed_regs; |
152 | } | 111 | } |
153 | crash_save_this_cpu(regs, cpu); | 112 | crash_save_this_cpu(regs, cpu); |