Commit 9746e467 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'kgdb-fixes-4.20-rc3' of https://git.linaro.org/people/daniel.thompson/linux

Pull kgdb fixes from Daniel Thompson:
 "The most important changes here are two fixes for kdb regressions
  causes by the hashing of %p pointers together with a fix for a
  potential overflow in kdb tab completion handling (and warning fix).

  Also included are a set of changes in preparation to (eventually)
  enable -Wimplicit-fallthrough"

* tag 'kgdb-fixes-4.20-rc3' of https://git.linaro.org/people/daniel.thompson/linux:
  kdb: kdb_support: mark expected switch fall-throughs
  kdb: kdb_keyboard: mark expected switch fall-throughs
  kdb: kdb_main: refactor code in kdb_md_line
  kdb: Use strscpy with destination buffer size
  kdb: print real address of pointers instead of hashed addresses
  kdb: use correct pointer when 'btc' calls 'btt'
parents e4c4b0e4 646558ff
...@@ -179,14 +179,14 @@ kdb_bt(int argc, const char **argv) ...@@ -179,14 +179,14 @@ kdb_bt(int argc, const char **argv)
kdb_printf("no process for cpu %ld\n", cpu); kdb_printf("no process for cpu %ld\n", cpu);
return 0; return 0;
} }
sprintf(buf, "btt 0x%p\n", KDB_TSK(cpu)); sprintf(buf, "btt 0x%px\n", KDB_TSK(cpu));
kdb_parse(buf); kdb_parse(buf);
return 0; return 0;
} }
kdb_printf("btc: cpu status: "); kdb_printf("btc: cpu status: ");
kdb_parse("cpu\n"); kdb_parse("cpu\n");
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
sprintf(buf, "btt 0x%p\n", KDB_TSK(cpu)); sprintf(buf, "btt 0x%px\n", KDB_TSK(cpu));
kdb_parse(buf); kdb_parse(buf);
touch_nmi_watchdog(); touch_nmi_watchdog();
} }
......
...@@ -216,7 +216,7 @@ static char *kdb_read(char *buffer, size_t bufsize) ...@@ -216,7 +216,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
int count; int count;
int i; int i;
int diag, dtab_count; int diag, dtab_count;
int key; int key, buf_size, ret;
diag = kdbgetintenv("DTABCOUNT", &dtab_count); diag = kdbgetintenv("DTABCOUNT", &dtab_count);
...@@ -336,9 +336,8 @@ static char *kdb_read(char *buffer, size_t bufsize) ...@@ -336,9 +336,8 @@ static char *kdb_read(char *buffer, size_t bufsize)
else else
p_tmp = tmpbuffer; p_tmp = tmpbuffer;
len = strlen(p_tmp); len = strlen(p_tmp);
count = kallsyms_symbol_complete(p_tmp, buf_size = sizeof(tmpbuffer) - (p_tmp - tmpbuffer);
sizeof(tmpbuffer) - count = kallsyms_symbol_complete(p_tmp, buf_size);
(p_tmp - tmpbuffer));
if (tab == 2 && count > 0) { if (tab == 2 && count > 0) {
kdb_printf("\n%d symbols are found.", count); kdb_printf("\n%d symbols are found.", count);
if (count > dtab_count) { if (count > dtab_count) {
...@@ -350,9 +349,13 @@ static char *kdb_read(char *buffer, size_t bufsize) ...@@ -350,9 +349,13 @@ static char *kdb_read(char *buffer, size_t bufsize)
} }
kdb_printf("\n"); kdb_printf("\n");
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if (WARN_ON(!kallsyms_symbol_next(p_tmp, i))) ret = kallsyms_symbol_next(p_tmp, i, buf_size);
if (WARN_ON(!ret))
break; break;
kdb_printf("%s ", p_tmp); if (ret != -E2BIG)
kdb_printf("%s ", p_tmp);
else
kdb_printf("%s... ", p_tmp);
*(p_tmp + len) = '\0'; *(p_tmp + len) = '\0';
} }
if (i >= dtab_count) if (i >= dtab_count)
......
...@@ -173,11 +173,11 @@ int kdb_get_kbd_char(void) ...@@ -173,11 +173,11 @@ int kdb_get_kbd_char(void)
case KT_LATIN: case KT_LATIN:
if (isprint(keychar)) if (isprint(keychar))
break; /* printable characters */ break; /* printable characters */
/* drop through */ /* fall through */
case KT_SPEC: case KT_SPEC:
if (keychar == K_ENTER) if (keychar == K_ENTER)
break; break;
/* drop through */ /* fall through */
default: default:
return -1; /* ignore unprintables */ return -1; /* ignore unprintables */
} }
......
...@@ -1192,7 +1192,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, ...@@ -1192,7 +1192,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
if (reason == KDB_REASON_DEBUG) { if (reason == KDB_REASON_DEBUG) {
/* special case below */ /* special case below */
} else { } else {
kdb_printf("\nEntering kdb (current=0x%p, pid %d) ", kdb_printf("\nEntering kdb (current=0x%px, pid %d) ",
kdb_current, kdb_current ? kdb_current->pid : 0); kdb_current, kdb_current ? kdb_current->pid : 0);
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
kdb_printf("on processor %d ", raw_smp_processor_id()); kdb_printf("on processor %d ", raw_smp_processor_id());
...@@ -1208,7 +1208,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, ...@@ -1208,7 +1208,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
*/ */
switch (db_result) { switch (db_result) {
case KDB_DB_BPT: case KDB_DB_BPT:
kdb_printf("\nEntering kdb (0x%p, pid %d) ", kdb_printf("\nEntering kdb (0x%px, pid %d) ",
kdb_current, kdb_current->pid); kdb_current, kdb_current->pid);
#if defined(CONFIG_SMP) #if defined(CONFIG_SMP)
kdb_printf("on processor %d ", raw_smp_processor_id()); kdb_printf("on processor %d ", raw_smp_processor_id());
...@@ -1493,6 +1493,7 @@ static void kdb_md_line(const char *fmtstr, unsigned long addr, ...@@ -1493,6 +1493,7 @@ static void kdb_md_line(const char *fmtstr, unsigned long addr,
char cbuf[32]; char cbuf[32];
char *c = cbuf; char *c = cbuf;
int i; int i;
int j;
unsigned long word; unsigned long word;
memset(cbuf, '\0', sizeof(cbuf)); memset(cbuf, '\0', sizeof(cbuf));
...@@ -1538,25 +1539,9 @@ static void kdb_md_line(const char *fmtstr, unsigned long addr, ...@@ -1538,25 +1539,9 @@ static void kdb_md_line(const char *fmtstr, unsigned long addr,
wc.word = word; wc.word = word;
#define printable_char(c) \ #define printable_char(c) \
({unsigned char __c = c; isascii(__c) && isprint(__c) ? __c : '.'; }) ({unsigned char __c = c; isascii(__c) && isprint(__c) ? __c : '.'; })
switch (bytesperword) { for (j = 0; j < bytesperword; j++)
case 8:
*c++ = printable_char(*cp++); *c++ = printable_char(*cp++);
*c++ = printable_char(*cp++); addr += bytesperword;
*c++ = printable_char(*cp++);
*c++ = printable_char(*cp++);
addr += 4;
case 4:
*c++ = printable_char(*cp++);
*c++ = printable_char(*cp++);
addr += 2;
case 2:
*c++ = printable_char(*cp++);
addr++;
case 1:
*c++ = printable_char(*cp++);
addr++;
break;
}
#undef printable_char #undef printable_char
} }
} }
...@@ -2048,7 +2033,7 @@ static int kdb_lsmod(int argc, const char **argv) ...@@ -2048,7 +2033,7 @@ static int kdb_lsmod(int argc, const char **argv)
if (mod->state == MODULE_STATE_UNFORMED) if (mod->state == MODULE_STATE_UNFORMED)
continue; continue;
kdb_printf("%-20s%8u 0x%p ", mod->name, kdb_printf("%-20s%8u 0x%px ", mod->name,
mod->core_layout.size, (void *)mod); mod->core_layout.size, (void *)mod);
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
kdb_printf("%4d ", module_refcount(mod)); kdb_printf("%4d ", module_refcount(mod));
...@@ -2059,7 +2044,7 @@ static int kdb_lsmod(int argc, const char **argv) ...@@ -2059,7 +2044,7 @@ static int kdb_lsmod(int argc, const char **argv)
kdb_printf(" (Loading)"); kdb_printf(" (Loading)");
else else
kdb_printf(" (Live)"); kdb_printf(" (Live)");
kdb_printf(" 0x%p", mod->core_layout.base); kdb_printf(" 0x%px", mod->core_layout.base);
#ifdef CONFIG_MODULE_UNLOAD #ifdef CONFIG_MODULE_UNLOAD
{ {
...@@ -2341,7 +2326,7 @@ void kdb_ps1(const struct task_struct *p) ...@@ -2341,7 +2326,7 @@ void kdb_ps1(const struct task_struct *p)
return; return;
cpu = kdb_process_cpu(p); cpu = kdb_process_cpu(p);
kdb_printf("0x%p %8d %8d %d %4d %c 0x%p %c%s\n", kdb_printf("0x%px %8d %8d %d %4d %c 0x%px %c%s\n",
(void *)p, p->pid, p->parent->pid, (void *)p, p->pid, p->parent->pid,
kdb_task_has_cpu(p), kdb_process_cpu(p), kdb_task_has_cpu(p), kdb_process_cpu(p),
kdb_task_state_char(p), kdb_task_state_char(p),
...@@ -2354,7 +2339,7 @@ void kdb_ps1(const struct task_struct *p) ...@@ -2354,7 +2339,7 @@ void kdb_ps1(const struct task_struct *p)
} else { } else {
if (KDB_TSK(cpu) != p) if (KDB_TSK(cpu) != p)
kdb_printf(" Error: does not match running " kdb_printf(" Error: does not match running "
"process table (0x%p)\n", KDB_TSK(cpu)); "process table (0x%px)\n", KDB_TSK(cpu));
} }
} }
} }
...@@ -2687,7 +2672,7 @@ int kdb_register_flags(char *cmd, ...@@ -2687,7 +2672,7 @@ int kdb_register_flags(char *cmd,
for_each_kdbcmd(kp, i) { for_each_kdbcmd(kp, i) {
if (kp->cmd_name && (strcmp(kp->cmd_name, cmd) == 0)) { if (kp->cmd_name && (strcmp(kp->cmd_name, cmd) == 0)) {
kdb_printf("Duplicate kdb command registered: " kdb_printf("Duplicate kdb command registered: "
"%s, func %p help %s\n", cmd, func, help); "%s, func %px help %s\n", cmd, func, help);
return 1; return 1;
} }
} }
......
...@@ -83,7 +83,7 @@ typedef struct __ksymtab { ...@@ -83,7 +83,7 @@ typedef struct __ksymtab {
unsigned long sym_start; unsigned long sym_start;
unsigned long sym_end; unsigned long sym_end;
} kdb_symtab_t; } kdb_symtab_t;
extern int kallsyms_symbol_next(char *prefix_name, int flag); extern int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size);
extern int kallsyms_symbol_complete(char *prefix_name, int max_len); extern int kallsyms_symbol_complete(char *prefix_name, int max_len);
/* Exported Symbols for kernel loadable modules to use. */ /* Exported Symbols for kernel loadable modules to use. */
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
int kdbgetsymval(const char *symname, kdb_symtab_t *symtab) int kdbgetsymval(const char *symname, kdb_symtab_t *symtab)
{ {
if (KDB_DEBUG(AR)) if (KDB_DEBUG(AR))
kdb_printf("kdbgetsymval: symname=%s, symtab=%p\n", symname, kdb_printf("kdbgetsymval: symname=%s, symtab=%px\n", symname,
symtab); symtab);
memset(symtab, 0, sizeof(*symtab)); memset(symtab, 0, sizeof(*symtab));
symtab->sym_start = kallsyms_lookup_name(symname); symtab->sym_start = kallsyms_lookup_name(symname);
...@@ -88,7 +88,7 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab) ...@@ -88,7 +88,7 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
char *knt1 = NULL; char *knt1 = NULL;
if (KDB_DEBUG(AR)) if (KDB_DEBUG(AR))
kdb_printf("kdbnearsym: addr=0x%lx, symtab=%p\n", addr, symtab); kdb_printf("kdbnearsym: addr=0x%lx, symtab=%px\n", addr, symtab);
memset(symtab, 0, sizeof(*symtab)); memset(symtab, 0, sizeof(*symtab));
if (addr < 4096) if (addr < 4096)
...@@ -149,7 +149,7 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab) ...@@ -149,7 +149,7 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
symtab->mod_name = "kernel"; symtab->mod_name = "kernel";
if (KDB_DEBUG(AR)) if (KDB_DEBUG(AR))
kdb_printf("kdbnearsym: returns %d symtab->sym_start=0x%lx, " kdb_printf("kdbnearsym: returns %d symtab->sym_start=0x%lx, "
"symtab->mod_name=%p, symtab->sym_name=%p (%s)\n", ret, "symtab->mod_name=%px, symtab->sym_name=%px (%s)\n", ret,
symtab->sym_start, symtab->mod_name, symtab->sym_name, symtab->sym_start, symtab->mod_name, symtab->sym_name,
symtab->sym_name); symtab->sym_name);
...@@ -221,11 +221,13 @@ int kallsyms_symbol_complete(char *prefix_name, int max_len) ...@@ -221,11 +221,13 @@ int kallsyms_symbol_complete(char *prefix_name, int max_len)
* Parameters: * Parameters:
* prefix_name prefix of a symbol name to lookup * prefix_name prefix of a symbol name to lookup
* flag 0 means search from the head, 1 means continue search. * flag 0 means search from the head, 1 means continue search.
* buf_size maximum length that can be written to prefix_name
* buffer
* Returns: * Returns:
* 1 if a symbol matches the given prefix. * 1 if a symbol matches the given prefix.
* 0 if no string found * 0 if no string found
*/ */
int kallsyms_symbol_next(char *prefix_name, int flag) int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size)
{ {
int prefix_len = strlen(prefix_name); int prefix_len = strlen(prefix_name);
static loff_t pos; static loff_t pos;
...@@ -235,10 +237,8 @@ int kallsyms_symbol_next(char *prefix_name, int flag) ...@@ -235,10 +237,8 @@ int kallsyms_symbol_next(char *prefix_name, int flag)
pos = 0; pos = 0;
while ((name = kdb_walk_kallsyms(&pos))) { while ((name = kdb_walk_kallsyms(&pos))) {
if (strncmp(name, prefix_name, prefix_len) == 0) { if (!strncmp(name, prefix_name, prefix_len))
strncpy(prefix_name, name, strlen(name)+1); return strscpy(prefix_name, name, buf_size);
return 1;
}
} }
return 0; return 0;
} }
...@@ -432,7 +432,7 @@ int kdb_getphysword(unsigned long *word, unsigned long addr, size_t size) ...@@ -432,7 +432,7 @@ int kdb_getphysword(unsigned long *word, unsigned long addr, size_t size)
*word = w8; *word = w8;
break; break;
} }
/* drop through */ /* fall through */
default: default:
diag = KDB_BADWIDTH; diag = KDB_BADWIDTH;
kdb_printf("kdb_getphysword: bad width %ld\n", (long) size); kdb_printf("kdb_getphysword: bad width %ld\n", (long) size);
...@@ -481,7 +481,7 @@ int kdb_getword(unsigned long *word, unsigned long addr, size_t size) ...@@ -481,7 +481,7 @@ int kdb_getword(unsigned long *word, unsigned long addr, size_t size)
*word = w8; *word = w8;
break; break;
} }
/* drop through */ /* fall through */
default: default:
diag = KDB_BADWIDTH; diag = KDB_BADWIDTH;
kdb_printf("kdb_getword: bad width %ld\n", (long) size); kdb_printf("kdb_getword: bad width %ld\n", (long) size);
...@@ -525,7 +525,7 @@ int kdb_putword(unsigned long addr, unsigned long word, size_t size) ...@@ -525,7 +525,7 @@ int kdb_putword(unsigned long addr, unsigned long word, size_t size)
diag = kdb_putarea(addr, w8); diag = kdb_putarea(addr, w8);
break; break;
} }
/* drop through */ /* fall through */
default: default:
diag = KDB_BADWIDTH; diag = KDB_BADWIDTH;
kdb_printf("kdb_putword: bad width %ld\n", (long) size); kdb_printf("kdb_putword: bad width %ld\n", (long) size);
...@@ -887,13 +887,13 @@ void debug_kusage(void) ...@@ -887,13 +887,13 @@ void debug_kusage(void)
__func__, dah_first); __func__, dah_first);
if (dah_first) { if (dah_first) {
h_used = (struct debug_alloc_header *)debug_alloc_pool; h_used = (struct debug_alloc_header *)debug_alloc_pool;
kdb_printf("%s: h_used %p size %d\n", __func__, h_used, kdb_printf("%s: h_used %px size %d\n", __func__, h_used,
h_used->size); h_used->size);
} }
do { do {
h_used = (struct debug_alloc_header *) h_used = (struct debug_alloc_header *)
((char *)h_free + dah_overhead + h_free->size); ((char *)h_free + dah_overhead + h_free->size);
kdb_printf("%s: h_used %p size %d caller %p\n", kdb_printf("%s: h_used %px size %d caller %px\n",
__func__, h_used, h_used->size, h_used->caller); __func__, h_used, h_used->size, h_used->caller);
h_free = (struct debug_alloc_header *) h_free = (struct debug_alloc_header *)
(debug_alloc_pool + h_free->next); (debug_alloc_pool + h_free->next);
...@@ -902,7 +902,7 @@ void debug_kusage(void) ...@@ -902,7 +902,7 @@ void debug_kusage(void)
((char *)h_free + dah_overhead + h_free->size); ((char *)h_free + dah_overhead + h_free->size);
if ((char *)h_used - debug_alloc_pool != if ((char *)h_used - debug_alloc_pool !=
sizeof(debug_alloc_pool_aligned)) sizeof(debug_alloc_pool_aligned))
kdb_printf("%s: h_used %p size %d caller %p\n", kdb_printf("%s: h_used %px size %d caller %px\n",
__func__, h_used, h_used->size, h_used->caller); __func__, h_used, h_used->size, h_used->caller);
out: out:
spin_unlock(&dap_lock); spin_unlock(&dap_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment