 aa9291355e
			
		
	
	
	aa9291355e
	
	
	
		
			
			Cleanups
    kdb: Remove unused command flags, repeat flags and KDB_REPEAT_NONE
 
  Fixes
    kgdb/kdb: Allow access on a single core, if a CPU round up is deemed
       impossible, which will allow inspection of the now "trashed" kernel
    kdb: Add enable mask for the command groups
    kdb: access controls to restrict sensitive commands
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJUrq8WAAoJEIciOldedpOj+C8P/AjSUVBZdBLWzCU2VG150sQ0
 UacwFVLve9heoColHBF7VqIDCRkZokIKJmCbHUBPZTbs22auLRpNI+D6CY5lZD17
 jEHxrkKY4ragRRc/W3Y1MSc3aeGnS0i5AR8PJermMWxyUBfN3FBxgFHzTaLB2ZTT
 8A+tvmwiG4mHue52gSiYZPCl/52WWOh+NjDe7T9OZ+mNmQKwZ5ssQZmmyUkxrs3b
 LKXVXVtTUXxfEgB2x+lYTYAztcTsM5h+NbkT74FpSmwPjvU/p81Ptqveh+3JTdmX
 H+Jz/SqD1/NfxC1Eenh5Mc++p/UVxeRbBulV9jwqjOyJqDjw3qHs1cjm8tZZj1qG
 J3LODKi3GWhujMCfwdu5EJRnrFxgHCPiWInc2708oLbRi5SyOe6P6hNQ3K3Y4JtF
 VkYa62wSaI0fDNQUFRc3bXUOUdMOCXjuzw3BtTi93tcUNcQwCXuYCmWtVvBgmK1h
 LTrFCJmzbopiwpomxCwZ4BQm8id9HxP5pod95ypYb8K5aheXHCuSgibqj0nswWMm
 ix0YTd4UNTn79r6p4d0fXFjOOYpXZA80ojeVI27D9zW7dBYc5CGVA1IDNH0ZfiPo
 qySPUNUMXIjiTSOGZdUehByEC7tliLZczelRPnNh/9fmhJkJ745S7zs3DNQ7Ypg4
 xDKthlRGNjn6cXOPl7gX
 =cf1c
 -----END PGP SIGNATURE-----
Merge tag 'for_linus-3.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb
Pull kgdb/kdb fixes from Jason Wessel:
 "These have been around since 3.17 and in kgdb-next for the last 9
  weeks and some will go back to -stable.
  Summary of changes:
  Cleanups
   - kdb: Remove unused command flags, repeat flags and KDB_REPEAT_NONE
  Fixes
   - kgdb/kdb: Allow access on a single core, if a CPU round up is
     deemed impossible, which will allow inspection of the now "trashed"
     kernel
   - kdb: Add enable mask for the command groups
   - kdb: access controls to restrict sensitive commands"
* tag 'for_linus-3.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb:
  kernel/debug/debug_core.c: Logging clean-up
  kgdb: timeout if secondary CPUs ignore the roundup
  kdb: Allow access to sensitive commands to be restricted by default
  kdb: Add enable mask for groups of commands
  kdb: Categorize kdb commands (similar to SysRq categorization)
  kdb: Remove KDB_REPEAT_NONE flag
  kdb: Use KDB_REPEAT_* values as flags
  kdb: Rename kdb_register_repeat() to kdb_register_flags()
  kdb: Rename kdb_repeat_t to kdb_cmdflags_t, cmd_repeat to cmd_flags
  kdb: Remove currently unused kdbtab_t->cmd_flags
		
	
			
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			3.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * kdb helper for dumping the ftrace buffer
 | |
|  *
 | |
|  * Copyright (C) 2010 Jason Wessel <jason.wessel@windriver.com>
 | |
|  *
 | |
|  * ftrace_dump_buf based on ftrace_dump:
 | |
|  * Copyright (C) 2007-2008 Steven Rostedt <srostedt@redhat.com>
 | |
|  * Copyright (C) 2008 Ingo Molnar <mingo@redhat.com>
 | |
|  *
 | |
|  */
 | |
| #include <linux/init.h>
 | |
| #include <linux/kgdb.h>
 | |
| #include <linux/kdb.h>
 | |
| #include <linux/ftrace.h>
 | |
| 
 | |
| #include "trace.h"
 | |
| #include "trace_output.h"
 | |
| 
 | |
| static void ftrace_dump_buf(int skip_lines, long cpu_file)
 | |
