Skip to content

Commit

Permalink
Merge tag 'kgdb-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kerne…
Browse files Browse the repository at this point in the history
…l/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
  • Loading branch information
torvalds committed Nov 20, 2024
2 parents aad3a0d + 24b2455 commit f89a687
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 72 deletions.
2 changes: 1 addition & 1 deletion MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -12670,7 +12670,7 @@ F: samples/kfifo/

KGDB / KDB /debug_core
M: Jason Wessel <[email protected]>
M: Daniel Thompson <daniel.thompson@linaro.org>
M: Daniel Thompson <danielt@kernel.org>
R: Douglas Anderson <[email protected]>
L: [email protected]
S: Maintained
Expand Down
6 changes: 4 additions & 2 deletions kernel/debug/kdb/kdb_bp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
33 changes: 24 additions & 9 deletions kernel/debug/kdb/kdb_keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
69 changes: 17 additions & 52 deletions kernel/debug/kdb/kdb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -2428,23 +2396,20 @@ 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");
return 0;
}
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");
Expand Down
13 changes: 5 additions & 8 deletions kernel/trace/trace_kdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit f89a687

Please sign in to comment.