Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/kernel/debug/kdb/kdb_io.c
17237 views
1
/*
2
* Kernel Debugger Architecture Independent Console I/O handler
3
*
4
* This file is subject to the terms and conditions of the GNU General Public
5
* License. See the file "COPYING" in the main directory of this archive
6
* for more details.
7
*
8
* Copyright (c) 1999-2006 Silicon Graphics, Inc. All Rights Reserved.
9
* Copyright (c) 2009 Wind River Systems, Inc. All Rights Reserved.
10
*/
11
12
#include <linux/module.h>
13
#include <linux/types.h>
14
#include <linux/ctype.h>
15
#include <linux/kernel.h>
16
#include <linux/init.h>
17
#include <linux/kdev_t.h>
18
#include <linux/console.h>
19
#include <linux/string.h>
20
#include <linux/sched.h>
21
#include <linux/smp.h>
22
#include <linux/nmi.h>
23
#include <linux/delay.h>
24
#include <linux/kgdb.h>
25
#include <linux/kdb.h>
26
#include <linux/kallsyms.h>
27
#include "kdb_private.h"
28
29
#define CMD_BUFLEN 256
30
char kdb_prompt_str[CMD_BUFLEN];
31
32
int kdb_trap_printk;
33
34
static void kgdb_transition_check(char *buffer)
35
{
36
int slen = strlen(buffer);
37
if (strncmp(buffer, "$?#3f", slen) != 0 &&
38
strncmp(buffer, "$qSupported#37", slen) != 0 &&
39
strncmp(buffer, "+$qSupported#37", slen) != 0) {
40
KDB_STATE_SET(KGDB_TRANS);
41
kdb_printf("%s", buffer);
42
}
43
}
44
45
static int kdb_read_get_key(char *buffer, size_t bufsize)
46
{
47
#define ESCAPE_UDELAY 1000
48
#define ESCAPE_DELAY (2*1000000/ESCAPE_UDELAY) /* 2 seconds worth of udelays */
49
char escape_data[5]; /* longest vt100 escape sequence is 4 bytes */
50
char *ped = escape_data;
51
int escape_delay = 0;
52
get_char_func *f, *f_escape = NULL;
53
int key;
54
55
for (f = &kdb_poll_funcs[0]; ; ++f) {
56
if (*f == NULL) {
57
/* Reset NMI watchdog once per poll loop */
58
touch_nmi_watchdog();
59
f = &kdb_poll_funcs[0];
60
}
61
if (escape_delay == 2) {
62
*ped = '\0';
63
ped = escape_data;
64
--escape_delay;
65
}
66
if (escape_delay == 1) {
67
key = *ped++;
68
if (!*ped)
69
--escape_delay;
70
break;
71
}
72
key = (*f)();
73
if (key == -1) {
74
if (escape_delay) {
75
udelay(ESCAPE_UDELAY);
76
--escape_delay;
77
}
78
continue;
79
}
80
if (bufsize <= 2) {
81
if (key == '\r')
82
key = '\n';
83
*buffer++ = key;
84
*buffer = '\0';
85
return -1;
86
}
87
if (escape_delay == 0 && key == '\e') {
88
escape_delay = ESCAPE_DELAY;
89
ped = escape_data;
90
f_escape = f;
91
}
92
if (escape_delay) {
93
*ped++ = key;
94
if (f_escape != f) {
95
escape_delay = 2;
96
continue;
97
}
98
if (ped - escape_data == 1) {
99
/* \e */
100
continue;
101
} else if (ped - escape_data == 2) {
102
/* \e<something> */
103
if (key != '[')
104
escape_delay = 2;
105
continue;
106
} else if (ped - escape_data == 3) {
107
/* \e[<something> */
108
int mapkey = 0;
109
switch (key) {
110
case 'A': /* \e[A, up arrow */
111
mapkey = 16;
112
break;
113
case 'B': /* \e[B, down arrow */
114
mapkey = 14;
115
break;
116
case 'C': /* \e[C, right arrow */
117
mapkey = 6;
118
break;
119
case 'D': /* \e[D, left arrow */
120
mapkey = 2;
121
break;
122
case '1': /* dropthrough */
123
case '3': /* dropthrough */
124
/* \e[<1,3,4>], may be home, del, end */
125
case '4':
126
mapkey = -1;
127
break;
128
}
129
if (mapkey != -1) {
130
if (mapkey > 0) {
131
escape_data[0] = mapkey;
132
escape_data[1] = '\0';
133
}
134
escape_delay = 2;
135
}
136
continue;
137
} else if (ped - escape_data == 4) {
138
/* \e[<1,3,4><something> */
139
int mapkey = 0;
140
if (key == '~') {
141
switch (escape_data[2]) {
142
case '1': /* \e[1~, home */
143
mapkey = 1;
144
break;
145
case '3': /* \e[3~, del */
146
mapkey = 4;
147
break;
148
case '4': /* \e[4~, end */
149
mapkey = 5;
150
break;
151
}
152
}
153
if (mapkey > 0) {
154
escape_data[0] = mapkey;
155
escape_data[1] = '\0';
156
}
157
escape_delay = 2;
158
continue;
159
}
160
}
161
break; /* A key to process */
162
}
163
return key;
164
}
165
166
/*
167
* kdb_read
168
*
169
* This function reads a string of characters, terminated by
170
* a newline, or by reaching the end of the supplied buffer,
171
* from the current kernel debugger console device.
172
* Parameters:
173
* buffer - Address of character buffer to receive input characters.
174
* bufsize - size, in bytes, of the character buffer
175
* Returns:
176
* Returns a pointer to the buffer containing the received
177
* character string. This string will be terminated by a
178
* newline character.
179
* Locking:
180
* No locks are required to be held upon entry to this
181
* function. It is not reentrant - it relies on the fact
182
* that while kdb is running on only one "master debug" cpu.
183
* Remarks:
184
*
185
* The buffer size must be >= 2. A buffer size of 2 means that the caller only
186
* wants a single key.
187
*
188
* An escape key could be the start of a vt100 control sequence such as \e[D
189
* (left arrow) or it could be a character in its own right. The standard
190
* method for detecting the difference is to wait for 2 seconds to see if there
191
* are any other characters. kdb is complicated by the lack of a timer service
192
* (interrupts are off), by multiple input sources and by the need to sometimes
193
* return after just one key. Escape sequence processing has to be done as
194
* states in the polling loop.
195
*/
196
197
static char *kdb_read(char *buffer, size_t bufsize)
198
{
199
char *cp = buffer;
200
char *bufend = buffer+bufsize-2; /* Reserve space for newline
201
* and null byte */
202
char *lastchar;
203
char *p_tmp;
204
char tmp;
205
static char tmpbuffer[CMD_BUFLEN];
206
int len = strlen(buffer);
207
int len_tmp;
208
int tab = 0;
209
int count;
210
int i;
211
int diag, dtab_count;
212
int key;
213
214
215
diag = kdbgetintenv("DTABCOUNT", &dtab_count);
216
if (diag)
217
dtab_count = 30;
218
219
if (len > 0) {
220
cp += len;
221
if (*(buffer+len-1) == '\n')
222
cp--;
223
}
224
225
lastchar = cp;
226
*cp = '\0';
227
kdb_printf("%s", buffer);
228
poll_again:
229
key = kdb_read_get_key(buffer, bufsize);
230
if (key == -1)
231
return buffer;
232
if (key != 9)
233
tab = 0;
234
switch (key) {
235
case 8: /* backspace */
236
if (cp > buffer) {
237
if (cp < lastchar) {
238
memcpy(tmpbuffer, cp, lastchar - cp);
239
memcpy(cp-1, tmpbuffer, lastchar - cp);
240
}
241
*(--lastchar) = '\0';
242
--cp;
243
kdb_printf("\b%s \r", cp);
244
tmp = *cp;
245
*cp = '\0';
246
kdb_printf(kdb_prompt_str);
247
kdb_printf("%s", buffer);
248
*cp = tmp;
249
}
250
break;
251
case 13: /* enter */
252
*lastchar++ = '\n';
253
*lastchar++ = '\0';
254
kdb_printf("\n");
255
return buffer;
256
case 4: /* Del */
257
if (cp < lastchar) {
258
memcpy(tmpbuffer, cp+1, lastchar - cp - 1);
259
memcpy(cp, tmpbuffer, lastchar - cp - 1);
260
*(--lastchar) = '\0';
261
kdb_printf("%s \r", cp);
262
tmp = *cp;
263
*cp = '\0';
264
kdb_printf(kdb_prompt_str);
265
kdb_printf("%s", buffer);
266
*cp = tmp;
267
}
268
break;
269
case 1: /* Home */
270
if (cp > buffer) {
271
kdb_printf("\r");
272
kdb_printf(kdb_prompt_str);
273
cp = buffer;
274
}
275
break;
276
case 5: /* End */
277
if (cp < lastchar) {
278
kdb_printf("%s", cp);
279
cp = lastchar;
280
}
281
break;
282
case 2: /* Left */
283
if (cp > buffer) {
284
kdb_printf("\b");
285
--cp;
286
}
287
break;
288
case 14: /* Down */
289
memset(tmpbuffer, ' ',
290
strlen(kdb_prompt_str) + (lastchar-buffer));
291
*(tmpbuffer+strlen(kdb_prompt_str) +
292
(lastchar-buffer)) = '\0';
293
kdb_printf("\r%s\r", tmpbuffer);
294
*lastchar = (char)key;
295
*(lastchar+1) = '\0';
296
return lastchar;
297
case 6: /* Right */
298
if (cp < lastchar) {
299
kdb_printf("%c", *cp);
300
++cp;
301
}
302
break;
303
case 16: /* Up */
304
memset(tmpbuffer, ' ',
305
strlen(kdb_prompt_str) + (lastchar-buffer));
306
*(tmpbuffer+strlen(kdb_prompt_str) +
307
(lastchar-buffer)) = '\0';
308
kdb_printf("\r%s\r", tmpbuffer);
309
*lastchar = (char)key;
310
*(lastchar+1) = '\0';
311
return lastchar;
312
case 9: /* Tab */
313
if (tab < 2)
314
++tab;
315
p_tmp = buffer;
316
while (*p_tmp == ' ')
317
p_tmp++;
318
if (p_tmp > cp)
319
break;
320
memcpy(tmpbuffer, p_tmp, cp-p_tmp);
321
*(tmpbuffer + (cp-p_tmp)) = '\0';
322
p_tmp = strrchr(tmpbuffer, ' ');
323
if (p_tmp)
324
++p_tmp;
325
else
326
p_tmp = tmpbuffer;
327
len = strlen(p_tmp);
328
count = kallsyms_symbol_complete(p_tmp,
329
sizeof(tmpbuffer) -
330
(p_tmp - tmpbuffer));
331
if (tab == 2 && count > 0) {
332
kdb_printf("\n%d symbols are found.", count);
333
if (count > dtab_count) {
334
count = dtab_count;
335
kdb_printf(" But only first %d symbols will"
336
" be printed.\nYou can change the"
337
" environment variable DTABCOUNT.",
338
count);
339
}
340
kdb_printf("\n");
341
for (i = 0; i < count; i++) {
342
if (kallsyms_symbol_next(p_tmp, i) < 0)
343
break;
344
kdb_printf("%s ", p_tmp);
345
*(p_tmp + len) = '\0';
346
}
347
if (i >= dtab_count)
348
kdb_printf("...");
349
kdb_printf("\n");
350
kdb_printf(kdb_prompt_str);
351
kdb_printf("%s", buffer);
352
} else if (tab != 2 && count > 0) {
353
len_tmp = strlen(p_tmp);
354
strncpy(p_tmp+len_tmp, cp, lastchar-cp+1);
355
len_tmp = strlen(p_tmp);
356
strncpy(cp, p_tmp+len, len_tmp-len + 1);
357
len = len_tmp - len;
358
kdb_printf("%s", cp);
359
cp += len;
360
lastchar += len;
361
}
362
kdb_nextline = 1; /* reset output line number */
363
break;
364
default:
365
if (key >= 32 && lastchar < bufend) {
366
if (cp < lastchar) {
367
memcpy(tmpbuffer, cp, lastchar - cp);
368
memcpy(cp+1, tmpbuffer, lastchar - cp);
369
*++lastchar = '\0';
370
*cp = key;
371
kdb_printf("%s\r", cp);
372
++cp;
373
tmp = *cp;
374
*cp = '\0';
375
kdb_printf(kdb_prompt_str);
376
kdb_printf("%s", buffer);
377
*cp = tmp;
378
} else {
379
*++lastchar = '\0';
380
*cp++ = key;
381
/* The kgdb transition check will hide
382
* printed characters if we think that
383
* kgdb is connecting, until the check
384
* fails */
385
if (!KDB_STATE(KGDB_TRANS))
386
kgdb_transition_check(buffer);
387
else
388
kdb_printf("%c", key);
389
}
390
/* Special escape to kgdb */
391
if (lastchar - buffer >= 5 &&
392
strcmp(lastchar - 5, "$?#3f") == 0) {
393
strcpy(buffer, "kgdb");
394
KDB_STATE_SET(DOING_KGDB);
395
return buffer;
396
}
397
if (lastchar - buffer >= 14 &&
398
strcmp(lastchar - 14, "$qSupported#37") == 0) {
399
strcpy(buffer, "kgdb");
400
KDB_STATE_SET(DOING_KGDB2);
401
return buffer;
402
}
403
}
404
break;
405
}
406
goto poll_again;
407
}
408
409
/*
410
* kdb_getstr
411
*
412
* Print the prompt string and read a command from the
413
* input device.
414
*
415
* Parameters:
416
* buffer Address of buffer to receive command
417
* bufsize Size of buffer in bytes
418
* prompt Pointer to string to use as prompt string
419
* Returns:
420
* Pointer to command buffer.
421
* Locking:
422
* None.
423
* Remarks:
424
* For SMP kernels, the processor number will be
425
* substituted for %d, %x or %o in the prompt.
426
*/
427
428
char *kdb_getstr(char *buffer, size_t bufsize, char *prompt)
429
{
430
if (prompt && kdb_prompt_str != prompt)
431
strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
432
kdb_printf(kdb_prompt_str);
433
kdb_nextline = 1; /* Prompt and input resets line number */
434
return kdb_read(buffer, bufsize);
435
}
436
437
/*
438
* kdb_input_flush
439
*
440
* Get rid of any buffered console input.
441
*
442
* Parameters:
443
* none
444
* Returns:
445
* nothing
446
* Locking:
447
* none
448
* Remarks:
449
* Call this function whenever you want to flush input. If there is any
450
* outstanding input, it ignores all characters until there has been no
451
* data for approximately 1ms.
452
*/
453
454
static void kdb_input_flush(void)
455
{
456
get_char_func *f;
457
int res;
458
int flush_delay = 1;
459
while (flush_delay) {
460
flush_delay--;
461
empty:
462
touch_nmi_watchdog();
463
for (f = &kdb_poll_funcs[0]; *f; ++f) {
464
res = (*f)();
465
if (res != -1) {
466
flush_delay = 1;
467
goto empty;
468
}
469
}
470
if (flush_delay)
471
mdelay(1);
472
}
473
}
474
475
/*
476
* kdb_printf
477
*
478
* Print a string to the output device(s).
479
*
480
* Parameters:
481
* printf-like format and optional args.
482
* Returns:
483
* 0
484
* Locking:
485
* None.
486
* Remarks:
487
* use 'kdbcons->write()' to avoid polluting 'log_buf' with
488
* kdb output.
489
*
490
* If the user is doing a cmd args | grep srch
491
* then kdb_grepping_flag is set.
492
* In that case we need to accumulate full lines (ending in \n) before
493
* searching for the pattern.
494
*/
495
496
static char kdb_buffer[256]; /* A bit too big to go on stack */
497
static char *next_avail = kdb_buffer;
498
static int size_avail;
499
static int suspend_grep;
500
501
/*
502
* search arg1 to see if it contains arg2
503
* (kdmain.c provides flags for ^pat and pat$)
504
*
505
* return 1 for found, 0 for not found
506
*/
507
static int kdb_search_string(char *searched, char *searchfor)
508
{
509
char firstchar, *cp;
510
int len1, len2;
511
512
/* not counting the newline at the end of "searched" */
513
len1 = strlen(searched)-1;
514
len2 = strlen(searchfor);
515
if (len1 < len2)
516
return 0;
517
if (kdb_grep_leading && kdb_grep_trailing && len1 != len2)
518
return 0;
519
if (kdb_grep_leading) {
520
if (!strncmp(searched, searchfor, len2))
521
return 1;
522
} else if (kdb_grep_trailing) {
523
if (!strncmp(searched+len1-len2, searchfor, len2))
524
return 1;
525
} else {
526
firstchar = *searchfor;
527
cp = searched;
528
while ((cp = strchr(cp, firstchar))) {
529
if (!strncmp(cp, searchfor, len2))
530
return 1;
531
cp++;
532
}
533
}
534
return 0;
535
}
536
537
int vkdb_printf(const char *fmt, va_list ap)
538
{
539
int diag;
540
int linecount;
541
int logging, saved_loglevel = 0;
542
int saved_trap_printk;
543
int got_printf_lock = 0;
544
int retlen = 0;
545
int fnd, len;
546
char *cp, *cp2, *cphold = NULL, replaced_byte = ' ';
547
char *moreprompt = "more> ";
548
struct console *c = console_drivers;
549
static DEFINE_SPINLOCK(kdb_printf_lock);
550
unsigned long uninitialized_var(flags);
551
552
preempt_disable();
553
saved_trap_printk = kdb_trap_printk;
554
kdb_trap_printk = 0;
555
556
/* Serialize kdb_printf if multiple cpus try to write at once.
557
* But if any cpu goes recursive in kdb, just print the output,
558
* even if it is interleaved with any other text.
559
*/
560
if (!KDB_STATE(PRINTF_LOCK)) {
561
KDB_STATE_SET(PRINTF_LOCK);
562
spin_lock_irqsave(&kdb_printf_lock, flags);
563
got_printf_lock = 1;
564
atomic_inc(&kdb_event);
565
} else {
566
__acquire(kdb_printf_lock);
567
}
568
569
diag = kdbgetintenv("LINES", &linecount);
570
if (diag || linecount <= 1)
571
linecount = 24;
572
573
diag = kdbgetintenv("LOGGING", &logging);
574
if (diag)
575
logging = 0;
576
577
if (!kdb_grepping_flag || suspend_grep) {
578
/* normally, every vsnprintf starts a new buffer */
579
next_avail = kdb_buffer;
580
size_avail = sizeof(kdb_buffer);
581
}
582
vsnprintf(next_avail, size_avail, fmt, ap);
583
584
/*
585
* If kdb_parse() found that the command was cmd xxx | grep yyy
586
* then kdb_grepping_flag is set, and kdb_grep_string contains yyy
587
*
588
* Accumulate the print data up to a newline before searching it.
589
* (vsnprintf does null-terminate the string that it generates)
590
*/
591
592
/* skip the search if prints are temporarily unconditional */
593
if (!suspend_grep && kdb_grepping_flag) {
594
cp = strchr(kdb_buffer, '\n');
595
if (!cp) {
596
/*
597
* Special cases that don't end with newlines
598
* but should be written without one:
599
* The "[nn]kdb> " prompt should
600
* appear at the front of the buffer.
601
*
602
* The "[nn]more " prompt should also be
603
* (MOREPROMPT -> moreprompt)
604
* written * but we print that ourselves,
605
* we set the suspend_grep flag to make
606
* it unconditional.
607
*
608
*/
609
if (next_avail == kdb_buffer) {
610
/*
611
* these should occur after a newline,
612
* so they will be at the front of the
613
* buffer
614
*/
615
cp2 = kdb_buffer;
616
len = strlen(kdb_prompt_str);
617
if (!strncmp(cp2, kdb_prompt_str, len)) {
618
/*
619
* We're about to start a new
620
* command, so we can go back
621
* to normal mode.
622
*/
623
kdb_grepping_flag = 0;
624
goto kdb_printit;
625
}
626
}
627
/* no newline; don't search/write the buffer
628
until one is there */
629
len = strlen(kdb_buffer);
630
next_avail = kdb_buffer + len;
631
size_avail = sizeof(kdb_buffer) - len;
632
goto kdb_print_out;
633
}
634
635
/*
636
* The newline is present; print through it or discard
637
* it, depending on the results of the search.
638
*/
639
cp++; /* to byte after the newline */
640
replaced_byte = *cp; /* remember what/where it was */
641
cphold = cp;
642
*cp = '\0'; /* end the string for our search */
643
644
/*
645
* We now have a newline at the end of the string
646
* Only continue with this output if it contains the
647
* search string.
648
*/
649
fnd = kdb_search_string(kdb_buffer, kdb_grep_string);
650
if (!fnd) {
651
/*
652
* At this point the complete line at the start
653
* of kdb_buffer can be discarded, as it does
654
* not contain what the user is looking for.
655
* Shift the buffer left.
656
*/
657
*cphold = replaced_byte;
658
strcpy(kdb_buffer, cphold);
659
len = strlen(kdb_buffer);
660
next_avail = kdb_buffer + len;
661
size_avail = sizeof(kdb_buffer) - len;
662
goto kdb_print_out;
663
}
664
/*
665
* at this point the string is a full line and
666
* should be printed, up to the null.
667
*/
668
}
669
kdb_printit:
670
671
/*
672
* Write to all consoles.
673
*/
674
retlen = strlen(kdb_buffer);
675
if (!dbg_kdb_mode && kgdb_connected) {
676
gdbstub_msg_write(kdb_buffer, retlen);
677
} else {
678
if (!dbg_io_ops->is_console) {
679
len = strlen(kdb_buffer);
680
cp = kdb_buffer;
681
while (len--) {
682
dbg_io_ops->write_char(*cp);
683
cp++;
684
}
685
}
686
while (c) {
687
c->write(c, kdb_buffer, retlen);
688
touch_nmi_watchdog();
689
c = c->next;
690
}
691
}
692
if (logging) {
693
saved_loglevel = console_loglevel;
694
console_loglevel = 0;
695
printk(KERN_INFO "%s", kdb_buffer);
696
}
697
698
if (KDB_STATE(PAGER) && strchr(kdb_buffer, '\n'))
699
kdb_nextline++;
700
701
/* check for having reached the LINES number of printed lines */
702
if (kdb_nextline == linecount) {
703
char buf1[16] = "";
704
#if defined(CONFIG_SMP)
705
char buf2[32];
706
#endif
707
708
/* Watch out for recursion here. Any routine that calls
709
* kdb_printf will come back through here. And kdb_read
710
* uses kdb_printf to echo on serial consoles ...
711
*/
712
kdb_nextline = 1; /* In case of recursion */
713
714
/*
715
* Pause until cr.
716
*/
717
moreprompt = kdbgetenv("MOREPROMPT");
718
if (moreprompt == NULL)
719
moreprompt = "more> ";
720
721
#if defined(CONFIG_SMP)
722
if (strchr(moreprompt, '%')) {
723
sprintf(buf2, moreprompt, get_cpu());
724
put_cpu();
725
moreprompt = buf2;
726
}
727
#endif
728
729
kdb_input_flush();
730
c = console_drivers;
731
732
if (!dbg_io_ops->is_console) {
733
len = strlen(moreprompt);
734
cp = moreprompt;
735
while (len--) {
736
dbg_io_ops->write_char(*cp);
737
cp++;
738
}
739
}
740
while (c) {
741
c->write(c, moreprompt, strlen(moreprompt));
742
touch_nmi_watchdog();
743
c = c->next;
744
}
745
746
if (logging)
747
printk("%s", moreprompt);
748
749
kdb_read(buf1, 2); /* '2' indicates to return
750
* immediately after getting one key. */
751
kdb_nextline = 1; /* Really set output line 1 */
752
753
/* empty and reset the buffer: */
754
kdb_buffer[0] = '\0';
755
next_avail = kdb_buffer;
756
size_avail = sizeof(kdb_buffer);
757
if ((buf1[0] == 'q') || (buf1[0] == 'Q')) {
758
/* user hit q or Q */
759
KDB_FLAG_SET(CMD_INTERRUPT); /* command interrupted */
760
KDB_STATE_CLEAR(PAGER);
761
/* end of command output; back to normal mode */
762
kdb_grepping_flag = 0;
763
kdb_printf("\n");
764
} else if (buf1[0] == ' ') {
765
kdb_printf("\n");
766
suspend_grep = 1; /* for this recursion */
767
} else if (buf1[0] == '\n') {
768
kdb_nextline = linecount - 1;
769
kdb_printf("\r");
770
suspend_grep = 1; /* for this recursion */
771
} else if (buf1[0] && buf1[0] != '\n') {
772
/* user hit something other than enter */
773
suspend_grep = 1; /* for this recursion */
774
kdb_printf("\nOnly 'q' or 'Q' are processed at more "
775
"prompt, input ignored\n");
776
} else if (kdb_grepping_flag) {
777
/* user hit enter */
778
suspend_grep = 1; /* for this recursion */
779
kdb_printf("\n");
780
}
781
kdb_input_flush();
782
}
783
784
/*
785
* For grep searches, shift the printed string left.
786
* replaced_byte contains the character that was overwritten with
787
* the terminating null, and cphold points to the null.
788
* Then adjust the notion of available space in the buffer.
789
*/
790
if (kdb_grepping_flag && !suspend_grep) {
791
*cphold = replaced_byte;
792
strcpy(kdb_buffer, cphold);
793
len = strlen(kdb_buffer);
794
next_avail = kdb_buffer + len;
795
size_avail = sizeof(kdb_buffer) - len;
796
}
797
798
kdb_print_out:
799
suspend_grep = 0; /* end of what may have been a recursive call */
800
if (logging)
801
console_loglevel = saved_loglevel;
802
if (KDB_STATE(PRINTF_LOCK) && got_printf_lock) {
803
got_printf_lock = 0;
804
spin_unlock_irqrestore(&kdb_printf_lock, flags);
805
KDB_STATE_CLEAR(PRINTF_LOCK);
806
atomic_dec(&kdb_event);
807
} else {
808
__release(kdb_printf_lock);
809
}
810
kdb_trap_printk = saved_trap_printk;
811
preempt_enable();
812
return retlen;
813
}
814
815
int kdb_printf(const char *fmt, ...)
816
{
817
va_list ap;
818
int r;
819
820
va_start(ap, fmt);
821
r = vkdb_printf(fmt, ap);
822
va_end(ap);
823
824
return r;
825
}
826
EXPORT_SYMBOL_GPL(kdb_printf);
827
828