Merge tag 'kgdb-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux
Pull kgdb updates from Daniel Thompson:
"A relatively modest collection of changes:
- Adopt kstrtoint() and kstrtol() instead of the simple_strtoXX
family for better error checking of user input.
- Align the print behavour when breakpoints are enabled and disabled
by adopting the current behaviour of breakpoint disable for both.
- Remove some of the (rather odd and user hostile) hex fallbacks and
require kdb users to prefix with 0x instead.
- Tidy up (and fix) control code handling in kdb's keyboard code.
This makes the control code handling at the keyboard behave the
same way as it does via the UART.
- Switch my own entry in MAINTAINERS to my @kernel.org address"
* tag 'kgdb-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux:
kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode
MAINTAINERS: Use Daniel Thompson's korg address for kgdb work
kdb: Fix breakpoint enable to be silent if already enabled
kdb: Remove fallback interpretation of arbitrary numbers as hex
trace: kdb: Replace simple_strtoul with kstrtoul in kdb_ftdump
kdb: Replace the use of simple_strto with safer kstrto in kdb_main
This commit is contained in:
+1
-1
@@ -12670,7 +12670,7 @@ F: samples/kfifo/
|
||||
|
||||
KGDB / KDB /debug_core
|
||||
M: Jason Wessel <jason.wessel@windriver.com>
|
||||
M: Daniel Thompson <daniel.thompson@linaro.org>
|
||||
M: Daniel Thompson <danielt@kernel.org>
|
||||
R: Douglas Anderson <dianders@chromium.org>
|
||||
L: kgdb-bugreport@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
@@ -460,13 +460,15 @@ static int kdb_bc(int argc, const char **argv)
|
||||
|
||||
break;
|
||||
case KDBCMD_BE:
|
||||
if (bp->bp_enabled)
|
||||
break;
|
||||
|
||||
bp->bp_enabled = 1;
|
||||
|
||||
kdb_printf("Breakpoint %d at "
|
||||
kdb_bfd_vma_fmt " enabled",
|
||||
kdb_bfd_vma_fmt " enabled\n",
|
||||
i, bp->bp_addr);
|
||||
|
||||
kdb_printf("\n");
|
||||
break;
|
||||
case KDBCMD_BD:
|
||||
if (!bp->bp_enabled)
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#define KBD_STAT_OBF 0x01 /* Keyboard output buffer full */
|
||||
#define KBD_STAT_MOUSE_OBF 0x20 /* Mouse output buffer full */
|
||||
|
||||
#define CTRL(c) ((c) - 64)
|
||||
|
||||
static int kbd_exists;
|
||||
static int kbd_last_ret;
|
||||
|
||||
@@ -123,24 +125,24 @@ int kdb_get_kbd_char(void)
|
||||
return 8;
|
||||
}
|
||||
|
||||
/* Special Key */
|
||||
/* Translate special keys to equivalent CTRL control characters */
|
||||
switch (scancode) {
|
||||
case 0xF: /* Tab */
|
||||
return 9;
|
||||
return CTRL('I');
|
||||
case 0x53: /* Del */
|
||||
return 4;
|
||||
return CTRL('D');
|
||||
case 0x47: /* Home */
|
||||
return 1;
|
||||
return CTRL('A');
|
||||
case 0x4F: /* End */
|
||||
return 5;
|
||||
return CTRL('E');
|
||||
case 0x4B: /* Left */
|
||||
return 2;
|
||||
return CTRL('B');
|
||||
case 0x48: /* Up */
|
||||
return 16;
|
||||
return CTRL('P');
|
||||
case 0x50: /* Down */
|
||||
return 14;
|
||||
return CTRL('N');
|
||||
case 0x4D: /* Right */
|
||||
return 6;
|
||||
return CTRL('F');
|
||||
}
|
||||
|
||||
if (scancode == 0xe0)
|
||||
@@ -172,6 +174,19 @@ int kdb_get_kbd_char(void)
|
||||
switch (KTYP(keychar)) {
|
||||
case KT_LETTER:
|
||||
case KT_LATIN:
|
||||
switch (keychar) {
|
||||
/* non-printable supported control characters */
|
||||
case CTRL('A'): /* Home */
|
||||
case CTRL('B'): /* Left */
|
||||
case CTRL('D'): /* Del */
|
||||
case CTRL('E'): /* End */
|
||||
case CTRL('F'): /* Right */
|
||||
case CTRL('I'): /* Tab */
|
||||
case CTRL('N'): /* Down */
|
||||
case CTRL('P'): /* Up */
|
||||
return keychar;
|
||||
}
|
||||
|
||||
if (isprint(keychar))
|
||||
break; /* printable characters */
|
||||
fallthrough;
|
||||
|
||||
+17
-52
@@ -306,8 +306,8 @@ static int kdbgetulenv(const char *match, unsigned long *value)
|
||||
return KDB_NOTENV;
|
||||
if (strlen(ep) == 0)
|
||||
return KDB_NOENVVALUE;
|
||||
|
||||
*value = simple_strtoul(ep, NULL, 0);
|
||||
if (kstrtoul(ep, 0, value))
|
||||
return KDB_BADINT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -402,42 +402,15 @@ static void kdb_printenv(void)
|
||||
*/
|
||||
int kdbgetularg(const char *arg, unsigned long *value)
|
||||
{
|
||||
char *endp;
|
||||
unsigned long val;
|
||||
|
||||
val = simple_strtoul(arg, &endp, 0);
|
||||
|
||||
if (endp == arg) {
|
||||
/*
|
||||
* Also try base 16, for us folks too lazy to type the
|
||||
* leading 0x...
|
||||
*/
|
||||
val = simple_strtoul(arg, &endp, 16);
|
||||
if (endp == arg)
|
||||
return KDB_BADINT;
|
||||
}
|
||||
|
||||
*value = val;
|
||||
|
||||
if (kstrtoul(arg, 0, value))
|
||||
return KDB_BADINT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kdbgetu64arg(const char *arg, u64 *value)
|
||||
{
|
||||
char *endp;
|
||||
u64 val;
|
||||
|
||||
val = simple_strtoull(arg, &endp, 0);
|
||||
|
||||
if (endp == arg) {
|
||||
|
||||
val = simple_strtoull(arg, &endp, 16);
|
||||
if (endp == arg)
|
||||
return KDB_BADINT;
|
||||
}
|
||||
|
||||
*value = val;
|
||||
|
||||
if (kstrtou64(arg, 0, value))
|
||||
return KDB_BADINT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -473,10 +446,10 @@ int kdb_set(int argc, const char **argv)
|
||||
*/
|
||||
if (strcmp(argv[1], "KDBDEBUG") == 0) {
|
||||
unsigned int debugflags;
|
||||
char *cp;
|
||||
int ret;
|
||||
|
||||
debugflags = simple_strtoul(argv[2], &cp, 0);
|
||||
if (cp == argv[2] || debugflags & ~KDB_DEBUG_FLAG_MASK) {
|
||||
ret = kstrtouint(argv[2], 0, &debugflags);
|
||||
if (ret || debugflags & ~KDB_DEBUG_FLAG_MASK) {
|
||||
kdb_printf("kdb: illegal debug flags '%s'\n",
|
||||
argv[2]);
|
||||
return 0;
|
||||
@@ -1619,10 +1592,10 @@ static int kdb_md(int argc, const char **argv)
|
||||
if (!argv[0][3])
|
||||
valid = 1;
|
||||
else if (argv[0][3] == 'c' && argv[0][4]) {
|
||||
char *p;
|
||||
repeat = simple_strtoul(argv[0] + 4, &p, 10);
|
||||
if (kstrtouint(argv[0] + 4, 10, &repeat))
|
||||
return KDB_BADINT;
|
||||
mdcount = ((repeat * bytesperword) + 15) / 16;
|
||||
valid = !*p;
|
||||
valid = 1;
|
||||
}
|
||||
last_repeat = repeat;
|
||||
} else if (strcmp(argv[0], "md") == 0)
|
||||
@@ -2083,15 +2056,10 @@ static int kdb_dmesg(int argc, const char **argv)
|
||||
if (argc > 2)
|
||||
return KDB_ARGCOUNT;
|
||||
if (argc) {
|
||||
char *cp;
|
||||
lines = simple_strtol(argv[1], &cp, 0);
|
||||
if (*cp)
|
||||
if (kstrtoint(argv[1], 0, &lines))
|
||||
lines = 0;
|
||||
if (argc > 1) {
|
||||
adjust = simple_strtoul(argv[2], &cp, 0);
|
||||
if (*cp || adjust < 0)
|
||||
adjust = 0;
|
||||
}
|
||||
if (argc > 1 && (kstrtoint(argv[2], 0, &adjust) || adjust < 0))
|
||||
adjust = 0;
|
||||
}
|
||||
|
||||
/* disable LOGGING if set */
|
||||
@@ -2428,14 +2396,12 @@ static int kdb_help(int argc, const char **argv)
|
||||
static int kdb_kill(int argc, const char **argv)
|
||||
{
|
||||
long sig, pid;
|
||||
char *endp;
|
||||
struct task_struct *p;
|
||||
|
||||
if (argc != 2)
|
||||
return KDB_ARGCOUNT;
|
||||
|
||||
sig = simple_strtol(argv[1], &endp, 0);
|
||||
if (*endp)
|
||||
if (kstrtol(argv[1], 0, &sig))
|
||||
return KDB_BADINT;
|
||||
if ((sig >= 0) || !valid_signal(-sig)) {
|
||||
kdb_printf("Invalid signal parameter.<-signal>\n");
|
||||
@@ -2443,8 +2409,7 @@ static int kdb_kill(int argc, const char **argv)
|
||||
}
|
||||
sig = -sig;
|
||||
|
||||
pid = simple_strtol(argv[2], &endp, 0);
|
||||
if (*endp)
|
||||
if (kstrtol(argv[2], 0, &pid))
|
||||
return KDB_BADINT;
|
||||
if (pid <= 0) {
|
||||
kdb_printf("Process ID must be large than 0.\n");
|
||||
|
||||
@@ -96,22 +96,19 @@ static int kdb_ftdump(int argc, const char **argv)
|
||||
{
|
||||
int skip_entries = 0;
|
||||
long cpu_file;
|
||||
char *cp;
|
||||
int err;
|
||||
int cnt;
|
||||
int cpu;
|
||||
|
||||
if (argc > 2)
|
||||
return KDB_ARGCOUNT;
|
||||
|
||||
if (argc) {
|
||||
skip_entries = simple_strtol(argv[1], &cp, 0);
|
||||
if (*cp)
|
||||
skip_entries = 0;
|
||||
}
|
||||
if (argc && kstrtoint(argv[1], 0, &skip_entries))
|
||||
return KDB_BADINT;
|
||||
|
||||
if (argc == 2) {
|
||||
cpu_file = simple_strtol(argv[2], &cp, 0);
|
||||
if (*cp || cpu_file >= NR_CPUS || cpu_file < 0 ||
|
||||
err = kstrtol(argv[2], 0, &cpu_file);
|
||||
if (err || cpu_file >= NR_CPUS || cpu_file < 0 ||
|
||||
!cpu_online(cpu_file))
|
||||
return KDB_BADINT;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user