aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/debug
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-04-12 13:21:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-04-12 13:21:19 -0400
commitcb098d50ecc0a4729507ddcc7f4ae98c3703fadd (patch)
tree444db3ac525576f4ac3e9779c449e403eb5db4c6 /kernel/debug
parent07820c3bf17822361b25f1015125fd407d9925ed (diff)
parent2cf2f0d5b91fd1b06a6ae260462fc7945ea84add (diff)
Merge tag 'for_linus-4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb
Pull kdb updates from Jason Wessel: - fix 2032 time access issues and new compiler warnings - minor regression test cleanup - formatting fixes for end user use of kdb * tag 'for_linus-4.16' of git://git.kernel.org/pub/scm/linux/kernel/git/jwessel/kgdb: kdb: use memmove instead of overlapping memcpy kdb: use ktime_get_mono_fast_ns() instead of ktime_get_ts() kdb: bl: don't use tab character in output kdb: drop newline in unknown command output kdb: make "mdr" command repeat kdb: use __ktime_get_real_seconds instead of __current_kernel_time misc: kgdbts: Display progress of asynchronous tests
Diffstat (limited to 'kernel/debug')
-rw-r--r--kernel/debug/kdb/kdb_bp.c4
-rw-r--r--kernel/debug/kdb/kdb_main.c89
-rw-r--r--kernel/debug/kdb/kdb_support.c4
3 files changed, 44 insertions, 53 deletions
diff --git a/kernel/debug/kdb/kdb_bp.c b/kernel/debug/kdb/kdb_bp.c
index 90ff129c88a2..62c301ad0773 100644
--- a/kernel/debug/kdb/kdb_bp.c
+++ b/kernel/debug/kdb/kdb_bp.c
@@ -242,11 +242,11 @@ static void kdb_printbp(kdb_bp_t *bp, int i)
242 kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT); 242 kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT);
243 243
244 if (bp->bp_enabled) 244 if (bp->bp_enabled)
245 kdb_printf("\n is enabled"); 245 kdb_printf("\n is enabled ");
246 else 246 else
247 kdb_printf("\n is disabled"); 247 kdb_printf("\n is disabled");
248 248
249 kdb_printf("\taddr at %016lx, hardtype=%d installed=%d\n", 249 kdb_printf(" addr at %016lx, hardtype=%d installed=%d\n",
250 bp->bp_addr, bp->bp_type, bp->bp_installed); 250 bp->bp_addr, bp->bp_type, bp->bp_installed);
251 251
252 kdb_printf("\n"); 252 kdb_printf("\n");
diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index dbb0781a0533..e405677ee08d 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -1150,6 +1150,16 @@ void kdb_set_current_task(struct task_struct *p)
1150 kdb_current_regs = NULL; 1150 kdb_current_regs = NULL;
1151} 1151}
1152 1152
1153static void drop_newline(char *buf)
1154{
1155 size_t len = strlen(buf);
1156
1157 if (len == 0)
1158 return;
1159 if (*(buf + len - 1) == '\n')
1160 *(buf + len - 1) = '\0';
1161}
1162
1153/* 1163/*
1154 * kdb_local - The main code for kdb. This routine is invoked on a 1164 * kdb_local - The main code for kdb. This routine is invoked on a
1155 * specific processor, it is not global. The main kdb() routine 1165 * specific processor, it is not global. The main kdb() routine
@@ -1327,6 +1337,7 @@ do_full_getstr:
1327 cmdptr = cmd_head; 1337 cmdptr = cmd_head;
1328 diag = kdb_parse(cmdbuf); 1338 diag = kdb_parse(cmdbuf);
1329 if (diag == KDB_NOTFOUND) { 1339 if (diag == KDB_NOTFOUND) {
1340 drop_newline(cmdbuf);
1330 kdb_printf("Unknown kdb command: '%s'\n", cmdbuf); 1341 kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
1331 diag = 0; 1342 diag = 0;
1332 } 1343 }
@@ -1566,6 +1577,7 @@ static int kdb_md(int argc, const char **argv)
1566 int symbolic = 0; 1577 int symbolic = 0;
1567 int valid = 0; 1578 int valid = 0;
1568 int phys = 0; 1579 int phys = 0;
1580 int raw = 0;
1569 1581
1570 kdbgetintenv("MDCOUNT", &mdcount); 1582 kdbgetintenv("MDCOUNT", &mdcount);
1571 kdbgetintenv("RADIX", &radix); 1583 kdbgetintenv("RADIX", &radix);
@@ -1575,9 +1587,10 @@ static int kdb_md(int argc, const char **argv)
1575 repeat = mdcount * 16 / bytesperword; 1587 repeat = mdcount * 16 / bytesperword;
1576 1588
1577 if (strcmp(argv[0], "mdr") == 0) { 1589 if (strcmp(argv[0], "mdr") == 0) {
1578 if (argc != 2) 1590 if (argc == 2 || (argc == 0 && last_addr != 0))
1591 valid = raw = 1;
1592 else
1579 return KDB_ARGCOUNT; 1593 return KDB_ARGCOUNT;
1580 valid = 1;
1581 } else if (isdigit(argv[0][2])) { 1594 } else if (isdigit(argv[0][2])) {
1582 bytesperword = (int)(argv[0][2] - '0'); 1595 bytesperword = (int)(argv[0][2] - '0');
1583 if (bytesperword == 0) { 1596 if (bytesperword == 0) {
@@ -1613,7 +1626,10 @@ static int kdb_md(int argc, const char **argv)
1613 radix = last_radix; 1626 radix = last_radix;
1614 bytesperword = last_bytesperword; 1627 bytesperword = last_bytesperword;
1615 repeat = last_repeat; 1628 repeat = last_repeat;
1616 mdcount = ((repeat * bytesperword) + 15) / 16; 1629 if (raw)
1630 mdcount = repeat;
1631 else
1632 mdcount = ((repeat * bytesperword) + 15) / 16;
1617 } 1633 }
1618 1634
1619 if (argc) { 1635 if (argc) {
@@ -1630,7 +1646,10 @@ static int kdb_md(int argc, const char **argv)
1630 diag = kdbgetularg(argv[nextarg], &val); 1646 diag = kdbgetularg(argv[nextarg], &val);
1631 if (!diag) { 1647 if (!diag) {
1632 mdcount = (int) val; 1648 mdcount = (int) val;
1633 repeat = mdcount * 16 / bytesperword; 1649 if (raw)
1650 repeat = mdcount;
1651 else
1652 repeat = mdcount * 16 / bytesperword;
1634 } 1653 }
1635 } 1654 }
1636 if (argc >= nextarg+1) { 1655 if (argc >= nextarg+1) {
@@ -1640,8 +1659,15 @@ static int kdb_md(int argc, const char **argv)
1640 } 1659 }
1641 } 1660 }
1642 1661
1643 if (strcmp(argv[0], "mdr") == 0) 1662 if (strcmp(argv[0], "mdr") == 0) {
1644 return kdb_mdr(addr, mdcount); 1663 int ret;
1664 last_addr = addr;
1665 ret = kdb_mdr(addr, mdcount);
1666 last_addr += mdcount;
1667 last_repeat = mdcount;
1668 last_bytesperword = bytesperword; // to make REPEAT happy
1669 return ret;
1670 }
1645 1671
1646 switch (radix) { 1672 switch (radix) {
1647 case 10: 1673 case 10:
@@ -2473,41 +2499,6 @@ static int kdb_kill(int argc, const char **argv)
2473 return 0; 2499 return 0;
2474} 2500}
2475 2501
2476struct kdb_tm {
2477 int tm_sec; /* seconds */
2478 int tm_min; /* minutes */
2479 int tm_hour; /* hours */
2480 int tm_mday; /* day of the month */
2481 int tm_mon; /* month */
2482 int tm_year; /* year */
2483};
2484
2485static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
2486{
2487 /* This will work from 1970-2099, 2100 is not a leap year */
2488 static int mon_day[] = { 31, 29, 31, 30, 31, 30, 31,
2489 31, 30, 31, 30, 31 };
2490 memset(tm, 0, sizeof(*tm));
2491 tm->tm_sec = tv->tv_sec % (24 * 60 * 60);
2492 tm->tm_mday = tv->tv_sec / (24 * 60 * 60) +
2493 (2 * 365 + 1); /* shift base from 1970 to 1968 */
2494 tm->tm_min = tm->tm_sec / 60 % 60;
2495 tm->tm_hour = tm->tm_sec / 60 / 60;
2496 tm->tm_sec = tm->tm_sec % 60;
2497 tm->tm_year = 68 + 4*(tm->tm_mday / (4*365+1));
2498 tm->tm_mday %= (4*365+1);
2499 mon_day[1] = 29;
2500 while (tm->tm_mday >= mon_day[tm->tm_mon]) {
2501 tm->tm_mday -= mon_day[tm->tm_mon];
2502 if (++tm->tm_mon == 12) {
2503 tm->tm_mon = 0;
2504 ++tm->tm_year;
2505 mon_day[1] = 28;
2506 }
2507 }
2508 ++tm->tm_mday;
2509}
2510
2511/* 2502/*
2512 * Most of this code has been lifted from kernel/timer.c::sys_sysinfo(). 2503 * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
2513 * I cannot call that code directly from kdb, it has an unconditional 2504 * I cannot call that code directly from kdb, it has an unconditional
@@ -2515,10 +2506,10 @@ static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
2515 */ 2506 */
2516static void kdb_sysinfo(struct sysinfo *val) 2507static void kdb_sysinfo(struct sysinfo *val)
2517{ 2508{
2518 struct timespec uptime; 2509 u64 uptime = ktime_get_mono_fast_ns();
2519 ktime_get_ts(&uptime); 2510
2520 memset(val, 0, sizeof(*val)); 2511 memset(val, 0, sizeof(*val));
2521 val->uptime = uptime.tv_sec; 2512 val->uptime = div_u64(uptime, NSEC_PER_SEC);
2522 val->loads[0] = avenrun[0]; 2513 val->loads[0] = avenrun[0];
2523 val->loads[1] = avenrun[1]; 2514 val->loads[1] = avenrun[1];
2524 val->loads[2] = avenrun[2]; 2515 val->loads[2] = avenrun[2];
@@ -2533,8 +2524,8 @@ static void kdb_sysinfo(struct sysinfo *val)
2533 */ 2524 */
2534static int kdb_summary(int argc, const char **argv) 2525static int kdb_summary(int argc, const char **argv)
2535{ 2526{
2536 struct timespec now; 2527 time64_t now;
2537 struct kdb_tm tm; 2528 struct tm tm;
2538 struct sysinfo val; 2529 struct sysinfo val;
2539 2530
2540 if (argc) 2531 if (argc)
@@ -2548,9 +2539,9 @@ static int kdb_summary(int argc, const char **argv)
2548 kdb_printf("domainname %s\n", init_uts_ns.name.domainname); 2539 kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
2549 kdb_printf("ccversion %s\n", __stringify(CCVERSION)); 2540 kdb_printf("ccversion %s\n", __stringify(CCVERSION));
2550 2541
2551 now = __current_kernel_time(); 2542 now = __ktime_get_real_seconds();
2552 kdb_gmtime(&now, &tm); 2543 time64_to_tm(now, 0, &tm);
2553 kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d " 2544 kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
2554 "tz_minuteswest %d\n", 2545 "tz_minuteswest %d\n",
2555 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, 2546 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
2556 tm.tm_hour, tm.tm_min, tm.tm_sec, 2547 tm.tm_hour, tm.tm_min, tm.tm_sec,
diff --git a/kernel/debug/kdb/kdb_support.c b/kernel/debug/kdb/kdb_support.c
index d35cc2d3a4cc..990b3cc526c8 100644
--- a/kernel/debug/kdb/kdb_support.c
+++ b/kernel/debug/kdb/kdb_support.c
@@ -129,13 +129,13 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
129 } 129 }
130 if (i >= ARRAY_SIZE(kdb_name_table)) { 130 if (i >= ARRAY_SIZE(kdb_name_table)) {
131 debug_kfree(kdb_name_table[0]); 131 debug_kfree(kdb_name_table[0]);
132 memcpy(kdb_name_table, kdb_name_table+1, 132 memmove(kdb_name_table, kdb_name_table+1,
133 sizeof(kdb_name_table[0]) * 133 sizeof(kdb_name_table[0]) *
134 (ARRAY_SIZE(kdb_name_table)-1)); 134 (ARRAY_SIZE(kdb_name_table)-1));
135 } else { 135 } else {
136 debug_kfree(knt1); 136 debug_kfree(knt1);
137 knt1 = kdb_name_table[i]; 137 knt1 = kdb_name_table[i];
138 memcpy(kdb_name_table+i, kdb_name_table+i+1, 138 memmove(kdb_name_table+i, kdb_name_table+i+1,
139 sizeof(kdb_name_table[0]) * 139 sizeof(kdb_name_table[0]) *
140 (ARRAY_SIZE(kdb_name_table)-i-1)); 140 (ARRAY_SIZE(kdb_name_table)-i-1));
141 } 141 }