mirror of https://gitee.com/openkylin/linux.git
x86/dumpstack: Remove raw stack dump
For mostly historical reasons, the x86 oops dump shows the raw stack values: ... [registers] Stack: ffff880079af7350 ffff880079905400 0000000000000000 ffffc900008f3ae0 ffffffffa0196610 0000000000000001 00010000ffffffff 0000000087654321 0000000000000002 0000000000000000 0000000000000000 0000000000000000 Call Trace: ... This seems to be an artifact from long ago, and probably isn't needed anymore. It generally just adds noise to the dump, and it can be actively harmful because it leaks kernel addresses. Linus says: "The stack dump actually goes back to forever, and it used to be useful back in 1992 or so. But it used to be useful mainly because stacks were simpler and we didn't have very good call traces anyway. I definitely remember having used them - I just do not remember having used them in the last ten+ years. Of course, it's still true that if you can trigger an oops, you've likely already lost the security game, but since the stack dump is so useless, let's aim to just remove it and make games like the above harder." This also removes the related 'kstack=' cmdline option and the 'kstack_depth_to_print' sysctl. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/e83bd50df52d8fe88e94d2566426ae40d813bf8f.1477405374.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
bb5e5ce545
commit
0ee1dd9f5e
|
@ -1958,9 +1958,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
kmemcheck=2 (one-shot mode)
|
kmemcheck=2 (one-shot mode)
|
||||||
Default: 2 (one-shot mode)
|
Default: 2 (one-shot mode)
|
||||||
|
|
||||||
kstack=N [X86] Print N words from the kernel stack
|
|
||||||
in oops dumps.
|
|
||||||
|
|
||||||
kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
|
kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
|
||||||
Default is 0 (don't ignore, but inject #GP)
|
Default is 0 (don't ignore, but inject #GP)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ show up in /proc/sys/kernel:
|
||||||
- hung_task_warnings
|
- hung_task_warnings
|
||||||
- kexec_load_disabled
|
- kexec_load_disabled
|
||||||
- kptr_restrict
|
- kptr_restrict
|
||||||
- kstack_depth_to_print [ X86 only ]
|
|
||||||
- l2cr [ PPC only ]
|
- l2cr [ PPC only ]
|
||||||
- modprobe ==> Documentation/debugging-modules.txt
|
- modprobe ==> Documentation/debugging-modules.txt
|
||||||
- modules_disabled
|
- modules_disabled
|
||||||
|
@ -395,13 +394,6 @@ When kptr_restrict is set to (2), kernel pointers printed using
|
||||||
|
|
||||||
==============================================================
|
==============================================================
|
||||||
|
|
||||||
kstack_depth_to_print: (X86 only)
|
|
||||||
|
|
||||||
Controls the number of words to print when dumping the raw
|
|
||||||
kernel stack.
|
|
||||||
|
|
||||||
==============================================================
|
|
||||||
|
|
||||||
l2cr: (PPC only)
|
l2cr: (PPC only)
|
||||||
|
|
||||||
This flag controls the L2 cache of G3 processor boards. If
|
This flag controls the L2 cache of G3 processor boards. If
|
||||||
|
|
|
@ -277,10 +277,6 @@ IOMMU (input/output memory management unit)
|
||||||
space might stop working. Use this option if you have devices that
|
space might stop working. Use this option if you have devices that
|
||||||
are accessed from userspace directly on some PCI host bridge.
|
are accessed from userspace directly on some PCI host bridge.
|
||||||
|
|
||||||
Debugging
|
|
||||||
|
|
||||||
kstack=N Print N words from the kernel stack in oops dumps.
|
|
||||||
|
|
||||||
Miscellaneous
|
Miscellaneous
|
||||||
|
|
||||||
nogbpages
|
nogbpages
|
||||||
|
|
|
@ -43,8 +43,6 @@ static inline bool on_stack(struct stack_info *info, void *addr, size_t len)
|
||||||
addr + len > begin && addr + len <= end);
|
addr + len > begin && addr + len <= end);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int kstack_depth_to_print;
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
#define STACKSLOTS_PER_LINE 8
|
#define STACKSLOTS_PER_LINE 8
|
||||||
#else
|
#else
|
||||||
|
@ -86,9 +84,6 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs)
|
||||||
void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||||
unsigned long *stack, char *log_lvl);
|
unsigned long *stack, char *log_lvl);
|
||||||
|
|
||||||
void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
|
||||||
unsigned long *sp, char *log_lvl);
|
|
||||||
|
|
||||||
extern unsigned int code_bytes;
|
extern unsigned int code_bytes;
|
||||||
|
|
||||||
/* The form of the top of the frame on the stack */
|
/* The form of the top of the frame on the stack */
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
int panic_on_unrecovered_nmi;
|
int panic_on_unrecovered_nmi;
|
||||||
int panic_on_io_nmi;
|
int panic_on_io_nmi;
|
||||||
unsigned int code_bytes = 64;
|
unsigned int code_bytes = 64;
|
||||||
int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE;
|
|
||||||
static int die_counter;
|
static int die_counter;
|
||||||
|
|
||||||
bool in_task_stack(unsigned long *stack, struct task_struct *task,
|
bool in_task_stack(unsigned long *stack, struct task_struct *task,
|
||||||
|
@ -171,12 +170,12 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
||||||
if (!sp && task == current)
|
if (!sp && task == current)
|
||||||
sp = get_stack_pointer(current, NULL);
|
sp = get_stack_pointer(current, NULL);
|
||||||
|
|
||||||
show_stack_log_lvl(task, NULL, sp, KERN_DEFAULT);
|
show_trace_log_lvl(task, NULL, sp, KERN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_stack_regs(struct pt_regs *regs)
|
void show_stack_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
show_stack_log_lvl(current, regs, NULL, KERN_DEFAULT);
|
show_trace_log_lvl(current, regs, NULL, KERN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED;
|
||||||
|
@ -295,22 +294,6 @@ void die(const char *str, struct pt_regs *regs, long err)
|
||||||
oops_end(flags, regs, sig);
|
oops_end(flags, regs, sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init kstack_setup(char *s)
|
|
||||||
{
|
|
||||||
ssize_t ret;
|
|
||||||
unsigned long val;
|
|
||||||
|
|
||||||
if (!s)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ret = kstrtoul(s, 0, &val);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
kstack_depth_to_print = val;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
early_param("kstack", kstack_setup);
|
|
||||||
|
|
||||||
static int __init code_bytes_setup(char *s)
|
static int __init code_bytes_setup(char *s)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
|
@ -121,36 +121,6 @@ int get_stack_info(unsigned long *stack, struct task_struct *task,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
|
||||||
unsigned long *sp, char *log_lvl)
|
|
||||||
{
|
|
||||||
unsigned long *stack;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!try_get_task_stack(task))
|
|
||||||
return;
|
|
||||||
|
|
||||||
sp = sp ? : get_stack_pointer(task, regs);
|
|
||||||
|
|
||||||
stack = sp;
|
|
||||||
for (i = 0; i < kstack_depth_to_print; i++) {
|
|
||||||
if (kstack_end(stack))
|
|
||||||
break;
|
|
||||||
if ((i % STACKSLOTS_PER_LINE) == 0) {
|
|
||||||
if (i != 0)
|
|
||||||
pr_cont("\n");
|
|
||||||
printk("%s %08lx", log_lvl, *stack++);
|
|
||||||
} else
|
|
||||||
pr_cont(" %08lx", *stack++);
|
|
||||||
touch_nmi_watchdog();
|
|
||||||
}
|
|
||||||
pr_cont("\n");
|
|
||||||
show_trace_log_lvl(task, regs, sp, log_lvl);
|
|
||||||
|
|
||||||
put_task_stack(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -168,8 +138,7 @@ void show_regs(struct pt_regs *regs)
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
u8 *ip;
|
u8 *ip;
|
||||||
|
|
||||||
pr_emerg("Stack:\n");
|
show_trace_log_lvl(current, regs, NULL, KERN_EMERG);
|
||||||
show_stack_log_lvl(current, regs, NULL, KERN_EMERG);
|
|
||||||
|
|
||||||
pr_emerg("Code:");
|
pr_emerg("Code:");
|
||||||
|
|
||||||
|
|
|
@ -140,56 +140,6 @@ int get_stack_info(unsigned long *stack, struct task_struct *task,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
|
||||||
unsigned long *sp, char *log_lvl)
|
|
||||||
{
|
|
||||||
unsigned long *irq_stack_end;
|
|
||||||
unsigned long *irq_stack;
|
|
||||||
unsigned long *stack;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!try_get_task_stack(task))
|
|
||||||
return;
|
|
||||||
|
|
||||||
irq_stack_end = (unsigned long *)this_cpu_read(irq_stack_ptr);
|
|
||||||
irq_stack = irq_stack_end - (IRQ_STACK_SIZE / sizeof(long));
|
|
||||||
|
|
||||||
sp = sp ? : get_stack_pointer(task, regs);
|
|
||||||
|
|
||||||
stack = sp;
|
|
||||||
for (i = 0; i < kstack_depth_to_print; i++) {
|
|
||||||
unsigned long word;
|
|
||||||
|
|
||||||
if (stack >= irq_stack && stack <= irq_stack_end) {
|
|
||||||
if (stack == irq_stack_end) {
|
|
||||||
stack = (unsigned long *) (irq_stack_end[-1]);
|
|
||||||
pr_cont(" <EOI> ");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (kstack_end(stack))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (probe_kernel_address(stack, word))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((i % STACKSLOTS_PER_LINE) == 0) {
|
|
||||||
if (i != 0)
|
|
||||||
pr_cont("\n");
|
|
||||||
printk("%s %016lx", log_lvl, word);
|
|
||||||
} else
|
|
||||||
pr_cont(" %016lx", word);
|
|
||||||
|
|
||||||
stack++;
|
|
||||||
touch_nmi_watchdog();
|
|
||||||
}
|
|
||||||
|
|
||||||
pr_cont("\n");
|
|
||||||
show_trace_log_lvl(task, regs, sp, log_lvl);
|
|
||||||
|
|
||||||
put_task_stack(task);
|
|
||||||
}
|
|
||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -207,8 +157,7 @@ void show_regs(struct pt_regs *regs)
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
u8 *ip;
|
u8 *ip;
|
||||||
|
|
||||||
printk(KERN_DEFAULT "Stack:\n");
|
show_trace_log_lvl(current, regs, NULL, KERN_DEFAULT);
|
||||||
show_stack_log_lvl(current, regs, NULL, KERN_DEFAULT);
|
|
||||||
|
|
||||||
printk(KERN_DEFAULT "Code: ");
|
printk(KERN_DEFAULT "Code: ");
|
||||||
|
|
||||||
|
|
|
@ -989,13 +989,6 @@ static struct ctl_table kern_table[] = {
|
||||||
.mode = 0444,
|
.mode = 0444,
|
||||||
.proc_handler = proc_dointvec,
|
.proc_handler = proc_dointvec,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.procname = "kstack_depth_to_print",
|
|
||||||
.data = &kstack_depth_to_print,
|
|
||||||
.maxlen = sizeof(int),
|
|
||||||
.mode = 0644,
|
|
||||||
.proc_handler = proc_dointvec,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.procname = "io_delay_type",
|
.procname = "io_delay_type",
|
||||||
.data = &io_delay_type,
|
.data = &io_delay_type,
|
||||||
|
|
Loading…
Reference in New Issue