diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-12 13:21:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-12 13:21:19 -0400 |
| commit | cb098d50ecc0a4729507ddcc7f4ae98c3703fadd (patch) | |
| tree | 444db3ac525576f4ac3e9779c449e403eb5db4c6 /kernel | |
| parent | 07820c3bf17822361b25f1015125fd407d9925ed (diff) | |
| parent | 2cf2f0d5b91fd1b06a6ae260462fc7945ea84add (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')
| -rw-r--r-- | kernel/debug/kdb/kdb_bp.c | 4 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_main.c | 89 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_support.c | 4 | ||||
| -rw-r--r-- | kernel/time/timekeeping_internal.h | 2 |
4 files changed, 44 insertions, 55 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 | ||
| 1153 | static 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 | ||
| 2476 | struct 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 | |||
| 2485 | static 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 | */ |
| 2516 | static void kdb_sysinfo(struct sysinfo *val) | 2507 | static 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 | */ |
| 2534 | static int kdb_summary(int argc, const char **argv) | 2525 | static 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 | } |
diff --git a/kernel/time/timekeeping_internal.h b/kernel/time/timekeeping_internal.h index fdbeeb02dde9..cf5c0828ee31 100644 --- a/kernel/time/timekeeping_internal.h +++ b/kernel/time/timekeeping_internal.h | |||
| @@ -31,6 +31,4 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) | |||
| 31 | } | 31 | } |
| 32 | #endif | 32 | #endif |
| 33 | 33 | ||
| 34 | extern time64_t __ktime_get_real_seconds(void); | ||
| 35 | |||
| 36 | #endif /* _TIMEKEEPING_INTERNAL_H */ | 34 | #endif /* _TIMEKEEPING_INTERNAL_H */ |
