Commit cb098d50 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 07820c3b 2cf2f0d5
...@@ -400,10 +400,14 @@ static void skip_back_repeat_test(char *arg) ...@@ -400,10 +400,14 @@ static void skip_back_repeat_test(char *arg)
int go_back = simple_strtol(arg, NULL, 10); int go_back = simple_strtol(arg, NULL, 10);
repeat_test--; repeat_test--;
if (repeat_test <= 0) if (repeat_test <= 0) {
ts.idx++; ts.idx++;
else } else {
if (repeat_test % 100 == 0)
v1printk("kgdbts:RUN ... %d remaining\n", repeat_test);
ts.idx -= go_back; ts.idx -= go_back;
}
fill_get_buf(ts.tst[ts.idx].get); fill_get_buf(ts.tst[ts.idx].get);
} }
......
...@@ -31,6 +31,7 @@ struct timespec64 get_monotonic_coarse64(void); ...@@ -31,6 +31,7 @@ struct timespec64 get_monotonic_coarse64(void);
extern void getrawmonotonic64(struct timespec64 *ts); extern void getrawmonotonic64(struct timespec64 *ts);
extern void ktime_get_ts64(struct timespec64 *ts); extern void ktime_get_ts64(struct timespec64 *ts);
extern time64_t ktime_get_seconds(void); extern time64_t ktime_get_seconds(void);
extern time64_t __ktime_get_real_seconds(void);
extern time64_t ktime_get_real_seconds(void); extern time64_t ktime_get_real_seconds(void);
extern void ktime_get_active_ts64(struct timespec64 *ts); extern void ktime_get_active_ts64(struct timespec64 *ts);
......
...@@ -242,11 +242,11 @@ static void kdb_printbp(kdb_bp_t *bp, int i) ...@@ -242,11 +242,11 @@ static void kdb_printbp(kdb_bp_t *bp, int i)
kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT); kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT);
if (bp->bp_enabled) if (bp->bp_enabled)
kdb_printf("\n is enabled"); kdb_printf("\n is enabled ");
else else
kdb_printf("\n is disabled"); kdb_printf("\n is disabled");
kdb_printf("\taddr at %016lx, hardtype=%d installed=%d\n", kdb_printf(" addr at %016lx, hardtype=%d installed=%d\n",
bp->bp_addr, bp->bp_type, bp->bp_installed); bp->bp_addr, bp->bp_type, bp->bp_installed);
kdb_printf("\n"); kdb_printf("\n");
......
...@@ -1150,6 +1150,16 @@ void kdb_set_current_task(struct task_struct *p) ...@@ -1150,6 +1150,16 @@ void kdb_set_current_task(struct task_struct *p)
kdb_current_regs = NULL; kdb_current_regs = NULL;
} }
static void drop_newline(char *buf)
{
size_t len = strlen(buf);
if (len == 0)
return;
if (*(buf + len - 1) == '\n')
*(buf + len - 1) = '\0';
}
/* /*
* kdb_local - The main code for kdb. This routine is invoked on a * kdb_local - The main code for kdb. This routine is invoked on a
* specific processor, it is not global. The main kdb() routine * specific processor, it is not global. The main kdb() routine
...@@ -1327,6 +1337,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, ...@@ -1327,6 +1337,7 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
cmdptr = cmd_head; cmdptr = cmd_head;
diag = kdb_parse(cmdbuf); diag = kdb_parse(cmdbuf);
if (diag == KDB_NOTFOUND) { if (diag == KDB_NOTFOUND) {
drop_newline(cmdbuf);
kdb_printf("Unknown kdb command: '%s'\n", cmdbuf); kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
diag = 0; diag = 0;
} }
...@@ -1566,6 +1577,7 @@ static int kdb_md(int argc, const char **argv) ...@@ -1566,6 +1577,7 @@ static int kdb_md(int argc, const char **argv)
int symbolic = 0; int symbolic = 0;
int valid = 0; int valid = 0;
int phys = 0; int phys = 0;
int raw = 0;
kdbgetintenv("MDCOUNT", &mdcount); kdbgetintenv("MDCOUNT", &mdcount);
kdbgetintenv("RADIX", &radix); kdbgetintenv("RADIX", &radix);
...@@ -1575,9 +1587,10 @@ static int kdb_md(int argc, const char **argv) ...@@ -1575,9 +1587,10 @@ static int kdb_md(int argc, const char **argv)
repeat = mdcount * 16 / bytesperword; repeat = mdcount * 16 / bytesperword;
if (strcmp(argv[0], "mdr") == 0) { if (strcmp(argv[0], "mdr") == 0) {
if (argc != 2) if (argc == 2 || (argc == 0 && last_addr != 0))
valid = raw = 1;
else
return KDB_ARGCOUNT; return KDB_ARGCOUNT;
valid = 1;
} else if (isdigit(argv[0][2])) { } else if (isdigit(argv[0][2])) {
bytesperword = (int)(argv[0][2] - '0'); bytesperword = (int)(argv[0][2] - '0');
if (bytesperword == 0) { if (bytesperword == 0) {
...@@ -1613,6 +1626,9 @@ static int kdb_md(int argc, const char **argv) ...@@ -1613,6 +1626,9 @@ static int kdb_md(int argc, const char **argv)
radix = last_radix; radix = last_radix;
bytesperword = last_bytesperword; bytesperword = last_bytesperword;
repeat = last_repeat; repeat = last_repeat;
if (raw)
mdcount = repeat;
else
mdcount = ((repeat * bytesperword) + 15) / 16; mdcount = ((repeat * bytesperword) + 15) / 16;
} }
...@@ -1630,6 +1646,9 @@ static int kdb_md(int argc, const char **argv) ...@@ -1630,6 +1646,9 @@ static int kdb_md(int argc, const char **argv)
diag = kdbgetularg(argv[nextarg], &val); diag = kdbgetularg(argv[nextarg], &val);
if (!diag) { if (!diag) {
mdcount = (int) val; mdcount = (int) val;
if (raw)
repeat = mdcount;
else
repeat = mdcount * 16 / bytesperword; repeat = mdcount * 16 / bytesperword;
} }
} }
...@@ -1640,8 +1659,15 @@ static int kdb_md(int argc, const char **argv) ...@@ -1640,8 +1659,15 @@ static int kdb_md(int argc, const char **argv)
} }
} }
if (strcmp(argv[0], "mdr") == 0) if (strcmp(argv[0], "mdr") == 0) {
return kdb_mdr(addr, mdcount); int ret;
last_addr = addr;
ret = kdb_mdr(addr, mdcount);
last_addr += mdcount;
last_repeat = mdcount;
last_bytesperword = bytesperword; // to make REPEAT happy
return ret;
}
switch (radix) { switch (radix) {
case 10: case 10:
...@@ -2473,41 +2499,6 @@ static int kdb_kill(int argc, const char **argv) ...@@ -2473,41 +2499,6 @@ static int kdb_kill(int argc, const char **argv)
return 0; return 0;
} }
struct kdb_tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
};
static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
{
/* This will work from 1970-2099, 2100 is not a leap year */
static int mon_day[] = { 31, 29, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31 };
memset(tm, 0, sizeof(*tm));
tm->tm_sec = tv->tv_sec % (24 * 60 * 60);
tm->tm_mday = tv->tv_sec / (24 * 60 * 60) +
(2 * 365 + 1); /* shift base from 1970 to 1968 */
tm->tm_min = tm->tm_sec / 60 % 60;
tm->tm_hour = tm->tm_sec / 60 / 60;
tm->tm_sec = tm->tm_sec % 60;
tm->tm_year = 68 + 4*(tm->tm_mday / (4*365+1));
tm->tm_mday %= (4*365+1);
mon_day[1] = 29;
while (tm->tm_mday >= mon_day[tm->tm_mon]) {
tm->tm_mday -= mon_day[tm->tm_mon];
if (++tm->tm_mon == 12) {
tm->tm_mon = 0;
++tm->tm_year;
mon_day[1] = 28;
}
}
++tm->tm_mday;
}
/* /*
* Most of this code has been lifted from kernel/timer.c::sys_sysinfo(). * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
* I cannot call that code directly from kdb, it has an unconditional * 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,10 +2506,10 @@ static void kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
*/ */
static void kdb_sysinfo(struct sysinfo *val) static void kdb_sysinfo(struct sysinfo *val)
{ {
struct timespec uptime; u64 uptime = ktime_get_mono_fast_ns();
ktime_get_ts(&uptime);
memset(val, 0, sizeof(*val)); memset(val, 0, sizeof(*val));
val->uptime = uptime.tv_sec; val->uptime = div_u64(uptime, NSEC_PER_SEC);
val->loads[0] = avenrun[0]; val->loads[0] = avenrun[0];
val->loads[1] = avenrun[1]; val->loads[1] = avenrun[1];
val->loads[2] = avenrun[2]; val->loads[2] = avenrun[2];
...@@ -2533,8 +2524,8 @@ static void kdb_sysinfo(struct sysinfo *val) ...@@ -2533,8 +2524,8 @@ static void kdb_sysinfo(struct sysinfo *val)
*/ */
static int kdb_summary(int argc, const char **argv) static int kdb_summary(int argc, const char **argv)
{ {
struct timespec now; time64_t now;
struct kdb_tm tm; struct tm tm;
struct sysinfo val; struct sysinfo val;
if (argc) if (argc)
...@@ -2548,9 +2539,9 @@ static int kdb_summary(int argc, const char **argv) ...@@ -2548,9 +2539,9 @@ static int kdb_summary(int argc, const char **argv)
kdb_printf("domainname %s\n", init_uts_ns.name.domainname); kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
kdb_printf("ccversion %s\n", __stringify(CCVERSION)); kdb_printf("ccversion %s\n", __stringify(CCVERSION));
now = __current_kernel_time(); now = __ktime_get_real_seconds();
kdb_gmtime(&now, &tm); time64_to_tm(now, 0, &tm);
kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d " kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
"tz_minuteswest %d\n", "tz_minuteswest %d\n",
1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_hour, tm.tm_min, tm.tm_sec,
......
...@@ -129,13 +129,13 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab) ...@@ -129,13 +129,13 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
} }
if (i >= ARRAY_SIZE(kdb_name_table)) { if (i >= ARRAY_SIZE(kdb_name_table)) {
debug_kfree(kdb_name_table[0]); debug_kfree(kdb_name_table[0]);
memcpy(kdb_name_table, kdb_name_table+1, memmove(kdb_name_table, kdb_name_table+1,
sizeof(kdb_name_table[0]) * sizeof(kdb_name_table[0]) *
(ARRAY_SIZE(kdb_name_table)-1)); (ARRAY_SIZE(kdb_name_table)-1));
} else { } else {
debug_kfree(knt1); debug_kfree(knt1);
knt1 = kdb_name_table[i]; knt1 = kdb_name_table[i];
memcpy(kdb_name_table+i, kdb_name_table+i+1, memmove(kdb_name_table+i, kdb_name_table+i+1,
sizeof(kdb_name_table[0]) * sizeof(kdb_name_table[0]) *
(ARRAY_SIZE(kdb_name_table)-i-1)); (ARRAY_SIZE(kdb_name_table)-i-1));
} }
......
...@@ -31,6 +31,4 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) ...@@ -31,6 +31,4 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask)
} }
#endif #endif
extern time64_t __ktime_get_real_seconds(void);
#endif /* _TIMEKEEPING_INTERNAL_H */ #endif /* _TIMEKEEPING_INTERNAL_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment