This source file includes following definitions.
- db_force_whitespace
- db_more
- db_putchar
- db_print_position
- db_end_line
- db_format
- db_stack_dump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <sys/param.h>
34 #include <sys/proc.h>
35 #include <sys/stdarg.h>
36 #include <sys/systm.h>
37
38 #include <dev/cons.h>
39
40 #include <uvm/uvm_extern.h>
41
42 #include <machine/db_machdep.h>
43
44 #include <ddb/db_command.h>
45 #include <ddb/db_output.h>
46 #include <ddb/db_interface.h>
47 #include <ddb/db_sym.h>
48 #include <ddb/db_var.h>
49 #include <ddb/db_extern.h>
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 #ifndef DB_MAX_LINE
65 #define DB_MAX_LINE 24
66 #define DB_MAX_WIDTH 80
67 #endif
68
69 #define DB_MIN_MAX_WIDTH 20
70 #define DB_MIN_MAX_LINE 3
71 #define CTRL(c) ((c) & 0xff)
72
73 int db_output_position = 0;
74 int db_output_line = 0;
75 int db_last_non_space = 0;
76 int db_tab_stop_width = 8;
77 #define NEXT_TAB(i) \
78 ((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
79 int db_max_line = DB_MAX_LINE;
80 int db_max_width = DB_MAX_WIDTH;
81 int db_radix = 16;
82
83 static void db_more(void);
84
85
86
87
88 void
89 db_force_whitespace(void)
90 {
91 int last_print, next_tab;
92
93 last_print = db_last_non_space;
94 while (last_print < db_output_position) {
95 next_tab = NEXT_TAB(last_print);
96 if (next_tab <= db_output_position) {
97 while (last_print < next_tab) {
98 cnputc(' ');
99 last_print++;
100 }
101 }
102 else {
103 cnputc(' ');
104 last_print++;
105 }
106 }
107 db_last_non_space = db_output_position;
108 }
109
110 static void
111 db_more(void)
112 {
113 char *p;
114 int quit_output = 0;
115
116 for (p = "--db_more--"; *p; p++)
117 cnputc(*p);
118 switch(cngetc()) {
119 case ' ':
120 db_output_line = 0;
121 break;
122 case 'q':
123 case CTRL('c'):
124 db_output_line = 0;
125 quit_output = 1;
126 break;
127 default:
128 db_output_line--;
129 break;
130 }
131 p = "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b";
132 while (*p)
133 cnputc(*p++);
134 if (quit_output) {
135 db_error(0);
136
137 }
138 }
139
140
141
142
143 void
144 db_putchar(int c)
145 {
146 if (db_max_line >= DB_MIN_MAX_LINE && db_output_line >= db_max_line-1)
147 db_more();
148
149 if (c > ' ' && c <= '~') {
150
151
152
153
154
155 db_force_whitespace();
156 cnputc(c);
157 db_output_position++;
158 if (db_max_width >= DB_MIN_MAX_WIDTH
159 && db_output_position >= db_max_width-1) {
160
161 cnputc('\n');
162 db_output_position = 0;
163 db_last_non_space = 0;
164 db_output_line++;
165 }
166 db_last_non_space = db_output_position;
167 }
168 else if (c == '\n') {
169
170 cnputc(c);
171 db_output_position = 0;
172 db_last_non_space = 0;
173 db_output_line++;
174 }
175 else if (c == '\t') {
176
177 db_output_position = NEXT_TAB(db_output_position);
178 }
179 else if (c == ' ') {
180
181 db_output_position++;
182 }
183 else if (c == '\007') {
184
185 cnputc(c);
186 }
187
188 }
189
190
191
192
193 int
194 db_print_position(void)
195 {
196 return (db_output_position);
197 }
198
199
200
201
202 void
203 db_end_line(int space)
204 {
205 if (db_output_position >= db_max_width - space)
206 db_printf("\n");
207 }
208
209 char *
210 db_format(char *buf, size_t bufsize, long val, int format, int alt, int width)
211 {
212 const char *fmt;
213
214 if (format == DB_FORMAT_Z || db_radix == 16)
215 fmt = alt ? "-%#*lx" : "-%*lx";
216 else if (db_radix == 8)
217 fmt = alt ? "-%#*lo" : "-%*lo";
218 else
219 fmt = alt ? "-%#*lu" : "-%*lu";
220
221
222 if (val < 0 && format != DB_FORMAT_N)
223 val = -val;
224 else
225 fmt++;
226
227 snprintf(buf, bufsize, fmt, width, val);
228
229 return (buf);
230 }
231
232 void
233 db_stack_dump(void)
234 {
235 static int intrace;
236
237 if (intrace) {
238 printf("Faulted in traceback, aborting...\n");
239 return;
240 }
241
242 intrace = 1;
243 printf("Starting stack trace...\n");
244 db_stack_trace_print((db_expr_t)__builtin_frame_address(0), TRUE,
245 256 , "", printf);
246 printf("End of stack trace.\n");
247 intrace = 0;
248 }