Commit f89a687a authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents aad3a0d0 24b2455f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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)
+24 −9
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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)
	if (kstrtoul(arg, 0, value))
		return KDB_BADINT;
	}

	*value = val;

	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)
	if (kstrtou64(arg, 0, value))
		return KDB_BADINT;
	}

	*value = val;

	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,16 +2056,11 @@ 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)
		if (argc > 1 && (kstrtoint(argv[2], 0, &adjust) || adjust < 0))
			adjust = 0;
	}
	}

	/* disable LOGGING if set */
	diag = kdbgetintenv("LOGGING", &logging);
@@ -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");
+5 −8
Original line number Diff line number Diff line
@@ -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 {