* Fix 2032 time access issues and new compiler warnings
* minor regression test cleanup * formatting fixes for end user use of kdb -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJaz048AAoJEIciOldedpOjdSEP/i07tDKf/A7cFIsRgJgXO4hV M3fB3Kzr1DYrrfhWtWfjez/H7ScmYgNSwH7lsP8YibrpvwwxXblsE67zlg7w3oll qaGx7zVvBRwHo/0xCJicM7sb3Ey5KX3/ycCpRTmJvj+ywnKlMed6oTU/N9V7mBR0 ScFpst/omZEkJzYJQwkZPpW8A1zxWYKp/F3g8jAOSz50/S2RWjzSFfg7Efm7+ND7 IRo/Qcvj+gRxTJyEHxS0wU2EO1egnGLjHmzl1PZMq5X0WsWSUYJ7s6faYh/geuiD KFsIapYhRm3SEtgFmCnrVySk3GfdjaU+XDRPzSQk9qehySxU/oZdZbwtaI8YFo3t HvoMyvZg4B3BSU1s4WqGyo97Ug2T3z58V2mnfU0IiDH5wiiFg3uCNoBY7CQXG+GP wzPheSD+rWVAlcKuuNOQfufIkHrtWhJzjOPsVs4GfgOnZg6T1N7p40+i+hW6JNNi K2NTTc7o/SZ7P7de5RibuaGnvE9zCVPpag27Zsasvhrh3BKriBv1ijYUXVbgoImL sCFnERUYnR2M4iIAX2oMXyyW5KoiNJWCr+XaEmaYeoCOCcO2FQwo6J3SiNf2WZ4K BXZ4LlvTFqG1ew/GCcWxenCo5mtEqPvt9eyAF2R0CCgiP4m2SG6sEB4JkvJBvoI9 ZtJBLWguNYJyBwbKqKaq =zz/y -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
cb098d50ec
|
@ -400,10 +400,14 @@ static void skip_back_repeat_test(char *arg)
|
|||
int go_back = simple_strtol(arg, NULL, 10);
|
||||
|
||||
repeat_test--;
|
||||
if (repeat_test <= 0)
|
||||
if (repeat_test <= 0) {
|
||||
ts.idx++;
|
||||
else
|
||||
} else {
|
||||
if (repeat_test % 100 == 0)
|
||||
v1printk("kgdbts:RUN ... %d remaining\n", repeat_test);
|
||||
|
||||
ts.idx -= go_back;
|
||||
}
|
||||
fill_get_buf(ts.tst[ts.idx].get);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ struct timespec64 get_monotonic_coarse64(void);
|
|||
extern void getrawmonotonic64(struct timespec64 *ts);
|
||||
extern void ktime_get_ts64(struct timespec64 *ts);
|
||||
extern time64_t ktime_get_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);
|
||||
|
||||
|
|
|
@ -242,11 +242,11 @@ static void kdb_printbp(kdb_bp_t *bp, int i)
|
|||
kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT);
|
||||
|
||||
if (bp->bp_enabled)
|
||||
kdb_printf("\n is enabled");
|
||||
kdb_printf("\n is enabled ");
|
||||
else
|
||||
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);
|
||||
|
||||
kdb_printf("\n");
|
||||
|
|
|
@ -1150,6 +1150,16 @@ void kdb_set_current_task(struct task_struct *p)
|
|||
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
|
||||
* 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,
|
|||
cmdptr = cmd_head;
|
||||
diag = kdb_parse(cmdbuf);
|
||||
if (diag == KDB_NOTFOUND) {
|
||||
drop_newline(cmdbuf);
|
||||
kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
|
||||
diag = 0;
|
||||
}
|
||||
|
@ -1566,6 +1577,7 @@ static int kdb_md(int argc, const char **argv)
|
|||
int symbolic = 0;
|
||||
int valid = 0;
|
||||
int phys = 0;
|
||||
int raw = 0;
|
||||
|
||||
kdbgetintenv("MDCOUNT", &mdcount);
|
||||
kdbgetintenv("RADIX", &radix);
|
||||
|
@ -1575,9 +1587,10 @@ static int kdb_md(int argc, const char **argv)
|
|||
repeat = mdcount * 16 / bytesperword;
|
||||
|
||||
if (strcmp(argv[0], "mdr") == 0) {
|
||||
if (argc != 2)
|
||||
if (argc == 2 || (argc == 0 && last_addr != 0))
|
||||
valid = raw = 1;
|
||||
else
|
||||
return KDB_ARGCOUNT;
|
||||
valid = 1;
|
||||
} else if (isdigit(argv[0][2])) {
|
||||
bytesperword = (int)(argv[0][2] - '0');
|
||||
if (bytesperword == 0) {
|
||||
|
@ -1613,7 +1626,10 @@ static int kdb_md(int argc, const char **argv)
|
|||
radix = last_radix;
|
||||
bytesperword = last_bytesperword;
|
||||
repeat = last_repeat;
|
||||
mdcount = ((repeat * bytesperword) + 15) / 16;
|
||||
if (raw)
|
||||
mdcount = repeat;
|
||||
else
|
||||
mdcount = ((repeat * bytesperword) + 15) / 16;
|
||||
}
|
||||
|
||||
if (argc) {
|
||||
|
@ -1630,7 +1646,10 @@ static int kdb_md(int argc, const char **argv)
|
|||
diag = kdbgetularg(argv[nextarg], &val);
|
||||
if (!diag) {
|
||||
mdcount = (int) val;
|
||||
repeat = mdcount * 16 / bytesperword;
|
||||
if (raw)
|
||||
repeat = mdcount;
|
||||
else
|
||||
repeat = mdcount * 16 / bytesperword;
|
||||
}
|
||||
}
|
||||
if (argc >= nextarg+1) {
|
||||
|
@ -1640,8 +1659,15 @@ static int kdb_md(int argc, const char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
if (strcmp(argv[0], "mdr") == 0)
|
||||
return kdb_mdr(addr, mdcount);
|
||||
if (strcmp(argv[0], "mdr") == 0) {
|
||||
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) {
|
||||
case 10:
|
||||
|
@ -2473,41 +2499,6 @@ static int kdb_kill(int argc, const char **argv)
|
|||
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().
|
||||
* 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)
|
|||
*/
|
||||
static void kdb_sysinfo(struct sysinfo *val)
|
||||
{
|
||||
struct timespec uptime;
|
||||
ktime_get_ts(&uptime);
|
||||
u64 uptime = ktime_get_mono_fast_ns();
|
||||
|
||||
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[1] = avenrun[1];
|
||||
val->loads[2] = avenrun[2];
|
||||
|
@ -2533,8 +2524,8 @@ static void kdb_sysinfo(struct sysinfo *val)
|
|||
*/
|
||||
static int kdb_summary(int argc, const char **argv)
|
||||
{
|
||||
struct timespec now;
|
||||
struct kdb_tm tm;
|
||||
time64_t now;
|
||||
struct tm tm;
|
||||
struct sysinfo val;
|
||||
|
||||
if (argc)
|
||||
|
@ -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("ccversion %s\n", __stringify(CCVERSION));
|
||||
|
||||
now = __current_kernel_time();
|
||||
kdb_gmtime(&now, &tm);
|
||||
kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d "
|
||||
now = __ktime_get_real_seconds();
|
||||
time64_to_tm(now, 0, &tm);
|
||||
kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
|
||||
"tz_minuteswest %d\n",
|
||||
1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec,
|
||||
|
|
|
@ -129,13 +129,13 @@ int kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
|
|||
}
|
||||
if (i >= ARRAY_SIZE(kdb_name_table)) {
|
||||
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]) *
|
||||
(ARRAY_SIZE(kdb_name_table)-1));
|
||||
} else {
|
||||
debug_kfree(knt1);
|
||||
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]) *
|
||||
(ARRAY_SIZE(kdb_name_table)-i-1));
|
||||
}
|
||||
|
|
|
@ -31,6 +31,4 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64 mask)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern time64_t __ktime_get_real_seconds(void);
|
||||
|
||||
#endif /* _TIMEKEEPING_INTERNAL_H */
|
||||
|
|
Loading…
Reference in New Issue