| {
 | |
| 	/* use static because iter can be a bit big for the stack */
 | |
| 	static struct trace_iterator iter;
 | |
| 	static struct ring_buffer_iter *buffer_iter[CONFIG_NR_CPUS];
 | |
| 	unsigned int old_userobj;
 | |
| 	int cnt = 0, cpu;
 | |
| 
 | |
| 	trace_init_global_iter(&iter);
 | |
| 	iter.buffer_iter = buffer_iter;
 | |
| 
 | |
| 	for_each_tracing_cpu(cpu) {
 | |
| 		atomic_inc(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
 | |
| 	}
 | |
| 
 | |
| 	old_userobj = trace_flags;
 | |
| 
 | |
| 	/* don't look at user memory in panic mode */
 | |
| 	trace_flags &= ~TRACE_ITER_SYM_USEROBJ;
 | |
| 
 | |
| 	kdb_printf("Dumping ftrace buffer:\n");
 | |
| 
 | |
| 	/* reset all but tr, trace, and overruns */
 | |
| 	memset(&iter.seq, 0,
 | |
| 		   sizeof(struct trace_iterator) -
 | |
| 		   offsetof(struct trace_iterator, seq));
 | |
| 	iter.iter_flags |= TRACE_FILE_LAT_FMT;
 | |
| 	iter.pos = -1;
 | |
| 
 | |
| 	if (cpu_file == RING_BUFFER_ALL_CPUS) {
 | |
| 		for_each_tracing_cpu(cpu) {
 | |
| 			iter.buffer_iter[cpu] =
 | |
| 			ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu);
 | |
| 			ring_buffer_read_start(iter.buffer_iter[cpu]);
 | |
| 			tracing_iter_reset(&iter, cpu);
 | |
| 		}
 | |
| 	} else {
 | |
| 		iter.cpu_file = cpu_file;
 | |
| 		iter.buffer_iter[cpu_file] =
 | |
| 			ring_buffer_read_prepare(iter.trace_buffer->buffer, cpu_file);
 | |
| 		ring_buffer_read_start(iter.buffer_iter[cpu_file]);
 | |
| 		tracing_iter_reset(&iter, cpu_file);
 | |
| 	}
 | |
| 
 | |
| 	while (trace_find_next_entry_inc(&iter)) {
 | |
| 		if (!cnt)
 | |
| 			kdb_printf("---------------------------------\n");
 | |
| 		cnt++;
 | |
| 
 | |
| 		if (!skip_lines) {
 | |
| 			print_trace_line(&iter);
 | |
| 			trace_printk_seq(&iter.seq);
 | |
| 		} else {
 | |
| 			skip_lines--;
 | |
| 		}
 | |
| 
 | |
| 		if (KDB_FLAG(CMD_INTERRUPT))
 | |
| 			goto out;
 | |
| 	}
 | |
| 
 | |
| 	if (!cnt)
 | |
| 		kdb_printf("   (ftrace buffer empty)\n");
 | |
| 	else
 | |
| 		kdb_printf("---------------------------------\n");
 | |
| 
 | |
| out:
 | |
| 	trace_flags = old_userobj;
 | |
| 
 | |
| 	for_each_tracing_cpu(cpu) {
 | |
| 		atomic_dec(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
 | |
| 	}
 | |
| 
 | |
| 	for_each_tracing_cpu(cpu) {
 | |
| 		if (iter.buffer_iter[cpu]) {
 | |
| 			ring_buffer_read_finish(iter.buffer_iter[cpu]);
 | |
| 			iter.buffer_iter[cpu] = NULL;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * kdb_ftdump - Dump the ftrace log buffer
 | |
|  */
 | |
| static int kdb_ftdump(int argc, const char **argv)
 | |
| {
 | |
| 	int skip_lines = 0;
 | |
| 	long cpu_file;
 | |
| 	char *cp;
 | |
| 
 | |
| 	if (argc > 2)
 | |
| 		return KDB_ARGCOUNT;
 | |
| 
 | |
| 	if (argc) {
 | |
| 		skip_lines = simple_strtol(argv[1], &cp, 0);
 | |
| 		if (*cp)
 | |
| 			skip_lines = 0;
 | |
| 	}
 | |
| 
 | |
| 	if (argc == 2) {
 | |
| 		cpu_file = simple_strtol(argv[2], &cp, 0);
 | |
| 		if (*cp || cpu_file >= NR_CPUS || cpu_file < 0 ||
 | |
| 		    !cpu_online(cpu_file))
 | |
| 			return KDB_BADINT;
 | |
| 	} else {
 | |
| 		cpu_file = RING_BUFFER_ALL_CPUS;
 | |
| 	}
 | |
| 
 | |
| 	kdb_trap_printk++;
 | |
| 	ftrace_dump_buf(skip_lines, cpu_file);
 | |
| 	kdb_trap_printk--;
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static __init int kdb_ftrace_register(void)
 | |
| {
 | |
| 	kdb_register_flags("ftdump", kdb_ftdump, "[skip_#lines] [cpu]",
 | |
| 			    "Dump ftrace log", 0, KDB_ENABLE_ALWAYS_SAFE);
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| late_initcall(kdb_ftrace_register);
 |