@@ -64,8 +64,7 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
6464
6565 /*
6666 * We need to switch to kernel mode so that we can use __get_user
67- * to safely read from kernel space. Note that we now dump the
68- * code first, just in case the backtrace kills us.
67+ * to safely read from kernel space.
6968 */
7069 fs = get_fs ();
7170 set_fs (KERNEL_DS );
@@ -111,21 +110,12 @@ static void dump_backtrace_entry(unsigned long where)
111110 print_ip_sym (where );
112111}
113112
114- static void dump_instr (const char * lvl , struct pt_regs * regs )
113+ static void __dump_instr (const char * lvl , struct pt_regs * regs )
115114{
116115 unsigned long addr = instruction_pointer (regs );
117- mm_segment_t fs ;
118116 char str [sizeof ("00000000 " ) * 5 + 2 + 1 ], * p = str ;
119117 int i ;
120118
121- /*
122- * We need to switch to kernel mode so that we can use __get_user
123- * to safely read from kernel space. Note that we now dump the
124- * code first, just in case the backtrace kills us.
125- */
126- fs = get_fs ();
127- set_fs (KERNEL_DS );
128-
129119 for (i = -4 ; i < 1 ; i ++ ) {
130120 unsigned int val , bad ;
131121
@@ -139,8 +129,18 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
139129 }
140130 }
141131 printk ("%sCode: %s\n" , lvl , str );
132+ }
142133
143- set_fs (fs );
134+ static void dump_instr (const char * lvl , struct pt_regs * regs )
135+ {
136+ if (!user_mode (regs )) {
137+ mm_segment_t fs = get_fs ();
138+ set_fs (KERNEL_DS );
139+ __dump_instr (lvl , regs );
140+ set_fs (fs );
141+ } else {
142+ __dump_instr (lvl , regs );
143+ }
144144}
145145
146146static void dump_backtrace (struct pt_regs * regs , struct task_struct * tsk )
0 commit comments