]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.suse/kdb-common
Add a patch to fix Intel E100 wake-on-lan problems.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.suse / kdb-common
1 From: SGI KDB Development <kdb@oss.sgi.com>
2 Subject: kdb-v4.4-2.6.27-rc8-common-1.1
3 References: FATE#303971
4 X-URL: ftp://oss.sgi.com/www/projects/kdb/download/v4.4/
5
6 The KDB common code.
7
8 Acked-by: Bernhard Walle <bwalle@suse.de>
9
10 ---
11 Documentation/kdb/bt_x86 | 1837 ++++++++
12 Documentation/kdb/kdb.mm | 492 ++
13 Documentation/kdb/kdb_bp.man | 197
14 Documentation/kdb/kdb_bt.man | 315 +
15 Documentation/kdb/kdb_env.man | 46
16 Documentation/kdb/kdb_ll.man | 134
17 Documentation/kdb/kdb_md.man | 136
18 Documentation/kdb/kdb_ps.man | 96
19 Documentation/kdb/kdb_rd.man | 170
20 Documentation/kdb/kdb_sr.man | 68
21 Documentation/kdb/kdb_ss.man | 109
22 Documentation/kdb/slides | 1382 ++++++
23 Makefile | 1
24 drivers/char/keyboard.c | 10
25 drivers/hid/usbhid/hid-core.c | 28
26 drivers/hid/usbhid/usbkbd.c | 17
27 drivers/serial/8250.c | 53
28 drivers/serial/8250_early.c | 29
29 drivers/serial/sn_console.c | 73
30 drivers/usb/core/hcd.c | 14
31 drivers/usb/core/hcd.h | 4
32 drivers/usb/host/ehci-hcd.c | 42
33 drivers/usb/host/ehci-pci.c | 8
34 drivers/usb/host/ehci-q.c | 222 +
35 drivers/usb/host/ohci-hcd.c | 67
36 drivers/usb/host/ohci-pci.c | 8
37 drivers/usb/host/ohci-q.c | 62
38 fs/proc/mmu.c | 16
39 fs/proc/proc_misc.c | 114
40 include/linux/console.h | 5
41 include/linux/dis-asm.h | 347 +
42 include/linux/kdb.h | 175
43 include/linux/kdbprivate.h | 503 ++
44 include/linux/reboot.h | 7
45 include/linux/sysctl.h | 1
46 init/main.c | 32
47 kdb/ChangeLog | 2012 +++++++++
48 kdb/Makefile | 43
49 kdb/kdb_bp.c | 658 +++
50 kdb/kdb_bt.c | 180
51 kdb/kdb_cmds | 32
52 kdb/kdb_id.c | 236 +
53 kdb/kdb_io.c | 856 ++++
54 kdb/kdbdereference.c | 7257 ++++++++++++++++++++++++++++++++++
55 kdb/kdbmain.c | 4333 ++++++++++++++++++++
56 kdb/kdbsupport.c | 1154 +++++
57 kdb/modules/Makefile | 14
58 kdb/modules/kdbm_debugtypes.c | 388 +
59 kdb/modules/kdbm_pg.c | 688 +++
60 kdb/modules/kdbm_sched.c | 57
61 kdb/modules/kdbm_task.c | 205
62 kdb/modules/kdbm_vm.c | 1036 ++++
63 kdb/modules/kdbm_x86.c | 1093 +++++
64 kdb/modules/lcrash/README | 3
65 kdb/modules/lcrash/asm/README | 1
66 kdb/modules/lcrash/asm/kl_dump_ia64.h | 199
67 kdb/modules/lcrash/asm/kl_types.h | 48
68 kdb/modules/lcrash/kl_alloc.h | 124
69 kdb/modules/lcrash/kl_bfd.h | 31
70 kdb/modules/lcrash/kl_btnode.h | 95
71 kdb/modules/lcrash/kl_cmp.h | 102
72 kdb/modules/lcrash/kl_copt.h | 29
73 kdb/modules/lcrash/kl_debug.h | 168
74 kdb/modules/lcrash/kl_dump.h | 511 ++
75 kdb/modules/lcrash/kl_dump_arch.h | 124
76 kdb/modules/lcrash/kl_dump_ia64.h | 199
77 kdb/modules/lcrash/kl_dwarfs.h | 27
78 kdb/modules/lcrash/kl_error.h | 266 +
79 kdb/modules/lcrash/kl_htnode.h | 71
80 kdb/modules/lcrash/kl_lib.h | 65
81 kdb/modules/lcrash/kl_libutil.h | 40
82 kdb/modules/lcrash/kl_mem.h | 104
83 kdb/modules/lcrash/kl_mem_ia64.h | 149
84 kdb/modules/lcrash/kl_module.h | 69
85 kdb/modules/lcrash/kl_queue.h | 89
86 kdb/modules/lcrash/kl_stabs.h | 122
87 kdb/modules/lcrash/kl_stringtab.h | 68
88 kdb/modules/lcrash/kl_sym.h | 131
89 kdb/modules/lcrash/kl_task.h | 39
90 kdb/modules/lcrash/kl_typeinfo.h | 199
91 kdb/modules/lcrash/kl_types.h | 54
92 kdb/modules/lcrash/klib.h | 480 ++
93 kdb/modules/lcrash/lc_eval.h | 225 +
94 kernel/exit.c | 3
95 kernel/kallsyms.c | 22
96 kernel/kexec.c | 16
97 kernel/module.c | 19
98 kernel/panic.c | 8
99 kernel/printk.c | 14
100 kernel/sched.c | 93
101 kernel/signal.c | 49
102 kernel/sysctl_check.c | 1
103 lib/bug.c | 8
104 mm/hugetlb.c | 22
105 mm/mmzone.c | 4
106 mm/swapfile.c | 22
107 96 files changed, 31168 insertions(+), 7 deletions(-)
108
109 --- /dev/null
110 +++ b/Documentation/kdb/bt_x86
111 @@ -0,0 +1,1837 @@
112 +Copyright Keith Owens, 2007.
113 +
114 +How the KDB backtrace for x86 works, how to diagnose problems and submit a bug
115 +==============================================================================
116 +
117 +Unlike ia64, x86 architectures do not mandate unwind information in the kernel.
118 +gcc will include some unwind information for C functions, but not for assembler
119 +code. Attempts have been made to add unwind information to the assembler code
120 +by hand, with little success. Eventually Linus rejected the x86 unwind code
121 +because it was breaking too often and destroying useful debugging data.
122 +
123 +Even if the x86 unwinder worked correctly, it would only give an accurate
124 +backtrace, it would not give function arguments. Needless to say, function
125 +arguments are what people really want. To get function arguments requires much
126 +more support from the compiler than simple unwind data, the compiler has to
127 +track line by line where each argument is held and make that data available to
128 +the debugger. Compiling with gcc -g will provide that information, but the
129 +resulting kernel is several times larger than normal.
130 +
131 +Although the gcc -g data can be stored on another machine, there are constructs
132 +in the kernel that cannot be tracked by this method. i386 builds with 4K stacks
133 +and all x86_64 builds have multiple kernel stacks. The compiler knows nothing
134 +about these extra stacks and cannot backtrace through them correctly. The
135 +assembler code in arch/{i386,x86_64}/kernel/entry.S is a maze of twisty logic
136 +paths, some of which eventually jump to common labels. Describing this twisty
137 +logic to an unwinder is very difficult, expecially when you try to describe
138 +where arguments and/or registers are held).
139 +
140 +KDB gets an accurate x86 backtrace and extracts the arguments by performing code
141 +decomposition and analysis at run time. This avoids the need to bloat the
142 +running kernel to several times its normal size with gcc -g data. KDB (unlike
143 +gdb) also knows about the additional kernel stacks and twisty assembler code
144 +paths.
145 +
146 +The x86 backtrace code for i386 is very similar to the x86_64 code, with 80%
147 +common code and data. Most of the differences between the backtrace for the two
148 +architectures is due to the assembler code and stack handling. To avoid code
149 +duplication between KDB patches, the x86 backtrace code is actually stored in
150 +the kdb common patch, in source kdb/kdba_bt_x86.c. kdb/Makefile only builds
151 +kdba_bt_x86.o for i386 or x86_64. Most of the code reads as if the architecture
152 +is x86_64, using register names like rsp and rip. i386 is treated as a subset
153 +of x86_64, with fewer registers and printing the names as esp and eip. When
154 +this documentation refers to rsp and rip, read it as esp and eip for i386. The
155 +20% of code and data that is different in held in two large #ifdef sections,
156 +scan kdba_bt_x86.c for CONFIG_X86_64. Be careful when changing anything in the
157 +architecture specific sections, you will need to review the other architecture
158 +to see if it needs changes as well.
159 +
160 +The idea behind the x86 backtrace is to trace one function at a time, which
161 +gives us the calling function. Then apply the same algorithm to the calling
162 +function until you unwind to the first function in the process. The starting
163 +point for tracing any process is to extract the current stack pointer and
164 +current instruction pointer (rsp and rip). The way that these values are
165 +extracted varies between running tasks and blocked tasks, the method is
166 +described later (Process Starting Point) but ignore it for now, just assume that
167 +we have a starting rsp and rip.
168 +
169 +Given the instruction pointer (rip), we identify the start and end of the kernel
170 +or module function it is in, using the kernel symbol table. This is easy for C
171 +code, it is significantly harder for assembler code because of the twisty code
172 +paths that branch to common labels. The method of identifying the current
173 +function is described later (Identifying The Current Function) but ignore it for
174 +now, just assumes that we have the start and end address of the function plus
175 +its name.
176 +
177 +After the rip has been mapped to a function name with sensible start and end
178 +addresses, the next step is to analyse the code paths in that function. KDB
179 +already has a built in disassembler (copied with slight modifications from
180 +binutils) which knows how to decode each x86 instruction. Instead of
181 +duplicating that logic in kdba_bt_x86, it takes advantage of the fact that you
182 +can override the disassembler's print function, sending the output line to a
183 +buffer instead of printing it. kdba_bt_x86 stills has to decode the buffer but
184 +that is a lot easier than decoding the x86 instruction set.
185 +
186 +The code analysis consists of two main passes. There are example below of the
187 +analysis with basic block (bb) debugging activated (Examples of Basic Block
188 +Debugging Output).
189 +
190 +The first pass (bb_pass1) identifies all the basic blocks in the function. For
191 +our purposes, a basic block has a single entry point and one or more exit
192 +points. The start of the function is the start of basic block 0, all other
193 +blocks are the target of jump instructions (conditional or unconditional) from
194 +within the rest of the code. A block ends with an unconditional jump or with a
195 +terminating instruction such as ret, iret, sysexit, sysret or ud2a (BUG). A
196 +block can also end because the next instruction is the start of a new block
197 +(target of jmp or jcc), in this case there is an implied drop through from one
198 +block to the next.
199 +
200 +Although a call instruction also transfers control, it returns to the next
201 +instruction so call is not treated as a transfer. Instead call is treated as a
202 +normal instruction with side effects, the scratch registers are cleared after a
203 +call.
204 +
205 +At the end of the first pass over the function we have a directed graph that
206 +starts at bb[0]. The nodes of the graph (bb_list[]) are the basic blocks with
207 +their start and end address. The vertices are the jmp or jcc instructions
208 +(bb_jmp_list[]) that transfer control between blocks, plus any implied drop
209 +through transfers between consecutive blocks. This graph can have cycles, many
210 +functions have loops in them which transfer control back to earlier in the code
211 +body.
212 +
213 +The second pass (bb_pass2) runs over the directed graph analysing the effect of
214 +each instruction on the register and memory state. It is important to
215 +understand that the analysis in this pass is an abstract one, it does not use
216 +actual hex values for the register contents, instead it uses symbolic values.
217 +When the basic block code says that "register rsi contains value rax" it means
218 +that whatever value was in rax on entry to the function has also been copied to
219 +register rsi at this point in the logic flow.
220 +
221 +At an abstract level, all C functions start with exactly the same state, each
222 +register contains its own symbolic value (except for the stack pointer, see
223 +later) with no local stack variables defined yet. Assembler functions tend to
224 +have unusual starting points, with some registers and/or memory contents defined
225 +differently on entry. For example, ret_from_intr on i386 already has a struct
226 +pt_regs on its stack, ret_from_intr on x86_64 already has a partial struct
227 +pt_regs plus another two words stacked on top of it. The special starting cases
228 +are listed in the arch specific bb_special_cases[].
229 +
230 +Once the input state of bb[0] has been defined (including any special cases),
231 +bb_pass2_do_changed_blocks() runs over all the nodes in bb_list[]. Each
232 +instruction in each block is analysed (Tracking the Effects of Instructions) to
233 +see what effect it has on the abstract register state, the analysis of each
234 +instruction is done in bb_usage(). An instruction can copy one register to
235 +another, it can copy a register to stack, move from stack to a register or it
236 +can invalidate the contents of a register or memory location. A general rule in
237 +bb_usage() is that any operation whose results cannot be calculated in terms of
238 +an original input value gives an undefined result. Remember that it is the
239 +abstract value that becomes undefined, moving a constant to a register gives a
240 +defined value for the view of the program but it is undefined as far as the
241 +abstract state is concerned.
242 +
243 +References to data on the stack are a little awkward because the stack pointer
244 +frequently changes. To overcome this, kdba_bt_x86 defines a pseudo register
245 +called the 'original stack pointer' (osp). This always represents the stack
246 +pointer on entry to the function, so on entry rsp contains osp+0x0. As rsp is
247 +modified, it still points at osp, but its offset from osp changes. Copying rsp
248 +to another register (e.g. mov %rsp,%rbp) copies the osp offset as well. At the
249 +point that this function calls the next function down the stack, kdba_bt_x86
250 +knows the delta from osp to rsp. Applying that delta to the actual value of the
251 +stack pointer gives the stack pointer value on input to the current function,
252 +that location contains the return address so we can go up one stack frame and
253 +repeat the process.
254 +
255 +After doing basic block analysis on the current function, kdba_bt_x86 knows what
256 +the abstract register and memory state is at the point this function was
257 +interrupted or it called the next function down the stack, this is the exit
258 +state. For an interrupt the actual register values are saved in a struct
259 +pt_regs, for a call we have unwound from the KDB interrupt back to the called
260 +function so we have some idea of what the register values are in the called
261 +function. The abstract exit state is merged with the known actual register
262 +values to derive the original stack pointer. That in turn gives us any
263 +registers that were saved on stack. The original stack pointer gives the return
264 +address from the calling function, go up one stack frame and repeat the
265 +analysis.
266 +
267 +
268 +Process Starting Point
269 +======================
270 +
271 +All backtrace code needs a starting point which defines at least the stack
272 +pointer and instruction pointer, it may define other registers as well. The
273 +first part of kdba_bt_stack() extracts the starting point. Processes can be in
274 +one of three states, running (currently on a cpu), blocked (sleeping or ready to
275 +run but not currently on a cpu) or unknown.
276 +
277 +For running processes, the current rsp and rip are dynamic. Because KDB stops
278 +the entire machine by sending an interrupt to the other cpus, KDB can save the
279 +rsp and rip for each cpu at the point where KDB is entered. This data is held
280 +in array kdb_running_process and is stored by kdb_save_running() and the arch
281 +specific kdba_save_running() functions. When backtracing a running process, KDB
282 +uses the data in kdb_running_process as its starting point.
283 +
284 +For blocked processes we always have the saved rsp, it is held in the process's
285 +thread_info. For i386 blocked processes, thread_info also contains the saved
286 +rip. For x86_64 blocked processes, rip is no longer saved in thread_info, it is
287 +assumed that all blocked processes will resume at assembler label thread_return,
288 +so that rip is used on x86_64. See arch specific kdba_bt_stack_rip().
289 +
290 +Unknown process state only occurs when the user does 'bt <stack_address>'.
291 +Unlike other bt commands, 'bt <stack_address>' does not identify any specific
292 +process, instead it identifies a kernel stack. <stack_address> must be inside a
293 +valid kernel stack and must point to a saved rip from a call instruction.
294 +kdba_bt_x86.c uses the common kdba_get_stack_info() and arch specific
295 +kdba_get_stack_info_alternate() functions to check that the address falls within
296 +a valid kernel stack. If the user gives a stack address that does not point to
297 +a saved rip from a call instruction then the backtrace will be garbage.
298 +
299 +
300 +Identifying The Current Function
301 +================================
302 +
303 +Given a rip value, KDB uses the kallsyms data to find the start of the function
304 +(first address <= rip) and the end of the function (next symbol in kallsyms).
305 +This works for plain C code because gcc only generates one label per function.
306 +It does not work for assembler code or for assembler code embedded in C
307 +functions, because the assembler labels appear as global entries in kallsyms.
308 +For example, arch/i386/kernel/entry.S has function ret_from_exception which
309 +contains three global labels ret_from_intr, check_userspace and
310 +resume_userspace. If rip points to any of those global labels, KDB wants the
311 +start of the real function, i.e. ret_from_exception. In addition, if rip points
312 +to ret_from_exception, KDB wants the end of the function to be after the last
313 +global label in that function, i.e. after resume_userspace.
314 +
315 +The simplest way to handle these unwanted global labels is to list the spurious
316 +assembler labels, which is done in the arch specific array bb_spurious. After
317 +mapping rip to the nearest start and end labels from kallsyms, kdb_bb() works
318 +backwards until it finds a non-spurious label then works forwards to the next
319 +non-spurious label. That gives a real start and end address and a real name for
320 +the current function.
321 +
322 +Note that this algorithm only applies in kdb_bb() when it maps rip to a suitable
323 +start and end address. When disassembling the code, you will still see the
324 +spurious label names, users need to see the extra labels. ret_from_exception on
325 +i386 disassembles like this (2.6.22) :-
326 +
327 +[0]kdb> id ret_from_exception
328 +0xc0102554 ret_from_exception: cli
329 +0xc0102555 ret_from_intr: mov $0xfffff000,%ebp
330 +0xc010255a ret_from_intr+0x5: and %esp,%ebp
331 +0xc010255c check_userspace: mov 0x34(%esp),%eax
332 +0xc0102560 check_userspace+0x4: mov 0x30(%esp),%al
333 +0xc0102564 check_userspace+0x8: and $0x20003,%eax
334 +0xc0102569 check_userspace+0xd: cmp $0x3,%eax
335 +0xc010256c check_userspace+0x10: jb 0xc010258c resume_kernel
336 +0xc0102572 check_userspace+0x16: mov %esi,%esi
337 +0xc0102574 resume_userspace: cli
338 +0xc0102575 resume_userspace+0x1: mov 0x8(%ebp),%ecx
339 +0xc0102578 resume_userspace+0x4: and $0xfe3e,%ecx
340 +0xc010257e resume_userspace+0xa: jne 0xc01026f4 work_pending
341 +0xc0102584 resume_userspace+0x10: jmp 0xc01026a7 restore_all
342 +0xc0102589 resume_userspace+0x15: lea 0x0(%esi),%esi
343 +0xc010258c resume_kernel: cli
344 +
345 +For the purposes of kdba_bt_x86.c, any rip from 0xc0102554 to 0xc0102589 needs
346 +to map to the range 0xc0102554 (start) to 0xc010258c (end) with function name
347 +ret_from_exception. Therefore ret_from_intr, check_userspace and
348 +resume_userspace are listed in bb_spurious[] for i386 so those symbols are
349 +ignored. The comments in bb_spurious[] list the function that encloses each
350 +spurious label, those comments are only for humans, they do not affect the code.
351 +
352 +Once rip has been mapped to non-spurious labels, the module name, function name,
353 +start and end address are stored in variables bb_mod_name, bb_func_name,
354 +bb_func_start, bb_func_end. These variables are used throughout kdba_bt_x86.c
355 +for processing each function in turn.
356 +
357 +Watch for changes to assembler code, especially in arch/i386/kernel/entry.S,
358 +arch/x86_64/kernel/entry.S and arch/x86_64/ia32/ia32entry.S. When new labels
359 +are added you may need to adjust bb_spurious[] for that architecture. Running
360 +bb_all can help identify assembler labels that have been added or deleted.
361 +
362 +
363 +Tracking the Effects of Instructions
364 +====================================
365 +
366 +bb_pass2_do_changed_blocks() uses the KDB disassembler to decode the x86
367 +instructions to something a human can read. bb_dis_pass2() is used as a print
368 +routine to store data for a single instruction in a buffer then
369 +bb_parse_buffer() starts the analysis. Any instruction prefixes like lock or
370 +rep are stripped out. The opcode string is isolated then up to 3 operands are
371 +extracted (imul can have 3 operands), these are src, dst and dst2. The operand
372 +is matched against table bb_opcode_usage_all[] which lists all the instructions
373 +that actually appear in i386 and x86_64 kernels. A lot of the x86 instrcution
374 +set is not used by the kernel so instructions such as SSE do not appear in
375 +bb_opcode_usage_all[].
376 +
377 +Each operand is decoded by bb_parse_operand() to see whether it has a segment
378 +prefix, displacement, base, index or scale. An indirect call or jmp is
379 +identified. Operands consisting only of a register are classified as 'reg'
380 +type, displacements starting with '$' are immediate values otherwise the operand
381 +refers to a memory location. Any base or index register name is mapped to the
382 +abstract register name that contains it, this takes care of mapping (say) %ah to
383 +rax.
384 +
385 +After decoding the opcode and all its operands, bb_usage() decides what effect
386 +the instruction will have on the abstract state machine. Some x86 instructions
387 +list all the affected registers in their operands and these can be handled as
388 +generic cases. Alas many x86 instructions have side effects and change
389 +registers that are not listed in the operands, these have to be handled as
390 +special cases. enum bb_operand_usage lists the generic and special cases.
391 +
392 +bb_usage() is basically one huge switch statement over the special values in
393 +enum bb_operand_usage. For each special case it tracks the side effects of the
394 +instruction. Once all the special cases have been handled and converted to
395 +generic cases then bb_usage() handles the generic cases.
396 +
397 +bb_usage() detects when a register is copied to another register, a register is
398 +copied to stack or a known stack value is copied to a register and updates the
399 +state data accordingly. It is particularly important that all stack pointer
400 +updates and copies of the stack pointer are tracked, much of the saved state is
401 +on stack and can be accessed via any register that points to the stack, not just
402 +via rsp.
403 +
404 +i386 built with 4K stacks and all x86_64 builds have multiple kernel stacks.
405 +bb_usage() knows which instructions or locations are used to switch stacks and
406 +pretends that these instructions have no effect on the contents of rsp. The
407 +higher level backtrace code knows how to handle stack switching, it is too
408 +complicated for basic block analysis.
409 +
410 +
411 +Transfer of Control Outside the Current Function
412 +================================================
413 +
414 +Ignoring call instructions, most C code does not transfer control outside the
415 +current function, IOW there are no jump instructions to instructions outside the
416 +function. There are a few cases that this can occur for C code, inline
417 +assembler and tail recursion.
418 +
419 +Tail recursion occurs when a function ends by returning the value from a second
420 +function and that second function has exactly the same arguments and return
421 +value as the current function. For example,
422 +
423 + int bar(int i, char *p)
424 + {
425 + ... do some work and return an int ...
426 + }
427 +
428 + int foo(int i, char *p)
429 + {
430 + return bar(i, p);
431 + }
432 +
433 +If tail recursion is active (gcc -foptimize-sibling-calls) then instead of foo
434 +calling bar, bar returning to foo then foo returning to its caller, gcc will end
435 +foo with a direct jmp to bar. The source code says that something called foo
436 +but the stack trace will show bar is active, with no sign of foo on stack. When
437 +bar returns it will use the return address from the code that called foo.
438 +
439 +bb_transfer() detects an unconditional jmp to code outside the function body and
440 +assumes that this represents tail recursion. For tail recursion to work
441 +correctly, all the preserved registers must contain their original values,
442 +bb_sanity_check() validates this. Any deviation from the expected state will
443 +stop basic block analysis and fall back on the old unreliable backtrace code.
444 +
445 +Besides tail recursion in C code, assembler code can jump to labels outside the
446 +current function. Unfortunately this occurs all the time in the twisty
447 +assembler code and, to make things worse, many of these transfers are done with
448 +non-standard register or memory state. bb_special_case() and the arch specific
449 +bb_special_cases[] handle all the known special cases, including what the
450 +register and/or memory state should be. Any deviation from the expected state
451 +will stop basic block analysis and fall back on the old unreliable backtrace
452 +code.
453 +
454 +
455 +Locating Arguments
456 +==================
457 +
458 +Function arguments can be passed in registers or on stack. The full ABI for
459 +passing arguments is described in
460 +
461 + http://www.caldera.com/developers/devspecs/abi386-4.pdf
462 + http://www.x86-64.org/documentation/abi.pdf
463 +
464 +The short description, ignoring special cases like passing structures by name
465 +and floating point arguments which tend not to apply to the kernel, is :-
466 +
467 +i386. With -mpregparm=0, all arguments are passed on stack, except for
468 + functions defined as FASTCALL, where the first 3 arguments are passed in
469 + registers.
470 +
471 + With -mregparm=3, the first 3 arguments are passed in registers except
472 + for functions defined as asmlinkage or with variable number of
473 + arguments, when arguments are still passed on stack. -mpregparm=3 used
474 + to be a config option, in recent kernels it is the default.
475 +
476 + Arguments defined as long long (64 bit) are passed in two registers or
477 + in two locations on stack. Being passed in two pieces makes a 64 bit
478 + argument look like two 32 bit arguments to KDB, it will be printed as
479 + two separate arguments.
480 +
481 + When compiled with -mregparm=3, if a 64 bit argument is argument number
482 + 2 then it will not be split between register and stack, instead it will
483 + all be on stack and the third argument register will not be used. This
484 + makes it look like there is an extra argument in the list. There is
485 + nothing that KDB can do to detect these corner cases with 64 bit
486 + arguments on i386, which is a pity because they can confuse users.
487 +
488 + The preserved registers are ebx, ebp, esp, esi, edi. Arguments are
489 + passed in eax, edx, ecx. The return value is in eax.
490 +
491 +x86_64. The first 6 arguments are passed in registers, the 7th and later
492 + arguments are passed on stack. Except for functions with a variable
493 + number of arguments (e.g. printk) where all arguments are on stack
494 + except for rax which contains the number of SSE arguments (always 0 for
495 + the kernel).
496 +
497 + The preserved registers are rbx, rbp, rsp, r12, r13, r14, r15.
498 + Arguments are passed in rdi, rsi, rdx, rcx, r8, r9. The return value is
499 + in rax.
500 +
501 +For both architectures, kdba_bt detects an argument that is passed in a register
502 +by the fact that the function code reads from that argument type register while
503 +it contains its original value. IOW, testing the value of rax, copying rax to
504 +another register or storing it on stack without first overwriting rax means that
505 +rax contains a useful input value. Reading from memory which is above the
506 +original stack pointer means that there is a argument at that location on
507 +stack.
508 +
509 +There are some functions in the kernel whose definition contains arguments that
510 +are not actually used. Typically these functions are instantiations of generic
511 +function definitions where some, but not all, instantiations use all the
512 +arguments. For example, a filesystem function may take flags that are not used
513 +by this particular filesystem, but the function definition has to match the
514 +generic filesystem declarations. If the unused arguments are at the end of the
515 +list then there is no way of telling from the object code that they exist, the
516 +function that does not use the trailing aguments will have no code that refers
517 +to them. KDB will print a truncated argument list for this case.
518 +
519 +If the unused arguments are not at the end of the list then KDB can detect the
520 +presence of the unused arguments, because there is code that refers to later
521 +arguments. KDB will print the unused argument, although gcc may have
522 +overwritten the register it is in, in which case KDB prints "invalid".
523 +
524 +Originally kdba_bt_x86 would detect that there was no reference to arguments in
525 +registers but there were still references to arguments on stack and assume that
526 +the function had all its arguments on stack. Unfortunately this did not work
527 +with the large number of 'pass through' functions in the kernel. A 'pass
528 +through' function is one which calls another function with roughly the same
529 +argument list and makes no other reference to the register arguments. For
530 +example, ipv4_doint_and_flush_strategy() takes 7 arguments, calls
531 +devinet_conf_sysctl() with those 7 arguments in the same order and has no other
532 +reference to any of its arguments.
533 +
534 +Pass through functions do not touch the arguments that are passed in registers
535 +because they are already in the right location for the routine about to be
536 +called, so the pass through function has no code that references the argument
537 +registers. No code means that kdba_bt_x86 cannot tell if the function has
538 +register arguments or not. The arguments passed on stack must always be copied
539 +to the new stack frame, even for pass through functions, so the arguments on
540 +stack can always be detected.
541 +
542 +kdba_bt_x86 was changed to assume that if there are any arguments on stack then
543 +there are always arguments in registers, except for a list of functions that are
544 +known to be asmlinkage or to have a variable number of arguments.
545 +bb_assume_pass_through() ignores the known special cases, for other functions
546 +which have stack arguments but no register arguments it assumes the function is
547 +pass through and prints a warning about that assumption.
548 +
549 +The above heuristics mean that there is one case that kdba_bt_x86 cannot detect:
550 +pass through functions where all the arguments are in registers. These have no
551 +argument references at all in their code, so they are printed with no arguments.
552 +All they do is call another function so this class of functions never fails, or
553 +if it does fail then it is due to something that is not argument related. If
554 +the failure is further down the call stack then the arguments are printed at the
555 +next function down the stack, so the user still has the arguments.
556 +
557 +This list of limitations on getting the x86 arguments may seem to be a long one,
558 +but kdba_bt_x86 gives sensible results for most functions. For kernel
559 +debugging, any arguments are far better than none at all.
560 +
561 +
562 +Kernel Stack Switching
563 +======================
564 +
565 +Understanding the unusual way that x86 kernel stacks are used is very important
566 +when diagnosing backtrace problems. Every process has its own normal kernel
567 +stack, even processes that run entirely within the kernel such as kthread or the
568 +per cpu migration processes. The normal stacks are 4K or 8K on i386 (depending
569 +on CONFIG_4KSTACKS) and 8K on x86_64. The normal stacks are global, they are
570 +not tied to any cpu.
571 +
572 +For i386 with 8K stacks there are no other kernel stacks so there is no stack
573 +switching to worry about.
574 +
575 +For i386 with 4K process stacks, each cpu also has a 4K soft irq stack and a 4K
576 +hard irq stack. It is possible for a process to be running on its own process
577 +stack, for the process to be interrupted by a soft irq which is then interrupted
578 +by a hard irq. At that point the backtrace is split between the hard irq, the
579 +soft irq and the normal normal stacks.
580 +
581 +On x86_64, each cpu always has stacks for stackfault, doublefault, nmi, debug,
582 +mce and interrupts. See Documentation/x86_64/kernel-stacks.
583 +
584 +The arch specific kdba_get_stack_info_alternate() function works out which stack
585 +the backtrace starts on, how big the stack is and how to switch to the next
586 +stack. This information is stored in the kdb_activation_record and used by the
587 +higher level backtrace code to detect a stack switch.
588 +
589 +The normal stack has some padding at the end, this reflects the stack pointer
590 +when the process was created in the kernel. kdba_bt_x86 cannot backtrace
591 +through this padding data, mainly because the code that set the nitial stack
592 +pointer no longer exists after boot. ARCH_NORMAL_PADDING defines how many words
593 +to ignore at the end of the normal stack.
594 +
595 +
596 +Debugging KDB
597 +=============
598 +
599 +KDB has conditional debugging print statements scattered throughout the code.
600 +If KDB is not behaving as expected, you can turn on debugging and rerun the
601 +command. Before debugging KDB, set LINES 10000 and capture the output via a
602 +serial console. If using minicom, turn on word wrap (control-A W) and capture
603 +mode (control-A L). If you are using a serial console via a serial to Ethernet
604 +interface using ssh or telnet, use the 'script' command to start the session.
605 +
606 +The various KDB_DEBUG_FLAG_* flags are listed in include/linux/kdbprivate.h.
607 +You set debug with 'set KDBDEBUG 0xnn' where nn is the or'd value of the desired
608 +flags. 'set KDBDEBUG 0' turns off KDB debugging. When diagnosing x86 backtrace
609 +problems, the most useful debug flags are
610 +
611 + KDB_DEBUG_FLAG_ARA 0x10 Activation record, arch specific
612 + KDB_DEBUG_FLAG_BB_SUMM 0x04 Basic block analysis, summary only
613 + KDB_DEBUG_FLAG_BB 0x20 All basic block analysis
614 +
615 +ARA prints information about the different kernel stacks as kdba_bt_x86 unwinds
616 +through the switched kernel stacks. BB_SUMM prints a summary of the basic block
617 +analysis for each function, including the abstract exit state and the rollback
618 +calculations. BB prints a huge amount of basic block debugging, you probably
619 +only want to turn this for the full backtrace on as a last resort.
620 +
621 +I find 'set KDBDEBUG 0x14' to be best to get an overview of a problem. It gives
622 +both the kernel stack information plus the abstract state and actual location of
623 +data for each function.
624 +
625 +Command 'bb1' does a detailed debug session for a single function, bb1 takes a
626 +single parameter, the address of the exit point from the function, by number,
627 +not by name. bb1 turns on KDB_DEBUG_FLAG_BB, does basic block analysis for the
628 +function that contains the exit point then resets the debug flags to their
629 +previous value.
630 +
631 +Command 'bb_all' runs through every function in the base kernel (not module
632 +functions) and does a basic block analysis of every function. It also validates
633 +the various tables in kdba_bt_x86 where possible. bb_all is meant for the KDB
634 +maintainer to check that all the base kernel function pass the sanity checks, it
635 +can also be used by end users when reporting a bug. bb_all takes no parameters.
636 +It prints a '.' for every 100 functions it has analysed and allows for up to 20
637 +errors before giving up. The output from bb_all also includes the config
638 +variables that affect basic block analysis plus any assumptions about 'pass
639 +through' functions.
640 +
641 +
642 +Submitting a Bug Report Against kdba_bt_x86
643 +===========================================
644 +
645 +Capture the KDB output via a serial console.
646 +
647 +set LINES 10000
648 +set BTSP 1
649 +set KDBDEBUG 0x14
650 +Reproduce the problem.
651 +set KDBDEBUG 0
652 +bb_all
653 +
654 +If you can identify the rip/eip where kdba_bt_x86 gets confused, run bb1 with
655 +that address.
656 +
657 +Find each set of output from kdba_get_stack_info in the trace, extract the last
658 +two lines and type those lines into KDB. That will give a hex and symbolic dump
659 +of the raw kernel stacks. For example, if the trace data is
660 +
661 +kdba_get_stack_info: esp=0xc04fbef8 cpu=0 task=c047b3e0
662 +kdba_get_stack_info: ar->stack
663 + physical_start=0xc04fb000
664 + physical_end=0xc04fc000
665 + logical_start=0xc04fb038
666 + logical_end=0xc04fc000
667 + next=0xc04b4f44
668 + id=hardirq_ctx
669 + set MDCOUNT 1024
670 + mds 0xc04fb000
671 +
672 +then type the last two lines into KDB. Repeat this for each stack listed by
673 +kdba_get_stack_info on the failing backtrace.
674 +
675 +Send all the console output to the KDB maintainer.
676 +
677 +
678 +Examples of Basic Block Debugging Output
679 +========================================
680 +
681 +Example of the basic block analysis of fs/namei::getname() on i386. Kernel
682 +2.6.22, i386, compiled with frame pointers, gcc 4.1.0.
683 +
684 +Basic block debugging is very verbose, so set a high number of output lines.
685 +You really need a reliable serial console to capture this amount of output.
686 +
687 + [0]kdb> set LINES 10000
688 +
689 +A simple disassemble of getname(). This is not required for debugging purposes
690 +since each instruction is printed as part of basic block debugging, but this can
691 +be easier to read.
692 +
693 + [0]kdb> id getname
694 + 0xc015cce8 getname: push %ebp
695 + 0xc015cce9 getname+0x1: mov %esp,%ebp
696 + 0xc015cceb getname+0x3: push %edi
697 + 0xc015ccec getname+0x4: push %esi
698 + 0xc015cced getname+0x5: push %ebx
699 + 0xc015ccee getname+0x6: sub $0x4,%esp
700 + 0xc015ccf1 getname+0x9: mov %eax,%edi
701 + 0xc015ccf3 getname+0xb: mov $0xd0,%edx
702 + 0xc015ccf8 getname+0x10: mov 0xc04b2120,%eax
703 + 0xc015ccfd getname+0x15: call 0xc0153009 kmem_cache_alloc
704 + 0xc015cd02 getname+0x1a: mov %eax,0xfffffff0(%ebp)
705 + 0xc015cd05 getname+0x1d: mov $0xfffffff4,%eax
706 + 0xc015cd0a getname+0x22: cmpl $0x0,0xfffffff0(%ebp)
707 + 0xc015cd0e getname+0x26: je 0xc015cd7d getname+0x95
708 + 0xc015cd10 getname+0x28: mov %esp,%eax
709 + 0xc015cd12 getname+0x2a: and $0xfffff000,%eax
710 + 0xc015cd17 getname+0x2f: cmpl $0xffffffff,0x18(%eax)
711 + 0xc015cd1b getname+0x33: je 0xc015cd39 getname+0x51
712 + 0xc015cd1d getname+0x35: mov $0xfffffff2,%esi
713 + 0xc015cd22 getname+0x3a: cmp $0xbfffffff,%edi
714 + 0xc015cd28 getname+0x40: ja 0xc015cd60 getname+0x78
715 + 0xc015cd2a getname+0x42: mov $0xc0000000,%ebx
716 + 0xc015cd2f getname+0x47: sub %edi,%ebx
717 + 0xc015cd31 getname+0x49: cmp $0xfff,%ebx
718 + 0xc015cd37 getname+0x4f: jbe 0xc015cd3e getname+0x56
719 + 0xc015cd39 getname+0x51: mov $0x1000,%ebx
720 + 0xc015cd3e getname+0x56: mov %ebx,%ecx
721 + 0xc015cd40 getname+0x58: mov %edi,%edx
722 + 0xc015cd42 getname+0x5a: mov 0xfffffff0(%ebp),%eax
723 + 0xc015cd45 getname+0x5d: call 0xc023dbb4 strncpy_from_user
724 + 0xc015cd4a getname+0x62: cmp $0x0,%eax
725 + 0xc015cd4d getname+0x65: jle 0xc015cd5a getname+0x72
726 + 0xc015cd4f getname+0x67: mov $0xffffffdc,%esi
727 + 0xc015cd54 getname+0x6c: cmp %ebx,%eax
728 + 0xc015cd56 getname+0x6e: jae 0xc015cd60 getname+0x78
729 + 0xc015cd58 getname+0x70: jmp 0xc015cd71 getname+0x89
730 + 0xc015cd5a getname+0x72: je 0xc015cd76 getname+0x8e
731 + 0xc015cd5c getname+0x74: jge 0xc015cd71 getname+0x89
732 + 0xc015cd5e getname+0x76: mov %eax,%esi
733 + 0xc015cd60 getname+0x78: mov 0xfffffff0(%ebp),%edx
734 + 0xc015cd63 getname+0x7b: mov 0xc04b2120,%eax
735 + 0xc015cd68 getname+0x80: call 0xc01521f1 kmem_cache_free
736 + 0xc015cd6d getname+0x85: mov %esi,%eax
737 + 0xc015cd6f getname+0x87: jmp 0xc015cd7d getname+0x95
738 + 0xc015cd71 getname+0x89: mov 0xfffffff0(%ebp),%eax
739 + 0xc015cd74 getname+0x8c: jmp 0xc015cd7d getname+0x95
740 + 0xc015cd76 getname+0x8e: mov $0xfffffffe,%esi
741 + 0xc015cd7b getname+0x93: jmp 0xc015cd60 getname+0x78
742 + 0xc015cd7d getname+0x95: pop %edx
743 + 0xc015cd7e getname+0x96: pop %ebx
744 + 0xc015cd7f getname+0x97: pop %esi
745 + 0xc015cd80 getname+0x98: pop %edi
746 + 0xc015cd81 getname+0x99: pop %ebp
747 + 0xc015cd82 getname+0x9a: ret
748 +
749 +The bb1 command only one argument which must be an address, not a name. bb1
750 +turns on full basic block debugging and analyses the function containing the
751 +supplied address. Give bb1 the address of the exit point from this function,
752 +IOW the return address that is stored on stack due to a call from this function
753 +to the next function down the call stack. Assume that getname() has called
754 +kmem_cache_free() and something went wrong in kmem_cache_free() or one of the
755 +functions that it calls. The call to kmem_cache_free is at 0xc015cd68 and the
756 +return address on stack is the instruction after the call, i.e. 0xc015cd6d, so
757 +
758 + [0]kdb> bb1 0xc015cd6d
759 + bb_pass1: func_name getname func_start 0xc015cce8 func_end 0xc015cd83
760 +
761 +bb_pass1 has identified the function name and its start and end address. For C
762 +functions these are just the function start address and the next symbol in
763 +kallsyms. For Assembler code there may be spurious labels so the function name
764 +may not match the label prior to the address given to bb1. For an example of
765 +that on i386, find the address of resume_userspace then pass that address to the
766 +bb1 KDB command.
767 +
768 + bb_pass1: end
769 + bb[0] start 0xc015cce8 end 0xc015cd38 drop_through 1
770 + bb[1] start 0xc015cd39 end 0xc015cd3d drop_through 1
771 + bb[2] start 0xc015cd3e end 0xc015cd58 drop_through 0
772 + bb[3] start 0xc015cd5a end 0xc015cd5f drop_through 1
773 + bb[4] start 0xc015cd60 end 0xc015cd6f drop_through 0
774 + bb[5] start 0xc015cd71 end 0xc015cd74 drop_through 0
775 + bb[6] start 0xc015cd76 end 0xc015cd7b drop_through 0
776 + bb[7] start 0xc015cd7d end 0xc015cd82 drop_through 0
777 + bb_jmp[0] from 0xc015cd0e to 0xc015cd7d drop_through 0
778 + bb_jmp[1] from 0xc015cd1b to 0xc015cd39 drop_through 0
779 + bb_jmp[2] from 0xc015cd28 to 0xc015cd60 drop_through 0
780 + bb_jmp[3] from 0xc015cd37 to 0xc015cd3e drop_through 0
781 + bb_jmp[4] from 0xc015cd4d to 0xc015cd5a drop_through 0
782 + bb_jmp[5] from 0xc015cd56 to 0xc015cd60 drop_through 0
783 + bb_jmp[6] from 0xc015cd58 to 0xc015cd71 drop_through 0
784 + bb_jmp[7] from 0xc015cd5a to 0xc015cd76 drop_through 0
785 + bb_jmp[8] from 0xc015cd5c to 0xc015cd71 drop_through 0
786 + bb_jmp[9] from 0xc015cd6f to 0xc015cd7d drop_through 0
787 + bb_jmp[10] from 0xc015cd74 to 0xc015cd7d drop_through 0
788 + bb_jmp[11] from 0xc015cd7b to 0xc015cd60 drop_through 0
789 + bb_jmp[12] from 0xc015cd38 to 0xc015cd39 drop_through 1
790 + bb_jmp[13] from 0xc015cd3d to 0xc015cd3e drop_through 1
791 + bb_jmp[14] from 0xc015cd5f to 0xc015cd60 drop_through 1
792 +
793 +After analysing the logic flow, we can see that getname() consists of 8 basic
794 +blocks (nodes in bb_list[]). 5 of these blocks end in unconditional jumps, the
795 +other 3 drop through to the next block. There are 15 transfers of control
796 +(vertices in bb_jmp_list[]). 12 of these transfers are explicit jmp or jcc
797 +instructions, the other 3 are implicit transfers when dropping through from one
798 +block to the next. The node list is sorted by start address, the vertex list is
799 +not sorted.
800 +
801 +Basic block 0 starts at the function start (0xc015cce8) and ends at 0xc015cd38.
802 +0xc015cd39 is the target of a jump instruction (0xc015cd1b: je 0xc015cd39) so
803 +0xc015cd39 starts a new block, which means that 0xc015cd38 becomes the end of
804 +the previous block. Because bb[0] does not end in an explicit jmp instruction,
805 +there is a drop through from the end of bb[0] to the start of bb[1], see
806 +bb_jmp[12].
807 +
808 + bb_pass2: start
809 +
810 +To get the most accurate results from pass2, try to scan the directed graph by
811 +only looking at nodes whose inputs are all defined. Initially only process
812 +nodes with no missing inputs.
813 +
814 + bb_pass2_do_changed_blocks: allow_missing 0
815 +
816 + bb[0]
817 + bb_reg_state c07282e0
818 + rax = rax
819 + rbx = rbx
820 + rcx = rcx
821 + rdx = rdx
822 + rdi = rdi
823 + rsi = rsi
824 + rbp = rbp
825 + rsp = osp+0x0
826 +
827 +The initial state for bb[0] is the same for all C functions. Each register
828 +contains its own abstract value, except for rsp which is defined in terms of the
829 +original stack pointer (osp).
830 +
831 + '0xc015cce8 getname: push %ebp'
832 +
833 +The first instruction of getname() saves the frame pointer.
834 +
835 + opcode 'push' matched by 'push', usage 44
836 + src R: %ebp base_rc 8 (rbp)
837 +
838 +bb_usage() reports how the instruction was recognised and how its operands were
839 +decoded. Although this is i386 (ebp), it is reported as rbp. Using the x86_64
840 +names for registers throughout makes it easier to create common code for the two
841 +architecures.
842 +
843 + rsp osp offset +0x0 -> -0x4
844 +
845 +A push instruction decrements rsp by 4 (i386) or 8 (x86_64) bytes. rsp
846 +originally contained the original stack pointer (osp), now it contains the
847 +original stack pointer - 4.
848 +
849 + *(rsp+0x0 osp-0x4) = rbp slot 0
850 +
851 +The stack location pointed to by *rsp now contains the original value of rbp.
852 +Since rsp contains (osp-0x4), *(osp-0x4) contains rbp. It is slot 0 in the
853 +memory array associated with the register state.
854 +
855 + '0xc015cce9 getname+0x1: mov %esp,%ebp'
856 + opcode 'mov' matched by 'mov', usage 36
857 + src R: %esp base_rc 9 (rsp)
858 + dst R: %ebp base_rc 8 (rbp)
859 + rbp = rsp (osp-0x4)
860 +
861 +Copy esp (rsp) to ebp (rbp). rsp contained (osp-0x4) so rbp also contains
862 +(osp-0x4). Any reference to data via either rbp or rsp will now be tracked as a
863 +stack location.
864 +
865 + '0xc015cceb getname+0x3: push %edi'
866 + opcode 'push' matched by 'push', usage 44
867 + src R: %edi base_rc 6 (rdi)
868 + rsp osp offset -0x4 -> -0x8
869 + *(rsp+0x0 osp-0x8) = rdi slot 1
870 + '0xc015ccec getname+0x4: push %esi'
871 + opcode 'push' matched by 'push', usage 44
872 + src R: %esi base_rc 7 (rsi)
873 + rsp osp offset -0x8 -> -0xc
874 + *(rsp+0x0 osp-0xc) = rsi slot 2
875 + '0xc015cced getname+0x5: push %ebx'
876 + opcode 'push' matched by 'push', usage 44
877 + src R: %ebx base_rc 3 (rbx)
878 + rsp osp offset -0xc -> -0x10
879 + *(rsp+0x0 osp-0x10) = rbx slot 3
880 +
881 +Push 3 registers to stack. rsp is adjusted for each push and stack locations
882 +are assigned to contain the values of edi, esi and ebx. This sequence is very
883 +common in i386 C functions. edi, esi and ebx are preserved registers on i386,
884 +but gcc wants to use them for scratch space. The original contents iof these
885 +registers must be saved on stack and restored before returning to our caller.
886 +
887 + '0xc015ccee getname+0x6: sub $0x4,%esp'
888 + opcode 'sub' matched by 'sub', usage 51
889 + src I: $0x4
890 + dst R: %esp base_rc 9 (rsp)
891 + rsp osp offset -0x10 -> -0x14
892 +
893 +Subtract 4 bytes from esp. This defines the local stack variables. Sorry,
894 +names for local stack variables are not available to KDB.
895 +
896 + '0xc015ccf1 getname+0x9: mov %eax,%edi'
897 + opcode 'mov' matched by 'mov', usage 36
898 + src R: %eax base_rc 2 (rax)
899 + dst R: %edi base_rc 6 (rdi)
900 + rdi = rax (rax)
901 +
902 +Having saved edi on stack, gcc now overwrites edi with eax. At this point rax
903 +still contains its original value, so rdi now contains a copy of rax, as well as
904 +the original value which is still in rax. This is a common sequence in C code.
905 +rax contains argument 0 but it is also a scratch register. If the code needs to
906 +use argument 0 later then its value must be saved somewhere before executing any
907 +instruction that changes rax. edi is a preserved register so its contents will
908 +not be changed by any function that we call, or if it is changed then it will be
909 +restored before returning to this function.
910 +
911 +rax is listed in the arch specific bb_param_reg[] list and the code is reading
912 +from rax while it still contains its original value. The only way that makes
913 +any sense is when rax is an input argument to getname(). We note that fact in
914 +bb_reg_read().
915 +
916 + '0xc015ccf3 getname+0xb: mov $0xd0,%edx'
917 + opcode 'mov' matched by 'mov', usage 36
918 + src I: $0xd0
919 + dst R: %edx base_rc 5 (rdx)
920 + rdx = undefined
921 +
922 +Moving an constant value to edx. Although this is a constant, it does not refer
923 +to any of the original values that were supplied to this function. Therefore
924 +rdx becomes undefined for the purposes of the code analysis.
925 +
926 + '0xc015ccf8 getname+0x10: mov 0xc04b2120,%eax'
927 + opcode 'mov' matched by 'mov', usage 36
928 + src M: 0xc04b2120
929 + dst R: %eax base_rc 2 (rax)
930 + rax = undefined
931 +
932 +Moving a constant value to eax makes rax undefined.
933 +
934 + '0xc015ccfd getname+0x15: call 0xc0153009 <kmem_cache_alloc>'
935 + opcode 'call' matched by 'call', usage 17
936 + src M: 0xc0153009
937 + bb_reg_state c0728658
938 + rax = undefined
939 + rbx = rbx
940 + rcx = rcx
941 + rdx = undefined
942 + rdi = rax
943 + rsi = rsi
944 + rbp = osp-0x4
945 + rsp = osp-0x14
946 + slot 0 offset_address -0x4 rbp
947 + slot 1 offset_address -0x8 rdi
948 + slot 2 offset_address -0xc rsi
949 + slot 3 offset_address -0x10 rbx
950 +
951 +Basic block debugging prints the register and memory state when transfering
952 +control between blocks and when issuing call instructions. The call state is
953 +mainly useful when C code calls assembler routines, especially if you are not
954 +sure what state the assembler code expects. Not all of our assembler is as well
955 +documented as it could be :(
956 +
957 + rax = undefined
958 + rcx = undefined
959 + rdx = undefined
960 +
961 +The i386 ABI says that some registers are preserved across calls, see the arch
962 +specific bb_preserved_reg[] list. Any registers not in that list automatically
963 +become undefined after a call instruction.
964 +
965 + '0xc015cd02 getname+0x1a: mov %eax,0xfffffff0(%ebp)'
966 + opcode 'mov' matched by 'mov', usage 36
967 + src R: %eax base_rc 2 (rax)
968 + dst M: 0xfffffff0(%ebp) base_rc 8 (rbp)
969 +
970 +eax is the return value from the call, it is being saved at offset 0xfffffff0
971 +(-0x10) from ebp. Since rbp contains (osp-0x4) the return value is being stored
972 +at (osp-0x14). This is a stack location but we have no record of any data being
973 +held at that location, it is part of the local stack variables.
974 +
975 + '0xc015cd05 getname+0x1d: mov $0xfffffff4,%eax'
976 + opcode 'mov' matched by 'mov', usage 36
977 + src I: $0xfffffff4
978 + dst R: %eax base_rc 2 (rax)
979 + rax = undefined
980 + '0xc015cd0a getname+0x22: cmpl $0x0,0xfffffff0(%ebp)'
981 + opcode 'cmpl' matched by 'cmp', usage 3
982 + src I: $0x0
983 + dst M: 0xfffffff0(%ebp) base_rc 8 (rbp)
984 + '0xc015cd0e getname+0x26: je 0xc015cd7d <getname+0x95>'
985 + opcode 'je' matched by 'j', usage 28
986 + src M: 0xc015cd7d
987 + bb_reg_state c0728658
988 + rax = undefined
989 + rbx = rbx
990 + rcx = undefined
991 + rdx = undefined
992 + rdi = rax
993 + rsi = rsi
994 + rbp = osp-0x4
995 + rsp = osp-0x14
996 + slot 0 offset_address -0x4 rbp
997 + slot 1 offset_address -0x8 rdi
998 + slot 2 offset_address -0xc rsi
999 + slot 3 offset_address -0x10 rbx
1000 +
1001 +Transfer of control, print the register and memory state.
1002 +
1003 + matched: from 0xc015cd0e to 0xc015cd7d drop_through 0 bb_jmp[0]
1004 +
1005 +Which bb_jmp_list[] entry matches this transfer.
1006 +
1007 + new state c07286b8
1008 +
1009 +The current abstract register and memory state is cloned at address c07286b8.
1010 +This state becomes one of the inputs to the basic block whose start address is
1011 +0xc015cd7d.
1012 +
1013 + '0xc015cd10 getname+0x28: mov %esp,%eax'
1014 + opcode 'mov' matched by 'mov', usage 36
1015 + src R: %esp base_rc 9 (rsp)
1016 + dst R: %eax base_rc 2 (rax)
1017 + rax = rsp (osp-0x14)
1018 +
1019 +Copy rsp which contains (osp-0x14) to rax. rax contains a valid stack pointer.
1020 +
1021 + '0xc015cd12 getname+0x2a: and $0xfffff000,%eax'
1022 + opcode 'and' matched by 'and', usage 11
1023 + src I: $0xfffff000
1024 + dst R: %eax base_rc 2 (rax)
1025 + rax = undefined
1026 +
1027 +But not for long.
1028 +
1029 + '0xc015cd17 getname+0x2f: cmpl $0xffffffff,0x18(%eax)'
1030 + opcode 'cmpl' matched by 'cmp', usage 3
1031 + src I: $0xffffffff
1032 + dst M: 0x18(%eax) base_rc 2 (rax)
1033 + '0xc015cd1b getname+0x33: je 0xc015cd39 <getname+0x51>'
1034 + opcode 'je' matched by 'j', usage 28
1035 + src M: 0xc015cd39
1036 + bb_reg_state c0728658
1037 + rax = undefined
1038 + rbx = rbx
1039 + rcx = undefined
1040 + rdx = undefined
1041 + rdi = rax
1042 + rsi = rsi
1043 + rbp = osp-0x4
1044 + rsp = osp-0x14
1045 + slot 0 offset_address -0x4 rbp
1046 + slot 1 offset_address -0x8 rdi
1047 + slot 2 offset_address -0xc rsi
1048 + slot 3 offset_address -0x10 rbx
1049 +
1050 +Another transfer of control, print the state.
1051 +
1052 + matched: from 0xc015cd1b to 0xc015cd39 drop_through 0 bb_jmp[1]
1053 +
1054 +Which bb_jmp_list[] entry was used.
1055 +
1056 + reuse bb_jmp[0]
1057 +
1058 +To save space, we only clone the state if it is different. Otherwise we reuse
1059 +the state from another vertex and bump the reference count.
1060 +
1061 + '0xc015cd1d getname+0x35: mov $0xfffffff2,%esi'
1062 + opcode 'mov' matched by 'mov', usage 36
1063 + src I: $0xfffffff2
1064 + dst R: %esi base_rc 7 (rsi)
1065 + rsi = undefined
1066 +
1067 +Using esi as a scratch register, even though the i386 ABi says that esi is a
1068 +preserved register. Not to worry, the original value of rsi was saved on stack
1069 +on entry and it will be restored before exit.
1070 +
1071 + '0xc015cd22 getname+0x3a: cmp $0xbfffffff,%edi'
1072 + opcode 'cmp' matched by 'cmp', usage 3
1073 + src I: $0xbfffffff
1074 + dst R: %edi base_rc 6 (rdi)
1075 + '0xc015cd28 getname+0x40: ja 0xc015cd60 <getname+0x78>'
1076 + opcode 'ja' matched by 'j', usage 28
1077 + src M: 0xc015cd60
1078 + bb_reg_state c0728658
1079 + rax = undefined
1080 + rbx = rbx
1081 + rcx = undefined
1082 + rdx = undefined
1083 + rdi = rax
1084 + rsi = undefined
1085 + rbp = osp-0x4
1086 + rsp = osp-0x14
1087 + slot 0 offset_address -0x4 rbp
1088 + slot 1 offset_address -0x8 rdi
1089 + slot 2 offset_address -0xc rsi
1090 + slot 3 offset_address -0x10 rbx
1091 + matched: from 0xc015cd28 to 0xc015cd60 drop_through 0 bb_jmp[2]
1092 + new state c0728710
1093 +
1094 +This state is different from any states already saved, clone to a new entry.
1095 +
1096 + '0xc015cd2a getname+0x42: mov $0xc0000000,%ebx'
1097 + opcode 'mov' matched by 'mov', usage 36
1098 + src I: $0xc0000000
1099 + dst R: %ebx base_rc 3 (rbx)
1100 + rbx = undefined
1101 + '0xc015cd2f getname+0x47: sub %edi,%ebx'
1102 + opcode 'sub' matched by 'sub', usage 51
1103 + src R: %edi base_rc 6 (rdi)
1104 + dst R: %ebx base_rc 3 (rbx)
1105 + rbx = undefined
1106 + '0xc015cd31 getname+0x49: cmp $0xfff,%ebx'
1107 + opcode 'cmp' matched by 'cmp', usage 3
1108 + src I: $0xfff
1109 + dst R: %ebx base_rc 3 (rbx)
1110 + '0xc015cd37 getname+0x4f: jbe 0xc015cd3e <getname+0x56>'
1111 + opcode 'jbe' matched by 'j', usage 28
1112 + src M: 0xc015cd3e
1113 + bb_reg_state c0728658
1114 + rax = undefined
1115 + rbx = undefined
1116 + rcx = undefined
1117 + rdx = undefined
1118 + rdi = rax
1119 + rsi = undefined
1120 + rbp = osp-0x4
1121 + rsp = osp-0x14
1122 + slot 0 offset_address -0x4 rbp
1123 + slot 1 offset_address -0x8 rdi
1124 + slot 2 offset_address -0xc rsi
1125 + slot 3 offset_address -0x10 rbx
1126 + matched: from 0xc015cd37 to 0xc015cd3e drop_through 0 bb_jmp[3]
1127 + new state c0728768
1128 +
1129 +This state is different from any states already saved, clone to a new entry.
1130 +
1131 + bb_reg_state c0728658
1132 + rax = undefined
1133 + rbx = undefined
1134 + rcx = undefined
1135 + rdx = undefined
1136 + rdi = rax
1137 + rsi = undefined
1138 + rbp = osp-0x4
1139 + rsp = osp-0x14
1140 + slot 0 offset_address -0x4 rbp
1141 + slot 1 offset_address -0x8 rdi
1142 + slot 2 offset_address -0xc rsi
1143 + slot 3 offset_address -0x10 rbx
1144 + matched: from 0xc015cd38 to 0xc015cd39 drop_through 1 bb_jmp[12]
1145 + reuse bb_jmp[3]
1146 +
1147 +Basic block 0 drops through to basic block 1, treat it as an implicit transfer
1148 +of control. The state is the same as the previous jump instruction so reuse it
1149 +and bump the reference count.
1150 +
1151 +That ends basic block 0, now pick the next block in the list that (a) needs to
1152 +be scanned and (b) has all its input states defined. In this case bb[1].
1153 +
1154 + bb[1]
1155 +
1156 +bb[1] starts at 0xc015cd39 and has two paths that transfer control to it.
1157 +bb_jmp[1] from an explicit jump at 0xc015cd1b and a drop through at bb_jmp[12].
1158 +Where there is more than one input state we have to merge them and reconcile the
1159 +final value.
1160 +
1161 + first state c07286b8
1162 +
1163 +The first input state is stored at c07286b8. Looking back through the trace we
1164 +find that entry associated with bb_jmp[0], not bb_jmp[1] as expected. However
1165 +bb_jmp[1] reused the state that was stored for bb_jmp[0] so all is well.
1166 +
1167 + bb_reg_state c0728658
1168 + rax = undefined
1169 + rbx = rbx
1170 + rcx = undefined
1171 + rdx = undefined
1172 + rdi = rax
1173 + rsi = rsi
1174 + rbp = osp-0x4
1175 + rsp = osp-0x14
1176 + slot 0 offset_address -0x4 rbp
1177 + slot 1 offset_address -0x8 rdi
1178 + slot 2 offset_address -0xc rsi
1179 + slot 3 offset_address -0x10 rbx
1180 +
1181 +The first state for bb[1].
1182 +
1183 + merging state c0728768
1184 +
1185 +Now merge the second state, which is held at c0728768.
1186 +
1187 + rbx = undefined
1188 + rsi = undefined
1189 +
1190 +The two states disagree on the values being tracked in rbx and rsi. Compiler
1191 +theory 101 says that if two or more paths to a basic block have different values
1192 +for a register then that register cannot be relied on at the start of the block,
1193 +so make it undefined. The same logic applies to memory locations.
1194 +
1195 + final state
1196 + bb_reg_state c0728658
1197 + rax = undefined
1198 + rbx = undefined
1199 + rcx = undefined
1200 + rdx = undefined
1201 + rdi = rax
1202 + rsi = undefined
1203 + rbp = osp-0x4
1204 + rsp = osp-0x14
1205 + slot 0 offset_address -0x4 rbp
1206 + slot 1 offset_address -0x8 rdi
1207 + slot 2 offset_address -0xc rsi
1208 + slot 3 offset_address -0x10 rbx
1209 +
1210 +After merging all the input states, this is the final starting state for bb[1].
1211 +Now track what bb[1] does to the state.
1212 +
1213 + '0xc015cd39 getname+0x51: mov $0x1000,%ebx'
1214 + opcode 'mov' matched by 'mov', usage 36
1215 + src I: $0x1000
1216 + dst R: %ebx base_rc 3 (rbx)
1217 + rbx = undefined
1218 + bb_reg_state c0728658
1219 + rax = undefined
1220 + rbx = undefined
1221 + rcx = undefined
1222 + rdx = undefined
1223 + rdi = rax
1224 + rsi = undefined
1225 + rbp = osp-0x4
1226 + rsp = osp-0x14
1227 + slot 0 offset_address -0x4 rbp
1228 + slot 1 offset_address -0x8 rdi
1229 + slot 2 offset_address -0xc rsi
1230 + slot 3 offset_address -0x10 rbx
1231 + matched: from 0xc015cd3d to 0xc015cd3e drop_through 1 bb_jmp[13]
1232 + reuse bb_jmp[3]
1233 +
1234 +bb[1] is a single instruction which drops through to bb[2].
1235 +
1236 + bb[2]
1237 + first state c0728768
1238 + bb_reg_state c0728658
1239 + rax = undefined
1240 + rbx = undefined
1241 + rcx = undefined
1242 + rdx = undefined
1243 + rdi = rax
1244 + rsi = undefined
1245 + rbp = osp-0x4
1246 + rsp = osp-0x14
1247 + slot 0 offset_address -0x4 rbp
1248 + slot 1 offset_address -0x8 rdi
1249 + slot 2 offset_address -0xc rsi
1250 + slot 3 offset_address -0x10 rbx
1251 + merging state c0728768
1252 +
1253 +bb[2] has two inputs, both vertices are pointing to input state c0728768.
1254 +Merging an entry with itself has no effect.
1255 +
1256 + '0xc015cd3e getname+0x56: mov %ebx,%ecx'
1257 + opcode 'mov' matched by 'mov', usage 36
1258 + src R: %ebx base_rc 3 (rbx)
1259 + dst R: %ecx base_rc 4 (rcx)
1260 + rcx = rbx (undefined)
1261 + '0xc015cd40 getname+0x58: mov %edi,%edx'
1262 + opcode 'mov' matched by 'mov', usage 36
1263 + src R: %edi base_rc 6 (rdi)
1264 + dst R: %edx base_rc 5 (rdx)
1265 + rdx = rdi (rax)
1266 + '0xc015cd42 getname+0x5a: mov 0xfffffff0(%ebp),%eax'
1267 + opcode 'mov' matched by 'mov', usage 36
1268 + src M: 0xfffffff0(%ebp) base_rc 8 (rbp)
1269 + dst R: %eax base_rc 2 (rax)
1270 + rax = *(rbp-0x10) (osp-0x14) rax = undefined
1271 + '0xc015cd45 getname+0x5d: call 0xc023dbb4 <strncpy_from_user>'
1272 + opcode 'call' matched by 'call', usage 17
1273 + src M: 0xc023dbb4
1274 + bb_reg_state c0728658
1275 + rax = undefined
1276 + rbx = undefined
1277 + rcx = undefined
1278 + rdx = rax
1279 + rdi = rax
1280 + rsi = undefined
1281 + rbp = osp-0x4
1282 + rsp = osp-0x14
1283 + slot 0 offset_address -0x4 rbp
1284 + slot 1 offset_address -0x8 rdi
1285 + slot 2 offset_address -0xc rsi
1286 + slot 3 offset_address -0x10 rbx
1287 + rax = undefined
1288 + rcx = undefined
1289 + rdx = undefined
1290 + '0xc015cd4a getname+0x62: cmp $0x0,%eax'
1291 + opcode 'cmp' matched by 'cmp', usage 3
1292 + src I: $0x0
1293 + dst R: %eax base_rc 2 (rax)
1294 + '0xc015cd4d getname+0x65: jle 0xc015cd5a <getname+0x72>'
1295 + opcode 'jle' matched by 'j', usage 28
1296 + src M: 0xc015cd5a
1297 + bb_reg_state c0728658
1298 + rax = undefined
1299 + rbx = undefined
1300 + rcx = undefined
1301 + rdx = undefined
1302 + rdi = rax
1303 + rsi = undefined
1304 + rbp = osp-0x4
1305 + rsp = osp-0x14
1306 + slot 0 offset_address -0x4 rbp
1307 + slot 1 offset_address -0x8 rdi
1308 + slot 2 offset_address -0xc rsi
1309 + slot 3 offset_address -0x10 rbx
1310 + matched: from 0xc015cd4d to 0xc015cd5a drop_through 0 bb_jmp[4]
1311 + reuse bb_jmp[3]
1312 + '0xc015cd4f getname+0x67: mov $0xffffffdc,%esi'
1313 + opcode 'mov' matched by 'mov', usage 36
1314 + src I: $0xffffffdc
1315 + dst R: %esi base_rc 7 (rsi)
1316 + rsi = undefined
1317 + '0xc015cd54 getname+0x6c: cmp %ebx,%eax'
1318 + opcode 'cmp' matched by 'cmp', usage 3
1319 + src R: %ebx base_rc 3 (rbx)
1320 + dst R: %eax base_rc 2 (rax)
1321 + '0xc015cd56 getname+0x6e: jae 0xc015cd60 <getname+0x78>'
1322 + opcode 'jae' matched by 'j', usage 28
1323 + src M: 0xc015cd60
1324 + bb_reg_state c0728658
1325 + rax = undefined
1326 + rbx = undefined
1327 + rcx = undefined
1328 + rdx = undefined
1329 + rdi = rax
1330 + rsi = undefined
1331 + rbp = osp-0x4
1332 + rsp = osp-0x14
1333 + slot 0 offset_address -0x4 rbp
1334 + slot 1 offset_address -0x8 rdi
1335 + slot 2 offset_address -0xc rsi
1336 + slot 3 offset_address -0x10 rbx
1337 + matched: from 0xc015cd56 to 0xc015cd60 drop_through 0 bb_jmp[5]
1338 + reuse bb_jmp[3]
1339 + '0xc015cd58 getname+0x70: jmp 0xc015cd71 <getname+0x89>'
1340 + opcode 'jmp' matched by 'j', usage 28
1341 + src M: 0xc015cd71
1342 + bb_reg_state c0728658
1343 + rax = undefined
1344 + rbx = undefined
1345 + rcx = undefined
1346 + rdx = undefined
1347 + rdi = rax
1348 + rsi = undefined
1349 + rbp = osp-0x4
1350 + rsp = osp-0x14
1351 + slot 0 offset_address -0x4 rbp
1352 + slot 1 offset_address -0x8 rdi
1353 + slot 2 offset_address -0xc rsi
1354 + slot 3 offset_address -0x10 rbx
1355 + matched: from 0xc015cd58 to 0xc015cd71 drop_through 0 bb_jmp[6]
1356 + reuse bb_jmp[3]
1357 +
1358 + bb[3]
1359 + first state c0728768
1360 + bb_reg_state c0728658
1361 + rax = undefined
1362 + rbx = undefined
1363 + rcx = undefined
1364 + rdx = undefined
1365 + rdi = rax
1366 + rsi = undefined
1367 + rbp = osp-0x4
1368 + rsp = osp-0x14
1369 + slot 0 offset_address -0x4 rbp
1370 + slot 1 offset_address -0x8 rdi
1371 + slot 2 offset_address -0xc rsi
1372 + slot 3 offset_address -0x10 rbx
1373 +
1374 +bb[3] only has one input, nothing to merge.
1375 +
1376 + '0xc015cd5a getname+0x72: je 0xc015cd76 <getname+0x8e>'
1377 + opcode 'je' matched by 'j', usage 28
1378 + src M: 0xc015cd76
1379 + bb_reg_state c0728658
1380 + rax = undefined
1381 + rbx = undefined
1382 + rcx = undefined
1383 + rdx = undefined
1384 + rdi = rax
1385 + rsi = undefined
1386 + rbp = osp-0x4
1387 + rsp = osp-0x14
1388 + slot 0 offset_address -0x4 rbp
1389 + slot 1 offset_address -0x8 rdi
1390 + slot 2 offset_address -0xc rsi
1391 + slot 3 offset_address -0x10 rbx
1392 + matched: from 0xc015cd5a to 0xc015cd76 drop_through 0 bb_jmp[7]
1393 + reuse bb_jmp[3]
1394 + '0xc015cd5c getname+0x74: jge 0xc015cd71 <getname+0x89>'
1395 + opcode 'jge' matched by 'j', usage 28
1396 + src M: 0xc015cd71
1397 + bb_reg_state c0728658
1398 + rax = undefined
1399 + rbx = undefined
1400 + rcx = undefined
1401 + rdx = undefined
1402 + rdi = rax
1403 + rsi = undefined
1404 + rbp = osp-0x4
1405 + rsp = osp-0x14
1406 + slot 0 offset_address -0x4 rbp
1407 + slot 1 offset_address -0x8 rdi
1408 + slot 2 offset_address -0xc rsi
1409 + slot 3 offset_address -0x10 rbx
1410 + matched: from 0xc015cd5c to 0xc015cd71 drop_through 0 bb_jmp[8]
1411 + reuse bb_jmp[3]
1412 + '0xc015cd5e getname+0x76: mov %eax,%esi'
1413 + opcode 'mov' matched by 'mov', usage 36
1414 + src R: %eax base_rc 2 (rax)
1415 + dst R: %esi base_rc 7 (rsi)
1416 + rsi = rax (undefined)
1417 + bb_reg_state c0728658
1418 + rax = undefined
1419 + rbx = undefined
1420 + rcx = undefined
1421 + rdx = undefined
1422 + rdi = rax
1423 + rsi = undefined
1424 + rbp = osp-0x4
1425 + rsp = osp-0x14
1426 + slot 0 offset_address -0x4 rbp
1427 + slot 1 offset_address -0x8 rdi
1428 + slot 2 offset_address -0xc rsi
1429 + slot 3 offset_address -0x10 rbx
1430 + matched: from 0xc015cd5f to 0xc015cd60 drop_through 1 bb_jmp[14]
1431 + reuse bb_jmp[3]
1432 +
1433 + bb[5]
1434 + first state c0728768
1435 + bb_reg_state c0728658
1436 + rax = undefined
1437 + rbx = undefined
1438 + rcx = undefined
1439 + rdx = undefined
1440 + rdi = rax
1441 + rsi = undefined
1442 + rbp = osp-0x4
1443 + rsp = osp-0x14
1444 + slot 0 offset_address -0x4 rbp
1445 + slot 1 offset_address -0x8 rdi
1446 + slot 2 offset_address -0xc rsi
1447 + slot 3 offset_address -0x10 rbx
1448 + merging state c0728768
1449 + '0xc015cd71 getname+0x89: mov 0xfffffff0(%ebp),%eax'
1450 + opcode 'mov' matched by 'mov', usage 36
1451 + src M: 0xfffffff0(%ebp) base_rc 8 (rbp)
1452 + dst R: %eax base_rc 2 (rax)
1453 + rax = *(rbp-0x10) (osp-0x14) rax = undefined
1454 + '0xc015cd74 getname+0x8c: jmp 0xc015cd7d <getname+0x95>'
1455 + opcode 'jmp' matched by 'j', usage 28
1456 + src M: 0xc015cd7d
1457 + bb_reg_state c0728658
1458 + rax = undefined
1459 + rbx = undefined
1460 + rcx = undefined
1461 + rdx = undefined
1462 + rdi = rax
1463 + rsi = undefined
1464 + rbp = osp-0x4
1465 + rsp = osp-0x14
1466 + slot 0 offset_address -0x4 rbp
1467 + slot 1 offset_address -0x8 rdi
1468 + slot 2 offset_address -0xc rsi
1469 + slot 3 offset_address -0x10 rbx
1470 + matched: from 0xc015cd74 to 0xc015cd7d drop_through 0 bb_jmp[10]
1471 + reuse bb_jmp[3]
1472 +
1473 + bb[6]
1474 + first state c0728768
1475 + bb_reg_state c0728658
1476 + rax = undefined
1477 + rbx = undefined
1478 + rcx = undefined
1479 + rdx = undefined
1480 + rdi = rax
1481 + rsi = undefined
1482 + rbp = osp-0x4
1483 + rsp = osp-0x14
1484 + slot 0 offset_address -0x4 rbp
1485 + slot 1 offset_address -0x8 rdi
1486 + slot 2 offset_address -0xc rsi
1487 + slot 3 offset_address -0x10 rbx
1488 + '0xc015cd76 getname+0x8e: mov $0xfffffffe,%esi'
1489 + opcode 'mov' matched by 'mov', usage 36
1490 + src I: $0xfffffffe
1491 + dst R: %esi base_rc 7 (rsi)
1492 + rsi = undefined
1493 + '0xc015cd7b getname+0x93: jmp 0xc015cd60 <getname+0x78>'
1494 + opcode 'jmp' matched by 'j', usage 28
1495 + src M: 0xc015cd60
1496 + bb_reg_state c0728658
1497 + rax = undefined
1498 + rbx = undefined
1499 + rcx = undefined
1500 + rdx = undefined
1501 + rdi = rax
1502 + rsi = undefined
1503 + rbp = osp-0x4
1504 + rsp = osp-0x14
1505 + slot 0 offset_address -0x4 rbp
1506 + slot 1 offset_address -0x8 rdi
1507 + slot 2 offset_address -0xc rsi
1508 + slot 3 offset_address -0x10 rbx
1509 + matched: from 0xc015cd7b to 0xc015cd60 drop_through 0 bb_jmp[11]
1510 + reuse bb_jmp[3]
1511 +
1512 + bb[4]
1513 + first state c0728710
1514 + bb_reg_state c0728658
1515 + rax = undefined
1516 + rbx = rbx
1517 + rcx = undefined
1518 + rdx = undefined
1519 + rdi = rax
1520 + rsi = undefined
1521 + rbp = osp-0x4
1522 + rsp = osp-0x14
1523 + slot 0 offset_address -0x4 rbp
1524 + slot 1 offset_address -0x8 rdi
1525 + slot 2 offset_address -0xc rsi
1526 + slot 3 offset_address -0x10 rbx
1527 + merging state c0728768
1528 + rbx = undefined
1529 + merging state c0728768
1530 + merging state c0728768
1531 +
1532 +bb[4] has 4 inputs, 3 of which have the same state. One one path (state
1533 +c0728710) rbx is defined, on the others (c0728768) rbx is undefined so the final
1534 +state has rbx as undefined.
1535 +
1536 + final state
1537 + bb_reg_state c0728658
1538 + rax = undefined
1539 + rbx = undefined
1540 + rcx = undefined
1541 + rdx = undefined
1542 + rdi = rax
1543 + rsi = undefined
1544 + rbp = osp-0x4
1545 + rsp = osp-0x14
1546 + slot 0 offset_address -0x4 rbp
1547 + slot 1 offset_address -0x8 rdi
1548 + slot 2 offset_address -0xc rsi
1549 + slot 3 offset_address -0x10 rbx
1550 + '0xc015cd60 getname+0x78: mov 0xfffffff0(%ebp),%edx'
1551 + opcode 'mov' matched by 'mov', usage 36
1552 + src M: 0xfffffff0(%ebp) base_rc 8 (rbp)
1553 + dst R: %edx base_rc 5 (rdx)
1554 + rdx = *(rbp-0x10) (osp-0x14) rdx = undefined
1555 + '0xc015cd63 getname+0x7b: mov 0xc04b2120,%eax'
1556 + opcode 'mov' matched by 'mov', usage 36
1557 + src M: 0xc04b2120
1558 + dst R: %eax base_rc 2 (rax)
1559 + rax = undefined
1560 + '0xc015cd68 getname+0x80: call 0xc01521f1 <kmem_cache_free>'
1561 + opcode 'call' matched by 'call', usage 17
1562 + src M: 0xc01521f1
1563 + bb_reg_state c0728658
1564 + rax = undefined
1565 + rbx = undefined
1566 + rcx = undefined
1567 + rdx = undefined
1568 + rdi = rax
1569 + rsi = undefined
1570 + rbp = osp-0x4
1571 + rsp = osp-0x14
1572 + slot 0 offset_address -0x4 rbp
1573 + slot 1 offset_address -0x8 rdi
1574 + slot 2 offset_address -0xc rsi
1575 + slot 3 offset_address -0x10 rbx
1576 + rax = undefined
1577 + rcx = undefined
1578 + rdx = undefined
1579 + bb_reg_state c0728658
1580 + rax = undefined
1581 + rbx = undefined
1582 + rcx = undefined
1583 + rdx = undefined
1584 + rdi = rax
1585 + rsi = undefined
1586 + rbp = osp-0x4
1587 + rsp = osp-0x14
1588 + slot 0 offset_address -0x4 rbp
1589 + slot 1 offset_address -0x8 rdi
1590 + slot 2 offset_address -0xc rsi
1591 + slot 3 offset_address -0x10 rbx
1592 + '0xc015cd6d getname+0x85: mov %esi,%eax'
1593 + opcode 'mov' matched by 'mov', usage 36
1594 + src R: %esi base_rc 7 (rsi)
1595 + dst R: %eax base_rc 2 (rax)
1596 + rax = rsi (undefined)
1597 + '0xc015cd6f getname+0x87: jmp 0xc015cd7d <getname+0x95>'
1598 + opcode 'jmp' matched by 'j', usage 28
1599 + src M: 0xc015cd7d
1600 + bb_reg_state c0728658
1601 + rax = undefined
1602 + rbx = undefined
1603 + rcx = undefined
1604 + rdx = undefined
1605 + rdi = rax
1606 + rsi = undefined
1607 + rbp = osp-0x4
1608 + rsp = osp-0x14
1609 + slot 0 offset_address -0x4 rbp
1610 + slot 1 offset_address -0x8 rdi
1611 + slot 2 offset_address -0xc rsi
1612 + slot 3 offset_address -0x10 rbx
1613 + matched: from 0xc015cd6f to 0xc015cd7d drop_through 0 bb_jmp[9]
1614 + reuse bb_jmp[3]
1615 +
1616 + bb[7]
1617 + first state c07286b8
1618 + bb_reg_state c0728658
1619 + rax = undefined
1620 + rbx = rbx
1621 + rcx = undefined
1622 + rdx = undefined
1623 + rdi = rax
1624 + rsi = rsi
1625 + rbp = osp-0x4
1626 + rsp = osp-0x14
1627 + slot 0 offset_address -0x4 rbp
1628 + slot 1 offset_address -0x8 rdi
1629 + slot 2 offset_address -0xc rsi
1630 + slot 3 offset_address -0x10 rbx
1631 + merging state c0728768
1632 + rbx = undefined
1633 + rsi = undefined
1634 + merging state c0728768
1635 + final state
1636 + bb_reg_state c0728658
1637 + rax = undefined
1638 + rbx = undefined
1639 + rcx = undefined
1640 + rdx = undefined
1641 + rdi = rax
1642 + rsi = undefined
1643 + rbp = osp-0x4
1644 + rsp = osp-0x14
1645 + slot 0 offset_address -0x4 rbp
1646 + slot 1 offset_address -0x8 rdi
1647 + slot 2 offset_address -0xc rsi
1648 + slot 3 offset_address -0x10 rbx
1649 + '0xc015cd7d getname+0x95: pop %edx'
1650 + opcode 'pop' matched by 'pop', usage 42
1651 + src R: %edx base_rc 5 (rdx)
1652 + rdx = *(rsp+0x0) (osp-0x14) rdx = undefined
1653 + rsp osp offset -0x14 -> -0x10
1654 +
1655 +This instruction is a bit misleading. It looks like gcc is restoring a value
1656 +from the stack *(osp-0x14) to edx, but we have no record of any useful data
1657 +being stored at osp-0x14. In fact gcc is just reducing the stack pointer by 4
1658 +bytes to reverse the effect of 0xc015ccee: sub $0x4,%esp, the value popped into
1659 +edx contains nothing useful. Why gcc does pop instead of add $0x4,%esp is a
1660 +puzzle, probably some micro optimization.
1661 +
1662 + '0xc015cd7e getname+0x96: pop %ebx'
1663 + opcode 'pop' matched by 'pop', usage 42
1664 + src R: %ebx base_rc 3 (rbx)
1665 + rbx = *(rsp+0x0) (osp-0x10) value rbx
1666 + rsp osp offset -0x10 -> -0xc
1667 + delete rbx from osp-0x10 slot 3
1668 +
1669 +This pop is doing something useful. It is restoring the original value of the
1670 +preserved register ebx from stack, reversing 0xc015cced: push %ebx. Note that
1671 +incrementing rsp from osp-0x10 to osp-0xc invalidates the data held in memory at
1672 +osp-0x10, so we delete our record of it.
1673 +
1674 + '0xc015cd7f getname+0x97: pop %esi'
1675 + opcode 'pop' matched by 'pop', usage 42
1676 + src R: %esi base_rc 7 (rsi)
1677 + rsi = *(rsp+0x0) (osp-0xc) value rsi
1678 + rsp osp offset -0xc -> -0x8
1679 + delete rsi from osp-0xc slot 2
1680 + '0xc015cd80 getname+0x98: pop %edi'
1681 + opcode 'pop' matched by 'pop', usage 42
1682 + src R: %edi base_rc 6 (rdi)
1683 + rdi = *(rsp+0x0) (osp-0x8) value rdi
1684 + rsp osp offset -0x8 -> -0x4
1685 + delete rdi from osp-0x8 slot 1
1686 +
1687 +Pop the other preserved registers, in reverse order to the push sequence at the
1688 +start.
1689 +
1690 + '0xc015cd81 getname+0x99: pop %ebp'
1691 + opcode 'pop' matched by 'pop', usage 42
1692 + src R: %ebp base_rc 8 (rbp)
1693 + rbp = *(rsp+0x0) (osp-0x4) value rbp
1694 + rsp osp offset -0x4 -> +0x0
1695 + delete rbp from osp-0x4 slot 0
1696 +
1697 +Pop the previous frame pointer.
1698 +
1699 + '0xc015cd82 getname+0x9a: ret '
1700 + opcode 'ret' matched by 'ret', usage 48
1701 +
1702 +When a ret instruction is executed, all the preserved registers must be back to
1703 +their original value and the stack pointer must contain osp+0.
1704 +bb_sanity_check() will complain and abort the backtrace if this is not true. No
1705 +complaints here.
1706 +
1707 + bb_pass2: end bb_reg_params 1 bb_memory_params 0
1708 +
1709 +We identified one argument passed in a register (the read of rax at 0xc015ccf1)
1710 +and no reference to memory locations above the stack frame. So we have one
1711 +argument being passed in a register and no arguments being passed on stack.
1712 +This matches
1713 +
1714 + char * getname(const char __user * filename)
1715 +
1716 + bb_pass2: bb_exit_state at 0xc015cd6d
1717 + bb_reg_state c07287c0
1718 + rax = undefined
1719 + rbx = undefined
1720 + rcx = undefined
1721 + rdx = undefined
1722 + rdi = rax
1723 + rsi = undefined
1724 + rbp = osp-0x4
1725 + rsp = osp-0x14
1726 + slot 0 offset_address -0x4 rbp
1727 + slot 1 offset_address -0x8 rdi
1728 + slot 2 offset_address -0xc rsi
1729 + slot 3 offset_address -0x10 rbx
1730 +
1731 +We told bb1 that the exit address from this function is 0xc015cd6d. The
1732 +abstract state at this exit point was saved, it defines how we rollback the
1733 +actual register values from the next function down the stack (kmem_cache_free)
1734 +to get the actual register values on entry to this function (getname). See
1735 +bb_actual_rollback() which updates bb_actual[].
1736 +
1737 +Looking at the exit state above, we see that rsp contains the abstracte value
1738 +osp-0x14. It is a given that we have the actual value of rsp after the call
1739 +from getname() to kmem_cache_free(), otherwise we would not have found the
1740 +return address on stack and we would not be analysing getname(). Adding 0x14
1741 +(the delta from osp to rsp) to our current actual rsp gives us the actual value
1742 +of osp on entry to getname().
1743 +
1744 +The main aim of doing all this work is to track the function arguments so we can
1745 +print them if possible. getname() only has one argument which was passed in
1746 +eax. According to the abstract exit state, the original value of rax is
1747 +currently in rdi, so by looking at the actual value of rdi from the next stack
1748 +frame down we are able to get the argument to getname().
1749 +
1750 +It is not always possible to get register arguments, gcc will only preserve
1751 +input arguments as long as it needs them so there may be no saved copy of
1752 +arguments that are passed in register. In this case, bt_print_one() prints
1753 +"invalid".
1754 +
1755 +If basic block analysis detected any arguments were passed on stack, their
1756 +contents can now be extracted based on the known value of the stack pointer.
1757 +bt_print_one() prints the arguments, if BT_ARGS is non-zero then any argument
1758 +that might be a kernel address is printed as a symbol.
1759 +
1760 +Once rsp has been rolled back to osp, we can calculate that actual address of
1761 +the stack locations that contain useful data. The previous values of rbp, rdi,
1762 +rsi and rbx are then copied from those locations into bb_actual[]. That gives
1763 +the values for those registers at the exit point from the function that called
1764 +getname(). Go up one level and repeat the analysis.
1765 +
1766 +There are two references to rdi in the exit state, which can be confusing.
1767 +
1768 + rdi = rax
1769 + slot 1 offset_address -0x8 rdi
1770 +
1771 +The first reference says that "register rdi contains the original value of rax",
1772 +the second reference says that "*(osp-0x8) contains the original value of rdi".
1773 +Do not confuse the two, one is by name, the other is by value.
1774 +
1775 +getname() is a fairly simple function, it has no loops. __follow_mount is more
1776 +complicated, it has loops as well as BUG() statements.
1777 +
1778 + [0]kdb> id __follow_mount
1779 + 0xc015be76 __follow_mount: push %ebp
1780 + 0xc015be77 __follow_mount+0x1: mov %esp,%ebp
1781 + 0xc015be79 __follow_mount+0x3: push %edi
1782 + 0xc015be7a __follow_mount+0x4: push %esi
1783 + 0xc015be7b __follow_mount+0x5: push %ebx
1784 + 0xc015be7c __follow_mount+0x6: mov %eax,%esi
1785 + 0xc015be7e __follow_mount+0x8: xor %edi,%edi
1786 + 0xc015be80 __follow_mount+0xa: jmp 0xc015beca __follow_mount+0x54
1787 + 0xc015be82 __follow_mount+0xc: mov (%esi),%eax
1788 + 0xc015be84 __follow_mount+0xe: call 0xc0169664 lookup_mnt
1789 + 0xc015be89 __follow_mount+0x13: mov %eax,%ebx
1790 + 0xc015be8b __follow_mount+0x15: test %eax,%eax
1791 + 0xc015be8d __follow_mount+0x17: je 0xc015bed3 __follow_mount+0x5d
1792 + 0xc015be8f __follow_mount+0x19: mov 0x4(%esi),%eax
1793 + 0xc015be92 __follow_mount+0x1c: call 0xc0163de2 dput
1794 + 0xc015be97 __follow_mount+0x21: test %edi,%edi
1795 + 0xc015be99 __follow_mount+0x23: je 0xc015bead __follow_mount+0x37
1796 + 0xc015be9b __follow_mount+0x25: mov (%esi),%eax
1797 + 0xc015be9d __follow_mount+0x27: test %eax,%eax
1798 + 0xc015be9f __follow_mount+0x29: je 0xc015bead __follow_mount+0x37
1799 + 0xc015bea1 __follow_mount+0x2b: movl $0x0,0x64(%eax)
1800 + 0xc015bea8 __follow_mount+0x32: call 0xc016835b mntput_no_expire
1801 + 0xc015bead __follow_mount+0x37: mov %ebx,(%esi)
1802 + 0xc015beaf __follow_mount+0x39: mov 0x10(%ebx),%eax
1803 + 0xc015beb2 __follow_mount+0x3c: test %eax,%eax
1804 + 0xc015beb4 __follow_mount+0x3e: je 0xc015bec2 __follow_mount+0x4c
1805 + 0xc015beb6 __follow_mount+0x40: cmpl $0x0,(%eax)
1806 + 0xc015beb9 __follow_mount+0x43: jne 0xc015bebf __follow_mount+0x49
1807 + 0xc015bebb __follow_mount+0x45: ud2a
1808 + 0xc015bebd __follow_mount+0x47: jmp 0xc015bebd __follow_mount+0x47
1809 + 0xc015bebf __follow_mount+0x49: lock incl (%eax)
1810 + 0xc015bec2 __follow_mount+0x4c: mov %eax,0x4(%esi)
1811 + 0xc015bec5 __follow_mount+0x4f: mov $0x1,%edi
1812 + 0xc015beca __follow_mount+0x54: mov 0x4(%esi),%edx
1813 + 0xc015becd __follow_mount+0x57: cmpl $0x0,0x74(%edx)
1814 + 0xc015bed1 __follow_mount+0x5b: jne 0xc015be82 __follow_mount+0xc
1815 + 0xc015bed3 __follow_mount+0x5d: mov %edi,%eax
1816 + 0xc015bed5 __follow_mount+0x5f: pop %ebx
1817 + 0xc015bed6 __follow_mount+0x60: pop %esi
1818 + 0xc015bed7 __follow_mount+0x61: pop %edi
1819 + 0xc015bed8 __follow_mount+0x62: pop %ebp
1820 + 0xc015bed9 __follow_mount+0x63: ret
1821 +
1822 + [0]kdb> bb1 0xc015bed9
1823 + bb_pass1: func_name __follow_mount func_start 0xc015be76 func_end 0xc015beda
1824 + bb_pass1: end
1825 + bb[0] start 0xc015be76 end 0xc015be80 drop_through 0
1826 + bb[1] start 0xc015be82 end 0xc015beac drop_through 1
1827 + bb[2] start 0xc015bead end 0xc015bebb drop_through 0
1828 +
1829 +Note that the ud2a (BUG) instruction at 0xc015bebb ends bb[2].
1830 +
1831 + bb[3] start 0xc015bebd end 0xc015bebd drop_through 0
1832 +
1833 +bb[3] is peculiar, it is a jmp to itself, nothing else refers to 0xc015bebd and
1834 +you cannot drop through from the previous instruction because ud2a kills the
1835 +kernel. The i386 and x86_64 BUG() macros contain for(;;) after ud2a, for no
1836 +good reason that I can see (is there old hardware that does not abort on ud2a?).
1837 +ia64 and the generic versions of BUG() do not contain for(;;). for(;;) after
1838 +ud2a generates a branch to itself than can never be executed.
1839 +
1840 + bb[4] start 0xc015bebf end 0xc015bec1 drop_through 1
1841 + bb[5] start 0xc015bec2 end 0xc015bec9 drop_through 1
1842 + bb[6] start 0xc015beca end 0xc015bed2 drop_through 1
1843 + bb[7] start 0xc015bed3 end 0xc015bed9 drop_through 0
1844 + bb_jmp[0] from 0xc015be80 to 0xc015beca drop_through 0
1845 + bb_jmp[1] from 0xc015be8d to 0xc015bed3 drop_through 0
1846 + bb_jmp[2] from 0xc015be99 to 0xc015bead drop_through 0
1847 + bb_jmp[3] from 0xc015be9f to 0xc015bead drop_through 0
1848 + bb_jmp[4] from 0xc015beb4 to 0xc015bec2 drop_through 0
1849 + bb_jmp[5] from 0xc015beb9 to 0xc015bebf drop_through 0
1850 + bb_jmp[6] from 0xc015bebd to 0xc015bebd drop_through 0
1851 + bb_jmp[7] from 0xc015bed1 to 0xc015be82 drop_through 0
1852 + bb_jmp[8] from 0xc015beac to 0xc015bead drop_through 1
1853 + bb_jmp[9] from 0xc015bec1 to 0xc015bec2 drop_through 1
1854 + bb_jmp[10] from 0xc015bec9 to 0xc015beca drop_through 1
1855 + bb_jmp[11] from 0xc015bed2 to 0xc015bed3 drop_through 1
1856 +
1857 +Apart from bb[0] and the special case bb[3], all the other blocks are part of a
1858 +cycle. That cycle goes bb[0] -> bb[6]. bb[6] -> {bb[1], bb[7]}. bb[1] ->
1859 +{bb[2], bb[7]}. bb[2] -> {bb[4], bb[5]}. bb[4] -> bb[5]. bb[5] -> bb[6] and
1860 +back to the start. bb[7] ends with 'ret', it does not feed into other blocks.
1861 +
1862 + bb_pass2: start
1863 +
1864 + bb_pass2_do_changed_blocks: allow_missing 0
1865 +
1866 + bb[0]
1867 + [ ... detail snipped ... ]
1868 + matched: from 0xc015be80 to 0xc015beca drop_through 0 bb_jmp[0]
1869 + new state c07286d8
1870 +
1871 + bb_pass2_do_changed_blocks: allow_missing 1
1872 +
1873 +Because of the cycle, only bb[0] can be processed with 0 missing inputs, all the
1874 +other blocks have at least one missing input. Call bb_pass2_do_changed_blocks()
1875 +again, this time allowing one missing input per blocks.
1876 +
1877 + bb[6]
1878 + first state c07286d8
1879 + [ ... detail snipped ... ]
1880 + matched: from 0xc015bed2 to 0xc015bed3 drop_through 1 bb_jmp[11]
1881 + reuse bb_jmp[7]
1882 +
1883 + bb[7]
1884 + first state c0728730
1885 + [ ... detail snipped ... ]
1886 +
1887 + bb[1]
1888 + first state c0728730
1889 + [ ... detail snipped ... ]
1890 + matched: from 0xc015beac to 0xc015bead drop_through 1 bb_jmp[8]
1891 + reuse bb_jmp[1]
1892 +
1893 + bb[2]
1894 + first state c0728788
1895 + [ ... detail snipped ... ]
1896 + merging state c0728788
1897 + merging state c0728788
1898 + [ ... detail snipped ... ]
1899 + matched: from 0xc015beb9 to 0xc015bebf drop_through 0 bb_jmp[5]
1900 + reuse bb_jmp[1]
1901 +
1902 + bb[4]
1903 + first state c0728788
1904 + [ ... detail snipped ... ]
1905 + matched: from 0xc015bec1 to 0xc015bec2 drop_through 1 bb_jmp[9]
1906 + reuse bb_jmp[1]
1907 +
1908 + bb[5]
1909 + first state c0728788
1910 + [ ... detail snipped ... ]
1911 + merging state c0728788
1912 + [ ... detail snipped ... ]
1913 + matched: from 0xc015bec9 to 0xc015beca drop_through 1 bb_jmp[10]
1914 + reuse bb_jmp[1]
1915 +
1916 + bb[6]
1917 + first state c07286d8
1918 + [ ... detail snipped ... ]
1919 + merging state c0728788
1920 + matched: from 0xc015bed2 to 0xc015bed3 drop_through 1 bb_jmp[11]
1921 + reuse bb_jmp[1]
1922 +
1923 +Note the rescan of bb[6]. The first scan only had one input from bb[0]. After
1924 +traversing the cycle and getting back from bb[5] to bb[6], bb[6] now has more
1925 +inputs so we need to rescan it. With the additional input, the output state
1926 +from bb[6] has changed since the first scan, which means that every block it
1927 +feeds has to be rescanned. bb[6] feeds bb[1] and bb[7].
1928 +
1929 + bb[7]
1930 + first state c0728788
1931 + [ ... detail snipped ... ]
1932 + merging state c0728788
1933 + [ ... detail snipped ... ]
1934 +
1935 +bb[7] being rescanned, this time it has data for both its inputs.
1936 +
1937 + bb[1]
1938 + first state c0728788
1939 + [ ... detail snipped ... ]
1940 + matched: from 0xc015beac to 0xc015bead drop_through 1 bb_jmp[8]
1941 + no state change
1942 +
1943 +bb[1] is being rescanned because the input from bb[6] has changed, however the
1944 +rescan of bb[1] reports 'no state change', the changed input from bb[6] did not
1945 +affect the final output state from bb[1]. Because the output state from bb[1]
1946 +has not changed since the previous scan, there is no need to rescan bb[2], bb[7]
1947 +or bb[4]. Since bb[4] is not being rescanned, there is no need to rescan bb[5]
1948 +or bb[6] and the cycle is closed.
1949 --- /dev/null
1950 +++ b/Documentation/kdb/kdb.mm
1951 @@ -0,0 +1,492 @@
1952 +.TH KDB 8 "September 21, 2005"
1953 +.hy 0
1954 +.SH NAME
1955 +Built-in Kernel Debugger for Linux - v4.4
1956 +.SH "Overview"
1957 +This document describes the built-in kernel debugger available
1958 +for linux. This debugger allows the programmer to interactively
1959 +examine kernel memory, disassemble kernel functions, set breakpoints
1960 +in the kernel code and display and modify register contents.
1961 +.P
1962 +A symbol table is included in the kernel image and in modules which
1963 +enables all non-stack symbols (including static symbols) to be used as
1964 +arguments to the kernel debugger commands.
1965 +.SH "Getting Started"
1966 +To include the kernel debugger in a linux kernel, use a
1967 +configuration mechanism (e.g. xconfig, menuconfig, et. al.)
1968 +to enable the \fBCONFIG_KDB\fP option. Additionally, for accurate
1969 +stack tracebacks, it is recommended that the \fBCONFIG_FRAME_POINTER\fP
1970 +option be enabled (if present). \fBCONFIG_FRAME_POINTER\fP changes the compiler
1971 +flags so that the frame pointer register will be used as a frame
1972 +pointer rather than a general purpose register.
1973 +.P
1974 +After linux has been configured to include the kernel debugger,
1975 +make a new kernel with the new configuration file (a make clean
1976 +is recommended before making the kernel), and install the kernel
1977 +as normal.
1978 +.P
1979 +You can compile a kernel with kdb support but have kdb off by default,
1980 +select \fBCONFIG_KDB_OFF\fR. Then the user has to explicitly activate
1981 +kdb by booting with the 'kdb=on' flag or, after /proc is mounted, by
1982 +.nf
1983 + echo "1" > /proc/sys/kernel/kdb
1984 +.fi
1985 +You can also do the reverse, compile a kernel with kdb on and
1986 +deactivate kdb with the boot flag 'kdb=off' or, after /proc is mounted,
1987 +by
1988 +.nf
1989 + echo "0" > /proc/sys/kernel/kdb
1990 +.fi
1991 +.P
1992 +When booting the new kernel, the 'kdb=early' flag
1993 +may be added after the image name on the boot line to
1994 +force the kernel to stop in the kernel debugger early in the
1995 +kernel initialization process. 'kdb=early' implies 'kdb=on'.
1996 +If the 'kdb=early' flag isn't provided, then kdb will automatically be
1997 +invoked upon system panic or when the \fBPAUSE\fP key is used from the
1998 +keyboard, assuming that kdb is on. Older versions of kdb used just a
1999 +boot flag of 'kdb' to activate kdb early, this is no longer supported.
2000 +.P
2001 +KDB can also be used via the serial port. Set up the system to
2002 +have a serial console (see \fIDocumentation/serial-console.txt\fP), you
2003 +must also have a user space program such as agetty set up to read from
2004 +the serial console.
2005 +The control sequence \fB<esc>KDB\fP on the serial port will cause the
2006 +kernel debugger to be entered, assuming that kdb is on, that some
2007 +program is reading from the serial console, at least one cpu is
2008 +accepting interrupts and the serial console driver is still usable.
2009 +.P
2010 +\fBNote:\fR\ When the serial console sequence consists of multiple
2011 +characters such as <esc>KDB then all but the last character are passed
2012 +through to the application that is reading from the serial console.
2013 +After exiting from kdb, you should use backspace to delete the rest of
2014 +the control sequence.
2015 +.P
2016 +You can boot with kdb activated but without the ability to enter kdb
2017 +via any keyboard sequence.
2018 +In this mode, kdb will only be entered after a system failure.
2019 +Booting with kdb=on-nokey will activate kdb but ignore keyboard
2020 +sequences that would normally drop you into kdb.
2021 +kdb=on-nokey is mainly useful when you are using a PC keyboard and your
2022 +application needs to use the Pause key.
2023 +You can also activate this mode by
2024 +.nf
2025 + echo "2" > /proc/sys/kernel/kdb
2026 +.fi
2027 +.P
2028 +If the console is sitting on the login prompt when you enter kdb, then
2029 +the login command may switch into upper case mode.
2030 +This is not a kdb bug, it is a "feature" of login - if the userid is
2031 +all upper case then login assumes that you using a TeleType (circa
2032 +1960) which does not have lower case characters.
2033 +Wait 60 seconds for login to timeout and it will switch back to lower
2034 +case mode.
2035 +.P
2036 +\fBNote:\fR\ Your distributor may have chosen a different kdb
2037 +activation sequence for the serial console.
2038 +Consult your distribution documentation.
2039 +.P
2040 +If you have both a keyboard+video and a serial console, you can use
2041 +either for kdb.
2042 +Define both video and serial consoles with boot parameters
2043 +.P
2044 +.nf
2045 + console=tty0 console=ttyS0,38400
2046 +.fi
2047 +.P
2048 +Any kdb data entered on the keyboard or the serial console will be echoed
2049 +to both.
2050 +.P
2051 +If you are using a USB keyboard then kdb commands cannot be entered
2052 +until the kernel has initialised the USB subsystem and recognised the
2053 +keyboard.
2054 +Using kdb=early with a USB keyboard will not work, the USB subsystem is
2055 +initialised too late.
2056 +.P
2057 +While kdb is active, the keyboard (not serial console) indicators may strobe.
2058 +The caps lock and scroll lock lights will turn on and off, num lock is not used
2059 +because it can confuse laptop keyboards where the numeric keypad is mapped over
2060 +the normal keys.
2061 +On exit from kdb the keyboard indicators will probably be wrong, they will not match the kernel state.
2062 +Pressing caps lock twice should get the indicators back in sync with
2063 +the kernel.
2064 +.SH "Basic Commands"
2065 +There are several categories of commands available to the
2066 +kernel debugger user including commands providing memory
2067 +display and modification, register display and modification,
2068 +instruction disassemble, breakpoints and stack tracebacks.
2069 +Any command can be prefixed with '-' which will cause kdb to ignore any
2070 +errors on that command, this is useful when packaging commands using
2071 +defcmd.
2072 +A line whose first non-space character is '#' is printed and ignored.
2073 +.P
2074 +The following table shows the currently implemented standard commands,
2075 +these are always available. Other commands can be added by extra
2076 +debugging modules, type '?' at the kdb prompt to get a list of all
2077 +available commands.
2078 +.DS
2079 +.TS
2080 +box, center;
2081 +l | l
2082 +l | l.
2083 +Command Description
2084 +_
2085 +bc Clear Breakpoint
2086 +bd Disable Breakpoint
2087 +be Enable Breakpoint
2088 +bl Display breakpoints
2089 +bp Set or Display breakpoint
2090 +bph Set or Display hardware breakpoint
2091 +bpa Set or Display breakpoint globally
2092 +bpha Set or Display hardware breakpoint globally
2093 +bt Stack backtrace for current process
2094 +btp Stack backtrace for specific process
2095 +bta Stack backtrace for all processes
2096 +btc Cycle over all live cpus and backtrace each one
2097 +cpu Display or switch cpus
2098 +dmesg Display system messages
2099 +defcmd Define a command as a set of other commands
2100 +ef Print exception frame
2101 +env Show environment
2102 +go Restart execution
2103 +handlers Control the display of IA64 MCA/INIT handlers
2104 +help Display help message
2105 +id Disassemble Instructions
2106 +kill Send a signal to a process
2107 +ll Follow Linked Lists
2108 +lsmod List loaded modules
2109 +md Display memory contents
2110 +mdWcN Display memory contents with width W and count N.
2111 +mdp Display memory based on a physical address
2112 +mdr Display raw memory contents
2113 +mds Display memory contents symbolically
2114 +mm Modify memory contents, words
2115 +mmW Modify memory contents, bytes
2116 +per_cpu Display per_cpu variables
2117 +pid Change the default process context
2118 +ps Display process status
2119 +reboot Reboot the machine
2120 +rd Display register contents
2121 +rm Modify register contents
2122 +rq Display runqueue for one cpu
2123 +rqa Display runqueue for all cpus
2124 +set Add/change environment variable
2125 +sr Invoke SysReq commands
2126 +ss Single step a cpu
2127 +ssb Single step a cpu until a branch instruction
2128 +stackdepth Print the stack depth for selected processes
2129 +summary Summarize the system
2130 +.TE
2131 +.DE
2132 +.P
2133 +Some commands can be abbreviated, such commands are indicated by a
2134 +non-zero \fIminlen\fP parameter to \fBkdb_register\fP; the value of
2135 +\fIminlen\fP being the minimum length to which the command can be
2136 +abbreviated (for example, the \fBgo\fP command can be abbreviated
2137 +legally to \fBg\fP).
2138 +.P
2139 +If an input string does not match a command in the command table,
2140 +it is treated as an address expression and the corresponding address
2141 +value and nearest symbol are shown.
2142 +.P
2143 +Some of the commands are described here.
2144 +Information on the more complicated commands can be found in the
2145 +appropriate manual pages.
2146 +.TP 8
2147 +cpu
2148 +With no parameters, it lists the available cpus.
2149 +\&'*' after a cpu number indicates a cpu that did not respond to the kdb
2150 +stop signal.
2151 +\&'+' after a cpu number indicates a cpu for which kdb has some data, but
2152 +that cpu is no longer responding to kdb, so you cannot switch to it.
2153 +This could be a cpu that has failed after entering kdb, or the cpu may
2154 +have saved its state for debugging then entered the prom, this is
2155 +normal for an IA64 MCA event.
2156 +\&'I' after a cpu number means that the cpu was idle before it entered
2157 +kdb, it is unlikely to contain any useful data.
2158 +\&'F' after a cpu number means that the cpu is offline.
2159 +There is currenly no way to distinguish between cpus that used to be
2160 +online but are now offline and cpus that were never online, the kernel
2161 +does not maintain the information required to separate those two cases.
2162 +.I cpu
2163 +followed by a number will switch to that cpu, you cannot switch to
2164 +a cpu marked '*', '+' or 'F'.
2165 +This command is only available if the kernel was configured for SMP.
2166 +.TP 8
2167 +dmesg [lines] [adjust]
2168 +Displays the system messages from the kernel buffer.
2169 +If kdb logging is on, it is disabled by dmesg and is left as disabled.
2170 +With no parameters or a zero value for 'lines', dmesg dumps the entire
2171 +kernel buffer.
2172 +If lines is specified and is positive, dmesg dumps the last 'lines'
2173 +from the buffer.
2174 +If lines is specified and is negative, dmesg dumps the first 'lines'
2175 +from the buffer.
2176 +If adjust is specified, adjust the starting point for the lines that
2177 +are printed.
2178 +When 'lines' is positive, move the starting point back by 'adjust'
2179 +lines, when 'lines' is negative, move the starting point forward by
2180 +\&'adjust' lines.
2181 +.I dmesg -100
2182 +will dump 100 lines, from the start of the buffer.
2183 +.I dmesg 100
2184 +will dump 100 lines, starting 100 lines from the end of the buffer,
2185 +.I dmesg 100 100
2186 +will dump 100 lines, starting 200 lines from the end of the buffer.
2187 +.I dmesg -100 100
2188 +will dump 100 lines, starting 100 lines from the start of the buffer.
2189 +.TP 8
2190 +defcmd
2191 +Defines a new command as a set of other commands, all input until
2192 +.I endefcmd
2193 +is saved and executed as a package.
2194 +.I defcmd
2195 +takes three parameters, the command name to be defined and used to
2196 +invoke the package, a quoted string containing the usage text and a
2197 +quoted string containing the help text for the command.
2198 +When using defcmd, it is a good idea to prefix commands that might fail
2199 +with '-', this ignores errors so the following commands are still
2200 +executed.
2201 +For example,
2202 +.P
2203 +.nf
2204 + defcmd diag "" "Standard diagnostics"
2205 + set LINES 2000
2206 + set BTAPROMPT 0
2207 + -id %eip-0x40
2208 + -cpu
2209 + -ps
2210 + -dmesg 80
2211 + -bt
2212 + -bta
2213 + endefcmd
2214 +.fi
2215 +.P
2216 +When used with no parameters, defcmd prints all the defined commands.
2217 +.TP 8
2218 +go
2219 +Continue normal execution.
2220 +Active breakpoints are reestablished and the processor(s) allowed to
2221 +run normally.
2222 +To continue at a specific address, use
2223 +.I rm
2224 +to change the instruction pointer then go.
2225 +.TP 8
2226 +handlers
2227 +Control the display of IA64 MCA/INIT handlers.
2228 +The IA64 MCA/INIT handlers run on separate tasks.
2229 +During an MCA/INIT event, the active tasks are typically the handlers,
2230 +rather than the original tasks, which is not very useful for debugging.
2231 +By default, KDB hides the MCA/INIT handlers so commands such as ps and
2232 +btc will display the original task.
2233 +You can change this behaviour by using
2234 +.I handlers show
2235 +to display the MCA/INIT handlers instead of the original tasks or use
2236 +.I handlers hide
2237 +(the default) to hide the MCA/INIT handlers and display the original
2238 +tasks.
2239 +.I handlers status
2240 +will list the address of the handler task and the original task for
2241 +each cpu.
2242 +\fBNote:\fR\ If the original task was running in user space or it
2243 +failed any of the MCA/INIT verification tests then there is no original
2244 +task to display.
2245 +In this case, the handler will be displayed even if
2246 +.I handlers hide
2247 +is set and
2248 +.I handlers status
2249 +will not show an original task.
2250 +.TP 8
2251 +id
2252 +Disassemble instructions starting at an address.
2253 +Environment variable IDCOUNT controls how many lines of disassembly
2254 +output the command produces.
2255 +.TP 8
2256 +kill
2257 +Internal command to send a signal (like kill(1)) to a process.
2258 +kill -signal pid.
2259 +.TP 8
2260 +lsmod
2261 +Internal command to list modules.
2262 +This does not use any kernel nor user space services so can be used at any time.
2263 +.TP 8
2264 +per_cpu <variable_name> [<length>] [<cpu>]
2265 +Display the values of a per_cpu variable, the variable_name is
2266 +specified without the \fIper_cpu__\fR prefix.
2267 +Length is the length of the variable, 1-8, if omitted or 0 it defaults
2268 +to the size of the machine's register.
2269 +To display the variable on a specific cpu, the third parameter is the
2270 +cpu number.
2271 +When the third parameter is omitted, the variable's value is printed
2272 +from all cpus, except that zero values are suppressed.
2273 +For each cpu, per_cpu prints the cpu number, the address of the
2274 +variable and its value.
2275 +.TP 8
2276 +pid <number>
2277 +Change the current process context, with no parameters it displays the
2278 +current process.
2279 +The current process is used to display registers, both kernel and user
2280 +space.
2281 +It is also used when dumping user pages.
2282 +.I pid R
2283 +resets to the original process that was running when kdb was entered.
2284 +This command is useful if you have been looking at other processes and/or
2285 +cpus and you want to get back to the original process.
2286 +It does not switch cpus, it only resets the context to the original process.
2287 +.TP 8
2288 +reboot
2289 +Reboot the system, with no attempt to do a clean close down.
2290 +.TP 8
2291 +rq <cpu>
2292 +Display the runqueues for the specified cpu.
2293 +.TP 8
2294 +rqa
2295 +Display the runqueues for all cpus.
2296 +.TP 8
2297 +stackdepth <percentage>
2298 +Print the stack usage for processes using more than the specified
2299 +percentage of their stack.
2300 +If percentage is not supplied, it defaults to 60.
2301 +This command is only implemented on i386 and ia64 architectures,
2302 +patches for other architectures will be gratefully accepted.
2303 +.TP 8
2304 +summary
2305 +Print a summary of the system, including the time (no timezone is
2306 +applied), uname information and various critical system counters.
2307 +.SH INITIAL KDB COMMANDS
2308 +kdb/kdb_cmds is a plain text file where you can define kdb commands
2309 +which are to be issued during kdb_init(). One command per line, blank
2310 +lines are ignored, lines starting with '#' are ignored. kdb_cmds is
2311 +intended for per user customization of kdb, you can use it to set
2312 +environment variables to suit your hardware or to set standard
2313 +breakpoints for the problem you are debugging. This file is converted
2314 +to a small C object, compiled and linked into the kernel. You must
2315 +rebuild and reinstall the kernel after changing kdb_cmds. This file
2316 +will never be shipped with any useful data so you can always override
2317 +it with your local copy. Sample kdb_cmds:
2318 +.P
2319 +.nf
2320 +# Initial commands for kdb, alter to suit your needs.
2321 +# These commands are executed in kdb_init() context, no SMP, no
2322 +# processes. Commands that require process data (including stack or
2323 +# registers) are not reliable this early. set and bp commands should
2324 +# be safe. Global breakpoint commands affect each cpu as it is booted.
2325 +
2326 +set LINES=50
2327 +set MDCOUNT=25
2328 +set RECURSE=1
2329 +bp sys_init_module
2330 +.fi
2331 +.SH INTERRUPTS AND KDB
2332 +When a kdb event occurs, one cpu (the initial cpu) enters kdb state.
2333 +It uses a cross system interrupt to interrupt the
2334 +other cpus and bring them all into kdb state. All cpus run with
2335 +interrupts disabled while they are inside kdb, this prevents most
2336 +external events from disturbing the kernel while kdb is running.
2337 +.B Note:
2338 +Disabled interrupts means that any I/O that relies on interrupts cannot
2339 +proceed while kdb is in control, devices can time out. The clock tick
2340 +is also disabled, machines will lose track of time while they are
2341 +inside kdb.
2342 +.P
2343 +Even with interrupts disabled, some non-maskable interrupt events will
2344 +still occur, these can disturb the kernel while you are debugging it.
2345 +The initial cpu will still accept NMI events, assuming that kdb was not
2346 +entered for an NMI event. Any cpu where you use the SS or SSB commands
2347 +will accept NMI events, even after the instruction has finished and the
2348 +cpu is back in kdb. This is an unavoidable side effect of the fact that
2349 +doing SS[B] requires the cpu to drop all the way out of kdb, including
2350 +exiting from the event that brought the cpu into kdb. Under normal
2351 +circumstances the only NMI event is for the NMI oopser and that is kdb
2352 +aware so it does not disturb the kernel while kdb is running.
2353 +.P
2354 +Sometimes doing SS or SSB on ix86 will allow one interrupt to proceed,
2355 +even though the cpu is disabled for interrupts. I have not been able
2356 +to track this one down but I suspect that the interrupt was pending
2357 +when kdb was entered and it runs when kdb exits through IRET even
2358 +though the popped flags are marked as cli(). If any ix86 hardware
2359 +expert can shed some light on this problem, please notify the kdb
2360 +maintainer.
2361 +.SH RECOVERING FROM KDB ERRORS
2362 +If a kdb command breaks and kdb has enough of a recovery environment
2363 +then kdb will abort the command and drop back into mainline kdb code.
2364 +This means that user written kdb commands can follow bad pointers
2365 +without killing kdb. Ideally all code should verify that data areas
2366 +are valid (using kdb_getarea) before accessing it but lots of calls to
2367 +kdb_getarea can be clumsy.
2368 +.P
2369 +The sparc64 port does not currently provide this error recovery.
2370 +If someone would volunteer to write the necessary longjmp/setjmp
2371 +code, their efforts would be greatly appreciated. In the
2372 +meantime, it is possible for kdb to trigger a panic by accessing
2373 +a bad address.
2374 +.SH DEBUGGING THE DEBUGGER
2375 +kdb has limited support for debugging problems within kdb. If you
2376 +suspect that kdb is failing, you can set environment variable KDBDEBUG
2377 +to a bit pattern which will activate kdb_printf statements within kdb.
2378 +See include/linux/kdb.h, KDB_DEBUG_FLAG_xxx defines. For example
2379 +.nf
2380 + set KDBDEBUG=0x60
2381 +.fi
2382 +activates the event callbacks into kdb plus state tracing in sections
2383 +of kdb.
2384 +.nf
2385 + set KDBDEBUG=0x18
2386 +.fi
2387 +gives lots of tracing as kdb tries to decode the process stack.
2388 +.P
2389 +You can also perform one level of recursion in kdb. If environment
2390 +variable RECURSE is not set or is 0 then kdb will either recover from
2391 +an error (if the recovery environment is satisfactory) or kdb will
2392 +allow the error to percolate, usually resulting in a dead system. When
2393 +RECURSE is 1 then kdb will recover from an error or, if there is no
2394 +satisfactory recovery environment, it will drop into kdb state to let
2395 +you diagnose the problem. When RECURSE is 2 then all errors drop into
2396 +kdb state, kdb does not attempt recovery first. Errors while in
2397 +recursive state all drop through, kdb does not even attempt to recover
2398 +from recursive errors.
2399 +.SH KEYBOARD EDITING
2400 +kdb supports a command history, which can be accessed via keyboard
2401 +sequences.
2402 +It supports the special keys on PC keyboards, control characters and
2403 +vt100 sequences on a serial console or a PC keyboard.
2404 +.P
2405 +.DS
2406 +.TS
2407 +box, center;
2408 +l | l | l l | l
2409 +l | l | l l | l.
2410 +PC Special keys Control VT100 key Codes Action
2411 +_
2412 +Backspace ctrl-H Backspace 0x7f Delete character to the left of the cursor
2413 +Delete ctrl-D Delete \\e[3~ Delete character to the right of the cursor
2414 +Home ctrl-A Home \\e[1~ Go to start of line
2415 +End ctrl-E End \\e[4~ Go to end of line
2416 +Up arrow ctrl-P Up arrow \\e[A Up one command in history
2417 +Down arrow ctrl-N Down arrow \\e[B Down one command in history
2418 +Left arrow ctrl-B Left arrow \\e[D Left one character in current command
2419 +Right arrow ctrl-F Right arrow \\e[C Right one character in current command
2420 +.TE
2421 +.DE
2422 +.P
2423 +There is no toggle for insert/replace mode, kdb editing is always in
2424 +insert mode.
2425 +Use delete and backspace to delete characters.
2426 +.P
2427 +kdb also supports tab completion for kernel symbols
2428 +Type the start of a kernel symbol and press tab (ctrl-I) to complete
2429 +the name
2430 +If there is more than one possible match, kdb will append any common
2431 +characters and wait for more input, pressing tab a second time will
2432 +display the possible matches
2433 +The number of matches is limited by environment variable DTABCOUNT,
2434 +with a default of 30 if that variable is not set.
2435 +.SH AUTHORS
2436 +Scott Lurndal, Richard Bass, Scott Foehner, Srinivasa Thirumalachar,
2437 +Masahiro Adegawa, Marc Esipovich, Ted Kline, Steve Lord, Andi Kleen,
2438 +Sonic Zhang.
2439 +.br
2440 +Keith Owens <kaos@sgi.com> - kdb maintainer.
2441 +.SH SEE ALSO
2442 +.P
2443 +linux/Documentation/kdb/kdb_{bp,bt,env,ll,md,ps,rd,sr,ss}.man
2444 --- /dev/null
2445 +++ b/Documentation/kdb/kdb_bp.man
2446 @@ -0,0 +1,197 @@
2447 +.TH BD 1 "July 12, 2004"
2448 +.SH NAME
2449 +bp, bpa, bph, bpha, bd, bc, be, bl \- breakpoint commands
2450 +.SH SYNOPSIS
2451 +bp \fIaddress-expression\fP
2452 +.LP
2453 +bpa \fIaddress-expression\fP
2454 +.LP
2455 +bph \fIaddress-expression\fP [\f(CWDATAR|DATAW|DATAA|IO\fP [\fIlength\fP]]
2456 +.LP
2457 +bpha \fIaddress-expression\fP [\f(CWDATAR|DATAW|DATAA|IO\fP [\fIlength\fP]]
2458 +.LP
2459 +bd \fIbreakpoint-number\fP
2460 +.LP
2461 +bc \fIbreakpoint-number\fP
2462 +.LP
2463 +be \fIbreakpoint-number\fP
2464 +.LP
2465 +bl
2466 +.SH DESCRIPTION
2467 +.hy 0
2468 +The
2469 +.B bp
2470 +family of commands are used to establish a breakpoint.
2471 +The \fIaddress-expression\fP may be a numeric value (decimal or
2472 +hexidecimal), a symbol name, a register name preceeded by a
2473 +percent symbol '%', or a simple expression consisting of a
2474 +symbol name, an addition or subtraction character and a numeric
2475 +value (decimal or hexidecimal).
2476 +.P
2477 +\fBbph\fP and \fBbpha\fP will force the use of a hardware register, provided
2478 +the processor architecture supports them.
2479 +.P
2480 +The \fIaddress-expression\fP may also consist of a single
2481 +asterisk '*' symbol which indicates that the command should
2482 +operate on all existing breakpoints (valid only for \fBbc\fP,
2483 +\fBbd\fP and \fBbe\fP).
2484 +.P
2485 +Four different types of
2486 +breakpoints may be set:
2487 +
2488 +.TP 8
2489 +Instruction
2490 +Causes the kernel debugger to be invoked from the debug exception
2491 +path when an instruction is fetched from the specified address. This
2492 +is the default if no other type of breakpoint is requested or when
2493 +the \fBbp\fP command is used.
2494 +
2495 +.TP 8
2496 +DATAR
2497 +Causes the kernel debugger to be entered when data of length
2498 +\fIlength\fP is read from or written to the specified address.
2499 +This type of breakpoint must use a processor debug register which
2500 +places an architecture dependent limit on the number of data and I/O
2501 +breakpoints that may be established. On arm mode XScale platform
2502 +(thumb mode is not supported yet),
2503 +debugger is triggered by reading from the specified address.
2504 +The \fBbph\fP or \fBbpha\fP commands must be used.
2505 +
2506 +.TP 8
2507 +DATAW
2508 +Enters the kernel debugger when data of length \fIlength\fP
2509 +is written to the specified address. \fIlength\fP defaults
2510 +to four bytes if it is not explicitly specified.
2511 +Note that the processor may have already overwritten the prior data at
2512 +the breakpoint location before the kernel debugger is invoked.
2513 +The prior data should be saved before establishing the breakpoint, if
2514 +required. On arm mode XScale platform, the debugger is triggered
2515 +after having overwritten the specified address.
2516 +The \fBbph\fP or \fBbpha\fP commands must be used.
2517 +
2518 +.TP 8
2519 +IO
2520 +Enters the kernel debugger when an \fBin\fP or \fBout\fP instruction
2521 +targets the specified I/O address. The \fBbph\fP or \fBbpha\fP
2522 +commands must be used. This type of breakpoint is not valid in
2523 +arm mode XScale platform. This option is not valid in arm
2524 +mode XScale platform.
2525 +
2526 +.TP 8
2527 +DATAA
2528 +Enters the kernel debugger after the data in specified address has
2529 +been accessed (read or write), this option is only used in arm
2530 +mode XScale platform.
2531 +
2532 +.P
2533 +The
2534 +.B bpha
2535 +command will establish a breakpoint on all processors in an
2536 +SMP system. This command is not available in an uniprocessor
2537 +kernel.
2538 +.P
2539 +The
2540 +.B bd
2541 +command will disable a breakpoint without removing it from the kernel
2542 +debugger's breakpoint table.
2543 +This can be used to keep breakpoints in the table without exceeding the
2544 +architecture limit on breakpoint registers.
2545 +A breakpoint-number of \fI*\fR will disable all break points.
2546 +.P
2547 +The
2548 +.B be
2549 +command will re-enable a disabled breakpoint.
2550 +A breakpoint-number of \fI*\fR will enable all break points.
2551 +.P
2552 +The
2553 +.B bc
2554 +command will clear a breakpoint from the breakpoint table.
2555 +A breakpoint-number of \fI*\fR will clear all break points.
2556 +.P
2557 +The
2558 +.B bl
2559 +command will list the existing set of breakpoints.
2560 +.SH LIMITATIONS
2561 +There is a compile time limit of sixteen entries in the
2562 +breakpoint table at any one time.
2563 +.P
2564 +There are architecture dependent limits on the number of hardware
2565 +breakpoints that can be set.
2566 +.IP ix86 8
2567 +Four.
2568 +.PD 0
2569 +.IP xscale 8
2570 +Two for insruction breakpoints and another two for data breakpoint.
2571 +.PD 0
2572 +.IP ia64 8
2573 +?
2574 +.PD 0
2575 +.IP sparc64 8
2576 +None.
2577 +.PD 1
2578 +When issuing the "go" command after entering the debugger due to
2579 +a breakpoint, kdb will silently perform a single step in order to
2580 +reapply the breakpoint. The sparc64 port has some limitations on
2581 +single stepping, which may limit where a breakpoint may be safely
2582 +set. Please read the man page for \fBss\fP for more information.
2583 +.SH ENVIRONMENT
2584 +The breakpoint subsystem does not currently use any environment
2585 +variables.
2586 +.SH SMP CONSIDERATIONS
2587 +Using
2588 +.B bc
2589 +is risky on SMP systems.
2590 +If you clear a breakpoint when another cpu has hit that breakpoint but
2591 +has not been processed then it may not be recognised as a kdb
2592 +breakpoint, usually resulting in incorrect program counters and kernel
2593 +panics.
2594 +It is safer to disable the breakpoint with
2595 +.BR bd ,
2596 +then
2597 +.B go
2598 +to let any other processors that are waiting on the breakpoint to
2599 +clear.
2600 +After all processors are clear of the disabled breakpoint then it is
2601 +safe to clear it using
2602 +.BR bc .
2603 +.P
2604 +Breakpoints which use the processor breakpoint registers
2605 +are only established on the processor which is
2606 +currently active. If you wish breakpoints to be universal
2607 +use the
2608 +.B bpa
2609 +or
2610 +.B bpha
2611 +commands.
2612 +.SH EXAMPLES
2613 +.TP 8
2614 +bp schedule
2615 +Sets an instruction breakpoint at the begining of the
2616 +function \fBschedule\fP.
2617 +
2618 +.TP 8
2619 +bp schedule+0x12e
2620 +Sets an instruction breakpoint at the instruction located
2621 +at \fBschedule\fP+\fI0x12e\fP.
2622 +
2623 +.TP 8
2624 +bph ttybuffer+0x24 dataw
2625 +Sets a data write breakpoint at the location referenced by
2626 +\fBttybuffer\fP+\fI0x24\fP for a length of four bytes.
2627 +
2628 +.TP 8
2629 +bph 0xc0254010 datar 1
2630 +Establishes a data reference breakpoint at address \fB0xc0254010\fP
2631 +for a length of one byte.
2632 +
2633 +.TP 8
2634 +bp
2635 +List current breakpoint table.
2636 +
2637 +.TP 8
2638 +bd 0
2639 +Disable breakpoint #0.
2640 +
2641 +.TP 8
2642 +bc *
2643 +Clear all breakpoints
2644 --- /dev/null
2645 +++ b/Documentation/kdb/kdb_bt.man
2646 @@ -0,0 +1,315 @@
2647 +.TH BT 1 "July 20, 2007"
2648 +.SH NAME
2649 +bt \- Stack Traceback command
2650 +.SH SYNOPSIS
2651 +bt [ <stack-frame-address> ]
2652 +.LP
2653 +btp <pid>
2654 +.LP
2655 +btt <struct-task-address>
2656 +.LP
2657 +bta [ DRSTZUIMA ]
2658 +.LP
2659 +btc [<cpu>]
2660 +.SH DESCRIPTION
2661 +.hy 0
2662 +The
2663 +.B bt
2664 +command is used to print a stack traceback. It uses the
2665 +current registers (see \fBrd\fP command) to determine
2666 +the starting context and attempts to provide a complete
2667 +stack traceback for the active thread. If \fIstack-frame-address\fP
2668 +is supplied, it is assumed to point to the start of a valid
2669 +stack frame and the stack will be traced back from that
2670 +point.
2671 +On x86 architecture, \fIstack-frame-address\fP must be the stack address of a
2672 +saved \fB%eip\fP (\fB%rip\fP for x86_64) value from a \fBcall\fP instruction.
2673 +.P
2674 +The \fBbtp\fP command will analyze the stack for the given
2675 +process identification (see the \fBps\fP command).
2676 +\fBbtp\fP sets the current process for any following register display or update
2677 +commands.
2678 +.P
2679 +The \fBbtt\fP command will analyze the stack for the given task
2680 +structure.
2681 +It is exactly equivalent to \fBbtp\fR on the pid extracted from the
2682 +task structure.
2683 +\fBbtt\fP sets the current process for any following register display or update
2684 +commands.
2685 +.P
2686 +The \fBbta\fP command lists the stack for all processes in the desired
2687 +state.
2688 +Without any parameters, \fBbta\fP gives a backtrace for all useful processes.
2689 +If a parameter is specified, it is a single string consisting of the
2690 +letters D, R, S, T, Z, U, I, M and A in any order.
2691 +See the kdb \fBps\fR man page for more details.
2692 +\fBbta\fP does not change the current process.
2693 +.P
2694 +The \fBbtc\fP command will analyze the stack for the current process on
2695 +a specified cpu or, if no cpu number is supplied, for the current
2696 +process on all cpus.
2697 +It does not switch to the other cpus, instead it uses the task
2698 +structures to identify and issue \fBbtt\fR against the current task on
2699 +the desired cpus.
2700 +\fBbtc\fP with no arguments does not change the current process.
2701 +\fBbtc\fP with a cpu number sets the current process for any following register
2702 +display or update commands.
2703 +.P
2704 +For each function, the stack trace prints at least two lines.
2705 +The first line contains four or five fields\ :-
2706 +.IP * 3
2707 +The pointer to the stack frame.
2708 +.PD 0
2709 +.IP * 3
2710 +The current address within this frame.
2711 +.IP * 3
2712 +The address converted to a function name (actually the first non-local
2713 +label which is <= the address).
2714 +.IP * 3
2715 +The offset of the address within the function.
2716 +.IP * 3
2717 +Any parameters to the function.
2718 +.PD 1
2719 +.PP
2720 +If environment variable NOSECT is set to 0 then the next line contains
2721 +five fields which are designed to make it easier to match the trace
2722 +against the kernel code\ :-
2723 +.IP * 3
2724 +The module name that contains the address, "kernel" if it is in the
2725 +base kernel.
2726 +.PD 0
2727 +.IP * 3
2728 +The section name that contains the address (not available on 2.6 kernels).
2729 +.IP * 3
2730 +The start address of the section (not available on 2.6 kernels).
2731 +.IP * 3
2732 +The start address of the function.
2733 +.IP * 3
2734 +The end address of the function (the first non-local label which is >
2735 +the address).
2736 +.PD 1
2737 +.PP
2738 +If arguments are being converted to symbols, any argument which
2739 +converts to a kernel or module address is printed as\ :-
2740 +.IP * 3
2741 +Argument address.
2742 +.PD 0
2743 +.IP * 3
2744 +The module name that contains the address, "kernel" if it is in the
2745 +base kernel.
2746 +.IP * 3
2747 +The symbol name the argument maps to.
2748 +.IP * 3
2749 +The offset of the argument from the symbol, suppressed if 0.
2750 +.PD 1
2751 +.P
2752 +On architectures that use nested stacks, the backtrace will indicate a
2753 +switch to a new stack by printing a line of equal signs and the type of
2754 +stack.
2755 +.SH MATCHING TRACE TO KERNEL CODE
2756 +The command "objdump\ -S" will disassemble an object and, if the code
2757 +was compiled with debugging (gcc flag -g), objdump will interleave the
2758 +C source lines with the generated object.
2759 +.PP
2760 +A complete objdump of the kernel or a module is too big, normally you
2761 +only want specific functions.
2762 +By default objdump will only print the .text section but Linux uses
2763 +other section names for executable code.
2764 +When objdump prints relocatable objects (modules) it uses an offset of
2765 +0 which is awkward to relate to the stack trace.
2766 +The five fields which are printed for each function are designed to
2767 +make it easier to match the stack trace against the kernel code using
2768 +"objdump\ -S".
2769 +.PP
2770 +If the function is in the kernel then you need the section name, the
2771 +start and end address of the function. The command is
2772 +.PP
2773 +.nf
2774 + objdump -S -j <section_name> \\
2775 + --start-address=<start-address> \\
2776 + --stop-address=<end-address> \\
2777 + /usr/src/linux/vmlinux
2778 +.fi
2779 +.PP
2780 +If the function is in a module then you need the section name, the
2781 +start address of the section, the start and end address of the
2782 +function, the module name. The command is
2783 +.PP
2784 +.nf
2785 + objdump -S -j <section_name> \\
2786 + --adjust-vma=<section-start> \\
2787 + --start-address=<start-address> \\
2788 + --stop-address=<end-address> \\
2789 + /path/to/module/<module-name>.o
2790 +.fi
2791 +.PP
2792 +Unfortunately the 2.6 kernel does not provide the information required
2793 +to locate the start of the section, which makes it very difficult to
2794 +perform a reliable objdump on a module.
2795 +.PP
2796 +All addresses to objdump must be preceded by '0x' if they are in hex,
2797 +objdump does not assume hex.
2798 +The stack trace values are printed with leading '0x' to make it easy to
2799 +run objdump.
2800 +.SH LIMITATIONS
2801 +Some architectures pass parameters in registers; ia64, x86_64 and i386 (with
2802 +gcc flag -mregparm) fall into this category.
2803 +On these architectures, the compiler may reuse input parameter registers as
2804 +scratch space.
2805 +For example, if a function takes a pointer to a structure and only accesses one
2806 +field in that structure, the compiler may calculate the address of the field by
2807 +adding a value to the input register.
2808 +Once the input register has been updated, it no longer points to the
2809 +start of the structure, but to some field within it.
2810 +This also occurs with array pointers, the compiler may update the input pointer
2811 +directly, leaving it pointing to some element of the array instead of the start
2812 +of the array.
2813 +Always treat parameter values that have been passed in registers with extreme
2814 +suspicion, the compiler may have changed the value.
2815 +The x86 backtrace can generally identify register parameters that are no longer
2816 +valid, it prints them as 'invalid' instead of as a misleading number.
2817 +The ia64 backtrace cannot identify parameter registers that have been
2818 +overwritten.
2819 +.P
2820 +x86 architectures do not have full unwind information in the kernel.
2821 +The KDB backtrace on x86 performs code decomposition and analysis to track the
2822 +frames on the call stack (including stack switches) and to locate parameters.
2823 +if this code analysis does not yield a valid result, KDB falls back on the old
2824 +method of scanning the process stack and printing anything that looks like a
2825 +kernel address.
2826 +This old method is unreliable (it produces lots of false positives in the
2827 +trace) and cannot track parameters at all, so no parameters are printed.
2828 +If you get an x86 backtrace that falls back to the old method, read
2829 +Documentation/kdb/bt_x86 and follow the steps listed to get diagnostics and to
2830 +submit a bug report.
2831 +.P
2832 +There are a lot of functions in the kernel which take some arguments then do
2833 +nothing except call another function with the same initial arguments, sometimes
2834 +adding parameters at the end. For example\ :-
2835 +.nf
2836 +.na
2837 +.ft CW
2838 +
2839 +int ipv4_doint_and_flush_strategy(ctl_table *table, int __user *name, int nlen,
2840 + void __user *oldval, size_t __user *oldlenp,
2841 + void __user *newval, size_t newlen)
2842 +{
2843 + int ret = devinet_conf_sysctl(table, name, nlen, oldval, oldlenp,
2844 + newval, newlen);
2845 +
2846 + if (ret == 1)
2847 + rt_cache_flush(0);
2848 +
2849 + return ret;
2850 +}
2851 +.ad b
2852 +.fi
2853 +.P
2854 +ipv4_doint_and_flush_strategy() passes all its parameters directly to
2855 +devinet_conf_sysctl() and makes no other use of those parameters,
2856 +so ipv4_doint_and_flush_strategy is a 'pass through' function.
2857 +The x86_64 calling sequence mandates that the first 6 parameters are passed in
2858 +registers, with other parameters being passed on stack.
2859 +The i386 calling sequence with -mregparm=3 (which is the default since about
2860 +2.6.18) passes the first 3 parameters in registers, with other parameters being
2861 +passed on stack.
2862 +The only exceptions to the above calling sequence are for functions declared as
2863 +asmlinkage or functions with a variable number of parameters (e.g. printk).
2864 +.P
2865 +When a pass through function calls another function, the first 3 (i386) or 6
2866 +(x86) parameters are already in their correct registers so the pass through
2867 +function does not need to access the registers, which means that there are no
2868 +references to these registers in the assembler code for the function.
2869 +Users still want to see those arguments so the x86 backtrace has to assume that
2870 +if\ :-
2871 +.IP * 2
2872 +There are parameters passed on the stack and
2873 +.IP *
2874 +There are no code references to parameters passed in registers and
2875 +.IP *
2876 +The function is not a known asmlinkage or variadic function, then
2877 +there are pass through register arguments.
2878 +.P
2879 +The x86 backtrace will warn you when it makes this assumption, like this\ :-
2880 +.nf
2881 +.na
2882 +.ft CW
2883 +
2884 + <function_name> has memory parameters but no register parameters.
2885 + Assuming it is a 'pass through' function that does not refer to its register
2886 + parameters and setting <n> register parameters
2887 +.ad b
2888 +.fi
2889 +.P
2890 +The above 3 line message is only printed once, any future assumptions will
2891 +print a shorter message.
2892 +.P
2893 +The \fBbt\fP command may print more or less arguments for a function
2894 +than that function accepts.
2895 +For x86, trailing arguments that are passed in but not used by the function
2896 +will not be printed, resulting in fewer arguments than expected.
2897 +For ia64, the hardware does not distinguish between input and local registers,
2898 +some local registers may be printed as function arguments, resulting in more
2899 +arguments than expected.
2900 +.P
2901 +On i386, 64 bit arguments (long long) occupy two adjacent 32 bit fields.
2902 +There is no way for KDB to tell that this has occurred, so 64 bit arguments
2903 +will be printed as two separate 32 bit arguments.
2904 +.SH ENVIRONMENT
2905 +The \fBBTARGS\fP environment variable governs the maximum number
2906 +of arguments that are printed for any single function.
2907 +On IA64 hardware, there is no difference between input and local registers, the
2908 +first \fBBTARGS\fP registers are printed, up to the total limit of input plus
2909 +local registers.
2910 +Use a large value for \fBBTARGS\fP if you want to see the local registers on
2911 +IA64.
2912 +.PP
2913 +If the \fBBTSP\fP environment variable is non-zero then the entire backtrace is
2914 +printed, otherwise only the backtrace to the point of the last interrupt is
2915 +printed.
2916 +Printing the entire backtrace with 'set\ BTSP\ 1' is useful for diagnosing
2917 +problems with the backtrace algorithms.
2918 +In addition, when BTSP is non-zero, each backtrace frame may print extra lines
2919 +giving information about the stack pointers, this is architecture specific.
2920 +.PP
2921 +If the \fBBTSYMARG\fP environment variable is non-zero then any
2922 +arguments that fall within the kernel or modules are converted to symbols.
2923 +.PP
2924 +If the \fBNOSECT\fP environment variable is non-zero then the
2925 +section information is suppressed.
2926 +The default is NOSECT=1 so section data is suppressed; use set\ NOSECT=0
2927 +to see section information.
2928 +.PP
2929 +The \fBBTAPROMPT\fP environment variable controls the prompt after each
2930 +process is listed by the \fBbta\fP command. If \fBBTAPROMPT\fP is not
2931 +set or is non-zero then \fBbta\fP issues a prompt after each process is
2932 +listed. If \fBBTAPROMPT\fP is set to zero then no prompt is issued and
2933 +all processes are listed without human intervention.
2934 +.PP
2935 +\fBbt\fR with no parameters uses the \fBPS\fR environment variable, see
2936 +the kdb \fBps\fR man page.
2937 +.SH SMP CONSIDERATIONS
2938 +None.
2939 +.SH EXAMPLES
2940 +.nf
2941 +.na
2942 +.ft CW
2943 +[0]kdb> bt
2944 +Stack traceback for pid 2873
2945 +0xc2efc0f0 2873 2836 1 0 R 0xc2efc2a0 *mount
2946 +esp eip Function (args)
2947 +0xf65a3c88 0xc0201f9f xfs_mount_validate_sb (0xf68bcb08, 0xf68bcb48, 0x0)
2948 +0xf65a3c94 0xc0202f17 xfs_readsb+0x9d (0xf68bcb08, 0x0)
2949 +0xf65a3cc0 0xc020a72e xfs_mount+0x21d (invalid, 0xf68bc2f0, 0x0)
2950 +0xf65a3cf4 0xc021a84a vfs_mount+0x1a (invalid)
2951 +0xf65a3d04 0xc021a721 xfs_fs_fill_super+0x76 (0xf76b6200, invalid, invalid)
2952 +0xf65a3d78 0xc015ad81 get_sb_bdev+0xd4 (invalid, invalid, invalid, 0xf7257000, 0xc021a6ab, 0xf7594b38)
2953 + xfs_fs_get_sb has memory parameters but no register parameters.
2954 + Assuming it is a 'pass through' function that does not refer to its register
2955 + parameters and setting 3 register parameters
2956 +0xf65a3db4 0xc0219a3a xfs_fs_get_sb+0x21 (invalid, invalid, invalid, 0xf7257000, 0xf7594b38)
2957 +0xf65a3dcc 0xc015a992 vfs_kern_mount+0x41 (0xc04847e0, 0x0, 0xf68e9000, 0xf7257000)
2958 +0xf65a3df0 0xc015aa11 do_kern_mount+0x38 (0xf6818000, 0x0, 0xf68e9000, 0xf7257000)
2959 +0xf65a3e10 0xc016c8b0 do_mount+0x5df (0xf68e9000, 0xf65d6000, 0xf6818000, 0xc0ed0000, 0xf7257000)
2960 +0xf65a3f90 0xc016c996 sys_mount+0x6f (0x8069b50, 0x8069b60, 0x8069b70, 0xc0ed0000, 0x8069ba0)
2961 +0xf65a3fb4 0xc0102646 sysenter_past_esp+0x5f (invalid, invalid, invalid, 0x73, 0x246, 0xbfe52f50)
2962 --- /dev/null
2963 +++ b/Documentation/kdb/kdb_env.man
2964 @@ -0,0 +1,46 @@
2965 +.TH ENV 1 "24 September 2000"
2966 +.SH NAME
2967 +env, set \- Environment manipulation commands
2968 +.SH SYNOPSIS
2969 +env
2970 +.LP
2971 +set \fIenvironment-variable\fP=\fIvalue\fP
2972 +.SH DESCRIPTION
2973 +The kernel debugger contains an environment which contains a series
2974 +of name-value pairs. Some environment variables are known to the
2975 +various kernel debugger commands and have specific meaning to the
2976 +command; such are enumerated on the respective reference material.
2977 +.P
2978 +Arbitrary environment variables may be created and used with
2979 +many commands (those which require an \fIaddress-expression\fP).
2980 +.P
2981 +The
2982 +.B env
2983 +command is used to display the current environment.
2984 +.P
2985 +The
2986 +.B set
2987 +command is used to alter an existing environment variable or
2988 +establish a new environment variable.
2989 +.SH LIMITATIONS
2990 +There is a compile-time limit of 33 environment variables.
2991 +.P
2992 +There is a compile-time limit of 512 bytes (\fBKDB_ENVBUFSIZE\fP)
2993 +of heap space available for new environment variables and for
2994 +environment variables changed from their compile-time values.
2995 +.SH ENVIRONMENT
2996 +These commands explicitly manipulate the environment.
2997 +.SH SMP CONSIDERATIONS
2998 +None.
2999 +.SH USER SETTINGS
3000 +You can include "set" commands in kdb/kdb_cmds (see kdb.mm) to define
3001 +your environment variables at kernel startup.
3002 +.SH EXAMPLES
3003 +.TP 8
3004 +env
3005 +Display current environment settings.
3006 +
3007 +.TP 8
3008 +set IDCOUNT=100
3009 +Set the number of lines to display for the \fBid\fP command
3010 +to the value \fI100\fP.
3011 --- /dev/null
3012 +++ b/Documentation/kdb/kdb_ll.man
3013 @@ -0,0 +1,134 @@
3014 +.TH LL 1 "19 April 1999"
3015 +.SH NAME
3016 +ll \- Linked List examination
3017 +.SH SYNOPSIS
3018 +ll <addr> <link-offset> <cmd>
3019 +.SH DESCRIPTION
3020 +The
3021 +.B ll
3022 +command is used to execute a single command repetitively for
3023 +each element of a linked list.
3024 +.P
3025 +The command specified by <cmd> will be executed with a single
3026 +argument, the address of the current element.
3027 +.SH LIMITATIONS
3028 +Be careful if using this command recursively.
3029 +.SH ENVIRONMENT
3030 +None.
3031 +.SH SMP CONSIDERATIONS
3032 +None.
3033 +.SH EXAMPLES
3034 +.nf
3035 +.na
3036 +.ft CW
3037 +# cd modules
3038 +# insmod kdbm_vm.o
3039 +# Entering kdb on processor 0 due to PAUSE
3040 +kdb> ps
3041 +Task Addr Pid Parent cpu lcpu Tss Command
3042 +0xc03de000 0000000001 0000000000 0000 0000 0xc03de2d4 init
3043 +0xc0090000 0000000002 0000000001 0000 0000 0xc00902d4 kflushd
3044 +0xc000e000 0000000003 0000000001 0000 0000 0xc000e2d4 kpiod
3045 +0xc000c000 0000000004 0000000001 0000 0000 0xc000c2d4 kswapd
3046 +0xc7de2000 0000000056 0000000001 0000 0000 0xc7de22d4 kerneld
3047 +0xc7d3a000 0000000179 0000000001 0000 0000 0xc7d3a2d4 syslogd
3048 +0xc7a7e000 0000000188 0000000001 0000 0000 0xc7a7e2d4 klogd
3049 +0xc7a04000 0000000199 0000000001 0000 0000 0xc7a042d4 atd
3050 +0xc7b84000 0000000210 0000000001 0000 0000 0xc7b842d4 crond
3051 +0xc79d6000 0000000221 0000000001 0000 0000 0xc79d62d4 portmap
3052 +0xc798e000 0000000232 0000000001 0000 0000 0xc798e2d4 snmpd
3053 +0xc7904000 0000000244 0000000001 0000 0000 0xc79042d4 inetd
3054 +0xc78fc000 0000000255 0000000001 0000 0000 0xc78fc2d4 lpd
3055 +0xc77ec000 0000000270 0000000001 0000 0000 0xc77ec2d4 sendmail
3056 +0xc77b8000 0000000282 0000000001 0000 0000 0xc77b82d4 gpm
3057 +0xc7716000 0000000300 0000000001 0000 0000 0xc77162d4 smbd
3058 +0xc7ee2000 0000000322 0000000001 0000 0000 0xc7ee22d4 mingetty
3059 +0xc7d6e000 0000000323 0000000001 0000 0000 0xc7d6e2d4 login
3060 +0xc778c000 0000000324 0000000001 0000 0000 0xc778c2d4 mingetty
3061 +0xc78b6000 0000000325 0000000001 0000 0000 0xc78b62d4 mingetty
3062 +0xc77e8000 0000000326 0000000001 0000 0000 0xc77e82d4 mingetty
3063 +0xc7708000 0000000327 0000000001 0000 0000 0xc77082d4 mingetty
3064 +0xc770e000 0000000328 0000000001 0000 0000 0xc770e2d4 mingetty
3065 +0xc76b0000 0000000330 0000000001 0000 0000 0xc76b02d4 update
3066 +0xc7592000 0000000331 0000000323 0000 0000 0xc75922d4 ksh
3067 +0xc7546000 0000000338 0000000331 0000 0000 0xc75462d4 su
3068 +0xc74dc000 0000000339 0000000338 0000 0000 0xc74dc2d4 ksh
3069 +kdb> md 0xc74dc2d4
3070 +c74dc2d4: 00000000 c74de000 00000018 00000000 .....`MG........
3071 +c74dc2e4: 00000000 00000000 00000000 074de000 .............`M.
3072 +c74dc2f4: c01123ff 00000000 00000000 00000000 #.@............
3073 +c74dc304: 00000000 00000000 c74dded0 00000000 ........P^MG....
3074 +[omitted]
3075 +c74dc474: 00000000 00000000 00000000 00000000 ................
3076 +c74dc484: 00000000 c7c15d00 c77b0900 c026fbe0 .....]AG..{G`{&@
3077 +c74dc494: 00000000 c76c2000 00000000 00000000 ..... lG........
3078 +c74dc4a4: 00000000 00000000 00000000 c74dc4ac ............,DMG
3079 +kdb> md 0xc026fbe0
3080 +c026fbe0: c0262b60 00000000 c7594940 c74de000 @HYG....@IYG.`MG
3081 +[omitted]
3082 +kdb> md 0xc0262b60
3083 +c0262b60: c0266660 08048000 0804c000 c7bec360 `f&@.....@..`C>G
3084 +kdb> ll c0262b60 12 md
3085 +c0262b60: c0266660 08048000 0804c000 c7bec360 `f&@.....@..`C>G
3086 +c7bec360: c0266660 0804c000 0804d000 c7becb20 `f&@.@...P.. K>G
3087 +c7becb20: c0266660 0804d000 08050000 c7bec3a0 `f&@.P...... C>G
3088 +c7bec3a0: c0266660 40000000 40009000 c7bec420 `f&@...@...@ D>G
3089 +c7bec420: c0266660 40009000 4000b000 c7bec4a0 `f&@...@.0.@ D>G
3090 +c7bec4a0: c0266660 4000b000 40010000 c7bec8e0 `f&@.0.@...@`H>G
3091 +c7bec8e0: c0266660 40010000 400a1000 c7becbe0 `f&@...@...@`K>G
3092 +c7becbe0: c0266660 400a1000 400a8000 c7becc60 `f&@...@...@`L>G
3093 +c7becc60: c0266660 400a8000 400b4000 c7952300 `f&@...@.@.@.#.G
3094 +c7952300: c0266660 400b5000 400bc000 c79521c0 `f&@.P.@.@.@@!.G
3095 +c79521c0: c0266660 400bc000 400bd000 c7bec6e0 `f&@.@.@.P.@`F>G
3096 +c7bec6e0: c0266660 bffff000 c0000000 00000000 `f&@.p?...@....
3097 +kdb>
3098 +kdb> ll c0262b60 12 vm
3099 +struct vm_area_struct at 0xc0262b60 for 56 bytes
3100 +vm_start = 0x8048000 vm_end = 0x804c000
3101 +page_prot = 0x25 avl_height = 2244 vm_offset = 0x0
3102 +flags: READ EXEC MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
3103 +struct vm_area_struct at 0xc7bec360 for 56 bytes
3104 +vm_start = 0x804c000 vm_end = 0x804d000
3105 +page_prot = 0x25 avl_height = -31808 vm_offset = 0x3000
3106 +flags: READ WRITE MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
3107 +struct vm_area_struct at 0xc7becb20 for 56 bytes
3108 +vm_start = 0x804d000 vm_end = 0x8050000
3109 +page_prot = 0x25 avl_height = -28664 vm_offset = 0x0
3110 +flags: READ WRITE EXEC MAYREAD MAYWRITE MAYEXEC
3111 +struct vm_area_struct at 0xc7bec3a0 for 56 bytes
3112 +vm_start = 0x40000000 vm_end = 0x40009000
3113 +page_prot = 0x25 avl_height = 30126 vm_offset = 0x0
3114 +flags: READ EXEC MAYREAD MAYWRITE MAYEXEC DENYWRITE
3115 +struct vm_area_struct at 0xc7bec420 for 56 bytes
3116 +vm_start = 0x40009000 vm_end = 0x4000b000
3117 +page_prot = 0x25 avl_height = 30126 vm_offset = 0x8000
3118 +flags: READ WRITE MAYREAD MAYWRITE MAYEXEC DENYWRITE
3119 +struct vm_area_struct at 0xc7bec4a0 for 56 bytes
3120 +vm_start = 0x4000b000 vm_end = 0x40010000
3121 +page_prot = 0x25 avl_height = 26853 vm_offset = 0x0
3122 +flags: READ MAYREAD MAYWRITE MAYEXEC
3123 +struct vm_area_struct at 0xc7bec8e0 for 56 bytes
3124 +vm_start = 0x40010000 vm_end = 0x400a1000
3125 +page_prot = 0x25 avl_height = 2244 vm_offset = 0x0
3126 +flags: READ EXEC MAYREAD MAYWRITE MAYEXEC
3127 +struct vm_area_struct at 0xc7becbe0 for 56 bytes
3128 +vm_start = 0x400a1000 vm_end = 0x400a8000
3129 +page_prot = 0x25 avl_height = 30126 vm_offset = 0x90000
3130 +flags: READ WRITE MAYREAD MAYWRITE MAYEXEC
3131 +struct vm_area_struct at 0xc7becc60 for 56 bytes
3132 +vm_start = 0x400a8000 vm_end = 0x400b4000
3133 +page_prot = 0x25 avl_height = 2244 vm_offset = 0x0
3134 +flags: READ WRITE MAYREAD MAYWRITE MAYEXEC
3135 +struct vm_area_struct at 0xc7952300 for 56 bytes
3136 +vm_start = 0x400b5000 vm_end = 0x400bc000
3137 +page_prot = 0x25 avl_height = 30126 vm_offset = 0x0
3138 +flags: READ EXEC MAYREAD MAYWRITE MAYEXEC
3139 +struct vm_area_struct at 0xc79521c0 for 56 bytes
3140 +vm_start = 0x400bc000 vm_end = 0x400bd000
3141 +page_prot = 0x25 avl_height = -16344 vm_offset = 0x6000
3142 +flags: READ WRITE MAYREAD MAYWRITE MAYEXEC
3143 +struct vm_area_struct at 0xc7bec6e0 for 56 bytes
3144 +vm_start = 0xbffff000 vm_end = 0xc0000000
3145 +page_prot = 0x25 avl_height = 2244 vm_offset = 0x0
3146 +flags: READ WRITE EXEC MAYREAD MAYWRITE MAYEXEC GROWSDOWN
3147 +kdb>
3148 --- /dev/null
3149 +++ b/Documentation/kdb/kdb_md.man
3150 @@ -0,0 +1,136 @@
3151 +.TH MD 1 "August 4, 2004"
3152 +.SH NAME
3153 +md, mdWcN, mdr, mds, mm, mmW\- Memory manipulation commands
3154 +.SH SYNOPSIS
3155 +md [ \fIaddress-expression\fP [ \fIline-count\fP [\fIoutput-radix\fP ] ] ]
3156 +.LP
3157 +md\fIW\fRc\fIn\fR [ \fIaddress-expression\fP [ \fIline-count\fP [\fIoutput-radix\fP ] ] ]
3158 +.LP
3159 +mdp \fIphysical-address-expression\fP,\fIbytes\fP
3160 +.LP
3161 +mdr \fIaddress-expression\fP,\fIbytes\fP
3162 +.LP
3163 +mds [ \fIaddress-expression\fP [ \fIline-count\fP [\fIoutput-radix\fP ] ] ]
3164 +.LP
3165 +mm \fIaddress-expression\fP \fInew-contents\fP
3166 +.LP
3167 +mm\fIW\fR \fIaddress-expression\fP \fInew-contents\fP
3168 +.SH DESCRIPTION
3169 +The
3170 +.B md
3171 +command is used to display the contents of memory.
3172 +The \fIaddress-expression\fP may be a numeric value (decimal or
3173 +hexidecimal), a symbol name, a register name preceeded by one or more
3174 +percent symbols '%', an environment variable name preceeded by
3175 +a currency symbol '$', or a simple expression consisting of a
3176 +symbol name, an addition or subtraction character and a numeric
3177 +value (decimal or hexidecimal).
3178 +.P
3179 +If an address is specified and the \fIline-count\fP or \fIradix\fP arguments
3180 +are omitted, they default to the values of the \fBMDCOUNT\fP and \fBRADIX\fP
3181 +environment variables respectively. If the \fBMDCOUNT\fP or \fBRADIX\fP
3182 +environment variables are unset, the appropriate defaults will be used [see
3183 +\fBENVIRONMENT\fP below]. If no address is specified then md resumes
3184 +after the last address printed, using the previous values of count and
3185 +radix. The start address is rounded down to a multiple of the
3186 +BYTESPERWORD (md) or width (md\fIW\fR).
3187 +.P
3188 +md uses the current value of environment variable \fBBYTESPERWORD\fP to
3189 +read the data. When reading hardware registers that require special
3190 +widths, it is more convenient to use md\fIW\fRc\fIn\fR where \fIW\fR is
3191 +the width for this command and \fRc\fIn\fR is the number of entries to
3192 +read. For example, md1c20 reads 20 bytes, 1 at a time. To continue
3193 +printing just type md, the width and count apply to following md
3194 +commands with no parameters. \fBNote:\fR The count is the number of
3195 +repeats of the width, unlike MDCOUNT which gives the number of md lines
3196 +to print.
3197 +.P
3198 +The
3199 +.B mdp
3200 +command displays the contents of physical memory, starting at the
3201 +specified physical address for the specified number of bytes.
3202 +The address is preceded by 'phys'.
3203 +.P
3204 +The
3205 +.B mdr
3206 +command displays the raw contents of memory, starting at the specified
3207 +address for the specified number of bytes.
3208 +The data is printed in one line without a leading address and no
3209 +trailing character conversion.
3210 +.B mdr
3211 +is intended for interfacing with external debuggers, it is of little
3212 +use to humans.
3213 +.P
3214 +The
3215 +.B mds
3216 +command displays the contents of memory one word per line and
3217 +attempts to correlate the contents of each word with a symbol
3218 +in the symbol table. If no symbol is found, the ascii representation
3219 +of the word is printed, otherwise the symbol name and offset from
3220 +symbol value are printed.
3221 +By default the section data is printed for kernel symbols.
3222 +.P
3223 +The
3224 +.B mm
3225 +and
3226 +\fBmm\fIW\fR
3227 +commands allow modification of memory. The bytes at the address
3228 +represented by \fIaddress-expression\fP are changed to
3229 +\fInew-contents\fP. \fInew-contents\fP is allowed to be an
3230 +\fIaddress-expression\fP.
3231 +.B mm
3232 +changes a machine word, \fBmm\fIW\fR changes \fIW\fR bytes at that
3233 +address.
3234 +.SH LIMITATIONS
3235 +None.
3236 +.SH ENVIRONMENT
3237 +.TP 8
3238 +MDCOUNT
3239 +This environment variable (default=8) defines the number of lines
3240 +that will be displayed by each invocation of the \fBmd\fP command.
3241 +
3242 +.TP 8
3243 +RADIX
3244 +This environment variable (default=16) defines the radix used to
3245 +print the memory contents.
3246 +
3247 +.TP 8
3248 +BYTESPERWORD
3249 +This environment variable (default=4) selects the width of output
3250 +data when printing memory contents. Select the value two to get
3251 +16-bit word output, select the value one to get byte output.
3252 +
3253 +.TP 8
3254 +LINES
3255 +This environment variable governs the number of lines of output
3256 +that will be presented before the kernel debugger built-in pager
3257 +pauses the output. This variable only affects the functioning
3258 +of the \fBmd\fP and \fBmds\fP if the \fBMDCOUNT\fP variable
3259 +is set to a value greater than the \fBLINES\fP variable.
3260 +
3261 +.TP 8
3262 +NOSECT
3263 +If the \fBNOSECT\fP environment variable is non-zero then the
3264 +section information is suppressed.
3265 +The default is NOSECT=1 so section data is suppressed; use set\ NOSECT=0
3266 +to see section information.
3267 +.SH SMP CONSIDERATIONS
3268 +None.
3269 +.SH EXAMPLES
3270 +.TP 8
3271 +md %edx
3272 +Display memory starting at the address contained in register \fB%edx\fP.
3273 +
3274 +.TP 8
3275 +mds %esp
3276 +Display stack contents symbolically. This command is quite useful
3277 +in manual stack traceback.
3278 +
3279 +.TP 8
3280 +mm 0xc0252110 0x25
3281 +Change the memory location at 0xc0252110 to the value 0x25.
3282 +
3283 +.TP 8
3284 +md chrdev_table 15
3285 +Display 15 lines (at 16 bytes per line) starting at address
3286 +represented by the symbol \fIchrdev_table\fP.
3287 --- /dev/null
3288 +++ b/Documentation/kdb/kdb_ps.man
3289 @@ -0,0 +1,96 @@
3290 +.TH PS 1 "September 14, 2004"
3291 +.SH NAME
3292 +ps \- Display processes
3293 +.SH SYNOPSIS
3294 +ps [ DRSTCZEUIMA ]
3295 +.SH DESCRIPTION
3296 +The
3297 +.B ps
3298 +command displays the status of all processes in the desired state.
3299 +This command does not take any locks (all cpus should be frozen while
3300 +kdb is running) so it can safely be used to debug lock problems with
3301 +the process table.
3302 +.P
3303 +Without any parameters, \fBps\fP displays all the interesting
3304 +processes, excluding idle tasks and sleeping system daemons.
3305 +If a parameter is specified, it is a single string consisting of the
3306 +letters D, R, S, T, C, Z, E, U, I and M, in any order.
3307 +Each letter selects processes in a specific state, when multiple
3308 +letters are specified, a process will be displayed if it is in any of
3309 +the specified states.
3310 +The states are\ :-
3311 +.P
3312 +.DS
3313 +.TS
3314 +box, center;
3315 +l | l
3316 +l | l.
3317 +D Uninterruptible sleep
3318 +R Running
3319 +S Interruptible sleep
3320 +T Stopped
3321 +C Traced
3322 +Z Zombie
3323 +E Dead
3324 +U Unrunnable
3325 +I Idle task
3326 +M Sleeping system daemon
3327 +A All
3328 +.TE
3329 +.DE
3330 +.P
3331 +For state R (running), the process may not be on a cpu at the moment,
3332 +but it is ready to run.
3333 +The header line above the backtrace contains '1' in the fourth field if
3334 +the process is actually on a cpu.
3335 +.P
3336 +The idle task is run on each cpu when there is no work for that cpu to do.
3337 +Unless the idle task is servicing an interrupt, there is no point in
3338 +printing the idle task.
3339 +An idle task that is not servicing a interrupt is marked as state I,
3340 +while servicing an interrupt it is in state R.
3341 +By default, idle tasks are not printed, use \fBps\ I\fR to print them.
3342 +If the idle tasks are not being printed, the start of the \fBps\R
3343 +output contains a list of which cpus are idle.
3344 +.P
3345 +Each cpu has one or more system daemons to handle per cpu work such as
3346 +soft irqs.
3347 +A system daemon (idenified by a NULL mm pointer) that is sleeping is
3348 +marked as state M.
3349 +These processes rarely have any useful data and generate a lot of
3350 +output on large machines, so sleeping system daemons are not printed by
3351 +default.
3352 +Use \fBps\ M\fR to print them.
3353 +.P
3354 +At the start of the \fBps\fR output is a line giving the cpu status,
3355 +see the kdb \fBcpu\fR command.
3356 +.SH LIMITATIONS
3357 +None.
3358 +.SH ENVIRONMENT
3359 +.TP 8
3360 +PS
3361 +This environment variable (default=DRSTCZEU) is used when \fBps\fR
3362 +is issued with no parameters.
3363 +
3364 +.SH SMP CONSIDERATIONS
3365 +None.
3366 +.SH EXAMPLES
3367 +.TP 8
3368 +\fBps\fR
3369 +displays the useful tasks, suppressing idle tasks and sleeping
3370 +system daemons.
3371 +
3372 +.TP 8
3373 +\fBps\ RD\fR
3374 +displays only tasks that are running or are in an uninterruptible
3375 +sleep.
3376 +
3377 +.TP 8
3378 +\fBps\ DRSTCZEUIM\fR
3379 +displays all tasks.
3380 +
3381 +.TP 8
3382 +\fBps\ A\fR
3383 +displays all tasks.
3384 +This is easier than remembering DRSTCZEUIM.
3385 +
3386 --- /dev/null
3387 +++ b/Documentation/kdb/kdb_rd.man
3388 @@ -0,0 +1,170 @@
3389 +.TH RD 1 "September 20, 2005"
3390 +.SH NAME
3391 +rd, rm\- Register manipulation commands
3392 +.SH SYNOPSIS
3393 +rd [[c [n]]|d|u]
3394 +.LP
3395 +rm \fIregister-name\fP \fInew-contents\fP
3396 +.LP
3397 +ef <address>
3398 +.SH DESCRIPTION
3399 +The
3400 +.B rd
3401 +command is used to display the contents of processor and coprocessor registers.
3402 +Without any arguments, the rd command displays the contents of the general
3403 +register set at the point at which the kernel debugger was entered.
3404 +If the bt* or pid commands have been used to change the current process then
3405 +.B rd
3406 +and
3407 +.B rm
3408 +may not be able to display any registers.
3409 +'n' argument is only used for XScale platform to identify the desired
3410 +coprocessor number, while 'd' option is not valid for XScale platform.
3411 +.P
3412 +On IA32 and IA64, with the 'c' argument, the processor control registers
3413 +%cr0, %cr1, %cr2 and %cr4 are displayed, while with the 'd' argument
3414 +the processor debug registers are displayed. If the 'u' argument
3415 +is supplied, the registers for the current task as of the last
3416 +time the current task entered the kernel are displayed.
3417 +.P
3418 +On XScale, 'c' argument is used to display the
3419 +all coprocessor control registers or specified coprocessor registers by
3420 +argumnet 'n'. Argument 'u' is used to display the
3421 +registers for the current task as of the last time the current task
3422 +entered the kernel. Argument 'd' is not supported.
3423 +.P
3424 +On ix86, the
3425 +.B rm
3426 +command allows modification of a register. The following
3427 +register names are valid: \fB%eax\fP, \fB%ebx\fP, \fB%ecx\fP,
3428 +\fB%edx\fP, \fB%esi\fP, \fB%edi\fP, \fB%esp\fP, \fB%eip\fP,
3429 +and \fB%ebp\fP. Note that if two '%' symbols are used
3430 +consecutively, the register set displayed by the 'u' argument
3431 +to the \fBrd\fP command is modified.
3432 +.P
3433 +The debug registers, \fBdr0\fP through \fBdr3\fP and both
3434 +\fBdr6\fP and \fBdr7\fP can also be modified with the \fBrm\fP
3435 +command.
3436 +.P
3437 +On sparc64, the valid registers are named \fB%g0\fP through
3438 +\fB%g7\fP, \fB%l0\fP through \fB%l7\fP, \fB%o0\fP through
3439 +\fB%o7\fP, and \fB%i0\fP through \fB%i7\fP, with the exceptions
3440 +that \fB%o6\fP is called \fB%sp\fP and that \fB%i6\fP is called
3441 +\fB%fp\fP. The registers \fB%tstate\fP, \fB%tpc\fP, \fB%tnpc\fP,
3442 +\fB%y\fP, and \fB%fprs\fP provide state information at the time
3443 +the system entered kdb. Additionally, when viewing registers, two
3444 +convenience names are provided: \fB%&regs\fP shows the
3445 +address on the stack of the current registers, and \fB%csp\fP
3446 +shows the current stack pointer within kdb itself.
3447 +.P
3448 +While on XScale, both the cpu registers and most coprocessor
3449 +registers can be be modified. \fIregister-name\fP can be followings like
3450 +r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14,
3451 +r15, cpsr to address cpu registers. For the coprocessor registers in XSacle,
3452 +either alias name or \fICpcc[CRndd[CRmbb[Opaa]]]\fP can be used to address
3453 +the register in coprocessor cc with CRn=dd, CRm=bb and opcode2=aa. All aa, bb, cc, dd can be
3454 +1 or 2 decimal digitals, the default value is 0 when any of them is omitted. Name
3455 +acc0_h and acc0_l are used to identify the high byte and
3456 +low word of accumulator in coprocessor 0.
3457 +.P
3458 +On IA64, the parameter to
3459 +.B rd
3460 +can be d (debug registers), u (user registers at most recent entry to kernel),
3461 +i (interrupt registers), %isr (current interrupt status), s (stacked
3462 +registers), k (kernel registers). You can also specify these individual
3463 +registers -
3464 +psr,
3465 +ifs,
3466 +ip,
3467 +unat,
3468 +pfs,
3469 +rsc,
3470 +rnat,
3471 +bsps,
3472 +pr,
3473 +ldrs,
3474 +ccv,
3475 +fpsr,
3476 +b0,
3477 +b6,
3478 +b7,
3479 +r1,
3480 +r2,
3481 +r3,
3482 +r8,
3483 +r9,
3484 +r10,
3485 +r11,
3486 +r12,
3487 +r13,
3488 +r14,
3489 +r15,
3490 +r16,
3491 +r17,
3492 +r18,
3493 +r19,
3494 +r20,
3495 +r21,
3496 +r22,
3497 +r23,
3498 +r24,
3499 +r25,
3500 +r26,
3501 +r27,
3502 +r28,
3503 +r29,
3504 +r30,
3505 +r31.
3506 +.B rm
3507 +can change any of the individual registers or the stacked registers.
3508 +.P
3509 +The
3510 +.B ef
3511 +command displays an exception frame at the specified address.
3512 +.SH LIMITATIONS
3513 +Currently the \fBrm\fP command will not allow modification of the
3514 +control registers.
3515 +.P
3516 +Currently neither the \fBrd\fP command nor the \fBrm\fP command will
3517 +display or modify the model specific registers on the Pentium
3518 +and Pentium Pro families.
3519 +.SH ENVIRONMENT
3520 +None.
3521 +.SH SMP CONSIDERATIONS
3522 +None.
3523 +.SH EXAMPLES
3524 +.TP 8
3525 +rd
3526 +Display general register set from kdb's current task.
3527 +
3528 +.TP 8
3529 +rd c 0
3530 +Display coprocessor 0 registers.
3531 +
3532 +.TP 8
3533 +rm %eax 0
3534 +Set the contents of \fB%eax\fP to zero. This will be the
3535 +value of %eax when kdb returns from the condition which
3536 +invoked it.
3537 +
3538 +.TP 8
3539 +rm %%eax 0
3540 +Set the value of the \fB%eax\fP register to zero. This will
3541 +be the value the user-mode application will see upon returning
3542 +from the kernel.
3543 +
3544 +.TP 8
3545 +rm %acc0_h 0
3546 +Set the contents of high byte of accumulator to zero.
3547 +
3548 +.TP 8
3549 +rm dr0 0xc1287220
3550 +Set the value of the \fBdr0\fB register to \f(CW0xc1287220\fP.
3551 +
3552 +.TP 8
3553 +rm %InVLD_BTB 0
3554 +Write 0 to coprocessor 15 register with CRn=7, CRm=5, opcode2=6.
3555 +
3556 +.TP 8
3557 +rm %CP15CRn7CRm5Op6 0
3558 +Same with above.
3559 --- /dev/null
3560 +++ b/Documentation/kdb/kdb_sr.man
3561 @@ -0,0 +1,68 @@
3562 +.TH SR 1 "7 October 2002"
3563 +.SH NAME
3564 +sr \- invoke sysrq commands from kdb
3565 +.SH SYNOPSIS
3566 +sr \fIx\fP
3567 +.SH DESCRIPTION
3568 +.hy 0
3569 +The
3570 +.B sr
3571 +command invokes the existing sysrq handler code in the kernel.
3572 +This command takes a single character which is passed to sysrq
3573 +processing, as if you had entered the sysrq key sequence followed by
3574 +that character.
3575 +.P
3576 +.B Caveats:
3577 +.P
3578 +kdb will always call the sysrq code but sysrq may be disabled.
3579 +If you expect to use sysrq functions during debugging then
3580 +.IP ""
3581 +echo "1" > /proc/sys/kernel/sysrq
3582 +.P
3583 +before starting the debug session.
3584 +Alternatively issue
3585 +.IP ""
3586 +mm4 sysrq_enabled 1
3587 +.P
3588 +during debugging.
3589 +.P
3590 +The sysrq code prints a heading using console loglevel 7 then reverts
3591 +to the original loglevel for the rest of the sysrq processing.
3592 +If the rest of the sysrq output is printed at a level below your
3593 +current loglevel then you will not see the output on the kdb console,
3594 +the output will only appear in the printk buffer.
3595 +It is the user's responsibility to set the loglevel correctly if they
3596 +want to see the sysrq output on the console.
3597 +Issue
3598 +.IP ""
3599 +sr 7
3600 +.P
3601 +before any other
3602 +.B sr
3603 +commands if you want to see the output on the console.
3604 +You may even have to adjust the default message loglevel in order to
3605 +see any output from
3606 +.BR sr .
3607 +See Documentation/sysctl/kernel.txt for details on setting console
3608 +loglevels via /proc.
3609 +You can also adjust the loglevel variables via kdb
3610 +.BR mm ;
3611 +on older kernels there are variables such as default_message_level, on
3612 +newer kernels all the loglevel variables are in array console_printk,
3613 +see kernel/printk.c for your kernel.
3614 +.P
3615 +Operations that require interrupt driven I/O can be invoked from kdb
3616 +.BR sr ,
3617 +but they will not do anything until you type 'go' to exit from kdb
3618 +(interrupts are disabled while in kdb).
3619 +There is no guarantee that these operations will work, if the machine
3620 +entered kdb because of an error then interrupt driven I/O may already
3621 +be dead.
3622 +Do not assume that
3623 +.B sr\ s
3624 +does anything useful.
3625 +.P
3626 +The sysrq handler uses locks and calls printk which also uses locks.
3627 +If the sysrq handler or any of the sysrq functions have to wait for a
3628 +lock then they will never return and kdb will appear to hang.
3629 +Invoking sysrq code from kdb is inherently unsafe.
3630 --- /dev/null
3631 +++ b/Documentation/kdb/kdb_ss.man
3632 @@ -0,0 +1,109 @@
3633 +.TH SS 1 "17 January 2002"
3634 +.SH NAME
3635 +ss, ssb \- Single Step
3636 +.SH SYNOPSIS
3637 +ss
3638 +.LP
3639 +ssb
3640 +.SH DESCRIPTION
3641 +The
3642 +.B ss
3643 +command is used to execute a single instruction and return
3644 +to the kernel debugger.
3645 +.P
3646 +Both the instruction that was single-stepped and the next
3647 +instruction to execute are printed.
3648 +.P
3649 +The \fBssb\fP command will execute instructions from the
3650 +current value of the instruction pointer. Each instruction
3651 +may be printed as it is executed, depending upon architecture;
3652 +execution will stop at any instruction which would cause the flow
3653 +of control to change (e.g. branch, call, interrupt instruction,
3654 +return, etc.)
3655 +.SH LIMITATIONS
3656 +On sparc64, there are some circumstances where single-stepping
3657 +can be dangerous. Do not single-step across an instruction which
3658 +changes the interrupt-enable bit in %tstate. Do not single step
3659 +through code which is invoked when entering or leaving the
3660 +kernel, particularly any kernel entry code before %tl is set to
3661 +0, or any kernel exit code after %tl is set to 1.
3662 +.SH ENVIRONMENT
3663 +None.
3664 +.SH SMP CONSIDERATIONS
3665 +Other processors are held in the kernel debugger when the instruction
3666 +is traced. Single stepping though code that requires a lock which is
3667 +in use by another processor is an exercise in futility, it will never
3668 +succeed.
3669 +.SH INTERRUPT CONSIDERATIONS
3670 +When a kdb event occurs, one cpu (the initial cpu) enters kdb state.
3671 +It uses a cross system interrupt to interrupt the
3672 +other cpus and bring them all into kdb state. All cpus run with
3673 +interrupts disabled while they are inside kdb, this prevents most
3674 +external events from disturbing the kernel while kdb is running.
3675 +.B Note:
3676 +Disabled interrupts means that any I/O that relies on interrupts cannot
3677 +proceed while kdb is in control, devices can time out. The clock tick
3678 +is also disabled, machines will lose track of time while they are
3679 +inside kdb.
3680 +.P
3681 +Even with interrupts disabled, some non-maskable interrupt events
3682 +will still occur, these can disturb the kernel while you are
3683 +debugging it. The initial cpu will still accept NMI events,
3684 +assuming that kdb was not entered for an NMI event. Any cpu
3685 +where you use the SS or SSB commands will accept NMI events, even
3686 +after the instruction has finished and the cpu is back in kdb.
3687 +This is an unavoidable side effect of the fact that doing SS[B]
3688 +requires the cpu to drop all the way out of kdb, including
3689 +exiting from the NMI event that brought the cpu into kdb. Under
3690 +normal circumstances the only NMI event is for the NMI oopser and
3691 +that is kdb aware so it does not disturb the kernel while kdb is
3692 +running.
3693 +.P
3694 +Sometimes doing SS or SSB on ix86 will allow one interrupt to proceed,
3695 +even though the cpu is disabled for interrupts. I have not been able
3696 +to track this one down but I suspect that the interrupt was pending
3697 +when kdb was entered and it runs when kdb exits through IRET even
3698 +though the popped flags are marked as cli(). If any ix86 hardware
3699 +expert can shed some light on this problem, please notify the kdb
3700 +maintainer.
3701 +.SH EXAMPLES
3702 +.nf
3703 +.na
3704 +.ft CW
3705 +kdb> bp gendisk_head datar 4
3706 +Data Access Breakpoint #0 at 0xc024ddf4 (gendisk_head) in dr0 is enabled on cpu 0
3707 +for 4 bytes
3708 +kdb> go
3709 +...
3710 +[root@host /root]# cat /proc/partitions
3711 +Entering kdb on processor 0 due to Debug Exception @ 0xc01845e3
3712 +Read/Write breakpoint #0 at 0xc024ddf4
3713 +[0]kdb> ssb
3714 +sd_finish+0x7b: movzbl 0xc02565d4,%edx
3715 +sd_finish+0x82: leal 0xf(%edx),%eax
3716 +sd_finish+0x85: sarl $0x4,%eax
3717 +sd_finish+0x88: movl 0xc0256654,%ecx
3718 +sd_finish+0x8e: leal (%eax,%eax,4),%edx
3719 +sd_finish+0x91: leal (%eax,%edx,2),%edx
3720 +sd_finish+0x94: movl 0xc0251108,%eax
3721 +sd_finish+0x99: movl %eax,0xffffffc(%ecx,%edx,4)
3722 +sd_finish+0x9d: movl %ecx,0xc0251108
3723 +sd_finish+0xa3: xorl %ebx,%ebx
3724 +sd_finish+0xa5: cmpb $0x0,0xc02565d4
3725 +[0]kdb> go
3726 +[root@host /root]#
3727 +
3728 +[0]kdb> ss
3729 +sys_read: pushl %ebp
3730 +SS trap at 0xc01274c1
3731 +sys_read+0x1: movl %esp,%ebp
3732 +[0]kdb> ss
3733 +sys_read+0x1: movl %esp,%ebp
3734 +SS trap at 0xc01274c3
3735 +sys_read+0x3: subl $0xc,%esp
3736 +[0]kdb> ss
3737 +sys_read+0x3: subl $0xc,%esp
3738 +SS trap at 0xc01274c6
3739 +sys_read+0x6: pushl %edi
3740 +[0]kdb>
3741 +
3742 --- /dev/null
3743 +++ b/Documentation/kdb/slides
3744 @@ -0,0 +1,1382 @@
3745 +#! /opt/cpg/bin/do-mgp
3746 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3747 +%%
3748 +%deffont "standard" tfont "comic.ttf"
3749 +%deffont "thick" tfont "arialb.ttf"
3750 +%deffont "typewriter" xfont "courier new-bold-r"
3751 +%deffont "type2writer" xfont "arial narrow-bold-r"
3752 +%%
3753 +%% Default settings per each line numbers.
3754 +%%
3755 +#%default 1 leftfill, size 2, fore "black", back "LemonChiffon2", font "thick"
3756 +%default 1 leftfill, size 2, fore "black", back "white", font "thick"
3757 +%default 2 size 10, vgap 10, prefix " ", center
3758 +%default 3 size 2, bar "gray70", vgap 10
3759 +%default 4 size 6, fore "black", vgap 30, prefix " ", font "standard", left
3760 +%%
3761 +%% Default settings that are applied to TAB-indented lines.
3762 +%%
3763 +%tab 1 size 4, vgap 35, prefix " ", icon arc "red" 40
3764 +%tab 2 size 4, vgap 20, prefix " ", icon delta3 "blue" 40
3765 +%tab 3 size 4, vgap 20, prefix " ", icon delta3 "green" 40
3766 +%%
3767 +%%
3768 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3769 +%page
3770 +
3771 +KDB - Kernel Debugger
3772 +
3773 +
3774 +
3775 +%size 7,center, font "thick"
3776 +Introduction
3777 +
3778 +And
3779 +
3780 +Demonstration
3781 +
3782 +
3783 +%size 3
3784 +
3785 +February 5, 2002 IBM Linux Technology Center Paul Dorwin
3786 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3787 +%page
3788 +
3789 +IBM Legal
3790 +
3791 +
3792 + IBM Legal requires this information:
3793 +
3794 +%size 3
3795 +
3796 + THE INFORMATION IN THE FOLLOWING PRESENTATION IS PREPARED
3797 + SOLELY FOR THE INFORMATION OF THE READER, AND COMES "AS IS"
3798 + AND WITHOUT WARRANTY OR REPRESENATION OF ANY KIND.
3799 +
3800 + ANY PARTY USING THE MATERIALS IN THIS PRESENTATION DOES SO
3801 + AT ITS OWN RISK LIABILITY AND THE PROVIDER OF THE MATERIALS
3802 + ACCEPTS NO RISK OR LIABILITY FOR SUCH USE OR RESULTING FROM
3803 + DISSEMINATION TO OR USE BY ANY OTHER PARTY
3804 +
3805 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3806 +%page
3807 +
3808 +Agenda
3809 +
3810 +%size 5
3811 +
3812 + Installing and Configuring KDB
3813 +
3814 + KDB Commands
3815 +
3816 + Scull Demo
3817 +
3818 + Setting Breakpoints
3819 +
3820 + Displaying Data Structures
3821 +
3822 + Kernel Data structures
3823 +
3824 + Take a walk through an IO operation
3825 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3826 +%page
3827 +
3828 +Installing Configuring KDB
3829 +
3830 +
3831 + Install KDB patch.
3832 + Start with a clean source tree
3833 + Apply architecture specific patches
3834 + Obtain patch for your kernel version
3835 + see http://oss.sgi.com/projects/kdb/
3836 + Apply the kdb patch
3837 + patch -p 1 -N -u -i /path/to/patch
3838 + Apply any other patches
3839 + Build and reboot on your kdb enabled kernel
3840 + Man pages can be found at Documentation/kdb
3841 +
3842 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3843 +%page
3844 +
3845 +Configuring KDB
3846 +
3847 +
3848 + Config kernel with the following options:
3849 + These are documented in Documentation/Configure.help
3850 +
3851 + CONFIG_KDB=y
3852 + Enable compilation of KDB in the kernel..
3853 + Setting this also sets CONFIG_KALLSYMS=y.
3854 + CONFIG_KDB_MODULES=n
3855 + KDB may be extended, compiling kdb/modules.
3856 + CONFIG_KDB_OFF=n
3857 + y = KDB is disabled by default.
3858 + boot with kdb=on to enable at boot.
3859 + /proc/sys/kernel/kdb to enable/disable when system is up.
3860 + CONFIG_KALLSYMS=y
3861 + This causes all symbols to be exported.
3862 + CONFIG_FRAME_POINTER=y
3863 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3864 +%page
3865 +
3866 +Invoking KDB
3867 +
3868 +
3869 + KDB can be invoked in the following ways:
3870 +
3871 + Early init with "kdb=early" lilo flag
3872 + Hits breakpoint prior to fork_init() (init/main.c)
3873 +
3874 + Serial console with CNTRL-A
3875 +
3876 + Console with PAUSE key
3877 +
3878 + When a pre-set breakpoint is hit
3879 +
3880 + On panic
3881 +
3882 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3883 +%page
3884 +
3885 +KDB Commands
3886 +
3887 +
3888 + KDB environment
3889 + env Show environment variables
3890 + set Set environment variables
3891 + help Display Help Message
3892 + ? Display Help Message
3893 +
3894 + System related
3895 + sections List kernel and module sections
3896 + lsmod List loaded kernel modules
3897 + reboot Reboot the machine immediately
3898 + cpu <cpunum> Switch to new cpu
3899 +
3900 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3901 +%page
3902 +
3903 +KDB Commands
3904 +
3905 +
3906 + Memory Manipulation
3907 + md <vaddr> Display Memory Contents
3908 + mdr <vaddr> <bytes> Display Raw Memory
3909 + mds <vaddr> Display Symbolically
3910 + mm <vaddr> <value> Modify Memory Contents
3911 + id <vaddr> Display Instructions
3912 +
3913 + Register Manipulation
3914 + rd Display Registers
3915 + rm <reg> <value> Modify Registers
3916 + ef <vaddr> Display exception frame
3917 +
3918 + Stack
3919 + bt [<vaddr>] Stack traceback
3920 + btp <pid> Display stack for <pid>
3921 + bta Display all stacks
3922 +
3923 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3924 +%page
3925 +
3926 +KDB Commands
3927 +
3928 +
3929 + Breakpoint
3930 + bc <bpnum> Clear Breakpoint
3931 + bd <bpnum> Disable Breakpoint
3932 + be <bpnum> Enable Breakpoint
3933 + bl [<vaddr>] Display breakpoints
3934 + bp [<vaddr>] Set/Display breakpoints
3935 + bpa [<vaddr>] Set/Display global breakpoints
3936 + bph [<vaddr>] Set hardware breakpoint
3937 + bpha [<vaddr>] Set global hardware breakpoint
3938 + bp* modifiers:
3939 + instruction - break on instruction fetch (default)
3940 + datar - break on read at vaddr
3941 + dataw - break on write at vaddr
3942 + IO - break on in or out op at vaddress
3943 +
3944 + Execution control
3945 + go [<vaddr>] Continue Execution
3946 + ss [<#steps>] Single Step
3947 + ssb Single step to branch/call
3948 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3949 +%page
3950 +
3951 +KDB Commands
3952 +
3953 +
3954 + Kernel structures
3955 + ll <vaddr> <offset> <command> Traverse list and execute command
3956 + ps Display active task list
3957 + vm <vaddr> Display vm_area_struct
3958 + dentry <dentry> Display interesting dentry stuff
3959 + filp <filp> Display interesting filp stuff
3960 + sh <vaddr> Show scsi_host
3961 + sd <vaddr> Show scsi_device
3962 + sc <vaddr> Show scsi_cmnd
3963 + kiobuf <vaddr> Display kiobuf
3964 + page <vaddr> Display page
3965 + inode <vaddr> Display inode
3966 + bh <vaddr> Display buffer head
3967 + inode_pages <inode *> Display pages in an inode
3968 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3969 +%page
3970 +
3971 +Scull Demo
3972 +
3973 +
3974 + Objective
3975 + Find and display the data associated with a scull device
3976 +
3977 + The sequence of events
3978 + Populate the scull device with data
3979 + Identify the breakpoints
3980 + Set breakpoint in the device read function
3981 + Identify the data structure elements
3982 + Identify device structures used to track data
3983 + Display data structures containing the data
3984 + Show the usage of the filp command
3985 +
3986 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3987 +%page
3988 +
3989 +Scull Demo: Populate Device
3990 +
3991 +
3992 + Obtain the code
3993 + Surf to http://examples.oreilly.com/linuxdrive2/
3994 + Download the tarball
3995 + Untar it to /usr/src
3996 +
3997 + Build and install the module
3998 + cd /usr/src/ldd2-samples-1.0.1/scull
3999 + make
4000 + ./scull.init start
4001 +
4002 + Populate the scull device
4003 + cat main.c > /dev/scull0
4004 + cat /dev/scull0
4005 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4006 +%page
4007 +
4008 +Scull Demo: Driver Details
4009 +
4010 +
4011 + cat /dev/scull0
4012 + fd =
4013 +%fore "blue", cont
4014 +open
4015 +%fore "black", cont
4016 +("/dev/scull0", O_RDONLY);
4017 + Kernel finds the file_operations structure
4018 + Kernel then invokes the open function
4019 +%fore "blue"
4020 + read
4021 +%fore "black", cont
4022 +(fd, buf, size);
4023 + Kernel finds the file_operations structure
4024 + Kernel then invokes the read function
4025 +
4026 + Scull device file operations structure
4027 +
4028 +%font "typewriter", size 3
4029 + struct file_operations scull_fops = {
4030 + llseek: scull_llseek,
4031 +%fore "blue"
4032 + read: scull_read,
4033 +%fore "black"
4034 + write: scull_write,
4035 + ioctl: scull_ioctl,
4036 +%fore "blue"
4037 + open: scull_open,
4038 +%fore "black"
4039 + release: scull_release,
4040 + };
4041 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4042 +%page
4043 +
4044 +Scull Demo: Driver Details
4045 +
4046 +%font "typewriter", size 3
4047 + scull_open code
4048 +%font "typewriter", size 3
4049 + int
4050 +%fore "blue", cont
4051 +scull_open
4052 +%fore "black", cont
4053 +(struct inode *inode, struct file *filp)
4054 + {
4055 + Scull_Dev *dev; /* device information */
4056 + int num = NUM(inode->i_rdev);
4057 +
4058 + <snip>
4059 +
4060 + dev = (Scull_Dev *)filp->private_data;
4061 + if (!dev) {
4062 + if (num >= scull_nr_devs) return -ENODEV;
4063 +%fore "blue"
4064 + dev = &scull_devices[num];
4065 + filp->private_data = dev;
4066 +%fore "black"
4067 + }
4068 +
4069 + <snip>
4070 +
4071 + }
4072 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4073 +%page
4074 +
4075 +Scull Demo: Driver Details
4076 +
4077 +%font "typewriter", size 3
4078 + scull_read code
4079 +%font "typewriter", size 3
4080 + ssize_t
4081 +%fore "blue", cont
4082 +scull_read
4083 +%fore "black", cont
4084 +(struct file *filp, char *buf, size_t count,
4085 + loff_t *f_pos)
4086 + {
4087 +
4088 +%fore "blue", cont
4089 + Scull_Dev *dev = filp->private_data;
4090 +%fore "black", cont
4091 + /* the first listitem */
4092 +%fore "blue"
4093 + Scull_Dev *dptr;
4094 +%fore "black"
4095 + int quantum = dev->quantum;
4096 + int qset = dev->qset;
4097 + int itemsize = quantum * qset;
4098 + if (down_interruptible(&dev->sem))
4099 + return -ERESTARTSYS;
4100 + if (*f_pos + count > dev->size)
4101 + count = dev->size - *f_pos;
4102 +
4103 + /* find listitem, qset index, and offset in the quantum */
4104 + item = (long)*f_pos / itemsize;
4105 + rest = (long)*f_pos % itemsize;
4106 + s_pos = rest / quantum; q_pos = rest % quantum;
4107 +
4108 + /* follow the list up to the right position */
4109 +%fore "blue"
4110 + dptr = scull_follow(dev, item);
4111 +%fore "black"
4112 +
4113 + <snip>
4114 +
4115 + }
4116 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4117 +%page
4118 +
4119 +Scull Demo: Breakpoints
4120 +
4121 +
4122 +%font "typewriter", size 3
4123 + Determine where to set breakpoint
4124 +%font "typewriter", size 3
4125 +%fore "blue"
4126 + dptr = scull_follow(dev, item);
4127 +%fore "black"
4128 +
4129 +%font "typewriter", size 3
4130 + Disassemble scull_read
4131 +%font "typewriter", size 3
4132 + [0]kdb>
4133 +%fore "blue", cont
4134 +id scull_read
4135 +%fore "black"
4136 + 0xf8c083b4 scull_read: push %ebp
4137 + 0xf8c083b5 scull_read+0x1:mov %esp,%ebp
4138 + 0xf8c083b7 scull_read+0x3:push %edi
4139 + <snip>
4140 + 0xf8c08465 scull_read+0xb1:sub $0x8,%esp
4141 +%fore "blue"
4142 + 0xf8c08468 scull_read+0xb4:push %ecx
4143 + 0xf8c08469 scull_read+0xb5:push %esi
4144 + 0xf8c0846a scull_read+0xb6:call 0xf8c08364 scull_follow:
4145 +%fore "black"
4146 + 0xf8c0846f scull_read+0xbb:mov %eax,
4147 +%fore "blue", cont
4148 + %edx
4149 +%fore "black"
4150 + 0xf8c08471
4151 +%fore "blue", cont
4152 +scull_read+0xbd
4153 +%fore "black", cont
4154 +:add $0x10,%esp
4155 + <snip>
4156 +
4157 + Set breakpoint in driver read
4158 +%font "typewriter", size 3
4159 + [0]kdb>
4160 +%fore "blue",cont
4161 +bp scull_read+0xbd
4162 +%fore "black"
4163 + Instruction(i) BP #0 at 0xf8c08471 ([scull]scull_read+0xbd)
4164 + is enabled globally adjust 1
4165 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4166 +%page
4167 +
4168 +Scull Demo: Breakpoints
4169 +
4170 +
4171 +%font "typewriter", size 3
4172 + Restart the system
4173 +%font "typewriter", size 3
4174 + [0]kdb>
4175 +%fore "blue", cont
4176 +go
4177 +%fore "black"
4178 +
4179 + Hit the Breakpoint
4180 +%font "typewriter", size 3
4181 + [root@elm3b77 root]#
4182 +%fore "blue", cont
4183 +cat /dev/scull0
4184 +%fore "black"
4185 + Instruction(i) breakpoint #0 at 0xf8c08471 (adjusted)
4186 + 0xf8c08471 scull_read+0xbd:int3
4187 + Entering kdb (current=0xf73ec000, pid 1249) on processor 2
4188 + due to Breakpoint @ 0xf8c08471
4189 +
4190 + Display the registers
4191 +%font "typewriter", size 3
4192 + [2]kdb>
4193 +%fore "blue", cont
4194 +rd
4195 +%fore "black"
4196 + eax = 0xf77d7b60 ebx = 0x00000000 ecx = 0x00000000 edx =
4197 +%fore "blue", cont
4198 +0xf77d7b60
4199 +%fore "black"
4200 + esi =
4201 +%fore "blue", cont
4202 +0xf77d7b60
4203 +%fore "black", cont
4204 + edi = 0x00001000 esp = 0xf7415f40 eip = 0xf8c08471
4205 + ebp = 0xf7415f78 xss = 0x00000018 xcs = 0x00000010 eflags = 0x00000246
4206 + xds = 0xf7590018 xes = 0x00000018 origeax = 0xffffffff &regs = 0xf7415f0c
4207 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4208 +%page
4209 +
4210 +Scull Demo: Data Structures
4211 +
4212 +%font "typewriter", size 3
4213 + Display the Scull_Dev structure
4214 +%font "typewriter", size 3
4215 + [2]kdb>
4216 +%fore "blue", cont
4217 +md 0xf77d7b60 2
4218 +%fore "black"
4219 + 0xf77d7b60
4220 +%fore "blue", cont
4221 +f7400000
4222 +%fore "black", cont
4223 + 00000000 00000fa0 000003e8 ..@w.... ...h...
4224 + 0xf77d7b70 0000534e 00000000 00000000 00000000 NS..............
4225 +
4226 + Scull Device Structure
4227 +%font "typewriter", size 3
4228 + typedef struct Scull_Dev {
4229 +%fore "blue"
4230 + void **data;
4231 +%fore "black"
4232 + struct Scull_Dev *next; /* next listitem */
4233 + int quantum; /* the current quantum size */
4234 + int qset; /* the current array size */
4235 + unsigned long size;
4236 + devfs_handle_t handle; /* only used if devfs is there */
4237 + unsigned int access_key; /* used by sculluid and scullpriv */
4238 + struct semaphore sem; /* mutual exclusion semaphore */
4239 + } Scull_Dev;
4240 +%size 6
4241 +
4242 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4243 +%page
4244 +
4245 +Scull Demo: Data Structures
4246 +
4247 +
4248 +%font "typewriter", size 3
4249 + Display the quantum set (dev->data)
4250 +%font "typewriter", size 3
4251 + [2]kdb>
4252 +%fore "blue", cont
4253 +md f7400000 2
4254 +%fore "black"
4255 + 0xf7400000
4256 +%fore "blue", cont
4257 +f73ea000
4258 +%fore "black", cont
4259 + f73f1000 f740c000 f7ab4000 . >w..?w.@@w.@+w
4260 + 0xf7400010 f73ef000 f755b000 00000000 00000000 .p>w.0Uw........
4261 +
4262 + Display the first quantum (dev->data[0])
4263 +%font "typewriter", size 3
4264 + [2]kdb>
4265 +%fore "blue", cont
4266 +md f73ea000
4267 +%fore "black"
4268 + 0xf73ea000 200a2a2f 616d202a 632e6e69 202d2d20 /*. * main.c --
4269 + 0xf73ea010 20656874 65726162 75637320 63206c6c the bare scull c
4270 + 0xf73ea020 20726168 75646f6d 200a656c 2a200a2a har module. *. *
4271 + 0xf73ea030 706f4320 67697279 28207468 32202943 Copyright (C) 2
4272 + 0xf73ea040 20313030 73656c41 646e6173 52206f72 001 Alessandro R
4273 + 0xf73ea050 6e696275 6e612069 6f4a2064 6874616e ubini and Jonath
4274 + 0xf73ea060 43206e61 6562726f 2a200a74 706f4320 an Corbet. * Cop
4275 + 0xf73ea070 67697279 28207468 32202943 20313030 yright (C) 2001
4276 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4277 +%page
4278 +
4279 +Scull Demo: filp command
4280 +
4281 +
4282 +%font "typewriter", size 3
4283 + Show filp usage - here is the scull_read prototype
4284 +%font "typewriter", size 3
4285 + ssize_t scull_read(
4286 +%fore "blue", cont
4287 +struct file *filp
4288 +%fore "black", cont
4289 +, char *buf,
4290 + size_t count, loff_t *f_pos);
4291 + Show the stack trace:
4292 +%font "typewriter", size 3
4293 +[2]kdb>
4294 +%fore "blue", cont
4295 +bt
4296 +%fore "black"
4297 + EBP EIP Function(args)
4298 + 0xee9dbf78 0xf8c08471 [scull]scull_read+0xbd (
4299 +%fore "blue", cont
4300 +0xeaf6c0c0
4301 +%fore "black", cont
4302 +, 0x804e128,
4303 + 0x1000, 0xeaf6c0e0, 0x804f000)
4304 + scull .text 0xf8c08060 0xf8c083b4 0xf8c084dc
4305 + 0xee9dbfbc 0xc0136278 sys_read+0x98 (0x3, 0x804e128, 0x1000, ...
4306 + kernel .text 0xc0100000 0xc01361e0 0xc01362b0
4307 + 0xc010702b system_call+0x33
4308 + kernel .text 0xc0100000 0xc0106ff8 0xc0107030
4309 + And show the filp output
4310 +%font "typewriter", size 3
4311 + [2]kdb>
4312 +%fore "blue", cont
4313 +filp 0xeaf6c0c0
4314 +%fore "black"
4315 + name.name 0xe93889fc name.len 6
4316 + File Pointer at 0xeaf6c0c0
4317 + f_list.nxt = 0xe42deca0 f_list.prv = 0xf7e69070
4318 +%fore "blue"
4319 + f_dentry = 0xe93889a0
4320 +%fore "black", cont
4321 + f_op = 0xf8c0a200
4322 + f_count = 2 f_flags = 0x8000 f_mode = 0x1
4323 + f_pos = 0 f_reada = 0 f_ramax = 0
4324 + f_raend = 0 f_ralen = 0 f_rawin = 0
4325 +
4326 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4327 +%page
4328 +
4329 +Scull Demo: filp command
4330 +
4331 +
4332 +%font "typewriter", size 3
4333 + filp output - continued
4334 +%font "typewriter", size 3
4335 +%fore "blue"
4336 + Directory Entry at 0xe93889a0
4337 +%fore "black"
4338 + d_name.len = 6
4339 +%fore "orange", cont
4340 +d_name.name = 0xe93889fc
4341 +%fore "black", cont
4342 +>
4343 + d_count = 1 d_flags = 0x0
4344 +%fore "blue", cont
4345 +d_inode = 0xe827b680
4346 +%fore "black"
4347 + d_hash.nxt = 0xc215aec8 d_hash.prv = 0xc215aec8
4348 + d_lru.nxt = 0xe93889b8 d_lru.prv = 0xe93889b8
4349 + d_child.nxt = 0xe89e1e80 d_child.prv = 0xe9388940
4350 + d_subdirs.nxt = 0xe93889c8 d_subdirs.prv = 0xe93889c8
4351 + d_alias.nxt = 0xe827b690 d_alias.prv = 0xe827b690
4352 + d_op = 0x00000000 d_sb = 0xf7e69000
4353 +
4354 +%fore "blue"
4355 + Inode Entry at 0xe827b680
4356 +%fore "black"
4357 + i_mode = 0x21a4 i_nlink = 1 i_rdev = 0xfe00
4358 + i_ino = 37182 i_count = 1 i_dev = 0x821
4359 + i_hash.nxt = 0xc20e6be8 i_hash.prv = 0xc20e6be8
4360 + i_list.nxt = 0xe827b2c8 i_list.prv = 0xe827b868
4361 + i_dentry.nxt = 0xe93889d0 i_dentry.prv = 0xe93889d0
4362 +
4363 + Check the filename (display d_name.name)
4364 +%font "typewriter", size 3
4365 + [2]kdb>
4366 +%fore "orange", cont
4367 +md 0xe93889fc 1
4368 +%fore "black"
4369 + 0xe93889fc 6c756373 0000306c 00000000 00000000 scull0..........
4370 +
4371 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4372 +%page
4373 +
4374 +Kernel Structures
4375 +
4376 +
4377 + Objective
4378 + Show output from various kernel related kdb commands
4379 +
4380 + Sequence of events
4381 + Simple Program
4382 + Write a simple program which allocates memory and hangs
4383 + Show usage of the ps, vm, and ll commands
4384 + Walk an IO operation
4385 + Hit a breakpoint in qlogic driver (isp1020_queuecommand)
4386 + Show usage of scsi related commands (sc, sh, and sd)
4387 + Show usage of vm related commands (bh, page, inode, inode_pages)
4388 +
4389 +
4390 +
4391 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4392 +%page
4393 +
4394 +Simple program
4395 +
4396 +%font "typewriter", size 3
4397 + simple.c - simple program which allocates memory
4398 +%font "typewriter", size 3
4399 +%fore "blue"
4400 + int foo_global[8192];
4401 +%fore "black"
4402 + main()
4403 + {
4404 + int *
4405 +%fore "blue", cont
4406 +foo_malloc;
4407 +%fore "black"
4408 + int i;
4409 + foo_malloc = (int *)malloc(0x8192);
4410 + for(i = 0; i < 0x100; i++) {
4411 + foo_global[i] = 0xdead0000 | i;
4412 + foo_malloc[i] = 0xbeef0000 | i;
4413 + }
4414 + printf("foo_global at %x\n", (int)foo_global);
4415 + printf("foo_malloc at %x\n", (int)foo_malloc);
4416 + printf("sleep forever\n");
4417 + sleep(2000000);
4418 + }
4419 +
4420 + simple output
4421 +%font "typewriter", size 3
4422 + [root@elm3b77 scull]# cc -o simple simple.c
4423 + [root@elm3b77 scull]# ./simple
4424 + foo_global at
4425 +%fore "blue", cont
4426 +8049780
4427 +%fore "black"
4428 + foo_malloc at
4429 +%fore "blue", cont
4430 +8051788
4431 +%fore "black"
4432 + sleep forever
4433 +
4434 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4435 +%page
4436 +
4437 +Simple Program
4438 +
4439 +%font "typewriter", size 3
4440 + Show the output of the ps command
4441 +%font "typewriter", size 3
4442 + Entering kdb (current=0xc2010000, pid 0) on processor 3 due to
4443 + Keyboard Entry
4444 + [3]kdb>
4445 +%fore "blue", cont
4446 +ps
4447 +%fore "black"
4448 + Task Addr Pid Parent [*] cpu State Thread Command
4449 + 0xf7efe000 00000001 00000000 0 003 stop 0xf7efe370 init
4450 + 0xf7ef0000 00000002 00000001 0 001 stop 0xf7ef0370 keventd
4451 + 0xf7eec000 00000003 00000000 0 000 stop 0xf7eec370 ksoftirqd_CPU0
4452 + 0xf7eea000 00000004 00000000 0 001 stop 0xf7eea370 ksoftirqd_CPU1
4453 + 0xf7ee8000 00000005 00000000 0 002 stop 0xf7ee8370 ksoftirqd_CPU2
4454 + 0xf7ee6000 00000006 00000000 0 003 stop 0xf7ee6370 ksoftirqd_CPU3
4455 +
4456 + <snip>
4457 +
4458 + 0xf7b46000 00001006 00000737 0 003 stop 0xf7b46370 sshd
4459 + 0xf7ace000 00001007 00001006 0 000 stop 0xf7ace370 bash
4460 + 0xef06a000 00001066 00001007 0 003 stop 0xef06a370 su
4461 + 0xeef88000 00001067 00001066 0 000 stop 0xeef88370 bash
4462 + 0xeef64000 00001119 00000770 0 001 stop 0xeef64370 in.ftpd
4463 +%fore "blue"
4464 + 0xeeeac000
4465 +%fore "black", cont
4466 + 00001138 00001067 0 001 stop 0xeeeac370
4467 +%fore "blue", cont
4468 +simple
4469 +%fore "black"
4470 + [3]kdb>
4471 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4472 +%page
4473 +
4474 +Simple Program
4475 +
4476 +%font "typewriter", size 3
4477 + Display the task struct
4478 +%font "typewriter", size 3
4479 + [3]kdb>
4480 +%fore "blue", cont
4481 +md 0xeeeac000
4482 +%fore "black"
4483 + 0xeeeac000 00000001 00000000 00000000 c0000000 ................
4484 + 0xeeeac010 c0339880 00000000 00000000 ffffffff ................
4485 + 0xeeeac020 0000000a 00000000 00000000
4486 +%fore "blue", cont
4487 +f7e10f00
4488 +%fore "black", cont
4489 + ..............aw
4490 + 0xeeeac030 00000001 ffffffff ffffffff 00000000 ................
4491 +
4492 +%font "typewriter", size 3
4493 + Determine offset of mm_struct ptr in task_struct
4494 +%font "typewriter", size 3
4495 + struct task_struct {
4496 + [0] volatile long state;
4497 + [4] unsigned long flags;
4498 + [8] int sigpending;
4499 + [c] mm_segment_t addr_limit;
4500 + [10] struct exec_domain *exec_domain;
4501 + [14] volatile long need_resched;
4502 + [18] unsigned long ptrace;
4503 + [1c] int lock_depth;
4504 + [20] long counter;
4505 + [24] long nice;
4506 + [28] unsigned long policy;
4507 +%fore "blue"
4508 + [2c] struct mm_struct *mm;
4509 +%fore "black"
4510 + [30] int processor;
4511 + [34] unsigned long cpus_runnable, cpus_allowed;
4512 + <snip>
4513 + };
4514 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4515 +%page
4516 +
4517 +Simple Program
4518 +
4519 +
4520 +%font "typewriter", size 3
4521 + Display the mm_struct associated with simple process
4522 +%font "typewriter", size 3
4523 + [3]kdb>
4524 +%fore "blue", cont
4525 +md f7e10f00
4526 +%fore "black"
4527 + 0xf7e10f00
4528 +%fore "blue", cont
4529 +e8357a80
4530 +%fore "black", cont
4531 + e8357978 f7ac77e0 eb15eac0 .z5hxy5h`w,w@j.k
4532 + 0xf7e10f10 00000001 00000002 0000000b 00000000 ................
4533 + 0xf7e10f20 00000001 f7e10f24 f7e10f24 00000001 ................
4534 + 0xf7e10f30 f7e35e70 eea7e8f0 08048000 0804862b ................
4535 + 0xf7e10f40 0804962c 08049744 08051780 0805a000 ................
4536 + 0xf7e10f50 bffffd10 bffffe00 bffffe09 bffffe09 ................
4537 + 0xf7e10f60 bffffff3 0000005a 00000168 00000000 ................
4538 + 0xf7e10f70 00000000 00000002 00000000 00000001 ................
4539 +
4540 +%font "typewriter", size 3
4541 + Determine offset of the first vma in the process
4542 +%font "typewriter", size 3
4543 + struct mm_struct {
4544 +%fore "blue"
4545 + struct vm_area_struct * mmap;
4546 +%fore "black"
4547 + rb_root_t mm_rb;
4548 + struct vm_area_struct * mmap_cache;
4549 + <snip>
4550 + };
4551 +
4552 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4553 +%page
4554 +
4555 +Simple Program
4556 +
4557 +%font "typewriter", size 3
4558 + Display the first vma using md
4559 +%font "typewriter", size 3
4560 + [3]kdb>
4561 +%fore "blue", cont
4562 +md e8357a80
4563 +%fore "black"
4564 + 0xe8357a80 f7e10f00 08048000 08049000
4565 +%fore "blue", cont
4566 +e8727e00
4567 +%fore "black",cont
4568 + ..aw.........~rh
4569 + 0xe8357a90 00000025 00001875 e8727e18 00000001 %...u....~rh....
4570 +
4571 + Display the first vma using vma
4572 +%font "typewriter", size 3
4573 + [3]kdb>
4574 +%fore "blue", cont
4575 +vma e8357a80
4576 +%fore "black"
4577 + struct vm_area_struct at 0xe8357a80 for 68 bytes
4578 + vm_start = 0x8048000 vm_end = 0x8049000
4579 + page_prot = 0x25
4580 + flags: READ EXEC MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
4581 +%font "typewriter", size 3
4582 +
4583 + Determine the offset to the vma list
4584 +%font "typewriter", size 3
4585 + struct vm_area_struct {
4586 + [0] struct mm_struct * vm_mm;
4587 + [4] unsigned long vm_start;
4588 + [8] unsigned long vm_end;
4589 +%fore "blue"
4590 + [c] struct vm_area_struct *vm_next;
4591 +%fore "black"
4592 + <snip>
4593 + };
4594 + Display the next vma
4595 +%font "typewriter", size 3
4596 + [3]kdb> vma e8727e00
4597 + struct vm_area_struct at 0xe8727e00 for 68 bytes
4598 + vm_start = 0x8049000 vm_end = 0x804a000
4599 + page_prot = 0x25
4600 + flags: READ WRITE MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
4601 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4602 +%page
4603 +
4604 +Simple Program
4605 +
4606 +%font "typewriter", size 3
4607 + Use the ll command to display the list of vma's
4608 +%font "typewriter", size 3
4609 + [3]kdb> ll e8357a80 0xc vma
4610 +.
4611 + struct vm_area_struct at 0xe8357a80 for 68 bytes
4612 + vm_start = 0x8048000 vm_end = 0x8049000
4613 + page_prot = 0x25
4614 + flags: READ EXEC MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
4615 +.
4616 + struct vm_area_struct at 0xe8727e00 for 68 bytes
4617 + vm_start =
4618 +%fore "orange", cont
4619 +0x8049000
4620 +%fore "black", cont
4621 + vm_end =
4622 +%fore "orange", cont
4623 +0x804a000
4624 +%fore "black"
4625 + page_prot = 0x25
4626 + flags: READ WRITE MAYREAD MAYWRITE MAYEXEC DENYWRITE EXECUTABLE
4627 +.
4628 + struct vm_area_struct at 0xe8727c80 for 68 bytes
4629 + vm_start =
4630 +%fore "blue", cont
4631 +0x804a000
4632 +%fore "black", cont
4633 + vm_end =
4634 +%fore "blue", cont
4635 +0x805a000
4636 +%fore "black"
4637 + page_prot = 0x25
4638 + flags: READ WRITE EXEC MAYREAD MAYWRITE MAYEXEC
4639 + <snip>
4640 + struct vm_area_struct at 0xe8357900 for 68 bytes
4641 + vm_start = 0xbfffe000 vm_end = 0xc0000000
4642 + page_prot = 0x25
4643 + flags: READ WRITE EXEC MAYREAD MAYWRITE MAYEXEC GROWSDOWN
4644 +
4645 + Match the vma to the displayed addresses
4646 +%font "typewriter", size 3
4647 + foo_global at
4648 +%fore "orange", cont
4649 +8049780
4650 +%fore "black"
4651 + foo_malloc at
4652 +%fore "blue", cont
4653 +8051788
4654 +%fore "black"
4655 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4656 +%page
4657 +
4658 +Walking IO structures
4659 +
4660 +
4661 + Objective
4662 + Show usage of various scsi and vm related kdb commands
4663 +
4664 + Sequence:
4665 + Set a breakpoint in the scsi driver
4666 + Stops when queueing a command to the controller
4667 + Cause IO on an idle disk
4668 + Show various IO stack traces
4669 + Display the IO data structures
4670 + Display vm information about the data
4671 +
4672 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4673 +%page
4674 +
4675 +Walking IO structures
4676 +
4677 +
4678 +%font "typewriter", size 3
4679 + Set the breakpoint
4680 +
4681 +%font "typewriter", size 3
4682 + [3]kdb>
4683 +%fore "blue", cont
4684 +bp isp1020_queuecommand
4685 +%fore "black"
4686 + Instruction(i) BP #0 at 0xc01ecfe0 (isp1020_queuecommand)
4687 + is enabled globally adjust 1
4688 +
4689 +%font "typewriter", size 3
4690 + Create some activity on a previously unused disk
4691 +
4692 +%font "typewriter", size 3
4693 + [3]kdb>
4694 +%fore "blue", cont
4695 +go
4696 +%fore "black"
4697 + [root@elm3b77 root]#
4698 +%fore "blue", cont
4699 +ls /rh62
4700 +%fore "black"
4701 +
4702 + Instruction(i) breakpoint #0 at 0xc01ecfe0 (adjusted)
4703 + 0xc01ecfe0 isp1020_queuecommand:int3
4704 +
4705 + Entering kdb (current=0xf75ba000, pid 1181) on processor 3 due to
4706 + Breakpoint @ 0xc01ecfe0
4707 +
4708 +
4709 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4710 +%page
4711 +
4712 +Walking IO structures
4713 +
4714 +
4715 +%font "typewriter", size 3
4716 + Show the stack.
4717 + This is a read of the /rh62 directory
4718 +
4719 +%font "typewriter", size 3
4720 + [1]kdb>
4721 +%fore "blue", cont
4722 +bt
4723 +%fore "black"
4724 + EBP EIP Function(args)
4725 + 0xf75bbdf4 0xc01ecfe0 isp1020_queuecommand
4726 + 0xc01e2c77 scsi_dispatch_cmd+0x1f7
4727 + 0xf75bbe24 0xc01e99b1 scsi_request_fn+0x2f1
4728 + 0xf75bbe34 0xc01c84fd generic_unplug_device+0x2d
4729 + 0xf75bbe50 0xc011b3af __run_task_queue+0x5f
4730 + 0xf75bbe6c 0xc013a63c block_sync_page+0x1c
4731 + 0xf75bbe98 0xc0128127 __lock_page+0x77
4732 + 0xf75bbea4 0xc0128178 lock_page+0x18
4733 + 0xf75bbec8 0xc012a4b3 read_cache_page+0xc3
4734 + 0xf75bbef4 0xc0168e23 ext2_get_page+0x23
4735 + 0xf75bbf48 0xc0168fdd ext2_readdir+0xfd
4736 + 0xf75bbf68 0xc0143d2e vfs_readdir+0x7e
4737 + 0xf75bbfbc 0xc01442ed
4738 +%fore "blue", cont
4739 +sys_getdents64+0x4d
4740 +%fore "black"
4741 + 0xc010702b system_call+0x33
4742 +
4743 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4744 +%page
4745 +
4746 +Walking IO structures
4747 +
4748 +
4749 +%font "typewriter", size 3
4750 + Allow the operation to complete
4751 +
4752 +%font "typewriter", size 3
4753 + [3]kdb>
4754 +%fore "blue", cont
4755 +go
4756 +%fore "black"
4757 + bench build etc lib mnt oldsys rh72 spv usr
4758 + bin data h linux mnt1 opt root test var
4759 + boot dev home lost+found mnt2 proc sbin tmp
4760 +
4761 +%font "typewriter", size 3
4762 + Force some more activity
4763 +
4764 +%font "typewriter", size 3
4765 + [root@elm3b77 root]#
4766 +%fore "blue", cont
4767 +cd /rh62/tmp
4768 +%fore "black"
4769 + Instruction(i) breakpoint #0 at 0xc01ecfe0 (adjusted)
4770 + 0xc01ecfe0 isp1020_queuecommand:int3
4771 +
4772 + Entering kdb (current=0xf768a000, pid 981) on processor 3 due to
4773 + Breakpoint @ 0xc01ecfe0
4774 +
4775 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4776 +%page
4777 +
4778 +Walking IO structures
4779 +
4780 +
4781 +%font "typewriter", size 3
4782 + Show the stack.
4783 + This is an inode read for /rh62/tmp
4784 +
4785 +%font "typewriter", size 3
4786 + [3]kdb>
4787 +%fore "blue", cont
4788 +bt
4789 +%fore "black"
4790 + EBP EIP Function(args)
4791 + 0xf768bd68 0xc01ecfe0 isp1020_queuecommand
4792 + 0xc01e2c77 scsi_dispatch_cmd+0x1f7
4793 + 0xf768bd98 0xc01e99b1 scsi_request_fn+0x2f1
4794 + 0xf768bda8 0xc01c84fd generic_unplug_device+0x2d
4795 + 0xf768bdc4 0xc011b3af __run_task_queue+0x5f
4796 + 0xf768bdfc 0xc0137216 __wait_on_buffer+0x56
4797 + 0xf768be1c 0xc0138600 bread+0x50
4798 + 0xf768be5c 0xc016b684 ext2_read_inode+0x114
4799 + 0xf768bf0c 0xc013fbec real_lookup+0x7c
4800 + 0xf768bf78 0xc014035d link_path_walk+0x5ad
4801 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4802 +%page
4803 +
4804 +Walking IO structures
4805 +
4806 +
4807 +%font "typewriter", size 3
4808 + Create a new file, causing yet more disk activity
4809 +
4810 +%font "typewriter", size 3
4811 + [3]kdb>
4812 +%fore "blue", cont
4813 +go
4814 +%fore "black"
4815 +
4816 + [root@elm3b77 tmp]#
4817 +%fore "blue", cont
4818 +echo "Hello linux reading group" > j1;sync
4819 +%fore "black"
4820 +
4821 + Instruction(i) breakpoint #0 at 0xc01ecfe0 (adjusted)
4822 + 0xc01ecfe0 isp1020_queuecommand:int3
4823 +
4824 + Entering kdb (current=0xf768a000, pid 981) on processor 3 due to
4825 + Breakpoint @ 0xc01ecfe0
4826 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4827 +%page
4828 +
4829 +Walking IO structures
4830 +
4831 +
4832 +%font "typewriter", size 3
4833 + Show the stack
4834 + This is an inode read in response to the open
4835 +%font "typewriter", size 3
4836 + [3]kdb>
4837 +%fore "blue", cont
4838 +bt
4839 +%fore "black"
4840 + EBP EIP Function(args)
4841 + 0xf768bd78 0xc01ecfe0 isp1020_queuecommand
4842 + 0xc01e2c77 scsi_dispatch_cmd+0x1f7
4843 + 0xf768bda8 0xc01e99b1 scsi_request_fn+0x2f1
4844 + 0xf768bdb8 0xc01c84fd generic_unplug_device+0x2d
4845 + 0xf768bdd4 0xc011b3af __run_task_queue+0x5f
4846 + 0xf768bdf0 0xc013a63c block_sync_page+0x1c
4847 + 0xf768be1c 0xc0128127 __lock_page+0x77
4848 + 0xf768be28 0xc0128178 lock_page+0x18
4849 + 0xf768be4c 0xc012a4b3 read_cache_page+0xc3
4850 + 0xf768be78 0xc0168e23 ext2_get_page+0x23
4851 + 0xf768beb8 0xc01691ed ext2_find_entry+0x8d
4852 + 0xf768bed4 0xc016933a ext2_inode_by_name+0x1a
4853 + 0xf768befc 0xc016c077 ext2_lookup+0x27
4854 + 0xf768bf1c 0xc014094a lookup_hash+0x9a
4855 + 0xf768bf64 0xc0140c4d open_namei+0xfd
4856 + 0xf768bfa0 0xc0135907 filp_open+0x37
4857 + 0xf768bfbc 0xc0135c64 sys_open+0x34
4858 + 0xc010702b system_call+0x33
4859 +
4860 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4861 +%page
4862 +
4863 +Walking IO structures
4864 +
4865 +
4866 +%font "typewriter", size 3
4867 + Let the operation continue
4868 +%font "typewriter", size 3
4869 + [3]kdb>
4870 +%fore "blue", cont
4871 +go
4872 +%fore "black"
4873 + Instruction(i) breakpoint #0 at 0xc01ecfe0 (adjusted)
4874 + 0xc01ecfe0 isp1020_queuecommand: int3
4875 + Entering kdb (current=0xc0352000, pid 0) on processor 0 due to
4876 + Breakpoint @ 0xc01ecfe0
4877 + Show the stack
4878 + This is an io completion queuing the next request
4879 +%font "typewriter", size 3
4880 + [0]kdb>
4881 +%fore "blue", cont
4882 +bt
4883 +%fore "black"
4884 + EBP EIP Function(args)
4885 + 0xc0353df4 0xc01ecfe0 isp1020_queuecommand(
4886 +%fore "blue", cont
4887 +0xf7e63a00
4888 +%fore "black", cont
4889 +,0xc01e7fc0...
4890 + 0xc01e2c77 scsi_dispatch_cmd+0x1f7
4891 + 0xc0353e24 0xc01e99b1 scsi_request_fn+0x2f1
4892 + 0xc0353e40 0xc01e8f6a
4893 +%fore "blue", cont
4894 +scsi_queue_next_request+0x4a
4895 +%fore "black"
4896 + 0xc0353e5c 0xc01e9166 __scsi_end_request+0x116
4897 + 0xc0353ea8 0xc01e93e0
4898 +%fore "blue", cont
4899 +scsi_io_completion+0x170
4900 +%fore "black"
4901 + 0xc0353ecc 0xc01f658e rw_intr+0x14e
4902 + 0xc0353ef8 0xc01e8668 scsi_old_done+0x6a8
4903 + 0xc0353fd4 0xc01052c2 cpu_idle+0x52
4904 + Function prototype
4905 +%font "typewriter", size 3
4906 + int isp1020_queuecommand(
4907 +%fore "blue", cont
4908 +Scsi_Cmnd *Cmnd,
4909 +%fore "black"
4910 + void (*done)(Scsi_Cmnd *))
4911 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4912 +%page
4913 +
4914 +Walking IO structures
4915 +
4916 +
4917 +%font "typewriter", size 3
4918 + Show the command being queued
4919 +%font "typewriter", size 3
4920 + [0]kdb>
4921 +%fore "blue", cont
4922 +sc 0xf7e63a00
4923 +%fore "black"
4924 + scsi_cmnd at 0xf7e63a00
4925 +%fore "blue"
4926 + host = 0xf7e91400
4927 +%fore "black", cont
4928 + state = 4099 owner = 258
4929 +%fore "blue", cont
4930 +device = 0xf7ed5d80
4931 +%fore "black"
4932 + bnext = 0x00000000 reset_chain = 0x00000000 eh_state = 0
4933 + done = 0xc01f6440
4934 + serial_number = 3402 serial_num_at_to = 0 retries = 0 timeout = 0
4935 + id/lun/cmnd = [0/0/0] cmd_len = 10 old_cmd_len = 10
4936 + cmnd = [2a/00/00/28/00/3f/00/00/10/00/ef/f7]
4937 + data_cmnd = [2a/00/00/28/00/3f/00/00/10/00/ef/f7]
4938 + request_buffer = 0xc03fd000 bh_next = 0x00000000
4939 + request_bufflen = 8192
4940 + use_sg = 2 old_use_sg = 2 sglist_len = 512 abore_reason = 0
4941 + bufflen = 8192 buffer = 0xc03fd000 underflow = 8192
4942 + transfersize = 512
4943 + tag = 0 pid = 3401
4944 + request struct
4945 + rq_status = RQ_ACTIVE rq_dev = [8/1] errors = 1 cmd = 0
4946 + sector = 2621440 nr_sectors = 16 current_nr_sectors = 8
4947 + buffer = 0xf7599000
4948 +%fore "blue", cont
4949 +bh = 0xf75ca300
4950 +%fore "black", cont
4951 + bhtail = 0xf75ca3c0
4952 +
4953 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4954 +%page
4955 +
4956 +Walking IO structures
4957 +
4958 +
4959 +%font "typewriter", size 3
4960 + Display the host adapter
4961 +%font "typewriter", size 3
4962 + [0]kdb>
4963 +%fore "blue", cont
4964 +sh 0xf7e91400
4965 +%fore "black"
4966 + Scsi_Host at 0xf7e91400
4967 + next = 0x00000000
4968 +%fore "blue", cont
4969 +host_queue = 0xf7ed5d80
4970 +%fore "black"
4971 + ehandler = 0x00000000 eh_wait = 0x00000000 en_notify = 0x00000000
4972 + eh_action = 0x00000000
4973 + h_active = 0x0 host_wait = 0xc0353ac4 hostt = 0xc034bce0
4974 + host_busy = 1
4975 + host_failed = 0 extra_bytes = 524 host_no = 0 resetting = 0
4976 + max id/lun/channel = [16/8/0] this_id = 7
4977 + can_queue = 64 cmd_per_lun = 1 sg_tablesize = 427 u_isa_dma = 0
4978 + host_blocked = 0 reverse_ordering = 0
4979 +
4980 +%font "typewriter", size 3
4981 + Display the scsi device
4982 +%font "typewriter", size 3
4983 + [0]kdb>
4984 +%fore "blue", cont
4985 +sd 0xf7ed5d80
4986 +%fore "black"
4987 + scsi_device at 0xf7ed5d80
4988 + next = 0xf7ed5c80 prev = 0x00000000 host = 0xf7e91400
4989 + device_busy = 1
4990 +%fore "blue", cont
4991 +device_queue 0xf7e63a00
4992 +%fore "black"
4993 + id/lun/chan = [0/0/0] single_lun = 0 device_blocked = 0
4994 + queue_depth = 1 current_tag = 0 scsi_level = 4
4995 + IBM DGHS18X 0360
4996 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4997 +%page
4998 +
4999 +Walking IO structures
5000 +
5001 +
5002 +%font "typewriter", size 3
5003 + Display the Buffer header associated with the command
5004 +%font "typewriter", size 3
5005 + [0]kdb>
5006 +%fore "blue", cont
5007 +bh 0xf75ca300
5008 +%fore "black"
5009 + buffer_head at 0xf75ca300
5010 + next 0x00000000 bno 327680 rsec 2621440 size 4096
5011 + dev 0x801 rdev 0x801
5012 + count 2 state 0x1d [Uptodate Lock Req Mapped] ftime 0x7695e
5013 + b_list 1 b_reqnext 0xf75ca3c0 b_data 0xf7599000
5014 +%fore "blue"
5015 + b_page 0xc1dd6640
5016 +%fore "black", cont
5017 + b_this_page 0xf75ca300 b_private 0x00000000
5018 +
5019 + Display the associated page structure
5020 +%font "typewriter", size 3
5021 + [0]kdb>
5022 +%fore "blue", cont
5023 +page 0xc1dd6640
5024 +%fore "black"
5025 + struct page at 0xc1dd6640
5026 + next 0xc1dd7300 prev 0xc1dd6240
5027 +%fore "blue", cont
5028 +addr space 0xf7af04d0
5029 +%fore "black"
5030 + index 327680 (offset 0x50000000)
5031 + count 2 flags PG_referenced PG_lru virtual 0xf7599000
5032 + buffers 0xf75ca300
5033 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5034 +%page
5035 +
5036 +Walking IO structures
5037 +
5038 +
5039 +%font "typewriter", size 3
5040 + Display the Address space associated with the page
5041 +%font "typewriter", size 3
5042 + [0]kdb>
5043 +%fore "blue", cont
5044 +md 0xf7af04d0
5045 +%fore "black"
5046 + 0xf7af04d0 c1dd6240 c1dea740 f7af04d8 f7af04d8 @b]A@'^AX./wX./w
5047 + 0xf7af04e0 f7af04e0 f7af04e0 00000007 c033b700 `./w`./w.....73@
5048 + 0xf7af04f0
5049 +%fore "blue", cont
5050 +f7af0420
5051 +%fore "black", cont
5052 + 00000000 00000000 00000001 ./w............
5053 + 0xf7af0500 000001d0 00000000 00000000 f7af050c P............./w
5054 + 0xf7af0510 f7af050c 00000000 f7a8afa0 00000000 ../w.... /(w....
5055 +
5056 + The structure looks like:
5057 +%size 3
5058 + struct address_space {
5059 + struct list_head clean_pages; /* list of clean pages */
5060 + struct list_head dirty_pages; /* list of dirty pages */
5061 + struct list_head locked_pages;/* list of locked pages */
5062 + unsigned long nrpages; /* number of total pages */
5063 + spinlock_t page_lock; /* spinlock protecting them*/
5064 + struct address_space_operations *a_ops; /* methods */
5065 +%fore "blue"
5066 + struct inode *host; /* owner: inode, block_dev */
5067 +%fore "black"
5068 + <snip>
5069 + };
5070 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5071 +%page
5072 +
5073 +Walking IO structures
5074 +
5075 +
5076 +%font "typewriter", size 3
5077 + Display the inode associated with the address space
5078 + I think htis is the inode for the block device.
5079 +
5080 +%font "typewriter", size 3
5081 + [1]kdb>
5082 +%fore "blue", cont
5083 +inode f7af0420
5084 +%fore "black"
5085 + struct inode at 0xf7af0420
5086 + i_ino = 289 i_count = 1 i_dev = 0x801 i_size 4301789184
5087 + i_mode = 0x8000 i_nlink = 1 i_rdev = 0x801
5088 + i_hash.nxt = 0xf7af0420 i_hash.prv = 0xf7af0420
5089 + i_list.nxt = 0xf7af0608 i_list.prv = 0xf7af0068
5090 + i_dentry.nxt = 0xf7af0430 i_dentry.prv = 0xf7af0430
5091 + i_dirty_buffers.nxt = 0xf7af0438 i_dirty_buffers.prv = 0xf7af0438
5092 + i_sb = 0xc201f200 i_op = 0xc03cfdc0 i_data = 0xf7af04d0 nrpages = 6
5093 + i_mapping = 0xf7af04d0
5094 + i_flags 0x0 i_state 0x0 [] fs specific info @ 0xf7af0540
5095 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5096 +%page
5097 +
5098 +Walking IO structures
5099 +
5100 +
5101 +%font "typewriter", size 3
5102 + Display the page list associated with the inode
5103 +%font "typewriter", size 3
5104 + [0]kdb>
5105 +%fore "blue", cont
5106 +inode_pages f7af0420
5107 +%fore "black"
5108 +CLEAN page_struct index cnt flags
5109 + 0xc1dd6240 327735 2 0x44 bh 0xf75caae0 bno 327735
5110 + [Lock Req Mapped]
5111 +%fore "blue"
5112 + 0xc1dd6640 327680 2 0x44 bh 0xf75ca300 bno 327680
5113 + [Uptodate Lock Req Mapped]
5114 +%fore "black"
5115 + 0xc1dd7300 327681 2 0x44 bh 0xf75ca3c0 bno 327681
5116 + [Uptodate Lock Req Mapped]
5117 + 0xc1dd6e00 327684 2 0x44 bh 0xf75ca420 bno 327684
5118 + [Uptodate Req Mapped]
5119 + 0xc1de8fc0 4 2 0xc0 bh 0xf7b5ade0 bno 4
5120 + [Uptodate Req Mapped]
5121 + 0xc1dea700 1 2 0x44 bh 0xf7e02740 bno 1
5122 + [Uptodate Req Mapped]
5123 + 0xc1dea740 0 2 0x44 bh 0xf7e028c0 bno 0
5124 + [Uptodate Req Mapped]
5125 +DIRTY page_struct index cnt flags
5126 +LOCKED page_struct index cnt flags
5127 --- a/Makefile
5128 +++ b/Makefile
5129 @@ -645,6 +645,7 @@ export mod_strip_cmd
5130
5131 ifeq ($(KBUILD_EXTMOD),)
5132 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
5133 +core-$(CONFIG_KDB) += kdb/
5134
5135 vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
5136 $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
5137 --- a/drivers/char/keyboard.c
5138 +++ b/drivers/char/keyboard.c
5139 @@ -43,6 +43,9 @@
5140 #include <linux/reboot.h>
5141 #include <linux/notifier.h>
5142 #include <linux/jiffies.h>
5143 +#ifdef CONFIG_KDB
5144 +#include <linux/kdb.h>
5145 +#endif /* CONFIG_KDB */
5146
5147 extern void ctrl_alt_del(void);
5148
5149 @@ -1189,6 +1192,13 @@ static void kbd_keycode(unsigned int key
5150 }
5151 #endif
5152
5153 +#ifdef CONFIG_KDB
5154 + if (down && !rep && keycode == KEY_PAUSE && kdb_on == 1) {
5155 + kdb(KDB_REASON_KEYBOARD, 0, get_irq_regs());
5156 + return;
5157 + }
5158 +#endif /* CONFIG_KDB */
5159 +
5160 #ifdef CONFIG_MAGIC_SYSRQ /* Handle the SysRq Hack */
5161 if (keycode == KEY_SYSRQ && (sysrq_down || (down == 1 && sysrq_alt))) {
5162 if (!sysrq_down) {
5163 --- a/drivers/hid/usbhid/hid-core.c
5164 +++ b/drivers/hid/usbhid/hid-core.c
5165 @@ -44,6 +44,10 @@
5166 #define DRIVER_DESC "USB HID core driver"
5167 #define DRIVER_LICENSE "GPL"
5168
5169 +#ifdef CONFIG_KDB_USB
5170 +#include <linux/kdb.h>
5171 +#endif
5172 +
5173 static char *hid_types[] = {"Device", "Pointer", "Mouse", "Device", "Joystick",
5174 "Gamepad", "Keyboard", "Keypad", "Multi-Axis Controller"};
5175 /*
5176 @@ -940,6 +944,15 @@ static void hid_disconnect(struct usb_in
5177
5178 usbhid = hid->driver_data;
5179
5180 +#ifdef CONFIG_KDB_USB
5181 + /*
5182 + * If the URB was for a Keyboard, detach it from kdb.
5183 + * If the URB was for another type of device, just
5184 + * allow kdb_usb_keyboard_detach() to silently fail.
5185 + */
5186 + kdb_usb_keyboard_detach(usbhid->urbin);
5187 +#endif
5188 +
5189 spin_lock_irq(&usbhid->inlock); /* Sync with error handler */
5190 usb_set_intfdata(intf, NULL);
5191 set_bit(HID_DISCONNECTED, &usbhid->iofl);
5192 @@ -1037,6 +1050,21 @@ static int hid_probe(struct usb_interfac
5193 printk(": USB HID v%x.%02x %s [%s] on %s\n",
5194 hid->version >> 8, hid->version & 0xff, c, hid->name, path);
5195
5196 +#ifdef CONFIG_KDB_USB
5197 + /* Attach USB keyboards to kdb */
5198 + if (!strcmp(c, "Keyboard")) {
5199 + int ret;
5200 + struct usbhid_device *usbhid = hid->driver_data;
5201 + extern void * usb_hcd_get_kdb_poll_func(struct usb_device *udev);
5202 + ret = kdb_usb_keyboard_attach(usbhid->urbin, usbhid->inbuf,
5203 + usb_hcd_get_kdb_poll_func(interface_to_usbdev(intf)));
5204 +
5205 + if (ret == -1)
5206 + printk(": FAILED to register keyboard (%s) "
5207 + "with KDB\n", path);
5208 + }
5209 +#endif /* CONFIG_KDB_USB */
5210 +
5211 return 0;
5212 }
5213
5214 --- a/drivers/hid/usbhid/usbkbd.c
5215 +++ b/drivers/hid/usbhid/usbkbd.c
5216 @@ -30,6 +30,9 @@
5217 #include <linux/init.h>
5218 #include <linux/usb/input.h>
5219 #include <linux/hid.h>
5220 +#ifdef CONFIG_KDB_USB
5221 +#include <linux/kdb.h>
5222 +#endif
5223
5224 /*
5225 * Version Information
5226 @@ -289,6 +292,16 @@ static int usb_kbd_probe(struct usb_inte
5227 usb_fill_int_urb(kbd->irq, dev, pipe,
5228 kbd->new, (maxp > 8 ? 8 : maxp),
5229 usb_kbd_irq, kbd, endpoint->bInterval);
5230 +
5231 +#ifdef CONFIG_KDB_USB
5232 + /* Attach keyboard to kdb */
5233 + extern void * usb_hcd_get_kdb_poll_func(struct usb_device *udev);
5234 +
5235 + kdb_usb_keyboard_attach(kbd->irq, kbd->new,
5236 + usb_hcd_get_kdb_poll_func(dev));
5237 +
5238 +#endif /* CONFIG_KDB_USB */
5239 +
5240 kbd->irq->transfer_dma = kbd->new_dma;
5241 kbd->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
5242
5243 @@ -326,6 +339,10 @@ static void usb_kbd_disconnect(struct us
5244
5245 usb_set_intfdata(intf, NULL);
5246 if (kbd) {
5247 +#ifdef CONFIG_KDB_USB
5248 + /* Detach the keyboard from kdb */
5249 + kdb_usb_keyboard_detach(kbd->irq);
5250 +#endif /* CONFIG_KDB_USB */
5251 usb_kill_urb(kbd->irq);
5252 input_unregister_device(kbd->dev);
5253 usb_kbd_free_mem(interface_to_usbdev(intf), kbd);
5254 --- a/drivers/serial/8250.c
5255 +++ b/drivers/serial/8250.c
5256 @@ -43,6 +43,19 @@
5257 #include <asm/irq.h>
5258
5259 #include "8250.h"
5260 +#include <linux/kdb.h>
5261 +#ifdef CONFIG_KDB
5262 +/*
5263 + * kdb_serial_line records the serial line number of the first serial console.
5264 + * NOTE: The kernel ignores characters on the serial line unless a user space
5265 + * program has opened the line first. To enter kdb before user space has opened
5266 + * the serial line, you can use the 'kdb=early' flag to lilo and set the
5267 + * appropriate breakpoints.
5268 + */
5269 +
5270 +static int kdb_serial_line = -1;
5271 +static const char *kdb_serial_ptr = kdb_serial_str;
5272 +#endif /* CONFIG_KDB */
5273
5274 /*
5275 * Configuration:
5276 @@ -1310,6 +1323,20 @@ receive_chars(struct uart_8250_port *up,
5277 * just force the read character to be 0
5278 */
5279 ch = 0;
5280 +#ifdef CONFIG_KDB
5281 + if ((up->port.line == kdb_serial_line) && kdb_on == 1) {
5282 + if (ch == *kdb_serial_ptr) {
5283 + if (!(*++kdb_serial_ptr)) {
5284 + atomic_inc(&kdb_8250);
5285 + kdb(KDB_REASON_KEYBOARD, 0, get_irq_regs());
5286 + atomic_dec(&kdb_8250);
5287 + kdb_serial_ptr = kdb_serial_str;
5288 + break;
5289 + }
5290 + } else
5291 + kdb_serial_ptr = kdb_serial_str;
5292 + }
5293 +#endif /* CONFIG_KDB */
5294
5295 flag = TTY_NORMAL;
5296 up->port.icount.rx++;
5297 @@ -2582,7 +2609,7 @@ serial8250_console_write(struct console
5298 if (up->port.sysrq) {
5299 /* serial8250_handle_port() already took the lock */
5300 locked = 0;
5301 - } else if (oops_in_progress) {
5302 + } else if (oops_in_progress || KDB_8250()) {
5303 locked = spin_trylock(&up->port.lock);
5304 } else
5305 spin_lock(&up->port.lock);
5306 @@ -2640,6 +2667,30 @@ static int __init serial8250_console_set
5307 if (!port->iobase && !port->membase)
5308 return -ENODEV;
5309
5310 +#ifdef CONFIG_KDB
5311 + /*
5312 + * Remember the line number of the first serial
5313 + * console. We'll make this the kdb serial console too.
5314 + */
5315 + if (co && kdb_serial_line == -1) {
5316 + kdb_serial_line = co->index;
5317 + kdb_serial.io_type = port->iotype;
5318 + switch (port->iotype) {
5319 + case SERIAL_IO_MEM:
5320 +#ifdef SERIAL_IO_MEM32
5321 + case SERIAL_IO_MEM32:
5322 +#endif
5323 + kdb_serial.iobase = (unsigned long)(port->membase);
5324 + kdb_serial.ioreg_shift = port->regshift;
5325 + break;
5326 + default:
5327 + kdb_serial.iobase = port->iobase;
5328 + kdb_serial.ioreg_shift = 0;
5329 + break;
5330 + }
5331 + }
5332 +#endif /* CONFIG_KDB */
5333 +
5334 if (options)
5335 uart_parse_options(options, &baud, &parity, &bits, &flow);
5336
5337 --- a/drivers/serial/8250_early.c
5338 +++ b/drivers/serial/8250_early.c
5339 @@ -38,6 +38,11 @@
5340 #include <asm/fixmap.h>
5341 #endif
5342
5343 +#ifdef CONFIG_KDB
5344 +#include <linux/kdb.h>
5345 +static int kdb_serial_line = -1;
5346 +#endif /* CONFIG_KDB */
5347 +
5348 struct early_serial8250_device {
5349 struct uart_port port;
5350 char options[16]; /* e.g., 115200n8 */
5351 @@ -231,6 +236,30 @@ int __init setup_early_serial8250_consol
5352
5353 register_console(&early_serial8250_console);
5354
5355 +#ifdef CONFIG_KDB
5356 + /*
5357 + * Remember the line number of the first serial
5358 + * console. We'll make this the kdb serial console too.
5359 + */
5360 + if (kdb_serial_line == -1) {
5361 + kdb_serial_line = early_serial8250_console.index;
5362 + kdb_serial.io_type = early_device.port.iotype;
5363 + switch (early_device.port.iotype) {
5364 + case SERIAL_IO_MEM:
5365 +#ifdef SERIAL_IO_MEM32
5366 + case SERIAL_IO_MEM32:
5367 +#endif
5368 + kdb_serial.iobase = (unsigned long)(early_device.port.membase);
5369 + kdb_serial.ioreg_shift = early_device.port.regshift;
5370 + break;
5371 + default:
5372 + kdb_serial.iobase = early_device.port.iobase;
5373 + kdb_serial.ioreg_shift = 0;
5374 + break;
5375 + }
5376 + }
5377 +#endif /* CONFIG_KDB */
5378 +
5379 return 0;
5380 }
5381
5382 --- a/drivers/serial/sn_console.c
5383 +++ b/drivers/serial/sn_console.c
5384 @@ -48,6 +48,22 @@
5385 #include <linux/delay.h> /* for mdelay */
5386 #include <linux/miscdevice.h>
5387 #include <linux/serial_core.h>
5388 +#ifdef CONFIG_KDB
5389 +#include <linux/kdb.h>
5390 +#include <linux/kdbprivate.h>
5391 +#include <linux/serial_reg.h>
5392 +/*
5393 + * kdb_serial_line records the serial line number of the first serial console.
5394 + * NOTE: The kernel ignores characters on the serial line unless a user space
5395 + * program has opened the line first. To enter kdb before user space has opened
5396 + * the serial line, you can use the 'kdb=early' flag to lilo and set the
5397 + * appropriate breakpoints.
5398 + */
5399 +
5400 +static int kdb_serial_line = -1;
5401 +static char *kdb_serial_ptr = (char *)kdb_serial_str;
5402 +#endif /* CONFIG_KDB */
5403 +
5404
5405 #include <asm/io.h>
5406 #include <asm/sn/simulator.h>
5407 @@ -485,6 +501,26 @@ sn_receive_chars(struct sn_cons_port *po
5408 "obtaining data from the console (0x%0x)\n", ch);
5409 break;
5410 }
5411 +#ifdef CONFIG_KDB
5412 + if (kdb_on == 1) {
5413 + if (ch == *kdb_serial_ptr) {
5414 + if (!(*++kdb_serial_ptr)) {
5415 + spin_unlock_irqrestore(&port->sc_port.lock, flags);
5416 + if (!get_irq_regs()) {
5417 + KDB_STATE_SET(KEYBOARD);
5418 + KDB_ENTER(); /* to get some registers */
5419 + } else
5420 + kdb(KDB_REASON_KEYBOARD, 0, get_irq_regs());
5421 + kdb_serial_ptr = (char *)kdb_serial_str;
5422 + spin_lock_irqsave(&port->sc_port.lock, flags);
5423 + break;
5424 + }
5425 + }
5426 + else
5427 + kdb_serial_ptr = (char *)kdb_serial_str;
5428 + }
5429 +#endif /* CONFIG_KDB */
5430 +
5431 #ifdef CONFIG_MAGIC_SYSRQ
5432 if (sysrq_requested) {
5433 unsigned long sysrq_timeout = sysrq_requested + HZ*5;
5434 @@ -1008,6 +1044,15 @@ sn_sal_console_write(struct console *co,
5435 */
5436 static int sn_sal_console_setup(struct console *co, char *options)
5437 {
5438 +#ifdef CONFIG_KDB
5439 + /*
5440 + * Remember the line number of the first serial
5441 + * console. We'll make this the kdb serial console too.
5442 + */
5443 + if (kdb_serial_line == -1) {
5444 + kdb_serial_line = co->index;
5445 + }
5446 +#endif /* CONFIG_KDB */
5447 return 0;
5448 }
5449
5450 @@ -1083,3 +1128,31 @@ static int __init sn_sal_serial_console_
5451 }
5452
5453 console_initcall(sn_sal_serial_console_init);
5454 +
5455 +#ifdef CONFIG_KDB
5456 +int
5457 +l1_control_in_polled(int offset)
5458 +{
5459 + int sal_call_status = 0, input;
5460 + int ret = 0;
5461 + if (offset == UART_LSR) {
5462 + ret = (UART_LSR_THRE | UART_LSR_TEMT); /* can send anytime */
5463 + sal_call_status = ia64_sn_console_check(&input);
5464 + if (!sal_call_status && input) {
5465 + /* input pending */
5466 + ret |= UART_LSR_DR;
5467 + }
5468 + }
5469 + return ret;
5470 +}
5471 +
5472 +int
5473 +l1_serial_in_polled(void)
5474 +{
5475 + int ch;
5476 + if (!ia64_sn_console_getc(&ch))
5477 + return ch;
5478 + else
5479 + return 0;
5480 +}
5481 +#endif /* CONFIG_KDB */
5482 --- a/drivers/usb/core/hcd.c
5483 +++ b/drivers/usb/core/hcd.c
5484 @@ -2027,6 +2027,20 @@ usb_hcd_platform_shutdown(struct platfor
5485 }
5486 EXPORT_SYMBOL_GPL(usb_hcd_platform_shutdown);
5487
5488 +#ifdef CONFIG_KDB_USB
5489 +void *
5490 +usb_hcd_get_kdb_poll_func(struct usb_device *udev)
5491 +{
5492 + struct usb_hcd *hcd = bus_to_hcd(udev->bus);
5493 +
5494 + if (hcd && hcd->driver)
5495 + return (void *)(hcd->driver->kdb_poll_char);
5496 +
5497 + return NULL;
5498 +}
5499 +EXPORT_SYMBOL_GPL (usb_hcd_get_kdb_poll_func);
5500 +#endif /* CONFIG_KDB_USB */
5501 +
5502 /*-------------------------------------------------------------------------*/
5503
5504 #if defined(CONFIG_USB_MON)
5505 --- a/drivers/usb/core/hcd.h
5506 +++ b/drivers/usb/core/hcd.h
5507 @@ -217,6 +217,10 @@ struct hc_driver {
5508 void (*relinquish_port)(struct usb_hcd *, int);
5509 /* has a port been handed over to a companion? */
5510 int (*port_handed_over)(struct usb_hcd *, int);
5511 +#ifdef CONFIG_KDB_USB
5512 + /* KDB poll function for this HC */
5513 + int (*kdb_poll_char)(struct urb *urb);
5514 +#endif /* CONFIG_KDB_USB */
5515 };
5516
5517 extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
5518 --- a/drivers/usb/host/ehci-hcd.c
5519 +++ b/drivers/usb/host/ehci-hcd.c
5520 @@ -993,6 +993,48 @@ static int ehci_get_frame (struct usb_hc
5521 ehci->periodic_size;
5522 }
5523
5524 +#ifdef CONFIG_KDB_USB
5525 +
5526 +int
5527 +ehci_kdb_poll_char(struct urb *urb)
5528 +{
5529 + struct ehci_hcd *ehci;
5530 +
5531 + /* just to make sure */
5532 + if (!urb || !urb->dev || !urb->dev->bus)
5533 + return -1;
5534 +
5535 + ehci = (struct ehci_hcd *) hcd_to_ehci(bus_to_hcd(urb->dev->bus));
5536 +
5537 + /* make sure */
5538 + if (!ehci)
5539 + return -1;
5540 +
5541 + if (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
5542 + return -1;
5543 +
5544 + /*
5545 + * If ehci->lock is held coming into this routine, it could
5546 + * mean KDB was entered while the HC driver was in the midst
5547 + * of processing URBs. Therefore it could be dangerous to
5548 + * processes URBs from this poll routine. And, we can't wait on
5549 + * the lock since we are in KDB and kernel threads (including the
5550 + * one holding the lock) are suspended.
5551 + * So, we punt and return an error. Keyboards attached to this
5552 + * HC will not be useable from KDB at this time.
5553 + */
5554 + if (spin_is_locked(&ehci->lock))
5555 + return -EBUSY;
5556 +
5557 + /* processes the URB */
5558 + if (qh_completions_kdb(ehci, urb->hcpriv, urb))
5559 + return 0;
5560 +
5561 + return -1;
5562 +}
5563 +
5564 +#endif /* CONFIG_KDB_USB */
5565 +
5566 /*-------------------------------------------------------------------------*/
5567
5568 #define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
5569 --- a/drivers/usb/host/ehci-pci.c
5570 +++ b/drivers/usb/host/ehci-pci.c
5571 @@ -22,6 +22,10 @@
5572 #error "This file is PCI bus glue. CONFIG_PCI must be defined."
5573 #endif
5574
5575 +#ifdef CONFIG_KDB_USB
5576 +#include <linux/kdb.h>
5577 +#endif
5578 +
5579 /*-------------------------------------------------------------------------*/
5580
5581 /* called after powerup, by probe or system-pm "wakeup" */
5582 @@ -404,6 +408,10 @@ static const struct hc_driver ehci_pci_h
5583 .bus_resume = ehci_bus_resume,
5584 .relinquish_port = ehci_relinquish_port,
5585 .port_handed_over = ehci_port_handed_over,
5586 +
5587 +#ifdef CONFIG_KDB_USB
5588 + .kdb_poll_char = ehci_kdb_poll_char,
5589 +#endif
5590 };
5591
5592 /*-------------------------------------------------------------------------*/
5593 --- a/drivers/usb/host/ehci-q.c
5594 +++ b/drivers/usb/host/ehci-q.c
5595 @@ -499,6 +499,228 @@ halt:
5596 return count;
5597 }
5598
5599 +#ifdef CONFIG_KDB_USB
5600 +/*
5601 + * This routine is basically a copy of qh_completions() for use by KDB.
5602 + * It is modified to only work on qtds which are associated
5603 + * with 'kdburb'. Also, there are some fixups related to locking.
5604 + */
5605 +unsigned
5606 +qh_completions_kdb(struct ehci_hcd *ehci, struct ehci_qh *qh, struct urb *kdburb)
5607 +{
5608 + struct ehci_qtd *last = NULL, *end = qh->dummy;
5609 + struct list_head *entry, *tmp;
5610 + int last_status = -EINPROGRESS;
5611 + int stopped;
5612 + unsigned count = 0;
5613 + int do_status = 0;
5614 + u8 state;
5615 + u32 halt = HALT_BIT(ehci);
5616 +
5617 + /* verify params are valid */
5618 + if (!qh || !kdburb)
5619 + return 0;
5620 +
5621 + if (unlikely (list_empty (&qh->qtd_list)))
5622 + return count;
5623 +
5624 + /* completions (or tasks on other cpus) must never clobber HALT
5625 + * till we've gone through and cleaned everything up, even when
5626 + * they add urbs to this qh's queue or mark them for unlinking.
5627 + *
5628 + * NOTE: unlinking expects to be done in queue order.
5629 + */
5630 + state = qh->qh_state;
5631 + qh->qh_state = QH_STATE_COMPLETING;
5632 + stopped = (state == QH_STATE_IDLE);
5633 +
5634 + /* remove de-activated QTDs from front of queue.
5635 + * after faults (including short reads), cleanup this urb
5636 + * then let the queue advance.
5637 + * if queue is stopped, handles unlinks.
5638 + */
5639 + list_for_each_safe (entry, tmp, &qh->qtd_list) {
5640 + struct ehci_qtd *qtd;
5641 + struct urb *urb;
5642 + u32 token = 0;
5643 + int qtd_status;
5644 +
5645 + qtd = list_entry (entry, struct ehci_qtd, qtd_list);
5646 + urb = qtd->urb;
5647 +
5648 + if (urb != kdburb)
5649 + continue;
5650 +
5651 + /* clean up any state from previous QTD ...*/
5652 + if (last) {
5653 + if (likely (last->urb != urb)) {
5654 + /*
5655 + * Lock hackery here...
5656 + * ehci_urb_done() makes the assumption
5657 + * that it's called with ehci->lock held.
5658 + * So, lock it if it isn't already.
5659 + */
5660 + if (!spin_is_locked(&ehci->lock))
5661 + spin_lock(&ehci->lock);
5662 +
5663 + ehci_urb_done(ehci, last->urb, last_status);
5664 +
5665 + /*
5666 + * ehci_urb_done() releases and reacquires
5667 + * ehci->lock, so release it here.
5668 + */
5669 + if (spin_is_locked(&ehci->lock))
5670 + spin_unlock (&ehci->lock);
5671 +
5672 + count++;
5673 + }
5674 + ehci_qtd_free (ehci, last);
5675 + last = NULL;
5676 + last_status = -EINPROGRESS;
5677 + }
5678 +
5679 + /* ignore urbs submitted during completions we reported */
5680 + if (qtd == end)
5681 + break;
5682 +
5683 + /* hardware copies qtd out of qh overlay */
5684 + rmb ();
5685 + token = hc32_to_cpu(ehci, qtd->hw_token);
5686 +
5687 + /* always clean up qtds the hc de-activated */
5688 + if ((token & QTD_STS_ACTIVE) == 0) {
5689 +
5690 + if ((token & QTD_STS_HALT) != 0) {
5691 + stopped = 1;
5692 +
5693 + /* magic dummy for some short reads; qh won't advance.
5694 + * that silicon quirk can kick in with this dummy too.
5695 + */
5696 + } else if (IS_SHORT_READ (token)
5697 + && !(qtd->hw_alt_next
5698 + & EHCI_LIST_END(ehci))) {
5699 + stopped = 1;
5700 + goto halt;
5701 + }
5702 +
5703 + /* stop scanning when we reach qtds the hc is using */
5704 + } else if (likely (!stopped
5705 + && HC_IS_RUNNING (ehci_to_hcd(ehci)->state))) {
5706 + break;
5707 +
5708 + } else {
5709 + stopped = 1;
5710 +
5711 + if (unlikely (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state)))
5712 + last_status = -ESHUTDOWN;
5713 +
5714 + /* ignore active urbs unless some previous qtd
5715 + * for the urb faulted (including short read) or
5716 + * its urb was canceled. we may patch qh or qtds.
5717 + */
5718 + if (likely(last_status == -EINPROGRESS &&
5719 + !urb->unlinked))
5720 + continue;
5721 +
5722 + /* issue status after short control reads */
5723 + if (unlikely (do_status != 0)
5724 + && QTD_PID (token) == 0 /* OUT */) {
5725 + do_status = 0;
5726 + continue;
5727 + }
5728 +
5729 + /* token in overlay may be most current */
5730 + if (state == QH_STATE_IDLE
5731 + && cpu_to_hc32(ehci, qtd->qtd_dma)
5732 + == qh->hw_current)
5733 + token = hc32_to_cpu(ehci, qh->hw_token);
5734 +
5735 + /* force halt for unlinked or blocked qh, so we'll
5736 + * patch the qh later and so that completions can't
5737 + * activate it while we "know" it's stopped.
5738 + */
5739 + if ((halt & qh->hw_token) == 0) {
5740 +halt:
5741 + qh->hw_token |= halt;
5742 + wmb ();
5743 + }
5744 + }
5745 +
5746 + /* remove it from the queue */
5747 + qtd_status = qtd_copy_status(ehci, urb, qtd->length, token);
5748 + if (unlikely(qtd_status == -EREMOTEIO)) {
5749 + do_status = (!urb->unlinked &&
5750 + usb_pipecontrol(urb->pipe));
5751 + qtd_status = 0;
5752 + }
5753 + if (likely(last_status == -EINPROGRESS))
5754 + last_status = qtd_status;
5755 +
5756 + if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {
5757 + last = list_entry (qtd->qtd_list.prev,
5758 + struct ehci_qtd, qtd_list);
5759 + last->hw_next = qtd->hw_next;
5760 + }
5761 + list_del (&qtd->qtd_list);
5762 + last = qtd;
5763 + }
5764 +
5765 + /* last urb's completion might still need calling */
5766 + if (likely (last != NULL)) {
5767 + /*
5768 + * Lock hackery here...
5769 + * ehci_urb_done() makes the assumption
5770 + * that it's called with ehci->lock held.
5771 + * So, lock it if it isn't already.
5772 + */
5773 + if (!spin_is_locked(&ehci->lock))
5774 + spin_lock(&ehci->lock);
5775 +
5776 + ehci_urb_done(ehci, last->urb, last_status);
5777 +
5778 + /*
5779 + * ehci_urb_done() releases and reacquires
5780 + * ehci->lock, so release it here.
5781 + */
5782 + if (spin_is_locked(&ehci->lock))
5783 + spin_unlock (&ehci->lock);
5784 +
5785 + count++;
5786 + ehci_qtd_free (ehci, last);
5787 + }
5788 +
5789 + /* restore original state; caller must unlink or relink */
5790 + qh->qh_state = state;
5791 +
5792 + /* be sure the hardware's done with the qh before refreshing
5793 + * it after fault cleanup, or recovering from silicon wrongly
5794 + * overlaying the dummy qtd (which reduces DMA chatter).
5795 + */
5796 + if (stopped != 0 || qh->hw_qtd_next == EHCI_LIST_END(ehci)) {
5797 + switch (state) {
5798 + case QH_STATE_IDLE:
5799 + qh_refresh(ehci, qh);
5800 + break;
5801 + case QH_STATE_LINKED:
5802 + /* should be rare for periodic transfers,
5803 + * except maybe high bandwidth ...
5804 + */
5805 + if ((cpu_to_hc32(ehci, QH_SMASK)
5806 + & qh->hw_info2) != 0) {
5807 + intr_deschedule (ehci, qh);
5808 + (void) qh_schedule (ehci, qh);
5809 + } else
5810 + unlink_async (ehci, qh);
5811 + break;
5812 + /* otherwise, unlink already started */
5813 + }
5814 + }
5815 +
5816 + return count;
5817 +}
5818 +
5819 +#endif /* CONFIG_KDB_USB */
5820 +
5821 /*-------------------------------------------------------------------------*/
5822
5823 // high bandwidth multiplier, as encoded in highspeed endpoint descriptors
5824 --- a/drivers/usb/host/ohci-hcd.c
5825 +++ b/drivers/usb/host/ohci-hcd.c
5826 @@ -984,6 +984,73 @@ static int ohci_restart (struct ohci_hcd
5827
5828 /*-------------------------------------------------------------------------*/
5829
5830 +#ifdef CONFIG_KDB_USB
5831 +
5832 +int
5833 +ohci_kdb_poll_char(struct urb *urb)
5834 +{
5835 + struct ohci_hcd *ohci;
5836 + struct ohci_regs * regs;
5837 +
5838 + /* just to make sure */
5839 + if (!urb || !urb->dev || !urb->dev->bus)
5840 + return -1;
5841 +
5842 + ohci = (struct ohci_hcd *) hcd_to_ohci(bus_to_hcd(urb->dev->bus));
5843 +
5844 + /* make sure */
5845 + if (!ohci || !ohci->hcca)
5846 + return -1;
5847 +
5848 + if (!HC_IS_RUNNING (ohci_to_hcd(ohci)->state))
5849 + return -1;
5850 +
5851 + /*
5852 + * If ohci->lock is held coming into this routine, it could
5853 + * mean KDB was entered while the HC driver was in the midst
5854 + * of processing URBs. Therefore it could be dangerous to
5855 + * processes URBs from this poll routine. And, we can't wait on
5856 + * the lock since we are in KDB and kernel threads (including the
5857 + * one holding the lock) are suspended.
5858 + * So, we punt and return an error. Keyboards attached to this
5859 + * HC will not be useable from KDB at this time.
5860 + */
5861 + if (spin_is_locked(&ohci->lock))
5862 + return -EBUSY;
5863 +
5864 + regs = ohci->regs;
5865 +
5866 + /* if the urb is not currently in progress resubmit it */
5867 + if (urb->status != -EINPROGRESS) {
5868 +
5869 + if (usb_submit_urb (urb, GFP_ATOMIC))
5870 + return -1;
5871 +
5872 + /* make sure the HC registers are set correctly */
5873 + ohci_writel (ohci, OHCI_INTR_WDH, &regs->intrenable);
5874 + ohci_writel (ohci, OHCI_INTR_WDH, &regs->intrstatus);
5875 + ohci_writel (ohci, OHCI_INTR_MIE, &regs->intrenable);
5876 +
5877 + // flush those pci writes
5878 + (void) ohci_readl (ohci, &ohci->regs->control);
5879 + }
5880 +
5881 + if (ohci->hcca->done_head) {
5882 + dl_done_list_kdb (ohci, urb);
5883 + ohci_writel (ohci, OHCI_INTR_WDH, &regs->intrstatus);
5884 + // flush the pci write
5885 + (void) ohci_readl (ohci, &ohci->regs->control);
5886 +
5887 + return 0;
5888 + }
5889 +
5890 + return -1;
5891 +}
5892 +
5893 +#endif /* CONFIG_KDB_USB */
5894 +
5895 +/*-------------------------------------------------------------------------*/
5896 +
5897 #define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
5898
5899 MODULE_AUTHOR (DRIVER_AUTHOR);
5900 --- a/drivers/usb/host/ohci-pci.c
5901 +++ b/drivers/usb/host/ohci-pci.c
5902 @@ -21,6 +21,10 @@
5903 #include <linux/pci.h>
5904 #include <linux/io.h>
5905
5906 +#ifdef CONFIG_KDB_USB
5907 +#include <linux/kdb.h>
5908 +#endif
5909 +
5910
5911 /* constants used to work around PM-related transfer
5912 * glitches in some AMD 700 series southbridges
5913 @@ -367,6 +371,7 @@ static int __devinit ohci_pci_start (str
5914 ohci_err (ohci, "can't start\n");
5915 ohci_stop (hcd);
5916 }
5917 +
5918 return ret;
5919 }
5920
5921 @@ -464,6 +469,9 @@ static const struct hc_driver ohci_pci_h
5922 .bus_resume = ohci_bus_resume,
5923 #endif
5924 .start_port_reset = ohci_start_port_reset,
5925 +#ifdef CONFIG_KDB_USB
5926 + .kdb_poll_char = ohci_kdb_poll_char,
5927 +#endif
5928 };
5929
5930 /*-------------------------------------------------------------------------*/
5931 --- a/drivers/usb/host/ohci-q.c
5932 +++ b/drivers/usb/host/ohci-q.c
5933 @@ -1127,3 +1127,65 @@ dl_done_list (struct ohci_hcd *ohci)
5934 td = td_next;
5935 }
5936 }
5937 +
5938 +
5939 +/*-------------------------------------------------------------------------*/
5940 +
5941 +#ifdef CONFIG_KDB_USB
5942 +static void
5943 +dl_done_list_kdb (struct ohci_hcd *ohci, struct urb *kdburb)
5944 +{
5945 + struct td *td = dl_reverse_done_list (ohci);
5946 +
5947 + while (td) {
5948 + struct td *td_next = td->next_dl_td;
5949 + struct urb *urb = td->urb;
5950 + urb_priv_t *urb_priv = urb->hcpriv;
5951 + struct ed *ed = td->ed;
5952 +
5953 + if (urb != kdburb) {
5954 + td = td_next;
5955 + continue;
5956 + }
5957 +
5958 + /* update URB's length and status from TD */
5959 + td_done (ohci, urb, td);
5960 + urb_priv->td_cnt++;
5961 +
5962 + /* If all this urb's TDs are done, just resubmit it */
5963 + if (urb_priv->td_cnt == urb_priv->length) {
5964 + urb->actual_length = 0;
5965 + urb->status = -EINPROGRESS;
5966 + td_submit_urb (ohci, urb);
5967 + }
5968 +
5969 + /* clean schedule: unlink EDs that are no longer busy */
5970 + if (list_empty (&ed->td_list)) {
5971 + if (ed->state == ED_OPER)
5972 + start_ed_unlink (ohci, ed);
5973 +
5974 + /* ... reenabling halted EDs only after fault cleanup */
5975 + } else if ((ed->hwINFO & cpu_to_hc32 (ohci, ED_SKIP | ED_DEQUEUE))
5976 + == cpu_to_hc32 (ohci, ED_SKIP)) {
5977 + td = list_entry (ed->td_list.next, struct td, td_list);
5978 + if (!(td->hwINFO & cpu_to_hc32 (ohci, TD_DONE))) {
5979 + ed->hwINFO &= ~cpu_to_hc32 (ohci, ED_SKIP);
5980 + /* ... hc may need waking-up */
5981 + switch (ed->type) {
5982 + case PIPE_CONTROL:
5983 + ohci_writel (ohci, OHCI_CLF,
5984 + &ohci->regs->cmdstatus);
5985 + break;
5986 + case PIPE_BULK:
5987 + ohci_writel (ohci, OHCI_BLF,
5988 + &ohci->regs->cmdstatus);
5989 + break;
5990 + }
5991 + }
5992 + }
5993 +
5994 + td = td_next;
5995 + }
5996 +}
5997 +
5998 +#endif /* CONFIG_KDB_USB */
5999 --- a/fs/proc/mmu.c
6000 +++ b/fs/proc/mmu.c
6001 @@ -14,11 +14,21 @@
6002 #include <asm/pgtable.h>
6003 #include "internal.h"
6004
6005 +#ifdef CONFIG_KDB
6006 +#include <linux/kdb.h>
6007 +#endif
6008 +
6009 void get_vmalloc_info(struct vmalloc_info *vmi)
6010 {
6011 struct vm_struct *vma;
6012 unsigned long free_area_size;
6013 unsigned long prev_end;
6014 +#ifdef CONFIG_KDB
6015 + int get_lock = !KDB_IS_RUNNING();
6016 +#else
6017 +#define get_lock 1
6018 +#endif
6019 +
6020
6021 vmi->used = 0;
6022
6023 @@ -30,7 +40,8 @@ void get_vmalloc_info(struct vmalloc_inf
6024
6025 prev_end = VMALLOC_START;
6026
6027 - read_lock(&vmlist_lock);
6028 + if (get_lock)
6029 + read_lock(&vmlist_lock);
6030
6031 for (vma = vmlist; vma; vma = vma->next) {
6032 unsigned long addr = (unsigned long) vma->addr;
6033 @@ -55,6 +66,7 @@ void get_vmalloc_info(struct vmalloc_inf
6034 if (VMALLOC_END - prev_end > vmi->largest_chunk)
6035 vmi->largest_chunk = VMALLOC_END - prev_end;
6036
6037 - read_unlock(&vmlist_lock);
6038 + if (get_lock)
6039 + read_unlock(&vmlist_lock);
6040 }
6041 }
6042 --- a/fs/proc/proc_misc.c
6043 +++ b/fs/proc/proc_misc.c
6044 @@ -239,6 +239,120 @@ static int meminfo_read_proc(char *page,
6045 #undef K
6046 }
6047
6048 +#ifdef CONFIG_KDB
6049 +#include <linux/kdb.h>
6050 +#include <linux/kdbprivate.h>
6051 +/* Like meminfo_read_proc() but without the locks and using kdb_printf() */
6052 +void
6053 +kdb_meminfo_read_proc(void)
6054 +{
6055 + struct sysinfo i;
6056 + unsigned long committed;
6057 + unsigned long allowed;
6058 + struct vmalloc_info vmi;
6059 + long cached;
6060 +
6061 +/*
6062 + * display in kilobytes.
6063 + */
6064 +#define K(x) ((x) << (PAGE_SHIFT - 10))
6065 + si_meminfo(&i);
6066 + kdb_si_swapinfo(&i);
6067 + committed = atomic_read(&vm_committed_space);
6068 + allowed = ((totalram_pages - hugetlb_total_pages())
6069 + * sysctl_overcommit_ratio / 100) + total_swap_pages;
6070 +
6071 + cached = global_page_state(NR_FILE_PAGES) -
6072 + total_swapcache_pages - i.bufferram;
6073 + if (cached < 0)
6074 + cached = 0;
6075 +
6076 + get_vmalloc_info(&vmi);
6077 +
6078 + kdb_printf(
6079 + "MemTotal: %8lu kB\n"
6080 + "MemFree: %8lu kB\n"
6081 + "Buffers: %8lu kB\n",
6082 + K(i.totalram),
6083 + K(i.freeram),
6084 + K(i.bufferram)
6085 + );
6086 + kdb_printf(
6087 + "Cached: %8lu kB\n"
6088 + "SwapCached: %8lu kB\n"
6089 + "Active: %8lu kB\n"
6090 + "Inactive: %8lu kB\n",
6091 + K(cached),
6092 + K(total_swapcache_pages),
6093 + K(global_page_state(NR_ACTIVE)),
6094 + K(global_page_state(NR_INACTIVE))
6095 + );
6096 +#ifdef CONFIG_HIGHMEM
6097 + kdb_printf(
6098 + "HighTotal: %8lu kB\n"
6099 + "HighFree: %8lu kB\n"
6100 + "LowTotal: %8lu kB\n"
6101 + "LowFree: %8lu kB\n",
6102 + K(i.totalhigh),
6103 + K(i.freehigh),
6104 + K(i.totalram-i.totalhigh),
6105 + K(i.freeram-i.freehigh)
6106 + );
6107 +#endif
6108 + kdb_printf(
6109 + "SwapTotal: %8lu kB\n"
6110 + "SwapFree: %8lu kB\n"
6111 + "Dirty: %8lu kB\n",
6112 + K(i.totalswap),
6113 + K(i.freeswap),
6114 + K(global_page_state(NR_FILE_DIRTY))
6115 + );
6116 + kdb_printf(
6117 + "Writeback: %8lu kB\n"
6118 + "AnonPages: %8lu kB\n"
6119 + "Mapped: %8lu kB\n",
6120 + K(global_page_state(NR_WRITEBACK)),
6121 + K(global_page_state(NR_ANON_PAGES)),
6122 + K(global_page_state(NR_FILE_MAPPED))
6123 + );
6124 + kdb_printf(
6125 + "Slab: %8lu kB\n"
6126 + "SReclaimable: %8lu kB\n"
6127 + "SUnreclaim: %8lu kB\n",
6128 + K(global_page_state(NR_SLAB_RECLAIMABLE) +
6129 + global_page_state(NR_SLAB_UNRECLAIMABLE)),
6130 + K(global_page_state(NR_SLAB_RECLAIMABLE)),
6131 + K(global_page_state(NR_SLAB_UNRECLAIMABLE))
6132 + );
6133 + kdb_printf(
6134 + "PageTables: %8lu kB\n"
6135 + "NFS_Unstable: %8lu kB\n"
6136 + "Bounce: %8lu kB\n",
6137 + K(global_page_state(NR_PAGETABLE)),
6138 + K(global_page_state(NR_UNSTABLE_NFS)),
6139 + K(global_page_state(NR_BOUNCE))
6140 + );
6141 + kdb_printf(
6142 + "CommitLimit: %8lu kB\n"
6143 + "Committed_AS: %8lu kB\n"
6144 + "VmallocTotal: %8lu kB\n",
6145 + K(allowed),
6146 + K(committed),
6147 + (unsigned long)VMALLOC_TOTAL >> 10
6148 + );
6149 + kdb_printf(
6150 + "VmallocUsed: %8lu kB\n"
6151 + "VmallocChunk: %8lu kB\n",
6152 + vmi.used >> 10,
6153 + vmi.largest_chunk >> 10
6154 + );
6155 +
6156 +#ifdef CONFIG_HUGETLBFS
6157 + kdb_hugetlb_report_meminfo();
6158 +#endif
6159 +}
6160 +#endif /* CONFIG_KDB */
6161 +
6162 static int fragmentation_open(struct inode *inode, struct file *file)
6163 {
6164 (void)inode;
6165 --- a/include/linux/console.h
6166 +++ b/include/linux/console.h
6167 @@ -142,7 +142,12 @@ void vcs_remove_sysfs(struct tty_struct
6168
6169 /* Some debug stub to catch some of the obvious races in the VT code */
6170 #if 1
6171 +#ifdef CONFIG_KDB
6172 +#include <linux/kdb.h>
6173 +#define WARN_CONSOLE_UNLOCKED() WARN_ON(!is_console_locked() && !oops_in_progress && !atomic_read(&kdb_event))
6174 +#else /* !CONFIG_KDB */
6175 #define WARN_CONSOLE_UNLOCKED() WARN_ON(!is_console_locked() && !oops_in_progress)
6176 +#endif /* CONFIG_KDB */
6177 #else
6178 #define WARN_CONSOLE_UNLOCKED()
6179 #endif
6180 --- /dev/null
6181 +++ b/include/linux/dis-asm.h
6182 @@ -0,0 +1,347 @@
6183 +/* Interface between the opcode library and its callers.
6184 +
6185 + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
6186 + Free Software Foundation, Inc.
6187 +
6188 + This program is free software; you can redistribute it and/or modify
6189 + it under the terms of the GNU General Public License as published by
6190 + the Free Software Foundation; either version 2, or (at your option)
6191 + any later version.
6192 +
6193 + This program is distributed in the hope that it will be useful,
6194 + but WITHOUT ANY WARRANTY; without even the implied warranty of
6195 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6196 + GNU General Public License for more details.
6197 +
6198 + You should have received a copy of the GNU General Public License
6199 + along with this program; if not, write to the Free Software
6200 + Foundation, Inc., 51 Franklin Street - Fifth Floor,
6201 + Boston, MA 02110-1301, USA.
6202 +
6203 + Written by Cygnus Support, 1993.
6204 +
6205 + The opcode library (libopcodes.a) provides instruction decoders for
6206 + a large variety of instruction sets, callable with an identical
6207 + interface, for making instruction-processing programs more independent
6208 + of the instruction set being processed. */
6209 +
6210 +/* Extracted from binutils 2.16.91.0.2 (OpenSUSE 10.0) and modified for kdb use.
6211 + * Any trailing whitespace was removed and #ifdef/ifndef __KERNEL__ added as
6212 + * required.
6213 + * Keith Owens <kaos@sgi.com> 15 May 2006
6214 + */
6215 +
6216 +#ifndef DIS_ASM_H
6217 +#define DIS_ASM_H
6218 +
6219 +#ifdef __cplusplus
6220 +extern "C" {
6221 +#endif
6222 +
6223 +#ifdef __KERNEL__
6224 +#include <asm/ansidecl.h>
6225 +#include <asm/bfd.h>
6226 +typedef void FILE;
6227 +#else /* __KERNEL__ */
6228 +#include <stdio.h>
6229 +#include "bfd.h"
6230 +#endif /* __KERNEL__ */
6231 +
6232 +typedef int (*fprintf_ftype) (void *, const char*, ...) ATTRIBUTE_FPTR_PRINTF_2;
6233 +
6234 +enum dis_insn_type {
6235 + dis_noninsn, /* Not a valid instruction */
6236 + dis_nonbranch, /* Not a branch instruction */
6237 + dis_branch, /* Unconditional branch */
6238 + dis_condbranch, /* Conditional branch */
6239 + dis_jsr, /* Jump to subroutine */
6240 + dis_condjsr, /* Conditional jump to subroutine */
6241 + dis_dref, /* Data reference instruction */
6242 + dis_dref2 /* Two data references in instruction */
6243 +};
6244 +
6245 +/* This struct is passed into the instruction decoding routine,
6246 + and is passed back out into each callback. The various fields are used
6247 + for conveying information from your main routine into your callbacks,
6248 + for passing information into the instruction decoders (such as the
6249 + addresses of the callback functions), or for passing information
6250 + back from the instruction decoders to their callers.
6251 +
6252 + It must be initialized before it is first passed; this can be done
6253 + by hand, or using one of the initialization macros below. */
6254 +
6255 +typedef struct disassemble_info {
6256 + fprintf_ftype fprintf_func;
6257 + void *stream;
6258 + void *application_data;
6259 +
6260 + /* Target description. We could replace this with a pointer to the bfd,
6261 + but that would require one. There currently isn't any such requirement
6262 + so to avoid introducing one we record these explicitly. */
6263 + /* The bfd_flavour. This can be bfd_target_unknown_flavour. */
6264 + enum bfd_flavour flavour;
6265 + /* The bfd_arch value. */
6266 + enum bfd_architecture arch;
6267 + /* The bfd_mach value. */
6268 + unsigned long mach;
6269 + /* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */
6270 + enum bfd_endian endian;
6271 + /* An arch/mach-specific bitmask of selected instruction subsets, mainly
6272 + for processors with run-time-switchable instruction sets. The default,
6273 + zero, means that there is no constraint. CGEN-based opcodes ports
6274 + may use ISA_foo masks. */
6275 + unsigned long insn_sets;
6276 +
6277 + /* Some targets need information about the current section to accurately
6278 + display insns. If this is NULL, the target disassembler function
6279 + will have to make its best guess. */
6280 + asection *section;
6281 +
6282 + /* An array of pointers to symbols either at the location being disassembled
6283 + or at the start of the function being disassembled. The array is sorted
6284 + so that the first symbol is intended to be the one used. The others are
6285 + present for any misc. purposes. This is not set reliably, but if it is
6286 + not NULL, it is correct. */
6287 + asymbol **symbols;
6288 + /* Number of symbols in array. */
6289 + int num_symbols;
6290 +
6291 + /* For use by the disassembler.
6292 + The top 16 bits are reserved for public use (and are documented here).
6293 + The bottom 16 bits are for the internal use of the disassembler. */
6294 + unsigned long flags;
6295 +#define INSN_HAS_RELOC 0x80000000
6296 + void *private_data;
6297 +
6298 + /* Function used to get bytes to disassemble. MEMADDR is the
6299 + address of the stuff to be disassembled, MYADDR is the address to
6300 + put the bytes in, and LENGTH is the number of bytes to read.
6301 + INFO is a pointer to this struct.
6302 + Returns an errno value or 0 for success. */
6303 + int (*read_memory_func)
6304 + (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length,
6305 + struct disassemble_info *info);
6306 +
6307 + /* Function which should be called if we get an error that we can't
6308 + recover from. STATUS is the errno value from read_memory_func and
6309 + MEMADDR is the address that we were trying to read. INFO is a
6310 + pointer to this struct. */
6311 + void (*memory_error_func)
6312 + (int status, bfd_vma memaddr, struct disassemble_info *info);
6313 +
6314 + /* Function called to print ADDR. */
6315 + void (*print_address_func)
6316 + (bfd_vma addr, struct disassemble_info *info);
6317 +
6318 + /* Function called to determine if there is a symbol at the given ADDR.
6319 + If there is, the function returns 1, otherwise it returns 0.
6320 + This is used by ports which support an overlay manager where
6321 + the overlay number is held in the top part of an address. In
6322 + some circumstances we want to include the overlay number in the
6323 + address, (normally because there is a symbol associated with
6324 + that address), but sometimes we want to mask out the overlay bits. */
6325 + int (* symbol_at_address_func)
6326 + (bfd_vma addr, struct disassemble_info * info);
6327 +
6328 + /* Function called to check if a SYMBOL is can be displayed to the user.
6329 + This is used by some ports that want to hide special symbols when
6330 + displaying debugging outout. */
6331 + bfd_boolean (* symbol_is_valid)
6332 + (asymbol *, struct disassemble_info * info);
6333 +
6334 + /* These are for buffer_read_memory. */
6335 + bfd_byte *buffer;
6336 + bfd_vma buffer_vma;
6337 + unsigned int buffer_length;
6338 +
6339 + /* This variable may be set by the instruction decoder. It suggests
6340 + the number of bytes objdump should display on a single line. If
6341 + the instruction decoder sets this, it should always set it to
6342 + the same value in order to get reasonable looking output. */
6343 + int bytes_per_line;
6344 +
6345 + /* The next two variables control the way objdump displays the raw data. */
6346 + /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */
6347 + /* output will look like this:
6348 + 00: 00000000 00000000
6349 + with the chunks displayed according to "display_endian". */
6350 + int bytes_per_chunk;
6351 + enum bfd_endian display_endian;
6352 +
6353 + /* Number of octets per incremented target address
6354 + Normally one, but some DSPs have byte sizes of 16 or 32 bits. */
6355 + unsigned int octets_per_byte;
6356 +
6357 + /* The number of zeroes we want to see at the end of a section before we
6358 + start skipping them. */
6359 + unsigned int skip_zeroes;
6360 +
6361 + /* The number of zeroes to skip at the end of a section. If the number
6362 + of zeroes at the end is between SKIP_ZEROES_AT_END and SKIP_ZEROES,
6363 + they will be disassembled. If there are fewer than
6364 + SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
6365 + attempt to avoid disassembling zeroes inserted by section
6366 + alignment. */
6367 + unsigned int skip_zeroes_at_end;
6368 +
6369 + /* Results from instruction decoders. Not all decoders yet support
6370 + this information. This info is set each time an instruction is
6371 + decoded, and is only valid for the last such instruction.
6372 +
6373 + To determine whether this decoder supports this information, set
6374 + insn_info_valid to 0, decode an instruction, then check it. */
6375 +
6376 + char insn_info_valid; /* Branch info has been set. */
6377 + char branch_delay_insns; /* How many sequential insn's will run before
6378 + a branch takes effect. (0 = normal) */
6379 + char data_size; /* Size of data reference in insn, in bytes */
6380 + enum dis_insn_type insn_type; /* Type of instruction */
6381 + bfd_vma target; /* Target address of branch or dref, if known;
6382 + zero if unknown. */
6383 + bfd_vma target2; /* Second target address for dref2 */
6384 +
6385 + /* Command line options specific to the target disassembler. */
6386 + char * disassembler_options;
6387 +
6388 +} disassemble_info;
6389 +
6390 +\f
6391 +/* Standard disassemblers. Disassemble one instruction at the given
6392 + target address. Return number of octets processed. */
6393 +typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
6394 +
6395 +extern int print_insn_big_mips (bfd_vma, disassemble_info *);
6396 +extern int print_insn_little_mips (bfd_vma, disassemble_info *);
6397 +extern int print_insn_i386 (bfd_vma, disassemble_info *);
6398 +extern int print_insn_i386_att (bfd_vma, disassemble_info *);
6399 +extern int print_insn_i386_intel (bfd_vma, disassemble_info *);
6400 +extern int print_insn_ia64 (bfd_vma, disassemble_info *);
6401 +extern int print_insn_i370 (bfd_vma, disassemble_info *);
6402 +extern int print_insn_m68hc11 (bfd_vma, disassemble_info *);
6403 +extern int print_insn_m68hc12 (bfd_vma, disassemble_info *);
6404 +extern int print_insn_m68k (bfd_vma, disassemble_info *);
6405 +extern int print_insn_z8001 (bfd_vma, disassemble_info *);
6406 +extern int print_insn_z8002 (bfd_vma, disassemble_info *);
6407 +extern int print_insn_h8300 (bfd_vma, disassemble_info *);
6408 +extern int print_insn_h8300h (bfd_vma, disassemble_info *);
6409 +extern int print_insn_h8300s (bfd_vma, disassemble_info *);
6410 +extern int print_insn_h8500 (bfd_vma, disassemble_info *);
6411 +extern int print_insn_alpha (bfd_vma, disassemble_info *);
6412 +extern int print_insn_big_arm (bfd_vma, disassemble_info *);
6413 +extern int print_insn_little_arm (bfd_vma, disassemble_info *);
6414 +extern int print_insn_sparc (bfd_vma, disassemble_info *);
6415 +extern int print_insn_big_a29k (bfd_vma, disassemble_info *);
6416 +extern int print_insn_little_a29k (bfd_vma, disassemble_info *);
6417 +extern int print_insn_avr (bfd_vma, disassemble_info *);
6418 +extern int print_insn_d10v (bfd_vma, disassemble_info *);
6419 +extern int print_insn_d30v (bfd_vma, disassemble_info *);
6420 +extern int print_insn_dlx (bfd_vma, disassemble_info *);
6421 +extern int print_insn_fr30 (bfd_vma, disassemble_info *);
6422 +extern int print_insn_hppa (bfd_vma, disassemble_info *);
6423 +extern int print_insn_i860 (bfd_vma, disassemble_info *);
6424 +extern int print_insn_i960 (bfd_vma, disassemble_info *);
6425 +extern int print_insn_ip2k (bfd_vma, disassemble_info *);
6426 +extern int print_insn_m32r (bfd_vma, disassemble_info *);
6427 +extern int print_insn_m88k (bfd_vma, disassemble_info *);
6428 +extern int print_insn_maxq_little (bfd_vma, disassemble_info *);
6429 +extern int print_insn_maxq_big (bfd_vma, disassemble_info *);
6430 +extern int print_insn_mcore (bfd_vma, disassemble_info *);
6431 +extern int print_insn_mmix (bfd_vma, disassemble_info *);
6432 +extern int print_insn_mn10200 (bfd_vma, disassemble_info *);
6433 +extern int print_insn_mn10300 (bfd_vma, disassemble_info *);
6434 +extern int print_insn_ms1 (bfd_vma, disassemble_info *);
6435 +extern int print_insn_msp430 (bfd_vma, disassemble_info *);
6436 +extern int print_insn_ns32k (bfd_vma, disassemble_info *);
6437 +extern int print_insn_crx (bfd_vma, disassemble_info *);
6438 +extern int print_insn_openrisc (bfd_vma, disassemble_info *);
6439 +extern int print_insn_big_or32 (bfd_vma, disassemble_info *);
6440 +extern int print_insn_little_or32 (bfd_vma, disassemble_info *);
6441 +extern int print_insn_pdp11 (bfd_vma, disassemble_info *);
6442 +extern int print_insn_pj (bfd_vma, disassemble_info *);
6443 +extern int print_insn_big_powerpc (bfd_vma, disassemble_info *);
6444 +extern int print_insn_little_powerpc (bfd_vma, disassemble_info *);
6445 +extern int print_insn_rs6000 (bfd_vma, disassemble_info *);
6446 +extern int print_insn_s390 (bfd_vma, disassemble_info *);
6447 +extern int print_insn_sh (bfd_vma, disassemble_info *);
6448 +extern int print_insn_tic30 (bfd_vma, disassemble_info *);
6449 +extern int print_insn_tic4x (bfd_vma, disassemble_info *);
6450 +extern int print_insn_tic54x (bfd_vma, disassemble_info *);
6451 +extern int print_insn_tic80 (bfd_vma, disassemble_info *);
6452 +extern int print_insn_v850 (bfd_vma, disassemble_info *);
6453 +extern int print_insn_vax (bfd_vma, disassemble_info *);
6454 +extern int print_insn_w65 (bfd_vma, disassemble_info *);
6455 +extern int print_insn_xstormy16 (bfd_vma, disassemble_info *);
6456 +extern int print_insn_xtensa (bfd_vma, disassemble_info *);
6457 +extern int print_insn_sh64 (bfd_vma, disassemble_info *);
6458 +extern int print_insn_sh64x_media (bfd_vma, disassemble_info *);
6459 +extern int print_insn_frv (bfd_vma, disassemble_info *);
6460 +extern int print_insn_iq2000 (bfd_vma, disassemble_info *);
6461 +extern int print_insn_m32c (bfd_vma, disassemble_info *);
6462 +
6463 +extern disassembler_ftype arc_get_disassembler (void *);
6464 +extern disassembler_ftype cris_get_disassembler (bfd *);
6465 +
6466 +extern void print_mips_disassembler_options (FILE *);
6467 +extern void print_ppc_disassembler_options (FILE *);
6468 +extern void print_arm_disassembler_options (FILE *);
6469 +extern void parse_arm_disassembler_option (char *);
6470 +extern int get_arm_regname_num_options (void);
6471 +extern int set_arm_regname_option (int);
6472 +extern int get_arm_regnames (int, const char **, const char **, const char *const **);
6473 +extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *);
6474 +
6475 +/* Fetch the disassembler for a given BFD, if that support is available. */
6476 +extern disassembler_ftype disassembler (bfd *);
6477 +
6478 +/* Amend the disassemble_info structure as necessary for the target architecture.
6479 + Should only be called after initialising the info->arch field. */
6480 +extern void disassemble_init_for_target (struct disassemble_info * info);
6481 +
6482 +/* Document any target specific options available from the disassembler. */
6483 +extern void disassembler_usage (FILE *);
6484 +
6485 +\f
6486 +/* This block of definitions is for particular callers who read instructions
6487 + into a buffer before calling the instruction decoder. */
6488 +
6489 +/* Here is a function which callers may wish to use for read_memory_func.
6490 + It gets bytes from a buffer. */
6491 +extern int buffer_read_memory
6492 + (bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *);
6493 +
6494 +/* This function goes with buffer_read_memory.
6495 + It prints a message using info->fprintf_func and info->stream. */
6496 +extern void perror_memory (int, bfd_vma, struct disassemble_info *);
6497 +
6498 +
6499 +/* Just print the address in hex. This is included for completeness even
6500 + though both GDB and objdump provide their own (to print symbolic
6501 + addresses). */
6502 +extern void generic_print_address
6503 + (bfd_vma, struct disassemble_info *);
6504 +
6505 +/* Always true. */
6506 +extern int generic_symbol_at_address
6507 + (bfd_vma, struct disassemble_info *);
6508 +
6509 +/* Also always true. */
6510 +extern bfd_boolean generic_symbol_is_valid
6511 + (asymbol *, struct disassemble_info *);
6512 +
6513 +/* Method to initialize a disassemble_info struct. This should be
6514 + called by all applications creating such a struct. */
6515 +extern void init_disassemble_info (struct disassemble_info *info, void *stream,
6516 + fprintf_ftype fprintf_func);
6517 +
6518 +/* For compatibility with existing code. */
6519 +#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \
6520 + init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC))
6521 +#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \
6522 + init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC))
6523 +
6524 +
6525 +#ifdef __cplusplus
6526 +}
6527 +#endif
6528 +
6529 +#endif /* ! defined (DIS_ASM_H) */
6530 --- /dev/null
6531 +++ b/include/linux/kdb.h
6532 @@ -0,0 +1,175 @@
6533 +#ifndef _KDB_H
6534 +#define _KDB_H
6535 +
6536 +/*
6537 + * Kernel Debugger Architecture Independent Global Headers
6538 + *
6539 + * This file is subject to the terms and conditions of the GNU General Public
6540 + * License. See the file "COPYING" in the main directory of this archive
6541 + * for more details.
6542 + *
6543 + * Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved.
6544 + * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
6545 + */
6546 +
6547 +#include <linux/init.h>
6548 +#include <linux/sched.h>
6549 +#include <asm/atomic.h>
6550 +
6551 +#ifdef CONFIG_KDB
6552 +/* These are really private, but they must be defined before including
6553 + * asm-$(ARCH)/kdb.h, so make them public and put them here.
6554 + */
6555 +extern int kdb_getuserarea_size(void *, unsigned long, size_t);
6556 +extern int kdb_putuserarea_size(unsigned long, void *, size_t);
6557 +
6558 +#include <asm/kdb.h>
6559 +#endif
6560 +
6561 +#define KDB_MAJOR_VERSION 4
6562 +#define KDB_MINOR_VERSION 4
6563 +#define KDB_TEST_VERSION ""
6564 +
6565 +/*
6566 + * kdb_initial_cpu is initialized to -1, and is set to the cpu
6567 + * number whenever the kernel debugger is entered.
6568 + */
6569 +extern volatile int kdb_initial_cpu;
6570 +extern atomic_t kdb_event;
6571 +extern atomic_t kdb_8250;
6572 +#ifdef CONFIG_KDB
6573 +#define KDB_IS_RUNNING() (kdb_initial_cpu != -1)
6574 +#define KDB_8250() (atomic_read(&kdb_8250) != 0)
6575 +#else
6576 +#define KDB_IS_RUNNING() (0)
6577 +#define KDB_8250() (0)
6578 +#endif /* CONFIG_KDB */
6579 +
6580 +/*
6581 + * kdb_on
6582 + *
6583 + * Defines whether kdb is on or not. Default value
6584 + * is set by CONFIG_KDB_OFF. Boot with kdb=on/off/on-nokey
6585 + * or echo "[012]" > /proc/sys/kernel/kdb to change it.
6586 + */
6587 +extern int kdb_on;
6588 +
6589 +#if defined(CONFIG_SERIAL_8250_CONSOLE) || defined(CONFIG_SERIAL_SGI_L1_CONSOLE)
6590 +/*
6591 + * kdb_serial.iobase is initialized to zero, and is set to the I/O
6592 + * address of the serial port when the console is setup in
6593 + * serial_console_setup.
6594 + */
6595 +extern struct kdb_serial {
6596 + int io_type;
6597 + unsigned long iobase;
6598 + unsigned long ioreg_shift;
6599 +} kdb_serial;
6600 +#endif
6601 +
6602 +/*
6603 + * kdb_diemsg
6604 + *
6605 + * Contains a pointer to the last string supplied to the
6606 + * kernel 'die' panic function.
6607 + */
6608 +extern const char *kdb_diemsg;
6609 +
6610 +#define KDB_FLAG_EARLYKDB (1 << 0) /* set from boot parameter kdb=early */
6611 +#define KDB_FLAG_CATASTROPHIC (1 << 1) /* A catastrophic event has occurred */
6612 +#define KDB_FLAG_CMD_INTERRUPT (1 << 2) /* Previous command was interrupted */
6613 +#define KDB_FLAG_NOIPI (1 << 3) /* Do not send IPIs */
6614 +#define KDB_FLAG_ONLY_DO_DUMP (1 << 4) /* Only do a dump, used when kdb is off */
6615 +#define KDB_FLAG_NO_CONSOLE (1 << 5) /* No console is available, kdb is disabled */
6616 +#define KDB_FLAG_NO_VT_CONSOLE (1 << 6) /* No VT console is available, do not use keyboard */
6617 +#define KDB_FLAG_NO_I8042 (1 << 7) /* No i8042 chip is available, do not use keyboard */
6618 +#define KDB_FLAG_RECOVERY (1 << 8) /* kdb is being entered for an error which has been recovered */
6619 +
6620 +extern volatile int kdb_flags; /* Global flags, see kdb_state for per cpu state */
6621 +
6622 +extern void kdb_save_flags(void);
6623 +extern void kdb_restore_flags(void);
6624 +
6625 +#define KDB_FLAG(flag) (kdb_flags & KDB_FLAG_##flag)
6626 +#define KDB_FLAG_SET(flag) ((void)(kdb_flags |= KDB_FLAG_##flag))
6627 +#define KDB_FLAG_CLEAR(flag) ((void)(kdb_flags &= ~KDB_FLAG_##flag))
6628 +
6629 +/*
6630 + * External entry point for the kernel debugger. The pt_regs
6631 + * at the time of entry are supplied along with the reason for
6632 + * entry to the kernel debugger.
6633 + */
6634 +
6635 +typedef enum {
6636 + KDB_REASON_ENTER=1, /* KDB_ENTER() trap/fault - regs valid */
6637 + KDB_REASON_ENTER_SLAVE, /* KDB_ENTER_SLAVE() trap/fault - regs valid */
6638 + KDB_REASON_BREAK, /* Breakpoint inst. - regs valid */
6639 + KDB_REASON_DEBUG, /* Debug Fault - regs valid */
6640 + KDB_REASON_OOPS, /* Kernel Oops - regs valid */
6641 + KDB_REASON_SWITCH, /* CPU switch - regs valid*/
6642 + KDB_REASON_KEYBOARD, /* Keyboard entry - regs valid */
6643 + KDB_REASON_NMI, /* Non-maskable interrupt; regs valid */
6644 + KDB_REASON_RECURSE, /* Recursive entry to kdb; regs probably valid */
6645 + KDB_REASON_CPU_UP, /* Add one cpu to kdb; regs invalid */
6646 + KDB_REASON_SILENT, /* Silent entry/exit to kdb; regs invalid - internal only */
6647 +} kdb_reason_t;
6648 +
6649 +#ifdef CONFIG_KDB
6650 +extern int kdb(kdb_reason_t, int, struct pt_regs *);
6651 +#else
6652 +#define kdb(reason,error_code,frame) (0)
6653 +#endif
6654 +
6655 +/* Mainly used by kdb code, but this function is sometimes used
6656 + * by hacked debug code so make it generally available, not private.
6657 + */
6658 +extern void kdb_printf(const char *,...)
6659 + __attribute__ ((format (printf, 1, 2)));
6660 +typedef void (*kdb_printf_t)(const char *, ...)
6661 + __attribute__ ((format (printf, 1, 2)));
6662 +extern void kdb_init(void);
6663 +
6664 +#if defined(CONFIG_SMP)
6665 +/*
6666 + * Kernel debugger non-maskable IPI handler.
6667 + */
6668 +extern int kdb_ipi(struct pt_regs *, void (*ack_interrupt)(void));
6669 +extern void smp_kdb_stop(void);
6670 +#else /* CONFIG_SMP */
6671 +#define smp_kdb_stop()
6672 +#endif /* CONFIG_SMP */
6673 +
6674 +#ifdef CONFIG_KDB_USB
6675 +
6676 +#include <linux/usb.h>
6677 +
6678 +extern int kdb_usb_keyboard_attach(struct urb *urb, unsigned char *buffer, void *poll_func);
6679 +extern int kdb_usb_keyboard_detach(struct urb *urb);
6680 +
6681 +#endif /* CONFIG_KDB_USB */
6682 +
6683 +static inline
6684 +int kdb_process_cpu(const struct task_struct *p)
6685 +{
6686 + unsigned int cpu = task_thread_info(p)->cpu;
6687 + if (cpu > NR_CPUS)
6688 + cpu = 0;
6689 + return cpu;
6690 +}
6691 +
6692 +extern const char kdb_serial_str[];
6693 +
6694 +#ifdef CONFIG_KDB_KDUMP
6695 +/* Define values for kdb_kdump_state */
6696 +extern int kdb_kdump_state; /* KDB kdump state */
6697 +#define KDB_KDUMP_RESET 0
6698 +#define KDB_KDUMP_KDUMP 1
6699 +
6700 +void kdba_kdump_prepare(struct pt_regs *);
6701 +void machine_crash_shutdown(struct pt_regs *);
6702 +void machine_crash_shutdown_begin(void);
6703 +void machine_crash_shutdown_end(struct pt_regs *);
6704 +
6705 +#endif /* CONFIG_KDB_KDUMP */
6706 +
6707 +#endif /* !_KDB_H */
6708 --- /dev/null
6709 +++ b/include/linux/kdbprivate.h
6710 @@ -0,0 +1,503 @@
6711 +#ifndef _KDBPRIVATE_H
6712 +#define _KDBPRIVATE_H
6713 +
6714 +/*
6715 + * Kernel Debugger Architecture Independent Private Headers
6716 + *
6717 + * This file is subject to the terms and conditions of the GNU General Public
6718 + * License. See the file "COPYING" in the main directory of this archive
6719 + * for more details.
6720 + *
6721 + * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved.
6722 + */
6723 +
6724 +
6725 +#include <linux/dis-asm.h>
6726 +#include <asm/kdbprivate.h>
6727 +#include <asm/bfd.h>
6728 +
6729 + /*
6730 + * Kernel Debugger Error codes. Must not overlap with command codes.
6731 + */
6732 +
6733 +#define KDB_NOTFOUND (-1)
6734 +#define KDB_ARGCOUNT (-2)
6735 +#define KDB_BADWIDTH (-3)
6736 +#define KDB_BADRADIX (-4)
6737 +#define KDB_NOTENV (-5)
6738 +#define KDB_NOENVVALUE (-6)
6739 +#define KDB_NOTIMP (-7)
6740 +#define KDB_ENVFULL (-8)
6741 +#define KDB_ENVBUFFULL (-9 )
6742 +#define KDB_TOOMANYBPT (-10)
6743 +#define KDB_TOOMANYDBREGS (-11)
6744 +#define KDB_DUPBPT (-12)
6745 +#define KDB_BPTNOTFOUND (-13)
6746 +#define KDB_BADMODE (-14)
6747 +#define KDB_BADINT (-15)
6748 +#define KDB_INVADDRFMT (-16)
6749 +#define KDB_BADREG (-17)
6750 +#define KDB_BADCPUNUM (-18)
6751 +#define KDB_BADLENGTH (-19)
6752 +#define KDB_NOBP (-20)
6753 +#define KDB_BADADDR (-21)
6754 +
6755 + /*
6756 + * Kernel Debugger Command codes. Must not overlap with error codes.
6757 + */
6758 +#define KDB_CMD_GO (-1001)
6759 +#define KDB_CMD_CPU (-1002)
6760 +#define KDB_CMD_SS (-1003)
6761 +#define KDB_CMD_SSB (-1004)
6762 +
6763 + /*
6764 + * Internal debug flags
6765 + */
6766 +/* KDB_DEBUG_FLAG_BT 0x0001 Was Stack traceback debug */
6767 +#define KDB_DEBUG_FLAG_BP 0x0002 /* Breakpoint subsystem debug */
6768 +#define KDB_DEBUG_FLAG_BB_SUMM 0x0004 /* Basic block analysis, summary only */
6769 +#define KDB_DEBUG_FLAG_AR 0x0008 /* Activation record, generic */
6770 +#define KDB_DEBUG_FLAG_ARA 0x0010 /* Activation record, arch specific */
6771 +#define KDB_DEBUG_FLAG_BB 0x0020 /* All basic block analysis */
6772 +#define KDB_DEBUG_FLAG_STATE 0x0040 /* State flags */
6773 +#define KDB_DEBUG_FLAG_MASK 0xffff /* All debug flags */
6774 +#define KDB_DEBUG_FLAG_SHIFT 16 /* Shift factor for dbflags */
6775 +
6776 +#define KDB_DEBUG(flag) (kdb_flags & (KDB_DEBUG_FLAG_##flag << KDB_DEBUG_FLAG_SHIFT))
6777 +#define KDB_DEBUG_STATE(text,value) if (KDB_DEBUG(STATE)) kdb_print_state(text, value)
6778 +
6779 +typedef enum {
6780 + KDB_REPEAT_NONE = 0, /* Do not repeat this command */
6781 + KDB_REPEAT_NO_ARGS, /* Repeat the command without arguments */
6782 + KDB_REPEAT_WITH_ARGS, /* Repeat the command including its arguments */
6783 +} kdb_repeat_t;
6784 +
6785 +typedef int (*kdb_func_t)(int, const char **);
6786 +
6787 + /*
6788 + * Symbol table format returned by kallsyms.
6789 + */
6790 +
6791 +typedef struct __ksymtab {
6792 + unsigned long value; /* Address of symbol */
6793 + const char *mod_name; /* Module containing symbol or "kernel" */
6794 + unsigned long mod_start;
6795 + unsigned long mod_end;
6796 + const char *sec_name; /* Section containing symbol */
6797 + unsigned long sec_start;
6798 + unsigned long sec_end;
6799 + const char *sym_name; /* Full symbol name, including any version */
6800 + unsigned long sym_start;
6801 + unsigned long sym_end;
6802 + } kdb_symtab_t;
6803 +extern int kallsyms_symbol_next(char *prefix_name, int flag);
6804 +extern int kallsyms_symbol_complete(char *prefix_name, int max_len);
6805 +
6806 + /*
6807 + * Exported Symbols for kernel loadable modules to use.
6808 + */
6809 +extern int kdb_register(char *, kdb_func_t, char *, char *, short);
6810 +extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, short, kdb_repeat_t);
6811 +extern int kdb_unregister(char *);
6812 +
6813 +extern int kdb_getarea_size(void *, unsigned long, size_t);
6814 +extern int kdb_putarea_size(unsigned long, void *, size_t);
6815 +
6816 +/* Like get_user and put_user, kdb_getarea and kdb_putarea take variable
6817 + * names, not pointers. The underlying *_size functions take pointers.
6818 + */
6819 +#define kdb_getarea(x,addr) kdb_getarea_size(&(x), addr, sizeof((x)))
6820 +#define kdb_putarea(addr,x) kdb_putarea_size(addr, &(x), sizeof((x)))
6821 +
6822 +extern int kdb_getphysword(unsigned long *word,
6823 + unsigned long addr, size_t size);
6824 +extern int kdb_getword(unsigned long *, unsigned long, size_t);
6825 +extern int kdb_putword(unsigned long, unsigned long, size_t);
6826 +
6827 +extern int kdbgetularg(const char *, unsigned long *);
6828 +extern char *kdbgetenv(const char *);
6829 +extern int kdbgetintenv(const char *, int *);
6830 +extern int kdbgetaddrarg(int, const char**, int*, unsigned long *,
6831 + long *, char **);
6832 +extern int kdbgetsymval(const char *, kdb_symtab_t *);
6833 +extern int kdbnearsym(unsigned long, kdb_symtab_t *);
6834 +extern void kdbnearsym_cleanup(void);
6835 +extern char *kdb_read(char *buffer, size_t bufsize);
6836 +extern char *kdb_strdup(const char *str, gfp_t type);
6837 +extern void kdb_symbol_print(kdb_machreg_t, const kdb_symtab_t *, unsigned int);
6838 +
6839 + /*
6840 + * Do we have a set of registers?
6841 + */
6842 +
6843 +#define KDB_NULL_REGS(regs) \
6844 + (regs == (struct pt_regs *)NULL ? kdb_printf("%s: null regs - should never happen\n", __FUNCTION__), 1 : 0)
6845 +
6846 + /*
6847 + * Routine for debugging the debugger state.
6848 + */
6849 +
6850 +extern void kdb_print_state(const char *, int);
6851 +
6852 + /*
6853 + * Per cpu kdb state. A cpu can be under kdb control but outside kdb,
6854 + * for example when doing single step.
6855 + */
6856 +volatile extern int kdb_state[ /*NR_CPUS*/ ];
6857 +#define KDB_STATE_KDB 0x00000001 /* Cpu is inside kdb */
6858 +#define KDB_STATE_LEAVING 0x00000002 /* Cpu is leaving kdb */
6859 +#define KDB_STATE_CMD 0x00000004 /* Running a kdb command */
6860 +#define KDB_STATE_KDB_CONTROL 0x00000008 /* This cpu is under kdb control */
6861 +#define KDB_STATE_HOLD_CPU 0x00000010 /* Hold this cpu inside kdb */
6862 +#define KDB_STATE_DOING_SS 0x00000020 /* Doing ss command */
6863 +#define KDB_STATE_DOING_SSB 0x00000040 /* Doing ssb command, DOING_SS is also set */
6864 +#define KDB_STATE_SSBPT 0x00000080 /* Install breakpoint after one ss, independent of DOING_SS */
6865 +#define KDB_STATE_REENTRY 0x00000100 /* Valid re-entry into kdb */
6866 +#define KDB_STATE_SUPPRESS 0x00000200 /* Suppress error messages */
6867 +#define KDB_STATE_LONGJMP 0x00000400 /* longjmp() data is available */
6868 +#define KDB_STATE_GO_SWITCH 0x00000800 /* go is switching back to initial cpu */
6869 +#define KDB_STATE_PRINTF_LOCK 0x00001000 /* Holds kdb_printf lock */
6870 +#define KDB_STATE_WAIT_IPI 0x00002000 /* Waiting for kdb_ipi() NMI */
6871 +#define KDB_STATE_RECURSE 0x00004000 /* Recursive entry to kdb */
6872 +#define KDB_STATE_IP_ADJUSTED 0x00008000 /* Restart IP has been adjusted */
6873 +#define KDB_STATE_GO1 0x00010000 /* go only releases one cpu */
6874 +#define KDB_STATE_KEYBOARD 0x00020000 /* kdb entered via keyboard on this cpu */
6875 +#define KDB_STATE_KEXEC 0x00040000 /* kexec issued */
6876 +#define KDB_STATE_ARCH 0xff000000 /* Reserved for arch specific use */
6877 +
6878 +#define KDB_STATE_CPU(flag,cpu) (kdb_state[cpu] & KDB_STATE_##flag)
6879 +#define KDB_STATE_SET_CPU(flag,cpu) ((void)(kdb_state[cpu] |= KDB_STATE_##flag))
6880 +#define KDB_STATE_CLEAR_CPU(flag,cpu) ((void)(kdb_state[cpu] &= ~KDB_STATE_##flag))
6881 +
6882 +#define KDB_STATE(flag) KDB_STATE_CPU(flag,smp_processor_id())
6883 +#define KDB_STATE_SET(flag) KDB_STATE_SET_CPU(flag,smp_processor_id())
6884 +#define KDB_STATE_CLEAR(flag) KDB_STATE_CLEAR_CPU(flag,smp_processor_id())
6885 +
6886 + /*
6887 + * kdb_nextline
6888 + *
6889 + * Contains the current line number on the screen. Used
6890 + * to handle the built-in pager (LINES env variable)
6891 + */
6892 +extern volatile int kdb_nextline;
6893 +
6894 + /*
6895 + * Breakpoint state
6896 + *
6897 + * Each active and inactive breakpoint is represented by
6898 + * an instance of the following data structure.
6899 + */
6900 +
6901 +typedef struct _kdb_bp {
6902 + bfd_vma bp_addr; /* Address breakpoint is present at */
6903 + kdb_machinst_t bp_inst; /* Replaced instruction */
6904 +
6905 + unsigned int bp_free:1; /* This entry is available */
6906 +
6907 + unsigned int bp_enabled:1; /* Breakpoint is active in register */
6908 + unsigned int bp_global:1; /* Global to all processors */
6909 +
6910 + unsigned int bp_hardtype:1; /* Uses hardware register */
6911 + unsigned int bp_forcehw:1; /* Force hardware register */
6912 + unsigned int bp_installed:1; /* Breakpoint is installed */
6913 + unsigned int bp_delay:1; /* Do delayed bp handling */
6914 + unsigned int bp_delayed:1; /* Delayed breakpoint */
6915 +
6916 + int bp_cpu; /* Cpu # (if bp_global == 0) */
6917 + kdbhard_bp_t bp_template; /* Hardware breakpoint template */
6918 + kdbhard_bp_t *bp_hard[NR_CPUS]; /* Hardware breakpoint structure */
6919 + int bp_adjust; /* Adjustment to PC for real instruction */
6920 +} kdb_bp_t;
6921 +
6922 + /*
6923 + * Breakpoint handling subsystem global variables
6924 + */
6925 +extern kdb_bp_t kdb_breakpoints[/* KDB_MAXBPT */];
6926 +
6927 + /*
6928 + * Breakpoint architecture dependent functions. Must be provided
6929 + * in some form for all architectures.
6930 + */
6931 +extern void kdba_initbp(void);
6932 +extern void kdba_printbp(kdb_bp_t *);
6933 +extern void kdba_alloc_hwbp(kdb_bp_t *bp, int *diagp);
6934 +extern void kdba_free_hwbp(kdb_bp_t *bp);
6935 +extern int kdba_parsebp(int, const char**, int *, kdb_bp_t*);
6936 +extern char *kdba_bptype(kdbhard_bp_t *);
6937 +extern void kdba_setsinglestep(struct pt_regs *);
6938 +extern void kdba_clearsinglestep(struct pt_regs *);
6939 +
6940 + /*
6941 + * Adjust instruction pointer architecture dependent function. Must be
6942 + * provided in some form for all architectures.
6943 + */
6944 +extern void kdba_adjust_ip(kdb_reason_t, int, struct pt_regs *);
6945 +
6946 + /*
6947 + * KDB-only global function prototypes.
6948 + */
6949 +extern void kdb_id1(unsigned long);
6950 +extern void kdb_id_init(void);
6951 +
6952 + /*
6953 + * Initialization functions.
6954 + */
6955 +extern void kdba_init(void);
6956 +extern void kdb_io_init(void);
6957 +
6958 + /*
6959 + * Architecture specific function to read a string.
6960 + */
6961 +typedef int (*get_char_func)(void);
6962 +extern get_char_func poll_funcs[];
6963 +
6964 +#ifndef CONFIG_IA64
6965 + /*
6966 + * Data for a single activation record on stack.
6967 + */
6968 +
6969 +struct kdb_stack_info {
6970 + kdb_machreg_t physical_start;
6971 + kdb_machreg_t physical_end;
6972 + kdb_machreg_t logical_start;
6973 + kdb_machreg_t logical_end;
6974 + kdb_machreg_t next;
6975 + const char * id;
6976 +};
6977 +
6978 +typedef struct { DECLARE_BITMAP(bits, KDBA_MAXARGS); } valid_t;
6979 +
6980 +struct kdb_activation_record {
6981 + struct kdb_stack_info stack; /* information about current stack */
6982 + int args; /* number of arguments detected */
6983 + kdb_machreg_t arg[KDBA_MAXARGS]; /* -> arguments */
6984 + valid_t valid; /* is argument n valid? */
6985 +};
6986 +#endif
6987 +
6988 + /*
6989 + * Architecture specific Stack Traceback functions.
6990 + */
6991 +
6992 +struct task_struct;
6993 +
6994 +extern int kdba_bt_address(kdb_machreg_t, int);
6995 +extern int kdba_bt_process(const struct task_struct *, int);
6996 +
6997 + /*
6998 + * KDB Command Table
6999 + */
7000 +
7001 +typedef struct _kdbtab {
7002 + char *cmd_name; /* Command name */
7003 + kdb_func_t cmd_func; /* Function to execute command */
7004 + char *cmd_usage; /* Usage String for this command */
7005 + char *cmd_help; /* Help message for this command */
7006 + short cmd_flags; /* Parsing flags */
7007 + short cmd_minlen; /* Minimum legal # command chars required */
7008 + kdb_repeat_t cmd_repeat; /* Does command auto repeat on enter? */
7009 +} kdbtab_t;
7010 +
7011 + /*
7012 + * External command function declarations
7013 + */
7014 +
7015 +extern int kdb_id(int, const char **);
7016 +extern int kdb_bt(int, const char **);
7017 +
7018 + /*
7019 + * External utility function declarations
7020 + */
7021 +extern char* kdb_getstr(char *, size_t, char *);
7022 +
7023 + /*
7024 + * Register contents manipulation
7025 + */
7026 +extern int kdba_getregcontents(const char *, struct pt_regs *, kdb_machreg_t *);
7027 +extern int kdba_setregcontents(const char *, struct pt_regs *, kdb_machreg_t);
7028 +extern int kdba_dumpregs(struct pt_regs *, const char *, const char *);
7029 +extern int kdba_setpc(struct pt_regs *, kdb_machreg_t);
7030 +extern kdb_machreg_t kdba_getpc(struct pt_regs *);
7031 +
7032 + /*
7033 + * Debug register handling.
7034 + */
7035 +extern void kdba_installdbreg(kdb_bp_t*);
7036 +extern void kdba_removedbreg(kdb_bp_t*);
7037 +
7038 + /*
7039 + * Breakpoint handling - External interfaces
7040 + */
7041 +extern void kdb_initbptab(void);
7042 +extern void kdb_bp_install_global(struct pt_regs *);
7043 +extern void kdb_bp_install_local(struct pt_regs *);
7044 +extern void kdb_bp_remove_global(void);
7045 +extern void kdb_bp_remove_local(void);
7046 +
7047 + /*
7048 + * Breakpoint handling - Internal to kdb_bp.c/kdba_bp.c
7049 + */
7050 +extern int kdba_installbp(struct pt_regs *regs, kdb_bp_t *);
7051 +extern int kdba_removebp(kdb_bp_t *);
7052 +
7053 +
7054 +typedef enum {
7055 + KDB_DB_BPT, /* Breakpoint */
7056 + KDB_DB_SS, /* Single-step trap */
7057 + KDB_DB_SSB, /* Single step to branch */
7058 + KDB_DB_SSBPT, /* Single step over breakpoint */
7059 + KDB_DB_NOBPT /* Spurious breakpoint */
7060 +} kdb_dbtrap_t;
7061 +
7062 +extern kdb_dbtrap_t kdba_db_trap(struct pt_regs *, int); /* DEBUG trap/fault handler */
7063 +extern kdb_dbtrap_t kdba_bp_trap(struct pt_regs *, int); /* Breakpoint trap/fault hdlr */
7064 +
7065 + /*
7066 + * Interrupt Handling
7067 + */
7068 +typedef unsigned long kdb_intstate_t;
7069 +
7070 +extern void kdba_disableint(kdb_intstate_t *);
7071 +extern void kdba_restoreint(kdb_intstate_t *);
7072 +
7073 + /*
7074 + * SMP and process stack manipulation routines.
7075 + */
7076 +extern int kdba_ipi(struct pt_regs *, void (*)(void));
7077 +extern int kdba_main_loop(kdb_reason_t, kdb_reason_t, int, kdb_dbtrap_t, struct pt_regs *);
7078 +extern int kdb_main_loop(kdb_reason_t, kdb_reason_t, int, kdb_dbtrap_t, struct pt_regs *);
7079 +
7080 + /*
7081 + * General Disassembler interfaces
7082 + */
7083 +extern int kdb_dis_fprintf(PTR, const char *, ...) __attribute__ ((format (printf, 2, 3)));
7084 +extern int kdb_dis_fprintf_dummy(PTR, const char *, ...) __attribute__ ((format (printf, 2, 3)));
7085 +extern disassemble_info kdb_di;
7086 +
7087 + /*
7088 + * Architecture Dependent Disassembler interfaces
7089 + */
7090 +extern int kdba_id_printinsn(kdb_machreg_t, disassemble_info *);
7091 +extern int kdba_id_parsemode(const char *, disassemble_info*);
7092 +extern void kdba_id_init(disassemble_info *);
7093 +extern void kdba_check_pc(kdb_machreg_t *);
7094 +
7095 + /*
7096 + * Miscellaneous functions and data areas
7097 + */
7098 +extern char *kdb_cmds[];
7099 +extern void kdb_syslog_data(char *syslog_data[]);
7100 +extern unsigned long kdb_task_state_string(const char *);
7101 +extern char kdb_task_state_char (const struct task_struct *);
7102 +extern unsigned long kdb_task_state(const struct task_struct *p, unsigned long mask);
7103 +extern void kdb_ps_suppressed(void);
7104 +extern void kdb_ps1(const struct task_struct *p);
7105 +extern int kdb_parse(const char *cmdstr);
7106 +extern void kdb_print_nameval(const char *name, unsigned long val);
7107 +extern void kdb_send_sig_info(struct task_struct *p, struct siginfo *info, int seqno);
7108 +#ifdef CONFIG_SWAP
7109 +extern void kdb_si_swapinfo(struct sysinfo *);
7110 +#else
7111 +#include <linux/swap.h>
7112 +#define kdb_si_swapinfo(x) si_swapinfo(x)
7113 +#endif
7114 +extern void kdb_meminfo_read_proc(void);
7115 +#ifdef CONFIG_HUGETLB_PAGE
7116 +extern void kdb_hugetlb_report_meminfo(void);
7117 +#endif /* CONFIG_HUGETLB_PAGE */
7118 +extern const char *kdb_walk_kallsyms(loff_t *pos);
7119 +
7120 + /*
7121 + * Architecture Dependant Local Processor setup & cleanup interfaces
7122 + */
7123 +extern void kdba_local_arch_setup(void);
7124 +extern void kdba_local_arch_cleanup(void);
7125 +
7126 + /*
7127 + * Defines for kdb_symbol_print.
7128 + */
7129 +#define KDB_SP_SPACEB 0x0001 /* Space before string */
7130 +#define KDB_SP_SPACEA 0x0002 /* Space after string */
7131 +#define KDB_SP_PAREN 0x0004 /* Parenthesis around string */
7132 +#define KDB_SP_VALUE 0x0008 /* Print the value of the address */
7133 +#define KDB_SP_SYMSIZE 0x0010 /* Print the size of the symbol */
7134 +#define KDB_SP_NEWLINE 0x0020 /* Newline after string */
7135 +#define KDB_SP_DEFAULT (KDB_SP_VALUE|KDB_SP_PAREN)
7136 +
7137 +/* Save data about running processes */
7138 +
7139 +struct kdb_running_process {
7140 + struct task_struct *p;
7141 + struct pt_regs *regs;
7142 + int seqno; /* kdb sequence number */
7143 + int irq_depth; /* irq count */
7144 + struct kdba_running_process arch; /* arch dependent save data */
7145 +};
7146 +
7147 +extern struct kdb_running_process kdb_running_process[/* NR_CPUS */];
7148 +
7149 +extern int kdb_save_running(struct pt_regs *, kdb_reason_t, kdb_reason_t, int, kdb_dbtrap_t);
7150 +extern void kdb_unsave_running(struct pt_regs *);
7151 +extern struct task_struct *kdb_curr_task(int);
7152 +
7153 +/* Incremented each time the main kdb loop is entered on the initial cpu,
7154 + * it gives some indication of how old the saved data is.
7155 + */
7156 +extern int kdb_seqno;
7157 +
7158 +#define kdb_task_has_cpu(p) (task_curr(p))
7159 +extern void kdb_runqueue(unsigned long cpu, kdb_printf_t xxx_printf);
7160 +
7161 +/* Simplify coexistence with NPTL */
7162 +#define kdb_do_each_thread(g, p) do_each_thread(g, p)
7163 +#define kdb_while_each_thread(g, p) while_each_thread(g, p)
7164 +
7165 +#define GFP_KDB (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
7166 +
7167 +extern void *debug_kmalloc(size_t size, gfp_t flags);
7168 +extern void debug_kfree(void *);
7169 +extern void debug_kusage(void);
7170 +
7171 +extern void kdba_set_current_task(const struct task_struct *);
7172 +extern const struct task_struct *kdb_current_task;
7173 +extern struct pt_regs *kdb_current_regs;
7174 +
7175 +/* Functions to safely read and write kernel areas. The {to,from}_xxx
7176 + * addresses are not necessarily valid, these functions must check for
7177 + * validity. If the arch already supports get and put routines with suitable
7178 + * validation and/or recovery on invalid addresses then use those routines,
7179 + * otherwise check it yourself.
7180 + */
7181 +
7182 +extern int kdba_putarea_size(unsigned long to_xxx, void *from, size_t size);
7183 +extern int kdba_getarea_size(void *to, unsigned long from_xxx, size_t size);
7184 +extern int kdba_verify_rw(unsigned long addr, size_t size);
7185 +
7186 +#ifndef KDB_RUNNING_PROCESS_ORIGINAL
7187 +#define KDB_RUNNING_PROCESS_ORIGINAL kdb_running_process
7188 +#endif
7189 +
7190 +extern int kdb_wait_for_cpus_secs;
7191 +extern void kdba_cpu_up(void);
7192 +extern char kdb_prompt_str[];
7193 +
7194 +#define KDB_WORD_SIZE ((int)sizeof(kdb_machreg_t))
7195 +
7196 +#ifdef CONFIG_KDB_USB
7197 +#include <linux/usb.h>
7198 +
7199 +struct kdb_usb_kbd_info {
7200 + struct urb *urb; /* pointer to the URB */
7201 + unsigned char *buffer; /* pointer to the kbd char buffer */
7202 + int (*poll_func)(struct urb *urb); /* poll function to retrieve chars */
7203 + int poll_ret; /* return val from poll_func */
7204 + int caps_lock; /* state of the caps lock for this keyboard */
7205 +};
7206 +#endif /* CONFIG_KDB_USB */
7207 +
7208 +#ifdef CONFIG_KDB_KDUMP
7209 +#define KDUMP_REASON_RESET 0
7210 +extern void kdba_kdump_shutdown_slave(struct pt_regs *);
7211 +#endif /* CONFIG_KDB_KDUMP */
7212 +
7213 +#endif /* !_KDBPRIVATE_H */
7214 --- a/include/linux/reboot.h
7215 +++ b/include/linux/reboot.h
7216 @@ -53,7 +53,14 @@ extern void machine_power_off(void);
7217
7218 extern void machine_shutdown(void);
7219 struct pt_regs;
7220 +#ifdef CONFIG_KDB_KDUMP
7221 extern void machine_crash_shutdown(struct pt_regs *);
7222 +extern void machine_crash_shutdown_begin(void);
7223 +extern void machine_crash_shutdown_other_cpu(struct pt_regs *);
7224 +extern void machine_crash_shutdown_end(struct pt_regs *);
7225 +#else
7226 +extern void machine_crash_shutdown(struct pt_regs *);
7227 +#endif /* !CONFIG_KDB_KDUMP */
7228
7229 /*
7230 * Architecture independent implemenations of sys_reboot commands.
7231 --- a/include/linux/sysctl.h
7232 +++ b/include/linux/sysctl.h
7233 @@ -163,6 +163,7 @@ enum
7234 KERN_MAX_LOCK_DEPTH=74,
7235 KERN_NMI_WATCHDOG=75, /* int: enable/disable nmi watchdog */
7236 KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
7237 + KERN_KDB=77, /* int: kdb on/off */
7238 };
7239
7240
7241 --- a/init/main.c
7242 +++ b/init/main.c
7243 @@ -71,6 +71,10 @@
7244 #include <asm/smp.h>
7245 #endif
7246
7247 +#ifdef CONFIG_KDB
7248 +#include <linux/kdb.h>
7249 +#endif /* CONFIG_KDB */
7250 +
7251 /*
7252 * This is one of the first .c files built. Error out early if we have compiler
7253 * trouble.
7254 @@ -193,6 +197,26 @@ static const char *panic_later, *panic_p
7255
7256 extern struct obs_kernel_param __setup_start[], __setup_end[];
7257
7258 +#ifdef CONFIG_KDB
7259 +static int __init kdb_setup(char *str)
7260 +{
7261 + if (strcmp(str, "on") == 0) {
7262 + kdb_on = 1;
7263 + } else if (strcmp(str, "on-nokey") == 0) {
7264 + kdb_on = 2;
7265 + } else if (strcmp(str, "off") == 0) {
7266 + kdb_on = 0;
7267 + } else if (strcmp(str, "early") == 0) {
7268 + kdb_on = 1;
7269 + kdb_flags |= KDB_FLAG_EARLYKDB;
7270 + } else
7271 + printk("kdb flag %s not recognised\n", str);
7272 + return 0;
7273 +}
7274 +
7275 +__setup("kdb=", kdb_setup);
7276 +#endif /* CONFIG_KDB */
7277 +
7278 static int __init obsolete_checksetup(char *line)
7279 {
7280 struct obs_kernel_param *p;
7281 @@ -659,6 +683,14 @@ asmlinkage void __init start_kernel(void
7282 pgtable_cache_init();
7283 prio_tree_init();
7284 anon_vma_init();
7285 +
7286 +#ifdef CONFIG_KDB
7287 + kdb_init();
7288 + if (KDB_FLAG(EARLYKDB)) {
7289 + KDB_ENTER();
7290 + }
7291 +#endif /* CONFIG_KDB */
7292 +
7293 #ifdef CONFIG_X86
7294 if (efi_enabled)
7295 efi_enter_virtual_mode();
7296 --- /dev/null
7297 +++ b/kdb/ChangeLog
7298 @@ -0,0 +1,2012 @@
7299 +2008-09-30 Jay Lan <jlan@sgi.com>
7300 +
7301 + * kdb-v4.4-2.6.27-rc8-common-1.
7302 +
7303 +2008-09-22 Jay Lan <jlan@sgi.com>
7304 +
7305 + * kdb-v4.4-2.6.27-rc7-common-1.
7306 +
7307 +2008-09-03 Jay Lan <jlan@sgi.com>
7308 +
7309 + * kdb-v4.4-2.6.27-rc5-common-1.
7310 +
7311 +2008-08-19 Jay Lan <jlan@sgi.com>
7312 +
7313 + * kdb-v4.4-2.6.27-rc3-common-1.
7314 +
7315 +2008-08-15 Jay Lan <jlan@sgi.com>
7316 +
7317 + * mm_online_pgdat_export_symbol, Jay Lan <jlan@sgi.com>
7318 + - Fix compilation error by exporting first_online_pgdat &
7319 + next_online_pgdat for 'pgdat' command.
7320 + * kdb-v4.4-2.6.27-rc2-common-2.1.
7321 +
7322 +2008-08-14 Jay Lan <jlan@sgi.com>
7323 +
7324 + * Support 'kdump' command to take a kdump vmcore from KDB,
7325 + Dan Aloni (da-x@monatomic.org),
7326 + Jason Xiao (jidong.xiao@gmail.com),
7327 + Jay Lan (jlan@sgi.com)
7328 + * kdb-v4.4-2.6.27-rc2-common-2.
7329 +
7330 +2008-08-06 Jay Lan <jlan@sgi.com>
7331 +
7332 + * Fix up the NULL pointer deference issue in ohci_kdb_poll_char,
7333 + Jason Xiao <jidong.xiao@gmail.com>
7334 + * kdb-v4.4-2.6.27-rc2-common-1.
7335 +
7336 +2008-07-18 Jay Lan <jlan@sgi.com>
7337 +
7338 + * support Hardware Breakpoint (bph/bpha) commands
7339 + IA64: Greg Banks <gnb@sgi.com>
7340 + X86: Konstantin Baydarov <kbaidarov@ru.mvista.com>
7341 + * kdb-v4.4-2.6.26-common-2.
7342 +
7343 +2008-07-14 Jay Lan <jlan@sgi.com>
7344 +
7345 + * kdb-v4.4-2.6.26-common-1.
7346 +
7347 +2008-07-11 Jay Lan <jlan@sgi.com>
7348 +
7349 + * New commands and some fixups and enhancements,
7350 + Joe Korty <joe.korty@ccur.com>
7351 + John Blackwood <john.blackwood@ccur.com>
7352 + Jim Houston <jim.houston@ccur.com>
7353 + - Use the non-sleeping copy_from_user_atomic.
7354 + - Enhance kdb_cmderror diagnostic output.
7355 + - Expand the KDB 'duplicate command' error message.
7356 + - Touch NMI watchdog in various KDB busy-loops.
7357 + - Support IMB HS20 Blade 8843 platform.
7358 + - Display exactly which cpus needed an NMI to get them into kdb.
7359 + - Better document that kdb's 'ps A' command can be used to show
7360 + _all_ processes and threads
7361 + - Suppress KDB boottime INFO messages if quiet boot.
7362 + - Add a KDB breakpoint to the OOPs path.
7363 + - Add CONFIG_DISCONTIGMEM support to kdbm_memmap.
7364 + - Extend the KDB task command to handle CONFIG_NUMA fields.
7365 + - Extend the KDB vm command to support NUMA stuff.
7366 + - Create the KDB mempolicy command.
7367 + - Create a pgdat command for KDB.
7368 + - Fix a hang on boot on some i386 systems.
7369 + * kdb-v4.4-2.6.26-rc9-common-1.
7370 +
7371 +2008-06-30 Jay Lan <jlan@sgi.com>
7372 +
7373 + * compilation warning cleanup, Cliff Wickman <cpw@sgi.com>
7374 + * kdb-v4.4-2.6.26-rc8-common-1.
7375 +
7376 +2008-06-25 Jay Lan <jlan@sgi.com>
7377 +
7378 + * Added John Blackwood <john.blackwood@ccur.com> to the authors of
7379 + kdb-v4.4-2.6.26-rc4-common-2.
7380 + * kdb-v4.4-2.6.26-rc7-common-1.
7381 +
7382 +2008-06-24 Jay Lan <jlan@sgi.com>
7383 +
7384 + * support lcrash style debug_info file: Cliff Wickman <cpw@sgi.com>
7385 + - It adds to kdb the ability to symbolically dereference structure
7386 + pointers through a lcrash-style debug_info file.
7387 + - Implements "print", "px", and "pd" print commands.
7388 + - Implements "walk" command to follow linked lists.
7389 + - Implements "whatis" to display a structure (with offsets).
7390 + - Implements "sizeof" for types (structures, typedefs, etc.).
7391 + * kdb-v4.4-2.6.26-rc5-common-2.
7392 +
7393 +2008-06-06 Jay Lan <jlan@sgi.com>
7394 +
7395 + * kdb-v4.4-2.6.26-rc5-common-1.
7396 +
7397 +2008-06-05 Jay Lan <jlan@sgi.com>
7398 +
7399 + * fixed 'rq/rqa' command runs off the end of runqueue's rt.active
7400 + priority bitmap array, John Blackwood <john.blackwood@ccur.com> &
7401 + Lachlan McIlroy <lachlan@sgi.com>
7402 + * kdb-v4.4-2.6.26-rc4-common-2.
7403 +
7404 +2008-05-30 Jay Lan <jlan@sgi.com>
7405 +
7406 + * kdb-v4.4-2.6.26-rc4-common-1.
7407 +
7408 +2008-05-20 Jay Lan <jlan@sgi.com>
7409 +
7410 + * kdb-v4.4-2.6.26-rc3-common-1.
7411 +
7412 +2008-05-13 Jay Lan <jlan@sgi.com>
7413 +
7414 + * XPC support is removed from KDB due to XPC changes in 2.6.26-rc1.
7415 + * kdb-v4.4-2.6.26-rc1-common-1.
7416 +
7417 +2008-04-17 Jay Lan <jlan@sgi.com>
7418 +
7419 + * kdb-v4.4-2.6.25-common-1.
7420 +
7421 +2008-03-16 Jay Lan <jlan@sgi.com>
7422 +
7423 + * kdb-v4.4-2.6.25-rc6-common-1.
7424 +
7425 +2008-03-03 Jay Lan <jlan@sgi.com>
7426 +
7427 + * kdb-v4.4-2.6.25-rc3-common-1.
7428 +
7429 +2008-02-26 Jay Lan <jlan@sgi.com>
7430 +
7431 + * remove 'fastcall' from kdb code.
7432 + * kdb-v4.4-2.6.25-rc2-common-1.
7433 +
7434 +2008-02-19 Jay Lan <jlan@sgi.com>
7435 +
7436 + * kdb-v4.4-2.6.25-rc1-common-1.
7437 +
7438 +2008-02-06 Jay Lan <jlan@sgi.com>
7439 +
7440 + * Backed out USB UHCI support since it caused dropped characters and
7441 + broke OHCI.
7442 + * Restored "archkdbcommon" commands for x86. It was lost at the x86
7443 + merge.
7444 + * Detecting if the HC was "busy", Aaron Young <ayoung@sgi.com>
7445 + * kdb-v4.4-2.6.24-common-2.
7446 +
7447 +2008-01-29 Jay Lan <jlan@sgi.com>
7448 +
7449 + * kdb-v4.4-2.6.24-common-1.
7450 +
7451 +2008-01-22 Jay Lan <jlan@sgi.com>
7452 +
7453 + * USB UHCI kdb support, Konstantin Baydarov <kbaidarov@ru.mvista.com>
7454 + * kdb-v4.4-2.6.24-rc8-common-3.
7455 +
7456 +2008-01-18 Jay Lan <jlan@sgi.com>
7457 +
7458 + * USB EHCI kdb support, Aaron Young <ayoung@sgi.com>
7459 + * kdb-v4.4-2.6.24-rc8-common-2.
7460 +
7461 +2008-01-18 Jay Lan <jlan@sgi.com>
7462 +
7463 + * kdb-v4.4-2.6.24-rc8-common-1.
7464 +
7465 +2008-01-07 Jay Lan <jlan@sgi.com>
7466 +
7467 + * kdb-v4.4-2.6.24-rc7-common-1.
7468 +
7469 +2007-12-21 Jay Lan <jlan@sgi.com>
7470 +
7471 + * Renamed kdb/kdba_bt_x86.c to arch/x86/kdba_bt.c. And thus, the x86
7472 + backtrace code is now moved into the kdb x86 patch.
7473 + * kdb v4.4-2.6.24-rc6-common-1.
7474 +
7475 +2007-12-12 Jay Lan <jlan@sgi.com>
7476 +
7477 + * kdb v4.4-2.6.24-rc5-common-1.
7478 +
7479 +2007-12-05 Jay Lan <jlan@sgi.com>
7480 +
7481 + * Fixed a 'sysctl table check failed' problem.
7482 + * kdb v4.4-2.6.24-rc4-common-1.
7483 +
7484 +2007-11-26 Jay Lan <jlan@sgi.com>
7485 +
7486 + * kdb v4.4-2.6.24-rc3-common-1.
7487 +
7488 +2007-11-13 Jay Lan <jlan@sgi.com>
7489 +
7490 + * Back ported "New KDB USB interface" from Aaron Young in
7491 + v4.4-2.6.23-common-2 to 2.6.24 kdb patchset.
7492 + * kdb v4.4-2.6.24-rc2-common-2.
7493 +
7494 +2007-11-12 Jay Lan <jlan@sgi.com>
7495 +
7496 + * kdb v4.4-2.6.24-rc2-common-1.
7497 +
7498 +2007-11-09 Jay Lan <jlan@sgi.com>
7499 +
7500 + * Rebase to 2.6.24-rc1 kernel
7501 + * - merged kdb-v4.4-2.6.23-i386-1 and kdb-v4.4-2.6.23-x86_64-1
7502 + * into kdb-v4.4-2.6.24-rc1-x86-1
7503 + * - Fields "done", "sglist_len", and "pid" are removed from
7504 + * struct scsi_cmnd. Thus, these fields are no longer displayed
7505 + * on "sc" command.
7506 + * kdb v4.4-2.6.24-rc1-common-1.
7507 +
7508 +2007-11-08 Jay Lan <jlan@sgi.com>
7509 +
7510 + * New KDB USB interface, Aaron Young <ayoung@sgi.com>
7511 + * 1. This patch allows KDB to work with any Host Contoller driver
7512 + * and call the correct HC driver poll routine (as long as the
7513 + * HC driver provides a .kdb_poll_char routine via it's
7514 + * associated hc_driver struct).
7515 + * 2. Hotplugged keyboards are now recognized by KDB.
7516 + * 3. Currently KDB can only make use of 1 USB type keyboard.
7517 + * New code can handle up to 8 attached keyboards - input is
7518 + * multiplexed from all of them while in kdb.
7519 + * kdb v4.4-2.6.23-common-2.
7520 +
7521 +2007-10-24 Jay Lan <jlan@sgi.com>
7522 +
7523 + * kdb v4.4-2.6.23-common-1.
7524 +
7525 +2007-09-26 Jay Lan <jlan@sgi.com>
7526 +
7527 + * kdb v4.4-2.6.23-rc8-common-1.
7528 +
7529 +2007-09-21 Jay Lan <jlan@sgi.com>
7530 +
7531 + * kdb v4.4-2.6.23-rc7-common-1.
7532 +
7533 +2007-09-12 Jay Lan <jlan@sgi.com>
7534 +
7535 + * kdb v4.4-2.6.23-rc6-common-1.
7536 +
7537 +2007-09-06 Jay Lan <jlan@sgi.com>
7538 +
7539 + * kdb v4.4-2.6.23-rc5-common-1.
7540 +
7541 +2007-08-30 Keith Owens <kaos@sgi.com>
7542 +
7543 + * New i386/x86_64 backtrace requires that kdb_save_running() does not
7544 + exit until after kdb_main_loop() has completed.
7545 + * List more noret functions in i386/x86_64 backtrace code.
7546 + * Call to a noret function ends a basic block.
7547 + * After a call to a noret function, eip/rip may be pointing at the next
7548 + function or not, depending on function alignment. Jay Lan.
7549 + * kdb v4.4-2.6.23-rc4-common-2.
7550 +
7551 +2007-08-30 Jay Lan <jlan@sgi.com>
7552 +
7553 + * kdb v4.4-2.6.23-rc4-common-1.
7554 +
7555 +2007-08-28 Keith Owens <kaos@sgi.com>
7556 +
7557 + * kdb/kdba_bt_x86.c:
7558 + * Handle the variable amount of stack data that is pushed by x86_64
7559 + * hardware on an interrupt.
7560 + * Add instruction vmsave.
7561 + * Handle pop to %rsp.
7562 + * Cope with return address for functions defined as ATTRIB_NORET.
7563 + * Include CONFIG_DEBUG_INFO in the summary line of bb_all.
7564 + * Check for an interrupt that was delivered while user space was in
7565 + * control.
7566 + * A return to child_rip ends a backtrace.
7567 + * Ignore level2_kernel_pgt and level3_kernel_pgt data areas if they
7568 + * occur within the text segment.
7569 + * kdb v4.4-2.6.23-rc3-common-2.
7570 +
7571 +2007-08-24 Keith Owens <kaos@sgi.com>
7572 +
7573 + * kdb v4.4-2.6.23-rc3-common-1.
7574 +
7575 +2007-08-24 Jay Lan <jlan@sgi.com>
7576 +
7577 + * kdb/kdba_bt_x86.c:
7578 + * retint_kernel is only defined for CONFIG_PREEMPT.
7579 + * Handle assembler code for CONFIG_HIBERNATION=y.
7580 + * Handle assembler code for CONFIG_MATH_EMULATION=y.
7581 + * Handle assembler code for CONFIG_XEN=y.
7582 + * Handle assembler code for CONFIG_KPROBES=y.
7583 + * Add CC version to the bb_all header.
7584 + * Handle spurious label in jprobe_return.
7585 + * Handle stack switch in jprobe_return.
7586 + * Prefix register name with '%' in xadd/xchg temporary variable.
7587 + * Require bb_usage_mov() to handle all the special cases internally.
7588 + * Handle stack manipulation for kexec.
7589 + * Handle spurious label in kretprobe_trampoline_holder.
7590 + * Add instructions clgi, invlpga, rcl, rdpmc, stgi, vmclear,
7591 + * vmlaunch, vmload, vmptrld, vmread, vmresume, vmrun, vmwrite,
7592 + * xstore-rng.
7593 + * Exclude more 16 bit and/or real mode acpi functions from bb_all.
7594 + * Handle assembler stack switching code in i386 do_softirq.
7595 + * kdb/kdbmain.c:
7596 + * Add CC version to the summary output.
7597 + * Bump debug_kmalloc pool from 128K to 256K, some of the kernel
7598 + * functions have huge numbers of basic blocks and jumps between them.
7599 + * Correct reinstallation of breakpoints when exiting KDB.
7600 + * Keith Owens.
7601 + * kdb v4.4-2.6.23-rc2-common-2.
7602 +
7603 +2007-08-07 Jay Lan <jlan@sgi.com>
7604 +
7605 + * kdb v4.4-2.6.23-rc2-common-1.
7606 +
7607 +2007-08-03 Keith Owens <kaos@sgi.com>
7608 +
7609 + * kdba_bt_x86.c: Rename some variables to make the code more readable.
7610 + Print more debug information when merging register states and when
7611 + calculating the new stack pointer.
7612 + * kdb v4.4-2.6.23-rc1-common-2.
7613 +
7614 +2007-07-30 Keith Owens <kaos@sgi.com>
7615 +
7616 + * kdb v4.4-2.6.23-rc1-common-1.
7617 +
7618 +2007-07-26 Keith Owens <kaos@sgi.com>
7619 +
7620 + * New x86 backtrace code.
7621 + * kdb v4.4-2.6.22-common-4.
7622 +
7623 +2007-07-17 Keith Owens <kaos@sgi.com>
7624 +
7625 + * Make kdb_printf_lock an irq lock to keep lockdep happy.
7626 + * kdb v4.4-2.6.22-common-3.
7627 +
7628 +2007-07-13 Keith Owens <kaos@sgi.com>
7629 +
7630 + * Increase the size of the debug_alloc pool.
7631 + * Add the caller that obtained each entry in the debug_alloc pool.
7632 + * Poison entries in the debug_alloc pool.
7633 + * Track current and maximum usage in debug_alloc pool.
7634 + * Print the debug_alloc entries that are still in use when kdb exits
7635 + (memory leaks).
7636 + * Increase the default value of BTARGS to 9.
7637 + * kdb v4.4-2.6.22-common-2.
7638 +
7639 +2007-07-09 Keith Owens <kaos@sgi.com>
7640 +
7641 + * kdb v4.4-2.6.22-common-1.
7642 +
7643 +2007-07-02 Keith Owens <kaos@sgi.com>
7644 +
7645 + * kdb v4.4-2.6.22-rc7-common-1.
7646 +
7647 +2007-06-20 Keith Owens <kaos@sgi.com>
7648 +
7649 + * kdb v4.4-2.6.22-rc5-common-1.
7650 +
7651 +2007-06-15 Keith Owens <kaos@sgi.com>
7652 +
7653 + * Do not include asm/kdb.h unless CONFIG_KDB is on. Dave Jiang.
7654 + * kdb v4.4-2.6.22-rc4-common-2.
7655 +
7656 +2007-06-08 Keith Owens <kaos@sgi.com>
7657 +
7658 + * kdb v4.4-2.6.22-rc4-common-1.
7659 +
7660 +2007-05-28 Keith Owens <kaos@sgi.com>
7661 +
7662 + * kdb v4.4-2.6.22-rc3-common-1.
7663 +
7664 +2007-05-22 Keith Owens <kaos@sgi.com>
7665 +
7666 + * kdb v4.4-2.6.22-rc2-common-1.
7667 +
7668 +2007-05-22 Keith Owens <kaos@sgi.com>
7669 +
7670 + * kdb v4.4-2.6.22-rc1-common-1.
7671 +
7672 +2007-05-17 Keith Owens <kaos@sgi.com>
7673 +
7674 + * Add rdmsr and wrmsr commands for i386 and x86_64. Original patch by
7675 + Bernardo Innocenti for i386, reworked by Keith Owens to make it safe
7676 + on all cpu models and to handle both i386 and x86_64.
7677 + * kdb v4.4-2.6.21-common-3.
7678 +
7679 +2007-05-15 Keith Owens <kaos@sgi.com>
7680 +
7681 + * Correct alignment of debug_alloc_header.
7682 + * kdb v4.4-2.6.21-common-2.
7683 +
7684 +2007-04-29 Keith Owens <kaos@sgi.com>
7685 +
7686 + * kdb v4.4-2.6.21-common-1.
7687 +
7688 +2007-04-16 Keith Owens <kaos@sgi.com>
7689 +
7690 + * Remove dead symbol declarations.
7691 + * kdb v4.4-2.6.21-rc7-common-2.
7692 +
7693 +2007-04-16 Keith Owens <kaos@sgi.com>
7694 +
7695 + * kdb v4.4-2.6.21-rc7-common-1.
7696 +
7697 +2007-04-10 Keith Owens <kaos@sgi.com>
7698 +
7699 + * kdb v4.4-2.6.21-rc6-common-1.
7700 +
7701 +2007-04-02 Keith Owens <kaos@sgi.com>
7702 +
7703 + * kdb v4.4-2.6.21-rc5-common-1.
7704 +
7705 +2007-03-19 Keith Owens <kaos@sgi.com>
7706 +
7707 + * kdb v4.4-2.6.21-rc4-common-1.
7708 +
7709 +2007-03-14 Keith Owens <kaos@sgi.com>
7710 +
7711 + * kdb v4.4-2.6.21-rc3-common-1.
7712 +
7713 +2007-03-14 Keith Owens <kaos@sgi.com>
7714 +
7715 + * kdb v4.4-2.6.21-rc2-common-1.
7716 +
7717 +2007-03-01 Keith Owens <kaos@sgi.com>
7718 +
7719 + * kdb v4.4-2.6.21-rc1-common-1.
7720 +
7721 +2007-03-01 Keith Owens <kaos@sgi.com>
7722 +
7723 + * Remove sparse warnings.
7724 + * kdb v4.4-2.6.20-common-6.
7725 +
7726 +2007-02-27 Keith Owens <kaos@sgi.com>
7727 +
7728 + * set_irq_regs() on entry to kdb() if they are not already set.
7729 + * kdb v4.4-2.6.20-common-5.
7730 +
7731 +2007-02-22 Keith Owens <kaos@sgi.com>
7732 +
7733 + * Initialise struct disassemble_info in kdb_id1().
7734 + * kdb v4.4-2.6.20-common-4.
7735 +
7736 +2007-02-16 Keith Owens <kaos@sgi.com>
7737 +
7738 + * Clean up debug_alloc_pool code.
7739 + * kdb v4.4-2.6.20-common-3.
7740 +
7741 +2007-02-16 Keith Owens <kaos@sgi.com>
7742 +
7743 + * Initialise variable bits of struct disassemble_info each time.
7744 + * kdb v4.4-2.6.20-common-2.
7745 +
7746 +2007-02-06 Keith Owens <kaos@sgi.com>
7747 +
7748 + * kdb v4.4-2.6.20-common-1.
7749 +
7750 +2007-02-01 Keith Owens <kaos@sgi.com>
7751 +
7752 + * kdb v4.4-2.6.20-rc7-common-1.
7753 +
7754 +2007-01-08 Keith Owens <kaos@sgi.com>
7755 +
7756 + * kdb v4.4-2.6.20-rc4-common-1.
7757 +
7758 +2007-01-02 Keith Owens <kaos@sgi.com>
7759 +
7760 + * kdb v4.4-2.6.20-rc3-common-1.
7761 +
7762 +2006-12-21 Keith Owens <kaos@sgi.com>
7763 +
7764 + * Initialize the debug_kmalloc pool on the first call, so it can be
7765 + used at any time.
7766 + * kdb v4.4-2.6.20-rc1-common-2.
7767 +
7768 +2006-12-20 Keith Owens <kaos@sgi.com>
7769 +
7770 + * kdb v4.4-2.6.20-rc1-common-1.
7771 +
7772 +2006-11-30 Keith Owens <kaos@sgi.com>
7773 +
7774 + * kdb v4.4-2.6.19-common-1.
7775 +
7776 +2006-11-30 Keith Owens <kaos@sgi.com>
7777 +
7778 + * Do not access registers if kdb_current_regs is NULL.
7779 + * kdb v4.4-2.6.19-rc6-common-3.
7780 +
7781 +2006-11-27 Keith Owens <kaos@sgi.com>
7782 +
7783 + * Only use VT keyboard if the command line allows it and ACPI indicates
7784 + that there is an i8042.
7785 + * Optimize kdb_read() to reduce the risk of dropping input characters.
7786 + * Print cpumasks as lists instead of hex, also cope with long lists.
7787 + * kdb v4.4-2.6.19-rc6-common-2.
7788 +
7789 +2006-11-20 Keith Owens <kaos@sgi.com>
7790 +
7791 + * kdb v4.4-2.6.19-rc6-common-1.
7792 +
7793 +2006-11-09 Keith Owens <kaos@sgi.com>
7794 +
7795 + * Change kdb() to fastcall.
7796 + * Correct loop in kdb_help(). Georg Nikodym.
7797 + * Only use VT console if the command line allows it.
7798 + * kdb v4.4-2.6.19-rc5-common-2.
7799 +
7800 +2006-11-08 Keith Owens <kaos@sgi.com>
7801 +
7802 + * kdb v4.4-2.6.19-rc5-common-1.
7803 +
7804 +2006-11-01 Keith Owens <kaos@sgi.com>
7805 +
7806 + * kdb v4.4-2.6.19-rc4-common-1.
7807 +
7808 +2006-10-24 Keith Owens <kaos@sgi.com>
7809 +
7810 + * kdb v4.4-2.6.19-rc3-common-1.
7811 +
7812 +2006-10-24 Keith Owens <kaos@sgi.com>
7813 +
7814 + * Remove redundant regs and envp parameters.
7815 + * kdb v4.4-2.6.19-rc2-common-2.
7816 +
7817 +2006-10-18 Keith Owens <kaos@sgi.com>
7818 +
7819 + * kdb v4.4-2.6.19-rc2-common-1.
7820 +
7821 +2006-10-11 Keith Owens <kaos@sgi.com>
7822 +
7823 + * Move kdbm_x86.c from the i386 to the common KDB patch.
7824 + * Expand kdbm_x86.c to work on x86_64 as well as i386.
7825 + * kdb v4.4-2.6.19-rc1-common-2.
7826 +
7827 +2006-10-09 Keith Owens <kaos@sgi.com>
7828 +
7829 + * kdb v4.4-2.6.19-rc1-common-1.
7830 +
7831 +2006-10-06 Keith Owens <kaos@sgi.com>
7832 +
7833 + * Remove #include <linux/config.h>
7834 + * kdb v4.4-2.6.18-common-2.
7835 +
7836 +2006-09-20 Keith Owens <kaos@sgi.com>
7837 +
7838 + * kdb v4.4-2.6.18-common-1.
7839 +
7840 +2006-09-15 Keith Owens <kaos@sgi.com>
7841 +
7842 + * kdb v4.4-2.6.18-rc7-common-1.
7843 +
7844 +2006-08-29 Keith Owens <kaos@sgi.com>
7845 +
7846 + * Rewrite all backtrace code.
7847 + * kdb v4.4-2.6.18-rc5-common-2.
7848 +
7849 +2006-08-28 Keith Owens <kaos@sgi.com>
7850 +
7851 + * kdb v4.4-2.6.18-rc5-common-1.
7852 +
7853 +2006-08-08 Keith Owens <kaos@sgi.com>
7854 +
7855 + * kdb v4.4-2.6.18-rc4-common-1.
7856 +
7857 +2006-08-04 Keith Owens <kaos@sgi.com>
7858 +
7859 + * kdb v4.4-2.6.18-rc3-common-1.
7860 +
7861 +2006-07-18 Keith Owens <kaos@sgi.com>
7862 +
7863 + * 8250.c locking has been fixed so there is no need to break spinlocks
7864 + for keyboard entry.
7865 + * kdb v4.4-2.6.18-rc2-common-2.
7866 +
7867 +2006-07-18 Keith Owens <kaos@sgi.com>
7868 +
7869 + * kdb v4.4-2.6.18-rc2-common-1.
7870 +
7871 +2006-07-12 Keith Owens <kaos@sgi.com>
7872 +
7873 + * Remove dead KDB_REASON codes.
7874 + * The main kdb() function is now always entered with interrupts
7875 + disabled, so there is no need to disable bottom halves.
7876 + * sparse cleanups.
7877 + * kdb v4.4-2.6.18-rc1-common-2.
7878 +
7879 +2006-07-07 Keith Owens <kaos@sgi.com>
7880 +
7881 + * kdb v4.4-2.6.18-rc1-common-1.
7882 +
7883 +2006-07-04 Keith Owens <kaos@sgi.com>
7884 +
7885 + * Add KDB_REASON_CPU_UP and callbacks for cpus coming online.
7886 + * Relegate KDB_REASON_SILENT to KDB internal use only.
7887 + * Backout the v4.4-2.6.15-common-3 change that made KDB_REASON_SILENT
7888 + wait for cpus, the Dell Xeon problem has been fixed.
7889 + * notify_die() is not called for KDB_REASON_SILENT nor
7890 + KDB_REASON_CPU_UP, these events do not stay in KDB.
7891 + * Export kdb_current_task for kdbm_x86. SuSE patch
7892 + kdb-missing-export.diff
7893 + * Scale kdb_wait_for_cpus_secs by the number of online cpus.
7894 + * Delete kdb_enablehwfault, architectures now do their own setup.
7895 + * Delete kdba_enable_mce, architectures now do their own setup.
7896 + * Delete kdba_enable_lbr, kdba_disable_lbr, kdba_print_lbr,
7897 + page_fault_mca. Only ever implemented on x86, difficult to maintain
7898 + and rarely used in the field.
7899 + * Replace #ifdef KDB_HAVE_LONGJMP with #ifdef kdba_setjmp.
7900 + * kdb v4.4-2.6.17-common-2.
7901 +
7902 +2006-06-19 Keith Owens <kaos@sgi.com>
7903 +
7904 + * kdb v4.4-2.6.17-common-1.
7905 +
7906 +2006-05-31 Keith Owens <kaos@sgi.com>
7907 +
7908 + * Break spinlocks for keyboard entry. Hopefully a temporary hack while
7909 + I track down why keyboard entry to KDB is hanging.
7910 + * kdb v4.4-2.6.17-rc5-common-2.
7911 +
7912 +2006-05-25 Keith Owens <kaos@sgi.com>
7913 +
7914 + * kdb v4.4-2.6.17-rc5-common-1.
7915 +
7916 +2006-05-15 Keith Owens <kaos@sgi.com>
7917 +
7918 + * Refresh bfd related files from binutils 2.16.91.0.2.
7919 + * kdb v4.4-2.6.17-rc4-common-2.
7920 +
7921 +2006-05-12 Keith Owens <kaos@sgi.com>
7922 +
7923 + * kdb v4.4-2.6.17-rc4-common-1.
7924 +
7925 +2006-04-28 Keith Owens <kaos@sgi.com>
7926 +
7927 + * kdb v4.4-2.6.17-rc3-common-1.
7928 +
7929 +2006-04-22 Keith Owens <kaos@sgi.com>
7930 +
7931 + * kdb v4.4-2.6.17-rc2-common-1.
7932 +
7933 +2006-04-11 Keith Owens <kaos@sgi.com>
7934 +
7935 + * kdb v4.4-2.6.17-rc1-common-1.
7936 +
7937 +2006-04-05 Keith Owens <kaos@sgi.com>
7938 +
7939 + * More fixes for the timing race with KDB_ENTER_SLAVE.
7940 + * kdb v4.4-2.6.16-common-5.
7941 +
7942 +2006-03-30 Keith Owens <kaos@sgi.com>
7943 +
7944 + * Some code was testing KDB_IS_RUNNING() twice, which left it open to
7945 + races. Cache the result instead.
7946 + * kdb v4.4-2.6.16-common-4.
7947 +
7948 +2006-03-30 Keith Owens <kaos@sgi.com>
7949 +
7950 + * Change CONFIG_LKCD to CONFIG_LKCD_DUMP.
7951 + * kdb v4.4-2.6.16-common-3.
7952 +
7953 +2006-03-22 Keith Owens <kaos@sgi.com>
7954 +
7955 + * Add some more xpc flags. Dean Nelson, SGI.
7956 + * Replace open coded counter references with atomic_read().
7957 + * Pass early_uart_console to early_uart_setup(). Francois
7958 + Wellenreiter, Bull.
7959 + * Replace open code with for_each_online_cpu().
7960 + * If cpus do not come into kdb after a few seconds then let
7961 + architectures send a more forceful interrupt.
7962 + * Close a timing race with KDB_ENTER_SLAVE.
7963 + * kdb v4.4-2.6.16-common-2.
7964 +
7965 +2006-03-21 Keith Owens <kaos@sgi.com>
7966 +
7967 + * kdb v4.4-2.6.16-common-1.
7968 +
7969 +2006-03-14 Nathan Scott <nathans@sgi.com>
7970 +
7971 + * kdb v4.4-2.6.16-rc6-common-1.
7972 +
7973 +2006-02-28 Nathan Scott <nathans@sgi.com>
7974 +
7975 + * kdb v4.4-2.6.16-rc5-common-1.
7976 +
7977 +2006-02-20 Nathan Scott <nathans@sgi.com>
7978 +
7979 + * kdb v4.4-2.6.16-rc4-common-1.
7980 +
7981 +2006-02-06 Keith Owens <kaos@sgi.com>
7982 +
7983 + * Change CONFIG_CRASH_DUMP to CONFIG_LKCD.
7984 + * Remove obsolete kdb_notifier_list.
7985 + * kdb v4.4-2.6.16-rc2-common-2.
7986 +
7987 +2006-02-06 Keith Owens <kaos@sgi.com>
7988 +
7989 + * Add xpcusers command. Dean Nelson, SGI.
7990 + * kdb v4.4-2.6.16-rc2-common-1.
7991 +
7992 +2006-02-02 Keith Owens <kaos@sgi.com>
7993 +
7994 + * Check if we have a console before using it for KDB.
7995 + * kdb v4.4-2.6.16-rc1-common-3.
7996 +
7997 +2006-02-01 Keith Owens <kaos@sgi.com>
7998 +
7999 + * Add option 'R' to the pid command to reset to the original task.
8000 + * Include 'pid R' in archkdb* commands to reset up the original failing
8001 + task. Users may have switched to other cpus and/or tasks before
8002 + issuing archkdb.
8003 + * Compile fix for kdbm_pg.c on i386.
8004 + * kdb v4.4-2.6.16-rc1-common-2.
8005 +
8006 +2006-01-18 Keith Owens <kaos@sgi.com>
8007 +
8008 + * kdb v4.4-2.6.16-rc1-common-1.
8009 +
8010 +2006-01-11 Keith Owens <kaos@sgi.com>
8011 +
8012 + * Plug a timing race between KDB_ENTER_SLAVE and KDB_ENTER, and allow
8013 + the cpu command to switch to a slave cpu.
8014 + * KDB_REASON_SILENT now waits for other cpus, to avoid spurious NMI
8015 + events that were seen on some Xeon systems.
8016 + * kdb v4.4-2.6.15-common-3.
8017 +
8018 +2006-01-08 Keith Owens <kaos@sgi.com>
8019 +
8020 + * kdb mainline invokes DIE_KDEBUG_ENTER and DIE_KDEBUG_LEAVE via
8021 + notify_die.
8022 + * Move xpc debug support from xpc to mainline kdb.
8023 + * kdbm_cm.c: check if file_lock_operations or lock_manager_operations
8024 + are set before dereferencing them. Felix Blyakher, SGI.
8025 + * kdb v4.4-2.6.15-common-2.
8026 +
8027 +2006-01-04 Keith Owens <kaos@sgi.com>
8028 +
8029 + * Print all buffers on a page in inode pages and update formatting to be
8030 + legible, too. David Chinner, SGI.
8031 + * Update page flags in kdbm_pg.
8032 + * Remove inline from *.c files.
8033 + * kdb v4.4-2.6.15-common-1.
8034 +
8035 +2005-12-25 Keith Owens <kaos@sgi.com>
8036 +
8037 + * kdb v4.4-2.6.15-rc7-common-1.
8038 +
8039 +2005-12-20 Keith Owens <kaos@sgi.com>
8040 +
8041 + * kdb v4.4-2.6.15-rc6-common-1.
8042 +
8043 +2005-12-10 Keith Owens <kaos@sgi.com>
8044 +
8045 + * Update mapping of flags to strings in kdbm_pg.c and kdbm_vm.c.
8046 + * kdb v4.4-2.6.15-rc5-common-3.
8047 +
8048 +2005-12-06 Keith Owens <kaos@sgi.com>
8049 +
8050 + * Add RECOVERY flag to global KDB flags.
8051 + * Add kdb_{save,restore}_flags.
8052 + * kdb v4.4-2.6.15-rc5-common-2.
8053 +
8054 +2005-12-05 Keith Owens <kaos@sgi.com>
8055 +
8056 + * kdb v4.4-2.6.15-rc5-common-1.
8057 +
8058 +2005-12-02 Keith Owens <kaos@sgi.com>
8059 +
8060 + * kdbm_vm.c: offsets of page macros should be unsigned long. Reported
8061 + by Dean Nelson, SGI.
8062 + * kdb v4.4-2.6.15-rc4-common-1.
8063 +
8064 +2005-11-30 Keith Owens <kaos@sgi.com>
8065 +
8066 + * New follow_page() API.
8067 + * kdb v4.4-2.6.15-rc3-common-1.
8068 +
8069 +2005-11-21 Keith Owens <kaos@sgi.com>
8070 +
8071 + * kdb v4.4-2.6.15-rc2-common-1.
8072 +
8073 +2005-11-15 Keith Owens <kaos@sgi.com>
8074 +
8075 + * kdb v4.4-2.6.15-rc1-common-1.
8076 +
8077 +2005-11-15 Keith Owens <kaos@sgi.com>
8078 +
8079 + * Allow kdb_printf() to be used outside kdb, in preemptible context.
8080 + * Build with CONFIG_SWAP=n. Reported by Leo Yuriev.
8081 + * kdb v4.4-2.6.14-common-2.
8082 +
8083 +2005-10-28 Keith Owens <kaos@sgi.com>
8084 +
8085 + * kdb v4.4-2.6.14-common-1.
8086 +
8087 +2005-10-21 Keith Owens <kaos@sgi.com>
8088 +
8089 + * kdb v4.4-2.6.14-rc5-common-1.
8090 +
8091 +2005-10-11 Keith Owens <kaos@sgi.com>
8092 +
8093 + * Handle removal of USB keyboard. Aaron Young, SGI.
8094 + * kdb v4.4-2.6.14-rc4-common-1.
8095 +
8096 +2005-10-05 Keith Owens <kaos@sgi.com>
8097 +
8098 + * Extend kdb_notifier_list() codes to include dumping.
8099 + * Use emergency_restart() for reboot, it can be called from interrupt
8100 + context, unlike machine_restart().
8101 + * kdb v4.4-2.6.14-rc3-common-1.
8102 +
8103 +2005-09-21 Keith Owens <kaos@sgi.com>
8104 +
8105 + * Support kdb_current_task in register display and modify commands.
8106 + * Document what changes kdb's notion of the current task.
8107 + * Update rd documentation for IA64.
8108 + * Move some definictions to kdbprivate.h and remove some unused symbol
8109 + exports.
8110 + * kdb v4.4-2.6.14-rc2-common-1.
8111 +
8112 +2005-09-20 Keith Owens <kaos@sgi.com>
8113 +
8114 + * Document IA64 handlers command.
8115 + * Add more fields to the task command.
8116 + * Cope with MCA/INIT handlers in the ps command.
8117 + * Namespace cleanup, delete unused exports, make some functions static.
8118 + * Add a kdb_notifier_list callback when kdb is about to reboot the
8119 + system.
8120 + * kdb v4.4-2.6.14-rc1-common-1.
8121 +
8122 +2005-08-29 Keith Owens <kaos@sgi.com>
8123 +
8124 + * kdb v4.4-2.6.13-common-1.
8125 +
8126 +2005-08-24 Keith Owens <kaos@sgi.com>
8127 +
8128 + * kdb v4.4-2.6.13-rc7-common-1.
8129 +
8130 +2005-08-08 Keith Owens <kaos@sgi.com>
8131 +
8132 + * kdb v4.4-2.6.13-rc6-common-1.
8133 +
8134 +2005-08-02 Keith Owens <kaos@sgi.com>
8135 +
8136 + * Print more fields from filp, dentry.
8137 + * Add kdb=on-nokey to suppress kdb entry from the keyboard.
8138 + * kdb v4.4-2.6.13-rc5-common-1.
8139 +
8140 +2005-07-30 Keith Owens <kaos@sgi.com>
8141 +
8142 + * kdb v4.4-2.6.13-rc4-common-1.
8143 +
8144 +2005-07-26 Keith Owens <kaos@sgi.com>
8145 +
8146 + * Fix compile problem with CONFIG_USB_KBD.
8147 + * kdb v4.4-2.6.13-rc3-common-3.
8148 +
8149 +2005-07-22 Keith Owens <kaos@sgi.com>
8150 +
8151 + * The asmlinkage kdb() patch was lost during packaging. Reinstate it.
8152 + * kdb v4.4-2.6.13-rc3-common-2.
8153 +
8154 +2005-07-19 Keith Owens <kaos@sgi.com>
8155 +
8156 + * Add support for USB keyboard (OHCI only). Aaron Young, SGI.
8157 + * kdb v4.4-2.6.13-rc3-common-1.
8158 +
8159 +2005-07-08 Keith Owens <kaos@sgi.com>
8160 +
8161 + * kdb v4.4-2.6.13-rc2-common-1.
8162 +
8163 +2005-07-01 Keith Owens <kaos@sgi.com>
8164 +
8165 + * Make kdb() asmlinkage to avoid problems with CONFIG_REGPARM.
8166 + * Change some uses of smp_processor_id() to be preempt safe.
8167 + * Use DEFINE_SPINLOCK().
8168 + * kdb v4.4-2.6.13-rc1-common-1.
8169 +
8170 +2005-06-18 Keith Owens <kaos@sgi.com>
8171 +
8172 + * kdb v4.4-2.6.12-common-1.
8173 +
8174 +2005-06-08 Keith Owens <kaos@sgi.com>
8175 +
8176 + * Correct early exit from bd *.
8177 + * kdb v4.4-2.6.12-rc6-common-1.
8178 +
8179 +2005-05-25 Keith Owens <kaos@sgi.com>
8180 +
8181 + * Delete Documentation/kdb/dump.txt. lkcd now has reasonable
8182 + integration with kdb.
8183 + * kdb v4.4-2.6.12-rc5-common-1.
8184 +
8185 +2005-05-08 Keith Owens <kaos@sgi.com>
8186 +
8187 + * kdb v4.4-2.6.12-rc4-common-1.
8188 +
8189 +2005-04-21 Keith Owens <kaos@sgi.com>
8190 +
8191 + * Add rpte command (find the pte for a physical page).
8192 + * kdb v4.4-2.6.12-rc3-common-1.
8193 +
8194 +2005-04-06 Keith Owens <kaos@sgi.com>
8195 +
8196 + * Add rq and rqa commands. John Hawkes, SGI.
8197 + * kdb v4.4-2.6.12-rc2-common-1.
8198 +
8199 +2005-03-29 Keith Owens <kaos@sgi.com>
8200 +
8201 + * Use register_sysctl_table() instead of patching kernel/sysctl.c.
8202 + * Non-ASCII characters are not printable.
8203 + * kdb v4.4-2.6.12-rc1-common-1.
8204 +
8205 +2005-03-15 Keith Owens <kaos@sgi.com>
8206 +
8207 + * More coexistence patches for lkcd. Jason Uhlenkott, SGI.
8208 + * kdb v4.4-2.6.11-common-3.
8209 +
8210 +2005-03-08 Keith Owens <kaos@sgi.com>
8211 +
8212 + * Coexistence patches for lkcd. Jason Uhlenkott, SGI.
8213 + * kdb v4.4-2.6.11-common-2.
8214 +
8215 +2005-03-03 Keith Owens <kaos@sgi.com>
8216 +
8217 + * Add kdb to drivers/serial/8250_early.c. Francois Wellenreiter, Bull.
8218 + * kdb v4.4-2.6.11-common-1.
8219 +
8220 +2005-02-14 Keith Owens <kaos@sgi.com>
8221 +
8222 + * kdb v4.4-2.6.11-rc4-common-1.
8223 +
8224 +2005-02-08 Keith Owens <kaos@sgi.com>
8225 +
8226 + * kdb v4.4-2.6.11-rc3-bk4-common-1.
8227 +
8228 +2005-02-03 Keith Owens <kaos@sgi.com>
8229 +
8230 + * Print more superblock fields. Nathan Scott, SGI.
8231 + * Remove kallsyms correction for modules, Linus took it.
8232 + * kdb v4.4-2.6.11-rc3-common-1.
8233 +
8234 +2005-01-27 Keith Owens <kaos@sgi.com>
8235 +
8236 + * Add bio command. Nathan Scott, SGI.
8237 + * kdb v4.4-2.6.11-rc2-common-1.
8238 +
8239 +2005-01-20 Keith Owens <kaos@sgi.com>
8240 +
8241 + * Include kallsyms correction for modules until Linus takes it.
8242 + * kdb v4.4-2.6.11-rc1-bk7-common-1.
8243 +
8244 +2005-01-12 Keith Owens <kaos@sgi.com>
8245 +
8246 + * kallsyms now supports all symbols properly, remove kdb patch.
8247 + * Add last ditch allocator for debugging.
8248 + * Update kdb_meminfo_read_proc() for vmalloc changes.
8249 + * Update kdbm_vm.c for 4 level page tables.
8250 + * kdb v4.4-2.6.11-rc1-common-1.
8251 +
8252 +2004-12-25 Keith Owens <kaos@sgi.com>
8253 +
8254 + * Add kobject command.
8255 + * Ignore low addresses and large offsets in kdbnearsym().
8256 + * Console updates for sn2 simulator.
8257 + * kdb v4.4-2.6.10-common-1.
8258 +
8259 +2004-12-07 Keith Owens <kaos@sgi.com>
8260 +
8261 + * kdb v4.4-2.6.10-rc3-common-1.
8262 +
8263 +2004-11-23 Keith Owens <kaos@sgi.com>
8264 +
8265 + * Remove warning message from kdb_get_one_user_page(), it was too noisy.
8266 + * kdb v4.4-2.6.10-rc2-common-1.
8267 +
8268 +2004-11-02 Keith Owens <kaos@sgi.com>
8269 +
8270 + * Build with kdb patch applied but CONFIG_KDB=n.
8271 + * kdb v4.4-2.6.10-rc1-common-2.
8272 +
8273 +2004-10-29 Keith Owens <kaos@sgi.com>
8274 +
8275 + * Handle new compression scheme for kallsyms.
8276 + * Handle move of DEAD and ZOMBIE for task->state to task->exit_state.
8277 + * Tweak the concept of a valid kernel address to get all symbols,
8278 + including the symbols in the ia64 gate page.
8279 + * kdb v4.4-2.6.10-rc1-common-1.
8280 +
8281 +2004-10-21 Keith Owens <kaos@sgi.com>
8282 +
8283 + * Handle variable size for the kernel log buffer.
8284 + * kdb v4.4-2.6.9-common-2.
8285 +
8286 +2004-10-19 Keith Owens <kaos@sgi.com>
8287 +
8288 + * kdb v4.4-2.6.9-common-1.
8289 +
8290 +2004-10-12 Keith Owens <kaos@sgi.com>
8291 +
8292 + * kdb v4.4-2.6.9-rc4-common-1.
8293 +
8294 +2004-10-01 Keith Owens <kaos@sgi.com>
8295 +
8296 + * kdb v4.4-2.6.9-rc3-common-1.
8297 +
8298 +2004-09-30 Keith Owens <kaos@sgi.com>
8299 +
8300 + * Add stackdepth command to Documentation/kdb/kdb.mm. stackdepth is
8301 + only supported on i386 and ia64 at the moment.
8302 + * Skip kdbm_pg memmap build on x86_64. Scott Lurndal, 3leafnetworks.
8303 + * Export kdb_serial_str for modular I/O. Bryan Cardillo, UPenn.
8304 + * Reinstate tab completion for symbols.
8305 + * kdb v4.4-2.6.9-rc2-common-2.
8306 +
8307 +2004-09-14 Keith Owens <kaos@sgi.com>
8308 +
8309 + * Add task states C (traCed) and E (dEad).
8310 + * kdb v4.4-2.6.9-rc2-common-1.
8311 +
8312 +2004-08-27 Keith Owens <kaos@sgi.com>
8313 +
8314 + * kdb v4.4-2.6.9-rc1-common-1.
8315 +
8316 +2004-08-14 Keith Owens <kaos@sgi.com>
8317 +
8318 + * kdb v4.4-2.6.8-common-1.
8319 +
8320 +2004-08-12 Keith Owens <kaos@sgi.com>
8321 +
8322 + * kdb v4.4-2.6.8-rc4-common-1.
8323 +
8324 +2004-08-05 Keith Owens <kaos@sgi.com>
8325 +
8326 + * Mark kdb_initcall as __attribute_used__ for newer gcc.
8327 + * kdb v4.4-2.6.8-rc3-common-2.
8328 +
8329 +2004-08-04 Keith Owens <kaos@sgi.com>
8330 +
8331 + * Add mdp (memory display physical) comnmand.
8332 + Ananth N Mavinakayanahalli, IBM.
8333 + * kdb v4.4-2.6.8-rc3-common-1.
8334 +
8335 +2004-07-18 Keith Owens <kaos@sgi.com>
8336 +
8337 + * Patch for new sn_console. Erik Jacobson. SGI.
8338 + * kdb v4.4-2.6.8-rc2-common-1.
8339 +
8340 +2004-07-12 Keith Owens <kaos@sgi.com>
8341 +
8342 + * Convert kdbm_task to standard cpumask_t.
8343 + * Document '*' (all breakpoints) option on bd/be/bc commands.
8344 + * kdb v4.4-2.6.8-rc1-common-1.
8345 +
8346 +2004-06-30 Keith Owens <kaos@sgi.com>
8347 +
8348 + * Common changes to help the x86-64 port.
8349 + * kdb v4.4-2.6.7-common-3.
8350 +
8351 +2004-06-20 Keith Owens <kaos@sgi.com>
8352 +
8353 + * Move kdb includes in mm/swapfile.c to reduce conflicts with other
8354 + SGI patches.
8355 + * kdb v4.4-2.6.7-common-2.
8356 +
8357 +2004-06-16 Keith Owens <kaos@sgi.com>
8358 +
8359 + * kdb v4.4-2.6.7-common-1.
8360 +
8361 +2004-06-09 Keith Owens <kaos@sgi.com>
8362 +
8363 + * kdb v4.4-2.6.7-rc3-common-1.
8364 +
8365 +2004-06-09 Keith Owens <kaos@sgi.com>
8366 +
8367 + * Namespace clean up. Mark code/variables as static when it is only
8368 + used in one file, delete dead code/variables.
8369 + * Saved interrupt state requires long, not int.
8370 + * kdb v4.4-2.6.7-rc2-common-3.
8371 +
8372 +2004-06-08 Keith Owens <kaos@sgi.com>
8373 +
8374 + * Whitespace clean up, no code changes.
8375 + * kdb v4.4-2.6.7-rc2-common-2.
8376 +
8377 +2004-06-07 Keith Owens <kaos@sgi.com>
8378 +
8379 + * kdb v4.4-2.6.7-rc2-common-1.
8380 +
8381 +2004-06-06 Keith Owens <kaos@sgi.com>
8382 +
8383 + * Avoid recursion problems in kdb_init().
8384 + * Add standard archkdb commands.
8385 + * Add per_cpu command.
8386 + * Move kdb_{get,put}userarea_size definitions to linux/kdb.h.
8387 + * kdb v4.4-2.6.6-common-2.
8388 +
8389 +2004-05-23 Keith Owens <kaos@sgi.com>
8390 +
8391 + * Shrink the output from the cpu command.
8392 + * Add cpu state 'I', the cpu is idle.
8393 + * Add cpu state '+', some kdb data is available but the cpu is not
8394 + responding.
8395 + * Do not print tasks in state I or M by default in ps and bta commands.
8396 + * Add states I (idle task) and M (sleeping system daemon) to ps and
8397 + bta commands.
8398 + * Delete unused variables.
8399 + * Move private kdb fields from kdb.h to kdbprivate.h.
8400 + * Print 'for keyboard entry' for the special cases when KDB_ENTER() is
8401 + used to get registers.
8402 + * Move bfd.h and ansidecl.h from arch/$(ARCH)/kdb to include/asm-$(ARCH)
8403 + and remove -I arch/$(ARCH)/kdb.
8404 + * dmesg command now prints from either the start or end of dmesg, or at
8405 + an arbitrary point in the middle of the kernel log buffer.
8406 + * Sensible string dump for multi byte md commands.
8407 + * 'page' command handles ia64 correctly.
8408 + * Show some activity when waiting for cpus to enter kdb.
8409 + * Change the KDB entry code to <esc>KDB.
8410 + * Allow comment commands, starting with '#'.
8411 + * Commands defined using defcmd from kdb_cmds are not printed as they
8412 + are entered, use defcmd with no parameters to print all the defined
8413 + commands.
8414 + * Add summary command.
8415 + * Update copyright notices.
8416 + * Zero suppression on md command.
8417 + * Make set NOSECT=1 the default.
8418 + * PPC64 uses OF-stdout instead of console. Ananth N Mavinakayanahalli.
8419 + * kdb v4.4-2.6.6-common-1.
8420 +
8421 +2004-05-10 Keith Owens <kaos@sgi.com>
8422 +
8423 + * kdb v4.3-2.6.6-common-1.
8424 +
8425 +2004-05-06 Keith Owens <kaos@sgi.com>
8426 +
8427 + * kdb v4.3-2.6.6-rc3-common-1.
8428 +
8429 +2004-05-06 Keith Owens <kaos@sgi.com>
8430 +
8431 + * kdb v4.3-2.6.6-rc2-common-1.
8432 +
8433 +2004-04-30 Keith Owens <kaos@sgi.com>
8434 +
8435 + * Rewrite inode_pages command for new radix code in struct page.
8436 + * kdb v4.3-2.6.6-rc1-common-1.
8437 +
8438 +2004-04-11 Keith Owens <kaos@sgi.com>
8439 +
8440 + * Unlock sn_sal_lock before entering kdb from sn_serial.
8441 + * kdb v4.3-2.6.5-common-2.
8442 +
8443 +2004-04-05 Keith Owens <kaos@sgi.com>
8444 +
8445 + * kdb v4.3-2.6.5-common-1.
8446 +
8447 +2004-03-22 Keith Owens <kaos@sgi.com>
8448 +
8449 + * kdb v4.3-2.6.5-rc2-common-1.
8450 +
8451 +2004-03-12 Keith Owens <kaos@sgi.com>
8452 +
8453 + * More work to avoid spurious messages from WARN_CONSOLE_UNLOCKED().
8454 + * bh command bug fixes. Nathan Scott.
8455 + * kdb v4.3-2.6.4-common-1.
8456 +
8457 +2004-03-06 Keith Owens <kaos@sgi.com>
8458 +
8459 + * Set KDB_IS_RUNNING() during kdb_init to avoid spurious messages from
8460 + WARN_CONSOLE_UNLOCKED().
8461 + * Correct loss of symbol names in kdbnearsym.
8462 + * kdb v4.3-2.6.4-rc2-common-1.
8463 +
8464 +2004-02-29 Keith Owens <kaos@sgi.com>
8465 +
8466 + * kdb v4.3-2.6.4-rc1-common-1.
8467 +
8468 +2004-02-21 Keith Owens <kaos@sgi.com>
8469 +
8470 + * Correct build of kdb_cmds when using a separate object directory and
8471 + make it quiet. j-nomura (NEC), Keith Owens.
8472 + * kdb v4.3-2.6.3-common-2.
8473 +
8474 +2004-02-18 Keith Owens <kaos@sgi.com>
8475 +
8476 + * kdb v4.3-2.6.3-common-1.
8477 +
8478 +2004-02-17 Keith Owens <kaos@sgi.com>
8479 +
8480 + * Remove WAR for incorrect console registration patch.
8481 + * kdb v4.3-2.6.3-rc4-common-1.
8482 +
8483 +2004-02-17 Keith Owens <kaos@sgi.com>
8484 +
8485 + * Convert longjmp buffers from static to dynamic allocation, for large
8486 + cpu counts.
8487 + * Tweak kdbm_task for SMP/UP.
8488 + * Reconcile with kdb-v4.3 2.4.25-rc1-common-1.
8489 + * Simplify coexistence with NPTL patches.
8490 + * Support kill command on new scheduler.
8491 + * Do not refetch data when printing a value as characters.
8492 + * Document the pid command.
8493 + * Work around 2.6 kallsyms 'feature'.
8494 + * Upgrade to 2.6.3-rc3.
8495 + * WAR for incorrect console registration patch.
8496 + * kdb v4.3-2.6.3-rc3-common-1.
8497 +
8498 +2003-12-03 Keith Owens <kaos@sgi.com>
8499 +
8500 + * Reconcile 2.6-test versions from Xavier Bru (Bull), Greg Banks (SGI),
8501 + Jim Houston (Concurrent Computer Corp).
8502 + * Reconcile with kdb v4.3-2.4.23-common-2.
8503 + * Clean up CONFIG_KDB changes to {scripts,kernel}/kallsyms.c.
8504 + * Correct handling of kdb command line arguments.
8505 + * Make hooks into module code less intrusive.
8506 + * Delete kdb_active_task, not required with O(1) scheduler.
8507 + * Port kdbm_task.c from 2.4.
8508 + * Disable debug check in exit.c::next_thread() when kdb is running.
8509 + * Remove "only bh_disable when interrupts are set". BH must be disabled
8510 + in kdb to prevent deadlock on breakpoints in interrupt handlers.
8511 + * Add kdb to drivers/char/sn_serial.c.
8512 + * kdb v4.3-2.6.0-test11-common-1.
8513 +
8514 +2003-11-11 Xavier Bru <xavier.bru@bull.net>
8515 + * Merge to 2.6.0-test9
8516 +2003-10-17 Xavier Bru <xavier.bru@bull.net>
8517 + * fix NUll ptr in kdb_ps at early prompt.
8518 +2003-10-14 Xavier Bru <xavier.bru@bull.net>
8519 + * fix NUll ptr in kdb_ps when cpu not present.
8520 +2003-10-06 Xavier Bru <xavier.bru@bull.net>
8521 + * Merge to 2.6.0-test5
8522 + * fix compile error with CONFIG_MODULES not set.
8523 +
8524 +2003-09-08 Xavier Bru <xavier.bru@bull.net>
8525 + * Merge to 2.6.0-test4
8526 +
8527 +2003-07-10 Xavier Bru <xavier.bru@bull.net>
8528 +
8529 + * Merge kdb v4.3 to 2.5.72 ia64
8530 + * don't call local_bh_enable() with interrupts masked.
8531 +
8532 +2003-04-07 Xavier Bru <xavier.bru@bull.net>
8533 +
8534 + * Merge kdb v4.1 to 2.5.64 ia64
8535 + * new kernel parameters support
8536 + * new module format
8537 + * new kallsyms support
8538 +
8539 +2003-12-02 Keith Owens <kaos@sgi.com>
8540 +
8541 + * Use correct page alignment in kdb_get_one_user_page().
8542 + Prasanna S Panchamukhi, IBM.
8543 + * Split pte command into pte -m and pte -p. Dean Roe, SGI.
8544 + * kdb v4.3-2.4.23-common-2.
8545 +
8546 +2003-12-01 Keith Owens <kaos@sgi.com>
8547 +
8548 + * kdb v4.3-2.4.23-common-1.
8549 +
8550 +2003-11-11 Keith Owens <kaos@sgi.com>
8551 +
8552 + * Make KDB for USB keyboards build. Peter T. Breuer.
8553 + * Do not use USB keyboard if it has not been probed.
8554 + * kdb v4.3-2.4.23-rc1-common-1.
8555 +
8556 +2003-10-10 Keith Owens <kaos@sgi.com>
8557 +
8558 + * Sync with XFS 2.4.22 tree.
8559 + * kdb v4.3-2.4.22-common-2.
8560 +
8561 +2003-08-29 Keith Owens <kaos@sgi.com>
8562 +
8563 + * kdb v4.3-2.4.22-common-1.
8564 +
8565 +2003-07-27 Keith Owens <kaos@sgi.com>
8566 +
8567 + * kdb v4.3-2.4.22-pre8-common-8.
8568 +
8569 +2003-07-20 Keith Owens <kaos@sgi.com>
8570 +
8571 + * Make kdb_serial_str a common constant, the same for all consoles.
8572 + * Support SGI L1 console.
8573 + * kdb v4.3-2.4.21-common-8.
8574 +
8575 +2003-07-14 Keith Owens <kaos@sgi.com>
8576 +
8577 + * Correct ll command.
8578 + * kdb v4.3-2.4.21-common-7.
8579 +
8580 +2003-07-08 Keith Owens <kaos@sgi.com>
8581 +
8582 + * Export more kdb symbols. Vamsi Krishna S., IBM.
8583 + * kdb v4.3-2.4.21-common-6.
8584 +
8585 +2003-07-07 Keith Owens <kaos@sgi.com>
8586 +
8587 + * Tweak 'waiting for cpus' message.
8588 + * kdb v4.3-2.4.21-common-5.
8589 +
8590 +2003-07-07 Keith Owens <kaos@sgi.com>
8591 +
8592 + * 2.4.21-ia64-030702 patches common code that affects kdb. Workaround
8593 + this nuisance.
8594 + * kdb v4.3-2.4.21-common-4.
8595 +
8596 +2003-06-24 Keith Owens <kaos@sgi.com>
8597 +
8598 + * Add task and sigset commands. Mark Goodwin, SGI.
8599 + * kdb v4.3-2.4.21-common-3.
8600 +
8601 +2003-06-23 Keith Owens <kaos@sgi.com>
8602 +
8603 + * Sync with XFS 2.4.21 tree.
8604 + * kdb v4.3-2.4.21-common-2.
8605 +
8606 +2003-06-20 Keith Owens <kaos@sgi.com>
8607 +
8608 + * kdb v4.3-2.4.21-common-1.
8609 +
8610 +2003-06-20 Keith Owens <kaos@sgi.com>
8611 +
8612 + * More details on vm command, add vmp and pte commands.
8613 + Dean Nelson, Dean Roe, SGI.
8614 + * YAO1SCF (Yet Another O(1) Scheduler Coexistence Fix).
8615 + * Changes to common code to build on sparc. Tom Duffy.
8616 + * Move Tom Duffy's changes to drivers/sbus from the sparc64
8617 + patch to the common patch to keep all the serial changes
8618 + together.
8619 + * Changes to common code to build on Xscale. Eddie Dong, Intel.
8620 + * Remove CROSS_COMPILE_INC.
8621 + * Remove obsolete boot parameter 'kdb', long since replaced by
8622 + 'kdb=on'.
8623 + * Remove obsolete kdb_eframe_t casts.
8624 + * Add CONFIG_KDB_CONTINUE_CATASTROPHIC.
8625 + * Wait a short interval for cpus to join kdb before proceeding.
8626 + * Automatically enable sysrq for sr command.
8627 + * Correct double free of kdb_printf lock, spotted by Richard Sanders.
8628 + * Add optional cpu parameter to btc command.
8629 + * kdb v4.3-2.4.20-common-1.
8630 +
8631 +2003-05-02 Keith Owens <kaos@sgi.com>
8632 +
8633 + * Some architectures have problems with the initial empty kallsyms
8634 + section so revert to three kallsyms passes.
8635 + * Flush buffered input at startup and at 'more' prompt.
8636 + * Only print 'more' prompt when longjmp data is available.
8637 + * Print more data for buffers and inodes.
8638 + * Disable kill command when O(1) scheduler is installed, the code
8639 + needs to be redone for O(1).
8640 + * The kernel has an undocumented assumption that enable_bh() is
8641 + always called with interrupts enabled, make it so.
8642 + * Print trailing punctuation even for symbols that are not in kernel.
8643 + * Add read/write access to user pages. Vamsi Krishna S., IBM
8644 + * Rename cpu_is_online to cpu_online, as in 2.5.
8645 + * O(1) scheduler removes init_task so kdb maintains its own list of
8646 + active tasks.
8647 + * Delete btp 0 <cpuid> option, it needed init_tasks.
8648 + * Clean up USB keyboard support. Steven Dake.
8649 + * Sync with XFS 2.4.20 tree.
8650 + * kdb v4.2-2.4.20-common-1.
8651 +
8652 +2003-04-04 Keith Owens <kaos@sgi.com>
8653 +
8654 + * Remove one kallsyms pass.
8655 + * Automatic detection of O(1) scheduler.
8656 + * Rename cpu_online to cpu_is_online.
8657 + * Workarounds for scheduler bugs.
8658 + * Tweak algorithm for detecting if cpu process data is available.
8659 + * Add 'kill' command. Sonic Zhang, Keith Owens.
8660 + * kdb v4.1-2.4.20-common-1.
8661 +
8662 +2003-03-16 Keith Owens <kaos@sgi.com>
8663 +
8664 + * Each cpu saves its state as it enters kdb or before it enters code
8665 + which cannot call kdb.
8666 + * Allow btp on process 0 for a specified cpu.
8667 + * Add btt command, backtrace given a struct task address.
8668 + * btc command no longer switches cpus, instead it uses the saved data.
8669 + * bta shows the idle task on each cpu as well as real tasks, the idle
8670 + task could be handling an interrupt.
8671 + * ps command shows the idle task on each cpu.
8672 + * ps checks that the saved data for a cpu matches the process running on
8673 + that cpu and warns about stale saved data or no saved data at all.
8674 + * Remove special cases for i386 backtrace from common code and simplify
8675 + common bt code.
8676 + * Clean up kdb interaction with CONFIG_SERIAL_CONSOLE.
8677 + * Do not automatically repeat commands after the user typed 'q'.
8678 + * O(1) scheduler patch changes the process cpu field but does not set
8679 + any indicator that O(1) is being used. Adjust kdb_process_cpu() by
8680 + hand after applying O(1).
8681 + * Add kdb_print_nameval() to common code.
8682 + * Convert tests of cpu_online_map to cpu_online() macro.
8683 + * module.h needs errno.h when compiling with CONFIG_MODULES=n.
8684 + * Correct duplicate breakpoint handling.
8685 + * Do not try to send IPI during a catastrophic error, send_ipi can hang
8686 + and take kdb with it.
8687 + * kdb memmap command is i386 only, restrict it.
8688 + * Add large block device (LBD) support from XFS tree. Eric Sandeen.
8689 + * kdb v4.0-2.4.20-common-1.
8690 +
8691 +2003-02-03 Keith Owens <kaos@sgi.com>
8692 +
8693 + * Register kdb commands early.
8694 + * Decode oops via kallsyms if it is available.
8695 + * Update copyright notices to 2003.
8696 + * Add defcmd/endefcmd to allow users to package their own macros.
8697 + * kdb commands that fail are ignored when prefixed with '-'.
8698 + * Add selection options to bta command.
8699 + * Add btc command (switch to each cpu and backtrace).
8700 + * Do real time detection of dead cpus.
8701 + * Clear ip adjusted flag when leaving kdb.
8702 + * Clean up ps command.
8703 + * Print ps output for each task when backtracing.
8704 + * Bump to version v3.0 to reduce confusion between kdb and kernel
8705 + version numbers.
8706 + * Add kdba_local_arch_setup/kdba_local_arch_cleanup to correct
8707 + keyboard freeze. Ashish Kalra.
8708 + * Refuse multiple breakpoints at the same address.
8709 + * Add fl (file_lock) command, from XFS development tree.
8710 + * Correct inode_pages, from XFS development tree.
8711 + * Add command history and editing. Sonic Zhang.
8712 + * Extend command history and editing to handle vt100 escape sequences.
8713 + * Allow tab completion at start of line.
8714 + * Touch nmi watchdog on long running bta and btc commands.
8715 + * Clean up ps output and standardize with bta codes.
8716 + * Correctly handle escaped characters in commands.
8717 + * Update man pages for btc and command history/editing.
8718 + * kdb v3.0-2.4.20-common-1.
8719 +
8720 +2002-11-29 Keith Owens <kaos@sgi.com>
8721 +
8722 + * Upgrade to 2.4.20.
8723 + * Correct Documentation/kdb/kdb_sr.man.
8724 + * Remove leading zeroes from pids, they are decimal, not octal.
8725 + * kdb v2.5-2.4.20-common-1.
8726 +
8727 +2002-11-14 Keith Owens <kaos@sgi.com>
8728 +
8729 + * Upgrade to 2.4.20-rc1.
8730 + * kdb v2.5-2.4.20-rc1-common-1.
8731 +
8732 +2002-11-14 Keith Owens <kaos@sgi.com>
8733 +
8734 + * Fix processing with O(1) scheduler.
8735 + * 'go' switches back to initial cpu first.
8736 + * 'go <address>' only allowed on initial cpu.
8737 + * 'go' installs the global breakpoints from the initial cpu before
8738 + releasing the other cpus.
8739 + * If 'go' has to single step over a breakpoint then it single steps just
8740 + the initial cpu, installs the global breakpoints then releases the
8741 + other cpus.
8742 + * General clean up of handling for breakpoints and single stepping over
8743 + software breakpoints.
8744 + * Add kdb_notifier_block so other code can tell when kdb is in control.
8745 + * kdb v2.5-2.4.19-common-1.
8746 +
8747 +2002-11-02 Keith Owens <kaos@sgi.com>
8748 +
8749 + * Correct build without CONFIG_KDB.
8750 + * kdb v2.4-2.4.19-common-3.
8751 +
8752 +2002-11-01 Keith Owens <kaos@sgi.com>
8753 +
8754 + * Minimize differences from 2.5.44.
8755 + * kdb v2.4-2.4.19-common-2.
8756 +
8757 +2002-10-31 Keith Owens <kaos@sgi.com>
8758 +
8759 + * Add defcmd/endefcmd feature.
8760 + * Remove kdb_eframe_t.
8761 + * Clear bp data before using.
8762 + * Sanity check if we have pt_regs.
8763 + * Force LINES > 1.
8764 + * Remove special case for KDB_REASON_PANIC, use KDB_ENTER() instead.
8765 + * Remove kdba_getcurrentframe().
8766 + * Coexist with O(1) scheduler.
8767 + * Add lines option to dmesg, speed up dmesg.
8768 + * kdb v2.4-2.4.19-common-1.
8769 +
8770 +2002-10-17 Keith Owens <kaos@sgi.com>
8771 +
8772 + * Add selection critera to ps and bta commands.
8773 + * kdb v2.3-2.4.19-common-4.
8774 +
8775 +2002-10-07 Keith Owens <kaos@sgi.com>
8776 +
8777 + * New man page, Documentation/kdb/kdb_sr.man.
8778 +
8779 +2002-10-04 Keith Owens <kaos@sgi.com>
8780 +
8781 + * Minimize differences between patches for 2.4 and 2.5 kernels.
8782 + * Add Configure.help for CONFIG_KDB_USB.
8783 + * Reduce stack usage.
8784 + * kdb v2.3-2.4.19-common-3.
8785 +
8786 +2002-08-10 Keith Owens <kaos@sgi.com>
8787 +
8788 + * Replace kdb_port with kdb_serial to support memory mapped I/O.
8789 + David Mosberger.
8790 + * kdb v2.3-2.4.19-common-2.
8791 +
8792 +2002-08-07 Keith Owens <kaos@sgi.com>
8793 +
8794 + * Upgrade to 2.4.19.
8795 + * Remove individual SGI copyrights, the general SGI copyright applies.
8796 + * Handle md0. Reported by Hugh Dickins, different fix by Keith Owens.
8797 + * Use page_address() in kdbm_pg.c. Hugh Dickins.
8798 + * Remove debugging printk from kdbm_pg.c. Hugh Dickins.
8799 + * Move breakpoint address verification into arch dependent code.
8800 + * Dynamically resize kdb command table as required.
8801 + * Common code to support USB keyboard. Sebastien Lelarge.
8802 + * kdb v2.3-2.4.19-common-1.
8803 +
8804 +2002-07-09 Keith Owens <kaos@sgi.com>
8805 +
8806 + * Upgrade to 2.4.19-rc1.
8807 + * Add dmesg command.
8808 + * Clean up copyrights, Eric Sandeen.
8809 + * kdb v2.2-2.4.19-rc1-common-1.
8810 +
8811 +2002-06-14 Keith Owens <kaos@sgi.com>
8812 +
8813 + * Upgrade to 2.4.19-pre10.
8814 + * Sync with XFS.
8815 + * kdb v2.1-2.4.19-pre10-common-1.
8816 +
8817 +2002-04-09 Keith Owens <kaos@sgi.com>
8818 +
8819 + * Upgrade to 2.4.19-pre6.
8820 + * kdb v2.1-2.4.19-pre6-common-1.
8821 +
8822 +2002-03-18 Keith Owens <kaos@sgi.com>
8823 +
8824 + * Syntax check mdWcN commands.
8825 +
8826 +2002-03-01 Keith Owens <kaos@sgi.com>
8827 +
8828 + * Sync with XFS 2.4.18.
8829 + * kdb v2.1-2.4.18-common-2.
8830 +
8831 +2002-02-26 Keith Owens <kaos@sgi.com>
8832 +
8833 + * Upgrade to 2.4.18.
8834 + * Add Paul Dorwin (IBM) magicpoint slides on using kdb as
8835 + Documentation/kdb/slides.
8836 + * kdb v2.1-2.4.18-common-1.
8837 +
8838 +2002-01-23 Keith Owens <kaos@sgi.com>
8839 +
8840 + * Sync with XFS pagebuf changes.
8841 + * kdb v2.1-2.4.17-common-2.
8842 +
8843 +2002-01-18 Keith Owens <kaos@sgi.com>
8844 +
8845 + * Ignore single stepping during panic.
8846 + * Remove kdba_getword, kdba_putword. Replace with kdb_getword,
8847 + kdb_putword that rely on copy_xx_user. The new functions return
8848 + an error code, like copy_xx_user.
8849 + * New functions kdb_getarea, kdb_putarea for copying areas of data
8850 + such as structures. These functions also return an error code.
8851 + * Change all common code to use the new functions.
8852 + * bp command checks that it can read and write the word at the
8853 + breakpoint before accepting the address.
8854 + * Break points are now set FIFO and cleared LIFO so overlapping
8855 + entries give sensible results.
8856 + * Verify address before disassembling code.
8857 + * Common changes for sparc64. Ethan Solomita, Tom Duffy.
8858 + * Remove ss <count>, never supported.
8859 + * Remove kallsyms entries from arch vmlinux.lds files.
8860 + * Specify which commands auto repeat.
8861 + * kdb v2.1-2.4.17-common-1.
8862 +
8863 +2002-01-07 Keith Owens <kaos@sgi.com>
8864 +
8865 + * Remove console semaphore code, not good in interrupt.
8866 + * Remove fragment of ia64 patch that had crept into kdb.
8867 + * Release as kdb v2.0-2.4.17-common-3.
8868 +
8869 +2002-01-04 Keith Owens <kaos@sgi.com>
8870 +
8871 + * Sync xfs <-> kdb common code.
8872 +
8873 +2001-12-22 Keith Owens <kaos@sgi.com>
8874 +
8875 + * Upgrade to 2.4.17.
8876 + * Clean up ifdef CONFIG_KDB.
8877 + * Add ifdef CONFIG_KDB around include kdb.h.
8878 + * Delete dummy kdb.h files for unsupported architectures.
8879 + * Delete arch i386 and ia64 specific files. This changelog now
8880 + applies to kdb common code only.
8881 + * Release as kdb v2.0-2.4.17-common-1.
8882 +
8883 +2001-12-03 Keith Owens <kaos@sgi.com>
8884 +
8885 + * Upgrade to 2.4.16.
8886 + * Add include/asm-um/kdb.h stub to allow XFS to be tested under UML.
8887 + * Check if an interrupt frame on i386 came from user space.
8888 + * Out of scope bug fix in kdb_id.c. Ethan Solomita.
8889 + * Changes to common code to support sparc64. Ethan Solomita.
8890 + * Change GFP_KERNEL to GFP_ATOMIC in disasm. Ethan Solomita.
8891 +
8892 +2001-11-16 Keith Owens <kaos@sgi.com>
8893 +
8894 + * Upgrade to 2.4.15-pre5.
8895 + * Wrap () around #define expressions with unary operators.
8896 +
8897 +2001-11-13 Keith Owens <kaos@sgi.com>
8898 +
8899 + * Upgrade to 2.4.15-pre4.
8900 + * kbdm_pg.c patch from Hugh Dickins.
8901 +
8902 +2001-11-07 Keith Owens <kaos@sgi.com>
8903 +
8904 + * Upgrade to 2.4.14-ia64-011105.
8905 + * Change name of l1 serial I/O routine, add ia64 init command. SGI.
8906 + * Sync kdbm_pg with XFS.
8907 +
8908 +2001-11-06 Keith Owens <kaos@sgi.com>
8909 +
8910 + * Upgrade to kernel 2.4.14.
8911 +
8912 +2001-11-02 Keith Owens <kaos@sgi.com>
8913 +
8914 + * Sync kdbm_pg.c with XFS.
8915 +
8916 +2001-10-24 Keith Owens <kaos@sgi.com>
8917 +
8918 + * Upgrade to kernel 2.4.13.
8919 +
8920 +2001-10-14 Keith Owens <kaos@melbourne.sgi.com>
8921 +
8922 + * More use of TMPPREFIX in top level Makefile to speed up NFS compiles.
8923 +
8924 + * Correct repeat calculations in md/mds commands.
8925 +
8926 +2001-10-10 Keith Owens <kaos@melbourne.sgi.com>
8927 +
8928 + * Copy bfd.h and ansidecl.h to arch/$(ARCH)/kdb, remove dependecies on
8929 + user space includes.
8930 +
8931 + * Update kdb v1.9 to kernel 2.4.11.
8932 +
8933 +2001-10-01 Keith Owens <kaos@melbourne.sgi.com>
8934 +
8935 + * Update kdb v1.9 to kernel 2.4.11-pre1 and 2.4.10-ac1.
8936 +
8937 + * Correct loop in kdb_parse, reported by Tachino Nobuhiro.
8938 +
8939 +2001-09-25 Keith Owens <kaos@melbourne.sgi.com>
8940 +
8941 + * Update kdb v1.8 to kernel 2.4.10.
8942 +
8943 + * kdbm_pg patch from Hugh Dickens.
8944 +
8945 + * DProbes patch from Bharata B Rao.
8946 +
8947 + * mdWcn and mmW patch from Vamsi Krishna S.
8948 +
8949 + * i386 disasm layout patch from Jean-Marc Saffroy.
8950 +
8951 + * Work around for 64 bit binutils, Simon Munton.
8952 +
8953 + * kdb.mm doc correction by Chris Pascoe.
8954 +
8955 + * Enter repeats the last command, IA64 disasm only prints one
8956 + instruction. Don Dugger.
8957 +
8958 + * Allow kdb/modules to be linked into vmlinux.
8959 +
8960 + * Remove obsolete code from kdb/modules/kdbm_{pg,vm}.c.
8961 +
8962 + * Warn when commands are entered at more prompt.
8963 +
8964 + * Add MODULE_AUTHOR, DESCRIPTION, LICENSE.
8965 +
8966 + * Release as kdb v1.9.
8967 +
8968 +2001-02-27 Keith Owens <kaos@melbourne.sgi.com>
8969 +
8970 + * Update kdb v1.8 to kernel 2.4.2, sync kdb/modules with XFS.
8971 +
8972 + * Hook into panic() call.
8973 +
8974 +2000-12-18 Keith Owens <kaos@melbourne.sgi.com>
8975 +
8976 + * Update kdb v1.7 to kernel 2.4.0-test13-pre3, sync kdb/modules with
8977 + XFS.
8978 +
8979 +2000-11-18 Keith Owens <kaos@melbourne.sgi.com>
8980 +
8981 + * Update to kernel 2.4.0-test11-pre7, including forward port of
8982 + bug fixes from WIP 2.4.0-test9 tree.
8983 +
8984 + * Update to Cygnus CVS trees for disassembly code.
8985 +
8986 + * Bump to kdb v1.6.
8987 +
8988 +2000-10-19 Keith Owens <kaos@melbourne.sgi.com>
8989 +
8990 + * Update to kernel 2.4.0-test10-pre4.
8991 +
8992 +2000-10-15 Keith Owens <kaos@melbourne.sgi.com>
8993 +
8994 + * kdb/kdbmain.c (kdb_parse): Correctly handle blank input.
8995 +
8996 + * kdb/kdbmain.c (kdb_local, kdb): Reason SILENT can have NULL regs.
8997 +
8998 +2000-10-13 Keith Owens <kaos@melbourne.sgi.com>
8999 +
9000 + * kdb/kdbmain.c: Reduce CMD_LEN to avoid overflowing kdb_printf buffer.
9001 +
9002 +2000-10-11 Keith Owens <kaos@melbourne.sgi.com>
9003 +
9004 + * kdb/kdbmain.c (kdb): Test for userspace breakpoints before driving
9005 + other cpus into kdb. Speeds up gdb and avoids SMP race.
9006 +
9007 + * arch/i386/kdb/kdba_io.c (get_serial_char, get_kbd_char): Ignore
9008 + unprintable characters.
9009 +
9010 + * arch/i386/kdb/kdba_io.c (kdba_read): Better handling of buffer size.
9011 +
9012 +2000-10-04 Keith Owens <kaos@melbourne.sgi.com>
9013 +
9014 + * arch/i386/kdb/kdba_bt.c (kdba_bt_process): Verify that esp is inside
9015 + task_struct. Original patch by Mike Galbraith.
9016 +
9017 + * kdb/kdb_io.c (kdb_getstr): Reset output line counter, remove
9018 + unnecessary prompts.
9019 +
9020 + * arch/i386/kdb/kdbasupport.c (kdb_getregcontents): Change " cs" to
9021 + "xcs", ditto ss, ds, es. gdb2kdb does not like leading spaces.
9022 +
9023 + * include/asm-xxx/kdb.h: Add dummy kdb.h for all architectures except
9024 + ix86. This allows #include <linux/kdb.h> to appear in arch independent
9025 + code without causing compile errors.
9026 +
9027 + * kdb/modules/kdbm_pg: Sync with XFS.
9028 +
9029 +2000-10-03 Keith Owens <kaos@melbourne.sgi.com>
9030 +
9031 + * kdb/kdb_io.c (kdb_read): Ignore NMI while waiting for input.
9032 +
9033 + * kdb/kdb_io.c, kdb/Makefile: Export kdb_read.
9034 +
9035 +2000-10-02 Keith Owens <kaos@melbourne.sgi.com>
9036 +
9037 + * arch/i386/kernel/smpboot.c (do_boot_cpu): Set nmi_watchdog_source to 2
9038 + to avoid premature NMI oops during cpu bring up. We have to assume that
9039 + a box with more than 1 cpu has a working IO-APIC.
9040 +
9041 + * Documentation/kdb/{kdb.mm,kdb_md.man}: Add mdr command.
9042 +
9043 + * kdb/kdbmain.c (kdb_md): Add mdr command.
9044 +
9045 + * Release as kdb v1.5 against 2.4.0-test9-pre8.
9046 +
9047 + * arch/i386/kdb/kdba_io.c, arch/i386/kdb/kdbasupport.c, kdb/kdbmain.c,
9048 + kdb/kdb_io.c, kdb/kdb_id.c: Remove zero initializers for static
9049 + variables.
9050 +
9051 +2000-09-28 Keith Owens <kaos@melbourne.sgi.com>
9052 +
9053 + * various: Add nmi_watchdog_source, 1 local APIC, 2 IO-APIC.
9054 + Test nmi_watchdog_source instead of nr_ioapics so UP works on SMP hardware.
9055 +
9056 + * arch/i386/kernel/io_apic.c: Rename setup_nmi to setup_nmi_io for clarity.
9057 +
9058 + * kdb/kdbmain.c (kdb_parse): Only set NO_WATCHDOG if it was already set.
9059 +
9060 + * kdb/kdbmain.c (kdb): Clear NO_WATCHDOG on all exit paths.
9061 +
9062 + * include/linux/kdb.h: Add KDB_REASON_SILENT.
9063 +
9064 + * kdb/kdbmain.c (kdb_local): Treat reason SILENT as immediate 'go'.
9065 +
9066 + * kdb/kdbmain.c (kdb_init): Invoke kdb with reason SILENT to instantiate
9067 + any breakpoints on boot cpu.
9068 +
9069 + * arch/i386/kernel/smpboot.c (smp_callin): Invoke kdb with reason SILENT
9070 + to instantiate any global breakpoints on this cpu.
9071 +
9072 + * kdb/kdb_cmds: Remove comment that said initial commands only worked on
9073 + boot cpu.
9074 +
9075 +2000-09-27 Keith Owens <kaos@melbourne.sgi.com>
9076 +
9077 + * arch/i386/kernel/msr.c: Move {rd,wr}msr_eio to include/asm-i386/apic.h.
9078 +
9079 + * include/asm-i386/apic.h: Define NMI interfaces.
9080 +
9081 + * kernel/sysctl.c (kern_table):
9082 + * kernel/sysctl.c (do_proc_set_nmi_watchdog):
9083 + Add /proc/sys/kernel/nmi_watchdog.
9084 +
9085 + * arch/i386/kernel/apic.c: New routines set_nmi_counter_local,
9086 + setup_apic_nmi_watchdog.
9087 +
9088 + * arch/i386/kernel/traps.c: New routine set_nmi_watchdog(). Call apic
9089 + routines to set/clear local apic timer.
9090 +
9091 +2000-09-26 Keith Owens <kaos@melbourne.sgi.com>
9092 +
9093 + * include/linux/sysctl.h (enum): Add NMI_WATCHDOG.
9094 +
9095 + * arch/i386/kernel/traps.c (nmi_watchdog_tick): Check nmi_watchdog is
9096 + still on.
9097 +
9098 + * arch/i386/config.in: Add CONFIG_UP_NMI_WATCHDOG.
9099 +
9100 + * Documentation/Configure.help: Add CONFIG_UP_NMI_WATCHDOG.
9101 +
9102 + * Documentation/nmi_watchdog.txt: Update for UP NMI watchdog.
9103 +
9104 +2000-09-25 Keith Owens <kaos@melbourne.sgi.com>
9105 +
9106 + * arch/i386/kernel/apic.c (init_apic_mappings):
9107 + * arch/i386/kernel/io_apic.c (IO_APIC_init_uniprocessor):
9108 + Merge Keir Fraser's local APIC for uniprocessors patch.
9109 +
9110 +2000-09-24 Keith Owens <kaos@melbourne.sgi.com>
9111 +
9112 + * Various: Declare initialization routines as __init.
9113 +
9114 + * Makefile: Define and export AWK.
9115 +
9116 + * kdb/Makefile: Generate gen-kdb_cmds.c from kdb/kdb_cmds.
9117 +
9118 + * kdb/kdbmain.c (kdb_init): Call new routine kdb_cmds_init to execute
9119 + whatever the user put in kdb/kdb_cmds.
9120 +
9121 + * arch/i386/kdb/kdba_bt.c (kdba_bt_stack): New parameter to
9122 + indicate if esp in regs is known to be valid or not.
9123 +
9124 + * kdb/kdb_bp.c, arch/i386/kdb/kdba_bp.c: More trace prints for
9125 + breakpoint handling.
9126 +
9127 + * arch/i386/kdb/kdba_bp.c (kdba_installbp): Finally found and fixed the
9128 + annoying breakpoint bug where breakpoints where not always installed
9129 + after 'go'.
9130 +
9131 + * Documentation/kdb: Update man pages kdb.mm, kdb_env.man, kdb_ss.man.
9132 +
9133 + * Released as kdb-v1.5-beta1-2.4.0-test8.
9134 +
9135 + * Sync to 2.4.0-test9-pre6 and release as kdb-v1.5-beta1-2.4.0-test9-pre6.
9136 +
9137 +2000-09-23 Keith Owens <kaos@melbourne.sgi.com>
9138 +
9139 + * arch/i386/kdb/kdbasupport.c (kdba_getregcontents): New pseudo
9140 + registers cesp and ceflags to help with debugging the debugger.
9141 +
9142 + * kdb/kdbmain.c (kdb_local, kdb): Add KDB_REASON_RECURSE. Add
9143 + environment variable RECURSE. Add code to cope with some types of
9144 + recursion.
9145 +
9146 + * kdb/kdbmain.c (kdb), arch/i386/kdba/kdba_bp.c: Add
9147 + kdba_clearsinglestep.
9148 +
9149 +2000-09-22 Keith Owens <kaos@melbourne.sgi.com>
9150 +
9151 + * drivers/video/vgacon.c (write_vga): No cli() if kdb is running, avoid
9152 + console deadlock.
9153 +
9154 + * arch/i386/kernel/irq.c (get_irqlock): Warn if kdb is running, may hang.
9155 +
9156 + * include/linux/kdb.h: Define KDB_IS_RUNNING as (0) if no CONFIG_KDB.
9157 +
9158 + * arch/i386/kdb/kdba_bt.c (kdba_bt_stack): Do not attempt a backtrace if
9159 + the code segment is not in the kernel.
9160 +
9161 + * kdb/modules: Change modules from MX_OBJS to M_OBJS. Remove EXPORT_NOSYMBOLS.
9162 +
9163 +2000-09-21 Keith Owens <kaos@melbourne.sgi.com>
9164 +
9165 + * arch/i386/kernel/i386_ksyms.c: Move EXPORT_SYMBOLS for kdb to kdb/kdbmain.c.
9166 +
9167 + * kdb/Makefile: Change kdb/kdbmain.o from O_OBJS to OX_OBJS.
9168 +
9169 + * arch/i386/kernel/smp.c: Remove some #ifdef CONFIG_KDB. Remove kdbprivate.h.
9170 +
9171 + * include/linux/kdb.h: Add kdb_print_state. Add KDB_STATE_WAIT_IPI.
9172 +
9173 + * kdb/kdbmain.c (kdb): Only mark cpu as leaving if it is in KDB state. Maintain
9174 + WAIT_IPI state so a cpu is only driven through NMI once.
9175 +
9176 + * arch/i386/kernel/smp.c (smp_kdb_stop): All state fiddling moved to kdb().
9177 +
9178 +2000-09-20 Keith Owens <kaos@melbourne.sgi.com>
9179 +
9180 + * include/linux/kdb.h: #define kdb() as (0) if kdb is not configured.
9181 +
9182 + * arch/i386/kernel/traps.c: Remove some #ifdef CONFIG_KDB.
9183 +
9184 + * include/linux/kdbprivate.h: Move per cpu state to kdb.h.
9185 +
9186 + * include/linux/kdb.h: Add KDB_STATE_NO_WATCHDOG, KDB_STATE_PRINTF_LOCK.
9187 + Rename KDB_DEBUG_xxx to KDB_DEBUG_FLAG_xxx. Clean up debug flag
9188 + definitions.
9189 +
9190 + * arch/i386/kernel/traps.c (nmi_watchdog_tick): Check no watchdog.
9191 +
9192 + * kdb/kdbmain.c (kdb): Set no watchdog in normal kdb code.
9193 +
9194 + * kdb/kdbmain.c (kdb_parse): Allow watchdog in commands.
9195 +
9196 + * kdb/kdb_io.c (kdb_printf): No watchdog during printing. Clean up lock handling.
9197 +
9198 + * kdb/kdbmain.c (kdb_set): Clean up debug flag handling.
9199 +
9200 +2000-09-19 Juan J. Quintela <quintela@fi.udc.es>
9201 +
9202 + * kdb/arch/i386/kdb/kdba_io.c: Allow kdb to compile without CONFIG_VT and/or
9203 + serial console.
9204 +
9205 +2000-09-19 Keith Owens <kaos@melbourne.sgi.com>
9206 +
9207 + * include/linux/kdb.h: Define KDB_DEBUG_STATE().
9208 +
9209 + * kdb/kdbmain.c (kdb): Add kdb_print_state(), calls to KDB_DEBUG_STATE().
9210 +
9211 +2000-09-16 Keith Owens <kaos@melbourne.sgi.com>
9212 +
9213 + * Move to finer grained control over individual processors in kdb with
9214 + per cpu kdb state. Needed to allow ss[b] to only release one processor,
9215 + previously ss[b] released all processors. Also need to recover from
9216 + errors inside kdb commands, e.g. oops in kdbm_pg code.
9217 +
9218 + * various:
9219 + Move global flags KDB_FLAG_SSB, KDB_FLAG_SUPRESS, KDB_FLAG_FAULT,
9220 + KDB_FLAG_SS, KDB_FLAG_SSBPT, kdb_active, to per cpu state and macros
9221 + KDB_STATE(xxx).
9222 + Replace kdb_flags & KDB_FLAG_xxx with KDB_FLAG(xxx).
9223 + Replace kdb_flags & KDB_DEBUG_xxx with KDB_DEBUG(xxx).
9224 + Replace specific tests with wrapper KDB_IS_RUNNING().
9225 +
9226 + * various: Remove #ifdef CONFIG_SMP from kdb code wherever
9227 + possible. Simplifies the code and makes it much more readable.
9228 +
9229 + * arch/i386/kdb/kdbasupport.c (kdb_setjmp): Record if we have reliable
9230 + longjmp data instead of assuming it is always set.
9231 +
9232 + * various: Replace smp_kdb_wait with per cpu state, HOLD_CPU.
9233 +
9234 + * init/main.c : Replace #ifdef KDB_DEBUG with KDB_DEBUG(CALLBACK).
9235 +
9236 + * include/linux/kdbprivate.h: Separate command return codes from error
9237 + codes. Add more detailed command codes.
9238 +
9239 + * arch/i386/kernel/traps.c (die): Change spin_lock_irq to
9240 + spin_lock_irqsave. Why did I do this?
9241 +
9242 + * kdb/kdbmain.c (kdb_parse): Set per cpu flag CMD before executing kdb
9243 + command. More detailed return codes for commands that affect
9244 + processors.
9245 +
9246 + * kdb/kdbmain.c (kdb_previous_event): New, check if any processors are
9247 + still executing the previous kdb event. Removes a race window where a
9248 + second event could enter kdb before the first had completely ended.
9249 +
9250 + * kdb/kdbmain.c (kdb): Document all the concurrency conditions and how
9251 + kdb handles them. ss[b] now releases only the current cpu. Do not set
9252 + breakpoints when releasing for ss[b]. Recover from errors in kdb
9253 + commands. Check that we have reliable longjmp data before using it.
9254 +
9255 + * various: Update return code documentation.
9256 +
9257 + * kdb/kdb_bp.c (kdb_ss): Separate ss and ssb return codes.
9258 +
9259 + * kdb/kdbsupport.c (kdb_ipi): Finer grained algorithm for deciding
9260 + whether to call send a stop signal to a cpu.
9261 +
9262 + * arch/i386/kdb/kdba_bp.c (kdba_db_trap): Separate ss and ssb return
9263 + codes. Reinstall delayed software breakpoints per cpu instead of
9264 + globally. Changed algorithm for handling ss[b].
9265 +
9266 + * arch/i386/kdb/kdba_bp.c (kdba_bp_trap): Match software breakpoints per
9267 + cpu instead of globally.
9268 +
9269 + * include/linux/kdb.h: Bump version to kdb v1.5.
9270 +
9271 +2000-09-16 Keith Owens <kaos@melbourne.sgi.com>
9272 +
9273 + * kernel/sysctl.c (kern_table): add /proc/sys/kernel/kdb.
9274 +
9275 + * init/main.c (parse_options): add boot flags kdb=on, kdb=off,
9276 + kdb=early.
9277 +
9278 + * include/linux/sysctl.h (enum): add KERN_KDB.
9279 +
9280 + * drivers/char/serial.c (receive_chars): check kdb_on.
9281 +
9282 + * drivers/char/keyboard.c (handle_scancode): check kdb_on.
9283 +
9284 + * arch/i386/kernel/traps.c (nmi_watchdog_tick): check kdb_on.
9285 +
9286 + * arch/i386/config.in: add CONFIG_KDB_OFF.
9287 +
9288 + * Documentation/Configure.help: add CONFIG_KDB_OFF.
9289 +
9290 + * kdb/kdbmain.c: add kdb_initial_cpu, kdb_on.
9291 +
9292 + * kdb/kdbmain.c (kdb): check kdb_on, set kdb_initial_cpu.
9293 +
9294 + * kdb/kdbmain.c (kdb_init): add Keith Owens to kdb banner.
9295 +
9296 + * kdb/kdb_io.c (kdb_printf): serialize kdb_printf output.
9297 +
9298 + * kdb/kdb_bt.c (kdb_bt): check environment variable BTAPROMPT.
9299 +
9300 + * kdb/kdbsupport.c (kdb_ipi): ignore NMI for kdb_initial_cpu.
9301 +
9302 + * kdb/modules/kdbm_pg.c (kdbm_page): merge updates from 2.4.0-test5-xfs.
9303 +
9304 + * kdb/kdb_bt.man: add btp, bta, BTAPROMPT.
9305 +
9306 + * kdb/kdb.mm: add CONFIG_KDB_OFF, boot flags, btp, bta.
9307 +
9308 + * include/linux/kdbprivate.h: add kdb_initial_cpu.
9309 +
9310 + * include/linux/kdb.h: add kdb_on, bump version to kdb v1.4.
9311 --- /dev/null
9312 +++ b/kdb/Makefile
9313 @@ -0,0 +1,43 @@
9314 +#
9315 +# This file is subject to the terms and conditions of the GNU General Public
9316 +# License. See the file "COPYING" in the main directory of this archive
9317 +# for more details.
9318 +#
9319 +# Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
9320 +#
9321 +
9322 +CCVERSION := $(shell $(CC) -v 2>&1 | sed -ne '$$p')
9323 +obj-y := kdb_bt.o kdb_bp.o kdb_id.o kdbsupport.o gen-kdb_cmds.o kdbmain.o kdb_io.o kdbdereference.o
9324 +CFLAGS_kdbmain.o += -DCCVERSION="$(CCVERSION)"
9325 +
9326 +subdir-$(CONFIG_KDB_MODULES) := modules
9327 +obj-y += $(addsuffix /built-in.o, $(subdir-y))
9328 +
9329 +clean-files := gen-kdb_cmds.c
9330 +
9331 +override CFLAGS := $(CFLAGS:%-pg=% )
9332 +
9333 +# define architecture dependent kdb_cmds
9334 +ifeq ($(CONFIG_IA64),y)
9335 + KDB_CMDS = ia64/kdb/kdb_cmds
9336 +else
9337 + ifeq ($(CONFIG_X86_64),y)
9338 + KDB_CMDS = x86/kdb/kdb_cmds_64
9339 + else
9340 + ifeq ($(CONFIG_X86_32),y)
9341 + KDB_CMDS = x86/kdb/kdb_cmds_32
9342 + endif
9343 + endif
9344 +endif
9345 +
9346 +quiet_cmd_gen-kdb = GENKDB $@
9347 + cmd_gen-kdb = $(AWK) 'BEGIN {print "\#include <linux/stddef.h>"; print "\#include <linux/init.h>"} \
9348 + /^\#/{next} \
9349 + /^[ \t]*$$/{next} \
9350 + {gsub(/"/, "\\\"", $$0); \
9351 + print "static __initdata char kdb_cmd" cmds++ "[] = \"" $$0 "\\n\";"} \
9352 + END {print "extern char *kdb_cmds[]; char __initdata *kdb_cmds[] = {"; for (i = 0; i < cmds; ++i) {print " kdb_cmd" i ","}; print(" NULL\n};");}' \
9353 + $(filter-out %/Makefile,$^) > $@
9354 +
9355 +$(obj)/gen-kdb_cmds.c: $(src)/kdb_cmds $(wildcard $(TOPDIR)/arch/$(KDB_CMDS)) $(src)/Makefile
9356 + $(call cmd,gen-kdb)
9357 --- /dev/null
9358 +++ b/kdb/kdb_bp.c
9359 @@ -0,0 +1,658 @@
9360 +/*
9361 + * Kernel Debugger Architecture Independent Breakpoint Handler
9362 + *
9363 + * This file is subject to the terms and conditions of the GNU General Public
9364 + * License. See the file "COPYING" in the main directory of this archive
9365 + * for more details.
9366 + *
9367 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
9368 + */
9369 +
9370 +#include <linux/string.h>
9371 +#include <linux/kernel.h>
9372 +#include <linux/init.h>
9373 +#include <linux/kdb.h>
9374 +#include <linux/kdbprivate.h>
9375 +#include <linux/smp.h>
9376 +#include <linux/sched.h>
9377 +#include <linux/interrupt.h>
9378 +#include <asm/system.h>
9379 +
9380 +/*
9381 + * Table of kdb_breakpoints
9382 + */
9383 +kdb_bp_t kdb_breakpoints[KDB_MAXBPT];
9384 +
9385 +/*
9386 + * Predicate to test whether a breakpoint should be installed
9387 + * on this CPU.
9388 + *
9389 + * Note that for purposes of installation, hardware breakpoints
9390 + * are treated as local (even if the global flag is set), on
9391 + * the assumption that the require per-cpu registers to be set.
9392 + */
9393 +
9394 +static inline int kdb_is_installable_global_bp(const kdb_bp_t *bp)
9395 +{
9396 + return (bp->bp_enabled &&
9397 + bp->bp_global &&
9398 + !bp->bp_forcehw);
9399 +}
9400 +
9401 +static int kdb_is_installable_local_bp(const kdb_bp_t *bp)
9402 +{
9403 + if (!bp->bp_enabled)
9404 + return 0;
9405 +
9406 + if (bp->bp_forcehw) {
9407 + if (bp->bp_cpu == smp_processor_id() || bp->bp_global)
9408 + return 1;
9409 + } else {
9410 + if (bp->bp_cpu == smp_processor_id() && !bp->bp_global)
9411 + return 1;
9412 + }
9413 + return 0;
9414 +}
9415 +
9416 +/*
9417 + * kdb_bp_install_global
9418 + *
9419 + * Install global kdb_breakpoints prior to returning from the
9420 + * kernel debugger. This allows the kdb_breakpoints to be set
9421 + * upon functions that are used internally by kdb, such as
9422 + * printk().
9423 + *
9424 + * Parameters:
9425 + * regs Execution frame.
9426 + * Outputs:
9427 + * None.
9428 + * Returns:
9429 + * None.
9430 + * Locking:
9431 + * None.
9432 + * Remarks:
9433 + *
9434 + * This function is only called once per kdb session.
9435 + */
9436 +
9437 +void
9438 +kdb_bp_install_global(struct pt_regs *regs)
9439 +{
9440 + int i;
9441 +
9442 + for(i=0; i<KDB_MAXBPT; i++) {
9443 + kdb_bp_t *bp = &kdb_breakpoints[i];
9444 +
9445 + if (KDB_DEBUG(BP)) {
9446 + kdb_printf("kdb_bp_install_global bp %d bp_enabled %d bp_global %d\n",
9447 + i, bp->bp_enabled, bp->bp_global);
9448 + }
9449 + /* HW BP local or global are installed in kdb_bp_install_local*/
9450 + if (kdb_is_installable_global_bp(bp))
9451 + kdba_installbp(regs, bp);
9452 + }
9453 +}
9454 +
9455 +/*
9456 + * kdb_bp_install_local
9457 + *
9458 + * Install local kdb_breakpoints prior to returning from the
9459 + * kernel debugger. This allows the kdb_breakpoints to be set
9460 + * upon functions that are used internally by kdb, such as
9461 + * printk().
9462 + *
9463 + * Parameters:
9464 + * regs Execution frame.
9465 + * Outputs:
9466 + * None.
9467 + * Returns:
9468 + * None.
9469 + * Locking:
9470 + * None.
9471 + * Remarks:
9472 + *
9473 + * This function is called once per processor.
9474 + */
9475 +
9476 +void
9477 +kdb_bp_install_local(struct pt_regs *regs)
9478 +{
9479 + int i;
9480 +
9481 + for(i=0; i<KDB_MAXBPT; i++) {
9482 + kdb_bp_t *bp = &kdb_breakpoints[i];
9483 +
9484 + if (KDB_DEBUG(BP)) {
9485 + kdb_printf("kdb_bp_install_local bp %d bp_enabled %d bp_global %d cpu %d bp_cpu %d\n",
9486 + i, bp->bp_enabled, bp->bp_global,
9487 + smp_processor_id(), bp->bp_cpu);
9488 + }
9489 + if (kdb_is_installable_local_bp(bp))
9490 + kdba_installbp(regs, bp);
9491 + }
9492 +}
9493 +
9494 +/*
9495 + * kdb_bp_remove_global
9496 + *
9497 + * Remove global kdb_breakpoints upon entry to the kernel debugger.
9498 + *
9499 + * Parameters:
9500 + * None.
9501 + * Outputs:
9502 + * None.
9503 + * Returns:
9504 + * None.
9505 + * Locking:
9506 + * None.
9507 + * Remarks:
9508 + */
9509 +
9510 +void
9511 +kdb_bp_remove_global(void)
9512 +{
9513 + int i;
9514 +
9515 + for(i=KDB_MAXBPT-1; i>=0; i--) {
9516 + kdb_bp_t *bp = &kdb_breakpoints[i];
9517 +
9518 + if (KDB_DEBUG(BP)) {
9519 + kdb_printf("kdb_bp_remove_global bp %d bp_enabled %d bp_global %d\n",
9520 + i, bp->bp_enabled, bp->bp_global);
9521 + }
9522 + if (kdb_is_installable_global_bp(bp))
9523 + kdba_removebp(bp);
9524 + }
9525 +}
9526 +
9527 +
9528 +/*
9529 + * kdb_bp_remove_local
9530 + *
9531 + * Remove local kdb_breakpoints upon entry to the kernel debugger.
9532 + *
9533 + * Parameters:
9534 + * None.
9535 + * Outputs:
9536 + * None.
9537 + * Returns:
9538 + * None.
9539 + * Locking:
9540 + * None.
9541 + * Remarks:
9542 + */
9543 +
9544 +void
9545 +kdb_bp_remove_local(void)
9546 +{
9547 + int i;
9548 +
9549 + for(i=KDB_MAXBPT-1; i>=0; i--) {
9550 + kdb_bp_t *bp = &kdb_breakpoints[i];
9551 +
9552 + if (KDB_DEBUG(BP)) {
9553 + kdb_printf("kdb_bp_remove_local bp %d bp_enabled %d bp_global %d cpu %d bp_cpu %d\n",
9554 + i, bp->bp_enabled, bp->bp_global,
9555 + smp_processor_id(), bp->bp_cpu);
9556 + }
9557 + if (kdb_is_installable_local_bp(bp))
9558 + kdba_removebp(bp);
9559 + }
9560 +}
9561 +
9562 +/*
9563 + * kdb_printbp
9564 + *
9565 + * Internal function to format and print a breakpoint entry.
9566 + *
9567 + * Parameters:
9568 + * None.
9569 + * Outputs:
9570 + * None.
9571 + * Returns:
9572 + * None.
9573 + * Locking:
9574 + * None.
9575 + * Remarks:
9576 + */
9577 +
9578 +static void
9579 +kdb_printbp(kdb_bp_t *bp, int i)
9580 +{
9581 + if (bp->bp_forcehw) {
9582 + kdb_printf("Forced ");
9583 + }
9584 +
9585 + if (!bp->bp_template.bph_free) {
9586 + kdb_printf("%s ", kdba_bptype(&bp->bp_template));
9587 + } else {
9588 + kdb_printf("Instruction(i) ");
9589 + }
9590 +
9591 + kdb_printf("BP #%d at ", i);
9592 + kdb_symbol_print(bp->bp_addr, NULL, KDB_SP_DEFAULT);
9593 +
9594 + if (bp->bp_enabled) {
9595 + kdba_printbp(bp);
9596 + if (bp->bp_global)
9597 + kdb_printf(" globally");
9598 + else
9599 + kdb_printf(" on cpu %d", bp->bp_cpu);
9600 + if (bp->bp_adjust)
9601 + kdb_printf(" adjust %d", bp->bp_adjust);
9602 + } else {
9603 + kdb_printf("\n is disabled");
9604 + }
9605 +
9606 + kdb_printf("\taddr at %016lx, hardtype=%d, forcehw=%d, installed=%d, hard=%p\n",
9607 + bp->bp_addr, bp->bp_hardtype, bp->bp_forcehw,
9608 + bp->bp_installed, bp->bp_hard);
9609 +
9610 + kdb_printf("\n");
9611 +}
9612 +
9613 +/*
9614 + * kdb_bp
9615 + *
9616 + * Handle the bp, and bpa commands.
9617 + *
9618 + * [bp|bpa|bph] <addr-expression> [DATAR|DATAW|IO [length]]
9619 + *
9620 + * Parameters:
9621 + * argc Count of arguments in argv
9622 + * argv Space delimited command line arguments
9623 + * Outputs:
9624 + * None.
9625 + * Returns:
9626 + * Zero for success, a kdb diagnostic if failure.
9627 + * Locking:
9628 + * None.
9629 + * Remarks:
9630 + *
9631 + * bp Set breakpoint. Only use hardware assist if necessary.
9632 + * bpa Set breakpoint on all cpus, only use hardware regs if necessary
9633 + * bph Set breakpoint - force hardware register
9634 + * bpha Set breakpoint on all cpus, force hardware register
9635 + */
9636 +
9637 +static int
9638 +kdb_bp(int argc, const char **argv)
9639 +{
9640 + int i, bpno;
9641 + kdb_bp_t *bp, *bp_check;
9642 + int diag;
9643 + int free;
9644 + char *symname = NULL;
9645 + long offset = 0ul;
9646 + int nextarg;
9647 + kdb_bp_t template = {0};
9648 +
9649 + if (argc == 0) {
9650 + /*
9651 + * Display breakpoint table
9652 + */
9653 + for(bpno=0,bp=kdb_breakpoints; bpno<KDB_MAXBPT; bpno++, bp++) {
9654 + if (bp->bp_free) continue;
9655 +
9656 + kdb_printbp(bp, bpno);
9657 + }
9658 +
9659 + return 0;
9660 + }
9661 +
9662 + template.bp_global = ((strcmp(argv[0], "bpa") == 0)
9663 + || (strcmp(argv[0], "bpha") == 0));
9664 + template.bp_forcehw = ((strcmp(argv[0], "bph") == 0)
9665 + || (strcmp(argv[0], "bpha") == 0));
9666 +
9667 + /* Fix me: "bp" is treated as "bpa" to avoid system freeze. -jlan */
9668 + if (strcmp(argv[0], "bp") == 0)
9669 + template.bp_global = 1;
9670 +
9671 + nextarg = 1;
9672 + diag = kdbgetaddrarg(argc, argv, &nextarg, &template.bp_addr,
9673 + &offset, &symname);
9674 + if (diag)
9675 + return diag;
9676 + if (!template.bp_addr)
9677 + return KDB_BADINT;
9678 +
9679 + /*
9680 + * Find an empty bp structure, to allocate
9681 + */
9682 + free = KDB_MAXBPT;
9683 + for(bpno=0,bp=kdb_breakpoints; bpno<KDB_MAXBPT; bpno++,bp++) {
9684 + if (bp->bp_free) {
9685 + break;
9686 + }
9687 + }
9688 +
9689 + if (bpno == KDB_MAXBPT)
9690 + return KDB_TOOMANYBPT;
9691 +
9692 + /*
9693 + * Handle architecture dependent parsing
9694 + */
9695 + diag = kdba_parsebp(argc, argv, &nextarg, &template);
9696 + if (diag) {
9697 + return diag;
9698 + }
9699 +
9700 +
9701 + /*
9702 + * Check for clashing breakpoints.
9703 + *
9704 + * Note, in this design we can't have hardware breakpoints
9705 + * enabled for both read and write on the same address, even
9706 + * though ia64 allows this.
9707 + */
9708 + for(i=0,bp_check=kdb_breakpoints; i<KDB_MAXBPT; i++,bp_check++) {
9709 + if (!bp_check->bp_free &&
9710 + bp_check->bp_addr == template.bp_addr &&
9711 + (bp_check->bp_global ||
9712 + bp_check->bp_cpu == template.bp_cpu)) {
9713 + kdb_printf("You already have a breakpoint at " kdb_bfd_vma_fmt0 "\n", template.bp_addr);
9714 + return KDB_DUPBPT;
9715 + }
9716 + }
9717 +
9718 + template.bp_enabled = 1;
9719 +
9720 + /*
9721 + * Actually allocate the breakpoint found earlier
9722 + */
9723 + *bp = template;
9724 + bp->bp_free = 0;
9725 +
9726 + if (!bp->bp_global) {
9727 + bp->bp_cpu = smp_processor_id();
9728 + }
9729 +
9730 + /*
9731 + * Allocate a hardware breakpoint. If one is not available,
9732 + * disable the breakpoint, but leave it in the breakpoint
9733 + * table. When the breakpoint is re-enabled (via 'be'), we'll
9734 + * attempt to allocate a hardware register for it.
9735 + */
9736 + if (!bp->bp_template.bph_free) {
9737 + kdba_alloc_hwbp(bp, &diag);
9738 + if (diag) {
9739 + bp->bp_enabled = 0;
9740 + bp->bp_hardtype = 0;
9741 + kdba_free_hwbp(bp);
9742 + return diag;
9743 + }
9744 + }
9745 +
9746 + kdb_printbp(bp, bpno);
9747 +
9748 + return 0;
9749 +}
9750 +
9751 +/*
9752 + * kdb_bc
9753 + *
9754 + * Handles the 'bc', 'be', and 'bd' commands
9755 + *
9756 + * [bd|bc|be] <breakpoint-number>
9757 + * [bd|bc|be] *
9758 + *
9759 + * Parameters:
9760 + * argc Count of arguments in argv
9761 + * argv Space delimited command line arguments
9762 + * Outputs:
9763 + * None.
9764 + * Returns:
9765 + * Zero for success, a kdb diagnostic for failure
9766 + * Locking:
9767 + * None.
9768 + * Remarks:
9769 + */
9770 +
9771 +#define KDBCMD_BC 0
9772 +#define KDBCMD_BE 1
9773 +#define KDBCMD_BD 2
9774 +
9775 +static int
9776 +kdb_bc(int argc, const char **argv)
9777 +{
9778 + kdb_machreg_t addr;
9779 + kdb_bp_t *bp = NULL;
9780 + int lowbp = KDB_MAXBPT;
9781 + int highbp = 0;
9782 + int done = 0;
9783 + int i;
9784 + int diag;
9785 + int cmd; /* KDBCMD_B? */
9786 +
9787 + if (strcmp(argv[0], "be") == 0) {
9788 + cmd = KDBCMD_BE;
9789 + } else if (strcmp(argv[0], "bd") == 0) {
9790 + cmd = KDBCMD_BD;
9791 + } else
9792 + cmd = KDBCMD_BC;
9793 +
9794 + if (argc != 1)
9795 + return KDB_ARGCOUNT;
9796 +
9797 + if (strcmp(argv[1], "*") == 0) {
9798 + lowbp = 0;
9799 + highbp = KDB_MAXBPT;
9800 + } else {
9801 + diag = kdbgetularg(argv[1], &addr);
9802 + if (diag)
9803 + return diag;
9804 +
9805 + /*
9806 + * For addresses less than the maximum breakpoint number,
9807 + * assume that the breakpoint number is desired.
9808 + */
9809 + if (addr < KDB_MAXBPT) {
9810 + bp = &kdb_breakpoints[addr];
9811 + lowbp = highbp = addr;
9812 + highbp++;
9813 + } else {
9814 + for(i=0, bp=kdb_breakpoints; i<KDB_MAXBPT; i++, bp++) {
9815 + if (bp->bp_addr == addr) {
9816 + lowbp = highbp = i;
9817 + highbp++;
9818 + break;
9819 + }
9820 + }
9821 + }
9822 + }
9823 +
9824 + /*
9825 + * Now operate on the set of breakpoints matching the input
9826 + * criteria (either '*' for all, or an individual breakpoint).
9827 + */
9828 + for(bp=&kdb_breakpoints[lowbp], i=lowbp;
9829 + i < highbp;
9830 + i++, bp++) {
9831 + if (bp->bp_free)
9832 + continue;
9833 +
9834 + done++;
9835 +
9836 + switch (cmd) {
9837 + case KDBCMD_BC:
9838 + if (bp->bp_hardtype)
9839 + kdba_free_hwbp(bp);
9840 +
9841 + bp->bp_enabled = 0;
9842 + bp->bp_global = 0;
9843 +
9844 + kdb_printf("Breakpoint %d at " kdb_bfd_vma_fmt " cleared\n",
9845 + i, bp->bp_addr);
9846 +
9847 + bp->bp_addr = 0;
9848 + bp->bp_free = 1;
9849 +
9850 + break;
9851 + case KDBCMD_BE:
9852 + /*
9853 + * Allocate a hardware breakpoint. If one is not
9854 + * available, don't enable the breakpoint.
9855 + */
9856 + if (!bp->bp_template.bph_free
9857 + && !bp->bp_hardtype) {
9858 + kdba_alloc_hwbp(bp, &diag);
9859 + if (diag) {
9860 + bp->bp_enabled = 0;
9861 + bp->bp_hardtype = 0;
9862 + kdba_free_hwbp(bp);
9863 + return diag;
9864 + }
9865 + }
9866 +
9867 + bp->bp_enabled = 1;
9868 +
9869 + kdb_printf("Breakpoint %d at " kdb_bfd_vma_fmt " enabled",
9870 + i, bp->bp_addr);
9871 +
9872 + kdb_printf("\n");
9873 + break;
9874 + case KDBCMD_BD:
9875 + if (!bp->bp_enabled)
9876 + break;
9877 +
9878 + /*
9879 + * Since this breakpoint is now disabled, we can
9880 + * give up the hardware register which is allocated
9881 + * to it.
9882 + */
9883 + if (bp->bp_hardtype)
9884 + kdba_free_hwbp(bp);
9885 +
9886 + bp->bp_enabled = 0;
9887 +
9888 + kdb_printf("Breakpoint %d at " kdb_bfd_vma_fmt " disabled\n",
9889 + i, bp->bp_addr);
9890 +
9891 + break;
9892 + }
9893 + if (bp->bp_delay && (cmd == KDBCMD_BC || cmd == KDBCMD_BD)) {
9894 + bp->bp_delay = 0;
9895 + KDB_STATE_CLEAR(SSBPT);
9896 + }
9897 + }
9898 +
9899 + return (!done)?KDB_BPTNOTFOUND:0;
9900 +}
9901 +
9902 +/*
9903 + * kdb_ss
9904 + *
9905 + * Process the 'ss' (Single Step) and 'ssb' (Single Step to Branch)
9906 + * commands.
9907 + *
9908 + * ss
9909 + * ssb
9910 + *
9911 + * Parameters:
9912 + * argc Argument count
9913 + * argv Argument vector
9914 + * Outputs:
9915 + * None.
9916 + * Returns:
9917 + * KDB_CMD_SS[B] for success, a kdb error if failure.
9918 + * Locking:
9919 + * None.
9920 + * Remarks:
9921 + *
9922 + * Set the arch specific option to trigger a debug trap after the next
9923 + * instruction.
9924 + *
9925 + * For 'ssb', set the trace flag in the debug trap handler
9926 + * after printing the current insn and return directly without
9927 + * invoking the kdb command processor, until a branch instruction
9928 + * is encountered.
9929 + */
9930 +
9931 +static int
9932 +kdb_ss(int argc, const char **argv)
9933 +{
9934 + int ssb = 0;
9935 + struct pt_regs *regs = get_irq_regs();
9936 +
9937 + ssb = (strcmp(argv[0], "ssb") == 0);
9938 + if (argc != 0)
9939 + return KDB_ARGCOUNT;
9940 +
9941 + if (!regs) {
9942 + kdb_printf("%s: pt_regs not available\n", __FUNCTION__);
9943 + return KDB_BADREG;
9944 + }
9945 +
9946 + /*
9947 + * Set trace flag and go.
9948 + */
9949 + KDB_STATE_SET(DOING_SS);
9950 + if (ssb)
9951 + KDB_STATE_SET(DOING_SSB);
9952 +
9953 + kdba_setsinglestep(regs); /* Enable single step */
9954 +
9955 + if (ssb)
9956 + return KDB_CMD_SSB;
9957 + return KDB_CMD_SS;
9958 +}
9959 +
9960 +/*
9961 + * kdb_initbptab
9962 + *
9963 + * Initialize the breakpoint table. Register breakpoint commands.
9964 + *
9965 + * Parameters:
9966 + * None.
9967 + * Outputs:
9968 + * None.
9969 + * Returns:
9970 + * None.
9971 + * Locking:
9972 + * None.
9973 + * Remarks:
9974 + */
9975 +
9976 +void __init
9977 +kdb_initbptab(void)
9978 +{
9979 + int i;
9980 + kdb_bp_t *bp;
9981 +
9982 + /*
9983 + * First time initialization.
9984 + */
9985 + memset(&kdb_breakpoints, '\0', sizeof(kdb_breakpoints));
9986 +
9987 + for (i=0, bp=kdb_breakpoints; i<KDB_MAXBPT; i++, bp++) {
9988 + bp->bp_free = 1;
9989 + /*
9990 + * The bph_free flag is architecturally required. It
9991 + * is set by architecture-dependent code to false (zero)
9992 + * in the event a hardware breakpoint register is required
9993 + * for this breakpoint.
9994 + *
9995 + * The rest of the template is reserved to the architecture
9996 + * dependent code and _must_ not be touched by the architecture
9997 + * independent code.
9998 + */
9999 + bp->bp_template.bph_free = 1;
10000 + }
10001 +
10002 + kdb_register_repeat("bp", kdb_bp, "[<vaddr>]", "Set/Display breakpoints", 0, KDB_REPEAT_NO_ARGS);
10003 + kdb_register_repeat("bl", kdb_bp, "[<vaddr>]", "Display breakpoints", 0, KDB_REPEAT_NO_ARGS);
10004 + kdb_register_repeat("bpa", kdb_bp, "[<vaddr>]", "Set/Display global breakpoints", 0, KDB_REPEAT_NO_ARGS);
10005 + kdb_register_repeat("bph", kdb_bp, "[<vaddr>]", "Set hardware breakpoint", 0, KDB_REPEAT_NO_ARGS);
10006 + kdb_register_repeat("bpha", kdb_bp, "[<vaddr>]", "Set global hardware breakpoint", 0, KDB_REPEAT_NO_ARGS);
10007 + kdb_register_repeat("bc", kdb_bc, "<bpnum>", "Clear Breakpoint", 0, KDB_REPEAT_NONE);
10008 + kdb_register_repeat("be", kdb_bc, "<bpnum>", "Enable Breakpoint", 0, KDB_REPEAT_NONE);
10009 + kdb_register_repeat("bd", kdb_bc, "<bpnum>", "Disable Breakpoint", 0, KDB_REPEAT_NONE);
10010 +
10011 + kdb_register_repeat("ss", kdb_ss, "", "Single Step", 1, KDB_REPEAT_NO_ARGS);
10012 + kdb_register_repeat("ssb", kdb_ss, "", "Single step to branch/call", 0, KDB_REPEAT_NO_ARGS);
10013 + /*
10014 + * Architecture dependent initialization.
10015 + */
10016 + kdba_initbp();
10017 +}
10018 --- /dev/null
10019 +++ b/kdb/kdb_bt.c
10020 @@ -0,0 +1,180 @@
10021 +/*
10022 + * Kernel Debugger Architecture Independent Stack Traceback
10023 + *
10024 + * This file is subject to the terms and conditions of the GNU General Public
10025 + * License. See the file "COPYING" in the main directory of this archive
10026 + * for more details.
10027 + *
10028 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
10029 + */
10030 +
10031 +#include <linux/ctype.h>
10032 +#include <linux/string.h>
10033 +#include <linux/kernel.h>
10034 +#include <linux/sched.h>
10035 +#include <linux/kdb.h>
10036 +#include <linux/kdbprivate.h>
10037 +#include <linux/nmi.h>
10038 +#include <asm/system.h>
10039 +
10040 +
10041 +/*
10042 + * kdb_bt
10043 + *
10044 + * This function implements the 'bt' command. Print a stack
10045 + * traceback.
10046 + *
10047 + * bt [<address-expression>] (addr-exp is for alternate stacks)
10048 + * btp <pid> Kernel stack for <pid>
10049 + * btt <address-expression> Kernel stack for task structure at <address-expression>
10050 + * bta [DRSTCZEUIMA] All useful processes, optionally filtered by state
10051 + * btc [<cpu>] The current process on one cpu, default is all cpus
10052 + *
10053 + * bt <address-expression> refers to a address on the stack, that location
10054 + * is assumed to contain a return address.
10055 + *
10056 + * btt <address-expression> refers to the address of a struct task.
10057 + *
10058 + * Inputs:
10059 + * argc argument count
10060 + * argv argument vector
10061 + * Outputs:
10062 + * None.
10063 + * Returns:
10064 + * zero for success, a kdb diagnostic if error
10065 + * Locking:
10066 + * none.
10067 + * Remarks:
10068 + * Backtrack works best when the code uses frame pointers. But even
10069 + * without frame pointers we should get a reasonable trace.
10070 + *
10071 + * mds comes in handy when examining the stack to do a manual traceback or
10072 + * to get a starting point for bt <address-expression>.
10073 + */
10074 +
10075 +static int
10076 +kdb_bt1(const struct task_struct *p, unsigned long mask, int argcount, int btaprompt)
10077 +{
10078 + int diag;
10079 + char buffer[2];
10080 + if (kdb_getarea(buffer[0], (unsigned long)p) ||
10081 + kdb_getarea(buffer[0], (unsigned long)(p+1)-1))
10082 + return KDB_BADADDR;
10083 + if (!kdb_task_state(p, mask))
10084 + return 0;
10085 + kdb_printf("Stack traceback for pid %d\n", p->pid);
10086 + kdb_ps1(p);
10087 + diag = kdba_bt_process(p, argcount);
10088 + if (btaprompt) {
10089 + kdb_getstr(buffer, sizeof(buffer), "Enter <q> to end, <cr> to continue:");
10090 + if (buffer[0] == 'q') {
10091 + kdb_printf("\n");
10092 + return 1;
10093 + }
10094 + }
10095 + touch_nmi_watchdog();
10096 + return 0;
10097 +}
10098 +
10099 +int
10100 +kdb_bt(int argc, const char **argv)
10101 +{
10102 + int diag;
10103 + int argcount = 5;
10104 + int btaprompt = 1;
10105 + int nextarg;
10106 + unsigned long addr;
10107 + long offset;
10108 +
10109 + kdbgetintenv("BTARGS", &argcount); /* Arguments to print */
10110 + kdbgetintenv("BTAPROMPT", &btaprompt); /* Prompt after each proc in bta */
10111 +
10112 + if (strcmp(argv[0], "bta") == 0) {
10113 + struct task_struct *g, *p;
10114 + unsigned long cpu;
10115 + unsigned long mask = kdb_task_state_string(argc ? argv[1] : NULL);
10116 + if (argc == 0)
10117 + kdb_ps_suppressed();
10118 + /* Run the active tasks first */
10119 + for (cpu = 0; cpu < NR_CPUS; ++cpu) {
10120 + if (!cpu_online(cpu))
10121 + continue;
10122 + p = kdb_curr_task(cpu);
10123 + if (kdb_bt1(p, mask, argcount, btaprompt))
10124 + return 0;
10125 + }
10126 + /* Now the inactive tasks */
10127 + kdb_do_each_thread(g, p) {
10128 + if (task_curr(p))
10129 + continue;
10130 + if (kdb_bt1(p, mask, argcount, btaprompt))
10131 + return 0;
10132 + } kdb_while_each_thread(g, p);
10133 + } else if (strcmp(argv[0], "btp") == 0) {
10134 + struct task_struct *p;
10135 + unsigned long pid;
10136 + if (argc != 1)
10137 + return KDB_ARGCOUNT;
10138 + if ((diag = kdbgetularg((char *)argv[1], &pid)))
10139 + return diag;
10140 + if ((p = find_task_by_pid_type_ns(PIDTYPE_PID, pid, &init_pid_ns))) {
10141 + kdba_set_current_task(p);
10142 + return kdb_bt1(p, ~0UL, argcount, 0);
10143 + }
10144 + kdb_printf("No process with pid == %ld found\n", pid);
10145 + return 0;
10146 + } else if (strcmp(argv[0], "btt") == 0) {
10147 + if (argc != 1)
10148 + return KDB_ARGCOUNT;
10149 + if ((diag = kdbgetularg((char *)argv[1], &addr)))
10150 + return diag;
10151 + kdba_set_current_task((struct task_struct *)addr);
10152 + return kdb_bt1((struct task_struct *)addr, ~0UL, argcount, 0);
10153 + } else if (strcmp(argv[0], "btc") == 0) {
10154 + unsigned long cpu = ~0;
10155 + struct kdb_running_process *krp;
10156 + const struct task_struct *save_current_task = kdb_current_task;
10157 + char buf[80];
10158 + if (argc > 1)
10159 + return KDB_ARGCOUNT;
10160 + if (argc == 1 && (diag = kdbgetularg((char *)argv[1], &cpu)))
10161 + return diag;
10162 + /* Recursive use of kdb_parse, do not use argv after this point */
10163 + argv = NULL;
10164 + if (cpu != ~0) {
10165 + krp = kdb_running_process + cpu;
10166 + if (cpu >= NR_CPUS || !krp->seqno || !cpu_online(cpu)) {
10167 + kdb_printf("no process for cpu %ld\n", cpu);
10168 + return 0;
10169 + }
10170 + sprintf(buf, "btt 0x%p\n", krp->p);
10171 + kdb_parse(buf);
10172 + return 0;
10173 + }
10174 + kdb_printf("btc: cpu status: ");
10175 + kdb_parse("cpu\n");
10176 + for (cpu = 0, krp = kdb_running_process; cpu < NR_CPUS; ++cpu, ++krp) {
10177 + if (!cpu_online(cpu) || !krp->seqno)
10178 + continue;
10179 + sprintf(buf, "btt 0x%p\n", krp->p);
10180 + kdb_parse(buf);
10181 + touch_nmi_watchdog();
10182 + }
10183 + kdba_set_current_task(save_current_task);
10184 + return 0;
10185 + } else {
10186 + if (argc) {
10187 + nextarg = 1;
10188 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr,
10189 + &offset, NULL);
10190 + if (diag)
10191 + return diag;
10192 + return kdba_bt_address(addr, argcount);
10193 + } else {
10194 + return kdb_bt1(kdb_current_task, ~0UL, argcount, 0);
10195 + }
10196 + }
10197 +
10198 + /* NOTREACHED */
10199 + return 0;
10200 +}
10201 --- /dev/null
10202 +++ b/kdb/kdb_cmds
10203 @@ -0,0 +1,32 @@
10204 +# Initial commands for kdb, alter to suit your needs.
10205 +# These commands are executed in kdb_init() context, no SMP, no
10206 +# processes. Commands that require process data (including stack or
10207 +# registers) are not reliable this early. set and bp commands should
10208 +# be safe. Global breakpoint commands affect each cpu as it is booted.
10209 +
10210 +# Standard debugging information for first level support, just type archkdb
10211 +# or archkdbcpu or archkdbshort at the kdb prompt.
10212 +
10213 +defcmd archkdb "" "First line arch debugging"
10214 + set BTSYMARG 1
10215 + set BTARGS 9
10216 + pid R
10217 + -archkdbcommon
10218 + -bta
10219 +endefcmd
10220 +
10221 +defcmd archkdbcpu "" "archkdb with only tasks on cpus"
10222 + set BTSYMARG 1
10223 + set BTARGS 9
10224 + pid R
10225 + -archkdbcommon
10226 + -btc
10227 +endefcmd
10228 +
10229 +defcmd archkdbshort "" "archkdb with less detailed backtrace"
10230 + set BTSYMARG 0
10231 + set BTARGS 0
10232 + pid R
10233 + -archkdbcommon
10234 + -bta
10235 +endefcmd
10236 --- /dev/null
10237 +++ b/kdb/kdb_id.c
10238 @@ -0,0 +1,236 @@
10239 +/*
10240 + * Kernel Debugger Architecture Independent Instruction Disassembly
10241 + *
10242 + * This file is subject to the terms and conditions of the GNU General Public
10243 + * License. See the file "COPYING" in the main directory of this archive
10244 + * for more details.
10245 + *
10246 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
10247 + */
10248 +
10249 +#include <stdarg.h>
10250 +#include <linux/kernel.h>
10251 +#include <linux/init.h>
10252 +#include <linux/ctype.h>
10253 +#include <linux/string.h>
10254 +#include <linux/kdb.h>
10255 +#include <linux/kdbprivate.h>
10256 +
10257 +disassemble_info kdb_di;
10258 +
10259 +/*
10260 + * kdb_id
10261 + *
10262 + * Handle the id (instruction display) command.
10263 + *
10264 + * id [<addr>]
10265 + *
10266 + * Parameters:
10267 + * argc Count of arguments in argv
10268 + * argv Space delimited command line arguments
10269 + * Outputs:
10270 + * None.
10271 + * Returns:
10272 + * Zero for success, a kdb diagnostic if failure.
10273 + * Locking:
10274 + * None.
10275 + * Remarks:
10276 + */
10277 +
10278 +int
10279 +kdb_id(int argc, const char **argv)
10280 +{
10281 + kdb_machreg_t pc;
10282 + int icount;
10283 + int diag;
10284 + int i;
10285 + char *mode;
10286 + int nextarg;
10287 + long offset = 0;
10288 + static kdb_machreg_t lastpc;
10289 + struct disassemble_info *dip = &kdb_di;
10290 + char lastbuf[50];
10291 + unsigned long word;
10292 +
10293 + kdb_di.fprintf_func = kdb_dis_fprintf;
10294 + kdba_id_init(&kdb_di);
10295 +
10296 + if (argc != 1) {
10297 + if (lastpc == 0) {
10298 + return KDB_ARGCOUNT;
10299 + } else {
10300 + sprintf(lastbuf, "0x%lx", lastpc);
10301 + argv[1] = lastbuf;
10302 + argc = 1;
10303 + }
10304 + }
10305 +
10306 +
10307 + /*
10308 + * Fetch PC. First, check to see if it is a symbol, if not,
10309 + * try address.
10310 + */
10311 + nextarg = 1;
10312 + diag = kdbgetaddrarg(argc, argv, &nextarg, &pc, &offset, NULL);
10313 + if (diag)
10314 + return diag;
10315 + kdba_check_pc(&pc);
10316 + if (kdb_getarea(word, pc))
10317 + return(0);
10318 +
10319 + /*
10320 + * Number of lines to display
10321 + */
10322 + diag = kdbgetintenv("IDCOUNT", &icount);
10323 + if (diag)
10324 + return diag;
10325 +
10326 + mode = kdbgetenv("IDMODE");
10327 + diag = kdba_id_parsemode(mode, dip);
10328 + if (diag) {
10329 + return diag;
10330 + }
10331 +
10332 + for(i=0; i<icount; i++) {
10333 + pc += kdba_id_printinsn(pc, &kdb_di);
10334 + kdb_printf("\n");
10335 + }
10336 +
10337 + lastpc = pc;
10338 +
10339 + return 0;
10340 +}
10341 +
10342 +/*
10343 + * kdb_id1
10344 + *
10345 + * Disassemble a single instruction at 'pc'.
10346 + *
10347 + * Parameters:
10348 + * pc Address of instruction to disassemble
10349 + * Outputs:
10350 + * None.
10351 + * Returns:
10352 + * Zero for success, a kdb diagnostic if failure.
10353 + * Locking:
10354 + * None.
10355 + * Remarks:
10356 + */
10357 +
10358 +void
10359 +kdb_id1(unsigned long pc)
10360 +{
10361 + char *mode;
10362 + int diag;
10363 +
10364 + kdb_di.fprintf_func = kdb_dis_fprintf;
10365 + kdba_id_init(&kdb_di);
10366 +
10367 + /*
10368 + * Allow the user to specify that this instruction
10369 + * should be treated differently.
10370 + */
10371 +
10372 + mode = kdbgetenv("IDMODE");
10373 + diag = kdba_id_parsemode(mode, &kdb_di);
10374 + if (diag) {
10375 + kdb_printf("kdb_id: bad value in 'IDMODE' environment variable ignored\n");
10376 + }
10377 +
10378 + (void) kdba_id_printinsn(pc, &kdb_di);
10379 + kdb_printf("\n");
10380 +}
10381 +
10382 +/*
10383 + * kdb_dis_fprintf
10384 + *
10385 + * Format and print a string.
10386 + *
10387 + * Parameters:
10388 + * file Unused paramter.
10389 + * fmt Format string
10390 + * ... Optional additional parameters.
10391 + * Returns:
10392 + * 0
10393 + * Locking:
10394 + * Remarks:
10395 + * Result of format conversion cannot exceed 255 bytes.
10396 + */
10397 +
10398 +int
10399 +kdb_dis_fprintf(PTR file, const char *fmt, ...)
10400 +{
10401 + char buffer[256];
10402 + va_list ap;
10403 +
10404 + va_start(ap, fmt);
10405 + vsprintf(buffer, fmt, ap);
10406 + va_end(ap);
10407 +
10408 + kdb_printf("%s", buffer);
10409 +
10410 + return 0;
10411 +}
10412 +
10413 +/*
10414 + * kdb_dis_fprintf_dummy
10415 + *
10416 + * A dummy printf function for the disassembler, it does nothing.
10417 + * This lets code call the disassembler to step through
10418 + * instructions without actually printing anything.
10419 + * Inputs:
10420 + * Always ignored.
10421 + * Outputs:
10422 + * None.
10423 + * Returns:
10424 + * Always 0.
10425 + * Locking:
10426 + * none.
10427 + * Remarks:
10428 + * None.
10429 + */
10430 +
10431 +int
10432 +kdb_dis_fprintf_dummy(PTR file, const char *fmt, ...)
10433 +{
10434 + return(0);
10435 +}
10436 +
10437 +/*
10438 + * kdb_disinit
10439 + *
10440 + * Initialize the disassembly information structure
10441 + * for the GNU disassembler.
10442 + *
10443 + * Parameters:
10444 + * None.
10445 + * Outputs:
10446 + * None.
10447 + * Returns:
10448 + * Zero for success, a kdb diagnostic if failure.
10449 + * Locking:
10450 + * None.
10451 + * Remarks:
10452 + */
10453 +
10454 +void __init
10455 +kdb_id_init(void)
10456 +{
10457 + kdb_di.stream = NULL;
10458 + kdb_di.application_data = NULL;
10459 + kdb_di.symbols = NULL;
10460 + kdb_di.num_symbols = 0;
10461 + kdb_di.flags = 0;
10462 + kdb_di.private_data = NULL;
10463 + kdb_di.buffer = NULL;
10464 + kdb_di.buffer_vma = 0;
10465 + kdb_di.buffer_length = 0;
10466 + kdb_di.bytes_per_line = 0;
10467 + kdb_di.bytes_per_chunk = 0;
10468 + kdb_di.insn_info_valid = 0;
10469 + kdb_di.branch_delay_insns = 0;
10470 + kdb_di.data_size = 0;
10471 + kdb_di.insn_type = 0;
10472 + kdb_di.target = 0;
10473 + kdb_di.target2 = 0;
10474 +}
10475 --- /dev/null
10476 +++ b/kdb/kdb_io.c
10477 @@ -0,0 +1,856 @@
10478 +/*
10479 + * Kernel Debugger Architecture Independent Console I/O handler
10480 + *
10481 + * This file is subject to the terms and conditions of the GNU General Public
10482 + * License. See the file "COPYING" in the main directory of this archive
10483 + * for more details.
10484 + *
10485 + * Copyright (c) 1999-2006 Silicon Graphics, Inc. All Rights Reserved.
10486 + */
10487 +
10488 +#include <linux/module.h>
10489 +#include <linux/types.h>
10490 +#include <linux/ctype.h>
10491 +#include <linux/kernel.h>
10492 +#include <linux/init.h>
10493 +#include <linux/kdev_t.h>
10494 +#include <linux/console.h>
10495 +#include <linux/string.h>
10496 +#include <linux/sched.h>
10497 +#include <linux/smp.h>
10498 +#include <linux/nmi.h>
10499 +#include <linux/delay.h>
10500 +
10501 +#include <linux/kdb.h>
10502 +#include <linux/kdbprivate.h>
10503 +#include <linux/kallsyms.h>
10504 +
10505 +static struct console *kdbcons;
10506 +
10507 +#ifdef CONFIG_PPC64
10508 +#include <asm/udbg.h>
10509 +#endif
10510 +
10511 +#define CMD_BUFLEN 256
10512 +char kdb_prompt_str[CMD_BUFLEN];
10513 +
10514 +extern int kdb_grepping_flag;
10515 +extern char kdb_grep_string[];
10516 +extern int kdb_grep_leading;
10517 +extern int kdb_grep_trailing;
10518 +
10519 +/*
10520 + * kdb_read
10521 + *
10522 + * This function reads a string of characters, terminated by
10523 + * a newline, or by reaching the end of the supplied buffer,
10524 + * from the current kernel debugger console device.
10525 + * Parameters:
10526 + * buffer - Address of character buffer to receive input characters.
10527 + * bufsize - size, in bytes, of the character buffer
10528 + * Returns:
10529 + * Returns a pointer to the buffer containing the received
10530 + * character string. This string will be terminated by a
10531 + * newline character.
10532 + * Locking:
10533 + * No locks are required to be held upon entry to this
10534 + * function. It is not reentrant - it relies on the fact
10535 + * that while kdb is running on any one processor all other
10536 + * processors will be spinning at the kdb barrier.
10537 + * Remarks:
10538 + *
10539 + * Davidm asks, why doesn't kdb use the console abstraction;
10540 + * here are some reasons:
10541 + * - you cannot debug the console abstraction with kdb if
10542 + * kdb uses it.
10543 + * - you rely on the correct functioning of the abstraction
10544 + * in the presence of general system failures.
10545 + * - You must acquire the console spinlock thus restricting
10546 + * the usability - what if the kernel fails with the spinlock
10547 + * held - one still wishes to debug such situations.
10548 + * - How about debugging before the console(s) are registered?
10549 + * - None of the current consoles (sercons, vt_console_driver)
10550 + * have read functions defined.
10551 + * - The standard pc keyboard and terminal drivers are interrupt
10552 + * driven. We cannot enable interrupts while kdb is active,
10553 + * so the standard input functions cannot be used by kdb.
10554 + *
10555 + * An implementation could be improved by removing the need for
10556 + * lock acquisition - just keep a 'struct console *kdbconsole;' global
10557 + * variable which refers to the preferred kdb console.
10558 + *
10559 + * The bulk of this function is architecture dependent.
10560 + *
10561 + * The buffer size must be >= 2. A buffer size of 2 means that the caller only
10562 + * wants a single key.
10563 + *
10564 + * An escape key could be the start of a vt100 control sequence such as \e[D
10565 + * (left arrow) or it could be a character in its own right. The standard
10566 + * method for detecting the difference is to wait for 2 seconds to see if there
10567 + * are any other characters. kdb is complicated by the lack of a timer service
10568 + * (interrupts are off), by multiple input sources and by the need to sometimes
10569 + * return after just one key. Escape sequence processing has to be done as
10570 + * states in the polling loop.
10571 + */
10572 +
10573 +char *
10574 +kdb_read(char *buffer, size_t bufsize)
10575 +{
10576 + char *cp = buffer;
10577 + char *bufend = buffer+bufsize-2; /* Reserve space for newline and null byte */
10578 +
10579 + char *lastchar;
10580 + char *p_tmp;
10581 + char tmp;
10582 + static char tmpbuffer[CMD_BUFLEN];
10583 + int len = strlen(buffer);
10584 + int len_tmp;
10585 + int tab=0;
10586 + int count;
10587 + int i;
10588 + int diag, dtab_count;
10589 +
10590 +#define ESCAPE_UDELAY 1000
10591 +#define ESCAPE_DELAY 2*1000000/ESCAPE_UDELAY /* 2 seconds worth of udelays */
10592 + char escape_data[5]; /* longest vt100 escape sequence is 4 bytes */
10593 + char *ped = escape_data;
10594 + int escape_delay = 0;
10595 + get_char_func *f, *f_escape = NULL;
10596 +
10597 + diag = kdbgetintenv("DTABCOUNT",&dtab_count);
10598 + if (diag)
10599 + dtab_count = 30;
10600 +
10601 + if (len > 0 ) {
10602 + cp += len;
10603 + if (*(buffer+len-1) == '\n')
10604 + cp--;
10605 + }
10606 +
10607 + lastchar = cp;
10608 + *cp = '\0';
10609 + kdb_printf("%s", buffer);
10610 +
10611 + for (;;) {
10612 + int key;
10613 + for (f = &poll_funcs[0]; ; ++f) {
10614 + if (*f == NULL) {
10615 + /* Reset NMI watchdog once per poll loop */
10616 + touch_nmi_watchdog();
10617 + f = &poll_funcs[0];
10618 + }
10619 + if (escape_delay == 2) {
10620 + *ped = '\0';
10621 + ped = escape_data;
10622 + --escape_delay;
10623 + }
10624 + if (escape_delay == 1) {
10625 + key = *ped++;
10626 + if (!*ped)
10627 + --escape_delay;
10628 + break;
10629 + }
10630 + key = (*f)();
10631 + if (key == -1) {
10632 + if (escape_delay) {
10633 + udelay(ESCAPE_UDELAY);
10634 + --escape_delay;
10635 + }
10636 + continue;
10637 + }
10638 + if (bufsize <= 2) {
10639 + if (key == '\r')
10640 + key = '\n';
10641 + kdb_printf("%c", key);
10642 + *buffer++ = key;
10643 + *buffer = '\0';
10644 + return buffer;
10645 + }
10646 + if (escape_delay == 0 && key == '\e') {
10647 + escape_delay = ESCAPE_DELAY;
10648 + ped = escape_data;
10649 + f_escape = f;
10650 + }
10651 + if (escape_delay) {
10652 + *ped++ = key;
10653 + if (f_escape != f) {
10654 + escape_delay = 2;
10655 + continue;
10656 + }
10657 + if (ped - escape_data == 1) {
10658 + /* \e */
10659 + continue;
10660 + }
10661 + else if (ped - escape_data == 2) {
10662 + /* \e<something> */
10663 + if (key != '[')
10664 + escape_delay = 2;
10665 + continue;
10666 + } else if (ped - escape_data == 3) {
10667 + /* \e[<something> */
10668 + int mapkey = 0;
10669 + switch (key) {
10670 + case 'A': mapkey = 16; break; /* \e[A, up arrow */
10671 + case 'B': mapkey = 14; break; /* \e[B, down arrow */
10672 + case 'C': mapkey = 6; break; /* \e[C, right arrow */
10673 + case 'D': mapkey = 2; break; /* \e[D, left arrow */
10674 + case '1': /* dropthrough */
10675 + case '3': /* dropthrough */
10676 + case '4': mapkey = -1; break; /* \e[<1,3,4>], may be home, del, end */
10677 + }
10678 + if (mapkey != -1) {
10679 + if (mapkey > 0) {
10680 + escape_data[0] = mapkey;
10681 + escape_data[1] = '\0';
10682 + }
10683 + escape_delay = 2;
10684 + }
10685 + continue;
10686 + } else if (ped - escape_data == 4) {
10687 + /* \e[<1,3,4><something> */
10688 + int mapkey = 0;
10689 + if (key == '~') {
10690 + switch (escape_data[2]) {
10691 + case '1': mapkey = 1; break; /* \e[1~, home */
10692 + case '3': mapkey = 4; break; /* \e[3~, del */
10693 + case '4': mapkey = 5; break; /* \e[4~, end */
10694 + }
10695 + }
10696 + if (mapkey > 0) {
10697 + escape_data[0] = mapkey;
10698 + escape_data[1] = '\0';
10699 + }
10700 + escape_delay = 2;
10701 + continue;
10702 + }
10703 + }
10704 + break; /* A key to process */
10705 + }
10706 +
10707 + if (key != 9)
10708 + tab = 0;
10709 + switch (key) {
10710 + case 8: /* backspace */
10711 + if (cp > buffer) {
10712 + if (cp < lastchar) {
10713 + memcpy(tmpbuffer, cp, lastchar - cp);
10714 + memcpy(cp-1, tmpbuffer, lastchar - cp);
10715 + }
10716 + *(--lastchar) = '\0';
10717 + --cp;
10718 + kdb_printf("\b%s \r", cp);
10719 + tmp = *cp;
10720 + *cp = '\0';
10721 + kdb_printf(kdb_prompt_str);
10722 + kdb_printf("%s", buffer);
10723 + *cp = tmp;
10724 + }
10725 + break;
10726 + case 13: /* enter */
10727 + *lastchar++ = '\n';
10728 + *lastchar++ = '\0';
10729 + kdb_printf("\n");
10730 + return buffer;
10731 + case 4: /* Del */
10732 + if(cp < lastchar) {
10733 + memcpy(tmpbuffer, cp+1, lastchar - cp -1);
10734 + memcpy(cp, tmpbuffer, lastchar - cp -1);
10735 + *(--lastchar) = '\0';
10736 + kdb_printf("%s \r", cp);
10737 + tmp = *cp;
10738 + *cp = '\0';
10739 + kdb_printf(kdb_prompt_str);
10740 + kdb_printf("%s", buffer);
10741 + *cp = tmp;
10742 + }
10743 + break;
10744 + case 1: /* Home */
10745 + if(cp > buffer) {
10746 + kdb_printf("\r");
10747 + kdb_printf(kdb_prompt_str);
10748 + cp = buffer;
10749 + }
10750 + break;
10751 + case 5: /* End */
10752 + if(cp < lastchar) {
10753 + kdb_printf("%s", cp);
10754 + cp = lastchar;
10755 + }
10756 + break;
10757 + case 2: /* Left */
10758 + if (cp > buffer) {
10759 + kdb_printf("\b");
10760 + --cp;
10761 + }
10762 + break;
10763 + case 14: /* Down */
10764 + memset(tmpbuffer, ' ', strlen(kdb_prompt_str)+(lastchar-buffer));
10765 + *(tmpbuffer+strlen(kdb_prompt_str)+(lastchar-buffer)) = '\0';
10766 + kdb_printf("\r%s\r", tmpbuffer);
10767 + *lastchar = (char)key;
10768 + *(lastchar+1) = '\0';
10769 + return lastchar;
10770 + case 6: /* Right */
10771 + if (cp < lastchar) {
10772 + kdb_printf("%c", *cp);
10773 + ++cp;
10774 + }
10775 + break;
10776 + case 16: /* Up */
10777 + memset(tmpbuffer, ' ', strlen(kdb_prompt_str)+(lastchar-buffer));
10778 + *(tmpbuffer+strlen(kdb_prompt_str)+(lastchar-buffer)) = '\0';
10779 + kdb_printf("\r%s\r", tmpbuffer);
10780 + *lastchar = (char)key;
10781 + *(lastchar+1) = '\0';
10782 + return lastchar;
10783 + case 9: /* Tab */
10784 + if (tab < 2)
10785 + ++tab;
10786 + p_tmp = buffer;
10787 + while(*p_tmp==' ') p_tmp++;
10788 + if (p_tmp<=cp) {
10789 + memcpy(tmpbuffer, p_tmp, cp-p_tmp);
10790 + *(tmpbuffer + (cp-p_tmp)) = '\0';
10791 + p_tmp = strrchr(tmpbuffer, ' ');
10792 + if (p_tmp)
10793 + ++p_tmp;
10794 + else
10795 + p_tmp = tmpbuffer;
10796 + len = strlen(p_tmp);
10797 + count = kallsyms_symbol_complete(p_tmp, sizeof(tmpbuffer) - (p_tmp - tmpbuffer));
10798 + if (tab == 2) {
10799 + if (count > 0) {
10800 + kdb_printf("\n%d symbols are found.", count);
10801 + if(count>dtab_count) {
10802 + count=dtab_count;
10803 + kdb_printf(" But only first %d symbols will be printed.\nYou can change the environment variable DTABCOUNT.", count);
10804 + }
10805 + kdb_printf("\n");
10806 + for(i=0;i<count;i++) {
10807 + if(kallsyms_symbol_next(p_tmp, i)<0)
10808 + break;
10809 + kdb_printf("%s ",p_tmp);
10810 + *(p_tmp+len)='\0';
10811 + }
10812 + if(i>=dtab_count)kdb_printf("...");
10813 + kdb_printf("\n");
10814 + kdb_printf(kdb_prompt_str);
10815 + kdb_printf("%s", buffer);
10816 + }
10817 + }
10818 + else {
10819 + if (count > 0) {
10820 + len_tmp = strlen(p_tmp);
10821 + strncpy(p_tmp+len_tmp,cp, lastchar-cp+1);
10822 + len_tmp = strlen(p_tmp);
10823 + strncpy(cp, p_tmp+len, len_tmp-len+1);
10824 + len = len_tmp - len;
10825 + kdb_printf("%s", cp);
10826 + cp+=len;
10827 + lastchar+=len;
10828 + }
10829 + }
10830 + kdb_nextline = 1; /* reset output line number */
10831 + }
10832 + break;
10833 + default:
10834 + if (key >= 32 &&lastchar < bufend) {
10835 + if (cp < lastchar) {
10836 + memcpy(tmpbuffer, cp, lastchar - cp);
10837 + memcpy(cp+1, tmpbuffer, lastchar - cp);
10838 + *++lastchar = '\0';
10839 + *cp = key;
10840 + kdb_printf("%s\r", cp);
10841 + ++cp;
10842 + tmp = *cp;
10843 + *cp = '\0';
10844 + kdb_printf(kdb_prompt_str);
10845 + kdb_printf("%s", buffer);
10846 + *cp = tmp;
10847 + } else {
10848 + *++lastchar = '\0';
10849 + *cp++ = key;
10850 + kdb_printf("%c", key);
10851 + }
10852 + }
10853 + break;
10854 + }
10855 + }
10856 +}
10857 +
10858 +/*
10859 + * kdb_getstr
10860 + *
10861 + * Print the prompt string and read a command from the
10862 + * input device.
10863 + *
10864 + * Parameters:
10865 + * buffer Address of buffer to receive command
10866 + * bufsize Size of buffer in bytes
10867 + * prompt Pointer to string to use as prompt string
10868 + * Returns:
10869 + * Pointer to command buffer.
10870 + * Locking:
10871 + * None.
10872 + * Remarks:
10873 + * For SMP kernels, the processor number will be
10874 + * substituted for %d, %x or %o in the prompt.
10875 + */
10876 +
10877 +char *
10878 +kdb_getstr(char *buffer, size_t bufsize, char *prompt)
10879 +{
10880 + if(prompt && kdb_prompt_str!=prompt)
10881 + strncpy(kdb_prompt_str, prompt, CMD_BUFLEN);
10882 + kdb_printf(kdb_prompt_str);
10883 + kdb_nextline = 1; /* Prompt and input resets line number */
10884 + return kdb_read(buffer, bufsize);
10885 +}
10886 +
10887 +/*
10888 + * kdb_input_flush
10889 + *
10890 + * Get rid of any buffered console input.
10891 + *
10892 + * Parameters:
10893 + * none
10894 + * Returns:
10895 + * nothing
10896 + * Locking:
10897 + * none
10898 + * Remarks:
10899 + * Call this function whenever you want to flush input. If there is any
10900 + * outstanding input, it ignores all characters until there has been no
10901 + * data for approximately half a second.
10902 + */
10903 +
10904 +#define FLUSH_UDELAY 100
10905 +#define FLUSH_DELAY 500000/FLUSH_UDELAY /* 0.5 seconds worth of udelays */
10906 +
10907 +static void
10908 +kdb_input_flush(void)
10909 +{
10910 + get_char_func *f;
10911 + int flush_delay = 1;
10912 + while (flush_delay--) {
10913 + touch_nmi_watchdog();
10914 + for (f = &poll_funcs[0]; *f; ++f) {
10915 + if ((*f)() != -1) {
10916 + flush_delay = FLUSH_DELAY;
10917 + break;
10918 + }
10919 + }
10920 + if (flush_delay)
10921 + udelay(FLUSH_UDELAY);
10922 + }
10923 +}
10924 +
10925 +/*
10926 + * kdb_printf
10927 + *
10928 + * Print a string to the output device(s).
10929 + *
10930 + * Parameters:
10931 + * printf-like format and optional args.
10932 + * Returns:
10933 + * 0
10934 + * Locking:
10935 + * None.
10936 + * Remarks:
10937 + * use 'kdbcons->write()' to avoid polluting 'log_buf' with
10938 + * kdb output.
10939 + *
10940 + * If the user is doing a cmd args | grep srch
10941 + * then kdb_grepping_flag is set.
10942 + * In that case we need to accumulate full lines (ending in \n) before
10943 + * searching for the pattern.
10944 + */
10945 +
10946 +static char kdb_buffer[256]; /* A bit too big to go on stack */
10947 +static char *next_avail=kdb_buffer;
10948 +static int size_avail;
10949 +static int suspend_grep=0;
10950 +
10951 +/*
10952 + * search arg1 to see if it contains arg2
10953 + * (kdmain.c provides flags for ^pat and pat$)
10954 + *
10955 + * return 1 for found, 0 for not found
10956 + */
10957 +int
10958 +kdb_search_string(char *searched, char *searchfor)
10959 +{
10960 + char firstchar, *cp;
10961 + int len1, len2;
10962 +
10963 + /* not counting the newline at the end of "searched" */
10964 + len1 = strlen(searched)-1;
10965 + len2 = strlen(searchfor);
10966 + if (len1 < len2) return 0;
10967 + if (kdb_grep_leading && kdb_grep_trailing && len1 != len2) return 0;
10968 +
10969 + if (kdb_grep_leading) {
10970 + if (!strncmp(searched, searchfor, len2)) {
10971 + return 1;
10972 + }
10973 + } else if (kdb_grep_trailing) {
10974 + if (!strncmp(searched+len1-len2, searchfor, len2)) {
10975 + return 1;
10976 + }
10977 + } else {
10978 + firstchar = *searchfor;
10979 + cp = searched;
10980 + while ((cp = strchr(cp,firstchar))) {
10981 + if (!strncmp(cp, searchfor, len2)) {
10982 + return 1;
10983 + }
10984 + cp++;
10985 + }
10986 + }
10987 + return 0;
10988 +}
10989 +
10990 +void
10991 +kdb_printf(const char *fmt, ...)
10992 +{
10993 + va_list ap;
10994 + int diag;
10995 + int linecount;
10996 + int logging, saved_loglevel = 0;
10997 + int do_longjmp = 0;
10998 + int got_printf_lock = 0;
10999 + int fnd, len;
11000 + char *cp, *cp2, *cphold = NULL, replaced_byte = ' ';
11001 + char *moreprompt = "more> ";
11002 + struct console *c = console_drivers;
11003 + static DEFINE_SPINLOCK(kdb_printf_lock);
11004 + unsigned long uninitialized_var(flags);
11005 +
11006 + preempt_disable();
11007 + /* Serialize kdb_printf if multiple cpus try to write at once.
11008 + * But if any cpu goes recursive in kdb, just print the output,
11009 + * even if it is interleaved with any other text.
11010 + */
11011 + if (!KDB_STATE(PRINTF_LOCK)) {
11012 + KDB_STATE_SET(PRINTF_LOCK);
11013 + spin_lock_irqsave(&kdb_printf_lock, flags);
11014 + got_printf_lock = 1;
11015 + atomic_inc(&kdb_event);
11016 + } else {
11017 + __acquire(kdb_printf_lock);
11018 + }
11019 +
11020 + diag = kdbgetintenv("LINES", &linecount);
11021 + if (diag || linecount <= 1)
11022 + linecount = 22;
11023 +
11024 + diag = kdbgetintenv("LOGGING", &logging);
11025 + if (diag)
11026 + logging = 0;
11027 +
11028 + if (!kdb_grepping_flag || suspend_grep) {
11029 + /* normally, every vsnprintf starts a new buffer */
11030 + next_avail = kdb_buffer;
11031 + size_avail = sizeof(kdb_buffer);
11032 + }
11033 + va_start(ap, fmt);
11034 + vsnprintf(next_avail, size_avail, fmt, ap);
11035 + va_end(ap);
11036 +
11037 + /*
11038 + * If kdb_parse() found that the command was cmd xxx | grep yyy
11039 + * then kdb_grepping_flag is set, and kdb_grep_string contains yyy
11040 + *
11041 + * Accumulate the print data up to a newline before searching it.
11042 + * (vsnprintf does null-terminate the string that it generates)
11043 + */
11044 +
11045 + /* skip the search if prints are temporarily unconditional */
11046 + if (! suspend_grep) {
11047 +
11048 + if (kdb_grepping_flag) {
11049 + cp = strchr(kdb_buffer, '\n');
11050 + if (!cp) {
11051 + /*
11052 + * Special cases that don't end with newlines
11053 + * but should be written without one:
11054 + * The "[nn]kdb> " prompt should
11055 + * appear at the front of the buffer.
11056 + *
11057 + * The "[nn]more " prompt should also be
11058 + * (MOREPROMPT -> moreprompt)
11059 + * written * but we print that ourselves,
11060 + * we set the suspend_grep flag to make
11061 + * it unconditional.
11062 + *
11063 + */
11064 + if (next_avail == kdb_buffer) {
11065 + /*
11066 + * these should occur after a newline,
11067 + * so they will be at the front of
11068 + * the buffer
11069 + */
11070 + cp2 = kdb_buffer;
11071 + len = strlen(kdb_prompt_str);
11072 + if (!strncmp(cp2,kdb_prompt_str, len)) {
11073 + /*
11074 + * We're about to start a new
11075 + * command, so we can go back
11076 + * to normal mode.
11077 + */
11078 + kdb_grepping_flag = 0;
11079 + goto kdb_printit;
11080 + }
11081 + }
11082 + /* no newline; don't search/write the buffer
11083 + until one is there */
11084 + len = strlen(kdb_buffer);
11085 + next_avail = kdb_buffer + len;
11086 + size_avail = sizeof(kdb_buffer) - len;
11087 + goto kdb_print_out;
11088 + }
11089 +
11090 + /*
11091 + * The newline is present; print through it or discard
11092 + * it, depending on the results of the search.
11093 + */
11094 + cp++; /* to byte after the newline */
11095 + replaced_byte = *cp; /* remember what/where it was */
11096 + cphold = cp;
11097 + *cp = '\0'; /* end the string for our search */
11098 +
11099 + /*
11100 + * We now have a newline at the end of the string
11101 + * Only continue with this output if it contains the
11102 + * search string.
11103 + */
11104 + fnd = kdb_search_string(kdb_buffer, kdb_grep_string);
11105 + if (!fnd) {
11106 + /*
11107 + * At this point the complete line at the start
11108 + * of kdb_buffer can be discarded, as it does
11109 + * not contain what the user is looking for.
11110 + * Shift the buffer left.
11111 + */
11112 + *cphold = replaced_byte;
11113 + strcpy(kdb_buffer, cphold);
11114 + len = strlen(kdb_buffer);
11115 + next_avail = kdb_buffer + len;
11116 + size_avail = sizeof(kdb_buffer) - len;
11117 + goto kdb_print_out;
11118 + }
11119 + /*
11120 + * at this point the string is a full line and
11121 + * should be printed, up to the null.
11122 + */
11123 + }
11124 + }
11125 +kdb_printit:
11126 +
11127 + /*
11128 + * Write to all consoles.
11129 + */
11130 +#ifdef CONFIG_SPARC64
11131 + if (c == NULL)
11132 + prom_printf("%s", kdb_buffer);
11133 + else
11134 +#endif
11135 +
11136 +#ifdef CONFIG_PPC64
11137 + if (udbg_write)
11138 + udbg_write(kdb_buffer, strlen(kdb_buffer));
11139 + else
11140 +#endif
11141 +
11142 + while (c) {
11143 + c->write(c, kdb_buffer, strlen(kdb_buffer));
11144 + touch_nmi_watchdog();
11145 + c = c->next;
11146 + }
11147 + if (logging) {
11148 + saved_loglevel = console_loglevel;
11149 + console_loglevel = 0;
11150 + printk("%s", kdb_buffer);
11151 + }
11152 +
11153 + if (KDB_STATE(LONGJMP) && strchr(kdb_buffer, '\n'))
11154 + kdb_nextline++;
11155 +
11156 + /* check for having reached the LINES number of printed lines */
11157 + if (kdb_nextline == linecount) {
11158 + char buf1[16]="";
11159 +#if defined(CONFIG_SMP)
11160 + char buf2[32];
11161 +#endif
11162 +
11163 + /* Watch out for recursion here. Any routine that calls
11164 + * kdb_printf will come back through here. And kdb_read
11165 + * uses kdb_printf to echo on serial consoles ...
11166 + */
11167 + kdb_nextline = 1; /* In case of recursion */
11168 +
11169 + /*
11170 + * Pause until cr.
11171 + */
11172 + moreprompt = kdbgetenv("MOREPROMPT");
11173 + if (moreprompt == NULL) {
11174 + moreprompt = "more> ";
11175 + }
11176 +
11177 +#if defined(CONFIG_SMP)
11178 + if (strchr(moreprompt, '%')) {
11179 + sprintf(buf2, moreprompt, get_cpu());
11180 + put_cpu();
11181 + moreprompt = buf2;
11182 + }
11183 +#endif
11184 +
11185 + kdb_input_flush();
11186 + c = console_drivers;
11187 +#ifdef CONFIG_SPARC64
11188 + if (c == NULL)
11189 + prom_printf("%s", moreprompt);
11190 + else
11191 +#endif
11192 +
11193 +#ifdef CONFIG_PPC64
11194 + if (udbg_write)
11195 + udbg_write(moreprompt, strlen(moreprompt));
11196 + else
11197 +#endif
11198 +
11199 + while (c) {
11200 + c->write(c, moreprompt, strlen(moreprompt));
11201 + touch_nmi_watchdog();
11202 + c = c->next;
11203 + }
11204 +
11205 + if (logging)
11206 + printk("%s", moreprompt);
11207 +
11208 + kdb_read(buf1, 2); /* '2' indicates to return immediately after getting one key. */
11209 + kdb_nextline = 1; /* Really set output line 1 */
11210 +
11211 + /* empty and reset the buffer: */
11212 + kdb_buffer[0] = '\0';
11213 + next_avail = kdb_buffer;
11214 + size_avail = sizeof(kdb_buffer);
11215 + if ((buf1[0] == 'q') || (buf1[0] == 'Q')) {
11216 + /* user hit q or Q */
11217 + do_longjmp = 1;
11218 + KDB_FLAG_SET(CMD_INTERRUPT); /* command was interrupted */
11219 + /* end of command output; back to normal mode */
11220 + kdb_grepping_flag = 0;
11221 + kdb_printf("\n");
11222 + } else if (buf1[0] && buf1[0] != '\n') {
11223 + /* user hit something other than enter */
11224 + suspend_grep = 1; /* for this recursion */
11225 + kdb_printf("\nOnly 'q' or 'Q' are processed at more prompt, input ignored\n");
11226 + } else if (kdb_grepping_flag) {
11227 + /* user hit enter */
11228 + suspend_grep = 1; /* for this recursion */
11229 + kdb_printf("\n");
11230 + }
11231 + kdb_input_flush();
11232 + }
11233 +
11234 + /*
11235 + * For grep searches, shift the printed string left.
11236 + * replaced_byte contains the character that was overwritten with
11237 + * the terminating null, and cphold points to the null.
11238 + * Then adjust the notion of available space in the buffer.
11239 + */
11240 + if (kdb_grepping_flag && !suspend_grep) {
11241 + *cphold = replaced_byte;
11242 + strcpy(kdb_buffer, cphold);
11243 + len = strlen(kdb_buffer);
11244 + next_avail = kdb_buffer + len;
11245 + size_avail = sizeof(kdb_buffer) - len;
11246 + }
11247 +
11248 +kdb_print_out:
11249 + suspend_grep = 0; /* end of what may have been a recursive call */
11250 + if (logging) {
11251 + console_loglevel = saved_loglevel;
11252 + }
11253 + if (KDB_STATE(PRINTF_LOCK) && got_printf_lock) {
11254 + got_printf_lock = 0;
11255 + spin_unlock_irqrestore(&kdb_printf_lock, flags);
11256 + KDB_STATE_CLEAR(PRINTF_LOCK);
11257 + atomic_dec(&kdb_event);
11258 + } else {
11259 + __release(kdb_printf_lock);
11260 + }
11261 + preempt_enable();
11262 + if (do_longjmp)
11263 +#ifdef kdba_setjmp
11264 + kdba_longjmp(&kdbjmpbuf[smp_processor_id()], 1)
11265 +#endif /* kdba_setjmp */
11266 + ;
11267 +}
11268 +
11269 +/*
11270 + * kdb_io_init
11271 + *
11272 + * Initialize kernel debugger output environment.
11273 + *
11274 + * Parameters:
11275 + * None.
11276 + * Returns:
11277 + * None.
11278 + * Locking:
11279 + * None.
11280 + * Remarks:
11281 + * Select a console device. Only use a VT console if the user specified
11282 + * or defaulted console= /^tty[0-9]*$/
11283 + */
11284 +
11285 +void __init
11286 +kdb_io_init(void)
11287 +{
11288 + /*
11289 + * Select a console.
11290 + */
11291 + struct console *c = console_drivers;
11292 + int vt_console = 0;
11293 +
11294 + while (c) {
11295 + if ((c->flags & CON_CONSDEV) && !kdbcons)
11296 + kdbcons = c;
11297 + if ((c->flags & CON_ENABLED) &&
11298 + strncmp(c->name, "tty", 3) == 0) {
11299 + char *p = c->name + 3;
11300 + while (isdigit(*p))
11301 + ++p;
11302 + if (*p == '\0')
11303 + vt_console = 1;
11304 + }
11305 + c = c->next;
11306 + }
11307 +
11308 + if (kdbcons == NULL) {
11309 + printk(KERN_ERR "kdb: Initialization failed - no console. kdb is disabled.\n");
11310 + KDB_FLAG_SET(NO_CONSOLE);
11311 + kdb_on = 0;
11312 + }
11313 + if (!vt_console)
11314 + KDB_FLAG_SET(NO_VT_CONSOLE);
11315 + kdb_input_flush();
11316 + return;
11317 +}
11318 +
11319 +#ifdef CONFIG_KDB_USB
11320 +
11321 +int kdb_no_usb = 0;
11322 +
11323 +static int __init opt_kdbnousb(char *str)
11324 +{
11325 + kdb_no_usb = 1;
11326 + return 0;
11327 +}
11328 +
11329 +early_param("kdbnousb", opt_kdbnousb);
11330 +
11331 +#endif
11332 +
11333 +EXPORT_SYMBOL(kdb_read);
11334 --- /dev/null
11335 +++ b/kdb/kdbdereference.c
11336 @@ -0,0 +1,7257 @@
11337 +/*
11338 + *
11339 + * Most of this code is borrowed and adapted from the lkcd command "lcrash"
11340 + * and its supporting libarary.
11341 + *
11342 + * This kdb commands for casting memory structures.
11343 + * It provides
11344 + * "print" "px", "pd" *
11345 + *
11346 + * Careful of porting the klib KL_XXX functions (they call thru a jump table
11347 + * that we don't use here)
11348 + *
11349 + * The kernel type information is added be insmod'g the kdb debuginfo module
11350 + * It loads symbolic debugging info (provided from lcrash -o),
11351 + * (this information originally comes from the lcrash "kerntypes" file)
11352 + *
11353 + */
11354 +
11355 +#define VMALLOC_START_IA64 0xa000000200000000
11356 +#include <linux/kernel.h>
11357 +#include <linux/module.h>
11358 +#include <linux/kdb.h>
11359 +#include <linux/kdbprivate.h>
11360 +#include <linux/fs.h>
11361 +#include <asm/processor.h>
11362 +#include <asm/uaccess.h>
11363 +#include <asm/fcntl.h>
11364 +#include <linux/vmalloc.h>
11365 +#include <linux/ctype.h>
11366 +#include <linux/file.h>
11367 +#include <linux/err.h>
11368 +#include "modules/lcrash/klib.h"
11369 +#include "modules/lcrash/kl_stringtab.h"
11370 +#include "modules/lcrash/kl_btnode.h"
11371 +#include "modules/lcrash/lc_eval.h"
11372 +
11373 +#undef next_node /* collision with nodemask.h */
11374 +int have_debug_file = 0;
11375 +dbg_sym_t *types_tree_head;
11376 +dbg_sym_t *typedefs_tree_head;
11377 +kltype_t *kltype_array;
11378 +dbg_sym_t *dsym_types_array;
11379 +
11380 +
11381 +EXPORT_SYMBOL(types_tree_head);
11382 +EXPORT_SYMBOL(typedefs_tree_head);
11383 +EXPORT_SYMBOL(kltype_array);
11384 +EXPORT_SYMBOL(dsym_types_array);
11385 +
11386 +#define C_HEX 0x0002
11387 +#define C_WHATIS 0x0004
11388 +#define C_NOVARS 0x0008
11389 +#define C_SIZEOF 0x0010
11390 +#define C_SHOWOFFSET 0x0020
11391 +#define C_LISTHEAD 0x0040
11392 +#define C_LISTHEAD_N 0x0080 /* walk using list_head.next */
11393 +#define C_LISTHEAD_P 0x0100 /* walk using list_head.prev */
11394 +#define C_BINARY 0x0200
11395 +#define MAX_LONG_LONG 0xffffffffffffffffULL
11396 +klib_t kdb_klib;
11397 +klib_t *KLP = &kdb_klib;
11398 +k_error_t klib_error = 0;
11399 +dbg_sym_t *type_tree = (dbg_sym_t *)NULL;
11400 +dbg_sym_t *typedef_tree = (dbg_sym_t *)NULL;
11401 +dbg_sym_t *func_tree = (dbg_sym_t *)NULL;
11402 +dbg_sym_t *srcfile_tree = (dbg_sym_t *)NULL;
11403 +dbg_sym_t *var_tree = (dbg_sym_t *)NULL;
11404 +dbg_sym_t *xtype_tree = (dbg_sym_t *)NULL;
11405 +dbg_hashrec_t *dbg_hash[TYPE_NUM_SLOTS];
11406 +int all_count, deall_count;
11407 +void single_type(char *str);
11408 +void sizeof_type(char *str);
11409 +typedef struct chunk_s {
11410 + struct chunk_s *next; /* Must be first */
11411 + struct chunk_s *prev; /* Must be second */
11412 + void *addr;
11413 + struct bucket_s *bucketp;
11414 + uint32_t chunksz; /* size of memory chunk (via malloc()) */
11415 + uint32_t blksz; /* Not including header */
11416 + short blkcount; /* Number of blksz blocks in chunk */
11417 +} chunk_t;
11418 +
11419 +typedef struct blkhdr_s {
11420 + struct blkhdr_s *next;
11421 + union {
11422 + struct blkhdr_s *prev;
11423 + chunk_t *chunkp;
11424 + } b_un;
11425 + int flg;
11426 + int size;
11427 +} blkhdr_t;
11428 +
11429 +int ptrsz64 = ((int)sizeof(void *) == 8);
11430 +alloc_functions_t alloc_functions;
11431 +
11432 +/*
11433 + * return 1 if addr is invalid
11434 + */
11435 +static int
11436 +invalid_address(kaddr_t addr, int count)
11437 +{
11438 + unsigned char c;
11439 + unsigned long lcount;
11440 + /* FIXME: untested? */
11441 + lcount = count;
11442 + /* FIXME: use kdb_verify_area */
11443 + while (count--) {
11444 + if (kdb_getarea(c, addr))
11445 + return 1;
11446 + }
11447 + return 0;
11448 +}
11449 +
11450 +/*
11451 + * wrappers for calls to kernel-style allocation/deallocation
11452 + */
11453 +static void *
11454 +kl_alloc_block(int size)
11455 +{
11456 + void *vp;
11457 +
11458 + vp = kmalloc(size, GFP_KERNEL);
11459 + if (!vp) {
11460 + kdb_printf ("kmalloc of %d bytes failed\n", size);
11461 + }
11462 + /* important: the lcrash code sometimes assumes that the
11463 + * allocation is zeroed out
11464 + */
11465 + memset(vp, 0, size);
11466 + all_count++;
11467 + return vp;
11468 +}
11469 +static void
11470 +kl_free_block(void *vp)
11471 +{
11472 + kfree(vp);
11473 + deall_count++;
11474 + return;
11475 +}
11476 +
11477 +int
11478 +get_value(char *s, uint64_t *value)
11479 +{
11480 + return kl_get_value(s, NULL, 0, value);
11481 +}
11482 +
11483 +/*
11484 + * kl_get_block()
11485 + *
11486 + * Read a size block from virtual address addr in the system memory image.
11487 + */
11488 +k_error_t
11489 +kl_get_block(kaddr_t addr, unsigned size, void *bp, void *mmap)
11490 +{
11491 + if (!bp) {
11492 + return(KLE_NULL_BUFF);
11493 + } else if (!size) {
11494 + return(KLE_ZERO_SIZE);
11495 + }
11496 +
11497 + memcpy(bp, (void *)addr, size);
11498 +
11499 + return(0);
11500 +}
11501 +
11502 +/*
11503 + * print_value()
11504 + */
11505 +void
11506 +print_value(char *ldstr, uint64_t value, int width)
11507 +{
11508 + int w = 0;
11509 + char fmtstr[12], f, s[2]="\000\000";
11510 +
11511 + if (ldstr) {
11512 + kdb_printf("%s", ldstr);
11513 + }
11514 + s[0] = '#';
11515 + f = 'x';
11516 + if (width) {
11517 + if (ptrsz64) {
11518 + w = 18; /* due to leading "0x" */
11519 + } else {
11520 + w = 10; /* due to leading "0x" */
11521 + }
11522 + }
11523 + if (w) {
11524 + sprintf(fmtstr, "%%%s%d"FMT64"%c", s, w, f);
11525 + } else {
11526 + sprintf(fmtstr, "%%%s"FMT64"%c", s, f);
11527 + }
11528 + kdb_printf(fmtstr, value);
11529 +}
11530 +
11531 +/*
11532 + * print_list_head()
11533 + */
11534 +void
11535 +print_list_head(kaddr_t saddr)
11536 +{
11537 + print_value("STRUCT ADDR: ", (uint64_t)saddr, 8);
11538 + kdb_printf("\n");
11539 +}
11540 +
11541 +/*
11542 + * check_prev_ptr()
11543 + */
11544 +void
11545 +check_prev_ptr(kaddr_t ptr, kaddr_t prev)
11546 +{
11547 + if(ptr != prev) {
11548 + kdb_printf("\nWARNING: Pointer broken. %#"FMTPTR"x,"
11549 + " SHOULD BE: %#"FMTPTR"x\n", prev, ptr);
11550 + }
11551 +}
11552 +
11553 +/*
11554 + * kl_kaddr() -- Return a kernel virtual address stored in a structure
11555 + *
11556 + * Pointer 'p' points to a kernel structure
11557 + * of type 's.' Get the kernel address located in member 'm.'
11558 + */
11559 +kaddr_t
11560 +kl_kaddr(void *p, char *s, char *m)
11561 +{
11562 + uint64_t *u64p;
11563 + int offset;
11564 +
11565 + offset = kl_member_offset(s, m);
11566 + u64p = (uint64_t *)(p + offset);
11567 + return((kaddr_t)*u64p);
11568 +}
11569 +
11570 +/*
11571 + * walk_structs() -- walk linked lists of kernel data structures
11572 + */
11573 +int
11574 +walk_structs(char *s, char *f, char *member, kaddr_t addr, int flags)
11575 +{
11576 + int size, offset, mem_offset=0;
11577 + kaddr_t last = 0, next;
11578 + kltype_t *klt = (kltype_t *)NULL, *memklt=(kltype_t *)NULL;
11579 + unsigned long long iter_threshold = 10000;
11580 +
11581 + int counter = 0;
11582 + kaddr_t head=0, head_next=0, head_prev=0, entry=0;
11583 + kaddr_t entry_next=0, entry_prev;
11584 +
11585 + /* field name of link pointer, determine its offset in the struct. */
11586 + if ((offset = kl_member_offset(s, f)) == -1) {
11587 + kdb_printf("Could not determine offset for member %s of %s.\n",
11588 + f, s);
11589 + return 0;
11590 + }
11591 +
11592 + /* Get the type of the enclosing structure */
11593 + if (!(klt = kl_find_type(s, (KLT_STRUCT|KLT_UNION)))) {
11594 + kdb_printf("Could not find the type of %s\n", s);
11595 + return(1);
11596 + }
11597 +
11598 + /* Get the struct size */
11599 + if ((size = kl_struct_len(s)) == 0) {
11600 + kdb_printf ("could not get the length of %s\n", s);
11601 + return(1);
11602 + }
11603 +
11604 + /* test for a named member of the structure that should be displayed */
11605 + if (member) {
11606 + memklt = kl_get_member(klt, member);
11607 + if (!memklt) {
11608 + kdb_printf ("%s has no member %s\n", s, member);
11609 + return 1;
11610 + }
11611 + mem_offset = kl_get_member_offset(klt, member);
11612 + }
11613 +
11614 + if ((next = addr)) {
11615 + /* get head of list (anchor) when struct list_head is used */
11616 + if (flags & C_LISTHEAD) {
11617 + head = next;
11618 + if (invalid_address(head, sizeof(head))) {
11619 + kdb_printf ("invalid address %#lx\n",
11620 + head);
11621 + return 1;
11622 + }
11623 + /* get contents of addr struct member */
11624 + head_next = kl_kaddr((void *)head, "list_head", "next");
11625 + if (invalid_address(head, sizeof(head_next))) {
11626 + kdb_printf ("invalid address %#lx\n",
11627 + head_next);
11628 + return 1;
11629 + }
11630 + /* get prev field of anchor */
11631 + head_prev = kl_kaddr((void *)head, "list_head", "prev");
11632 + if (invalid_address(head, sizeof(head_prev))) {
11633 + kdb_printf ("invalid address %#lx\n",
11634 + head_prev);
11635 + return 1;
11636 + }
11637 + entry = 0;
11638 + }
11639 + }
11640 +
11641 + while(next && counter < iter_threshold) {
11642 + counter++;
11643 + if (counter > iter_threshold) {
11644 + kdb_printf("\nWARNING: Iteration threshold reached.\n");
11645 + kdb_printf("Current threshold: %lld\n", iter_threshold);
11646 + break;
11647 + }
11648 + if(flags & C_LISTHEAD) {
11649 + if(!(entry)){
11650 + if(flags & C_LISTHEAD_N){
11651 + entry = head_next;
11652 + } else {
11653 + entry = head_prev;
11654 + }
11655 + last = head;
11656 + }
11657 +
11658 + if(head == entry) {
11659 + if(flags & C_LISTHEAD_N){
11660 + check_prev_ptr(last, head_prev);
11661 + } else {
11662 + check_prev_ptr(last, head_next);
11663 + }
11664 + break;
11665 + }
11666 +
11667 + next = entry - offset; /* next structure */
11668 + /* check that the whole structure can be addressed */
11669 + if (invalid_address(next, size)) {
11670 + kdb_printf(
11671 + "invalid struct address %#lx\n", next);
11672 + return 1;
11673 + }
11674 + /* and validate that it points to valid addresses */
11675 + entry_next = kl_kaddr((void *)entry,"list_head","next");
11676 + if (invalid_address(entry_next, sizeof(entry_next))) {
11677 + kdb_printf("invalid address %#lx\n",
11678 + entry_next);
11679 + return 1;
11680 + }
11681 + entry_prev = kl_kaddr((void *)entry,"list_head","prev");
11682 + if (invalid_address(entry_prev, sizeof(entry_prev))) {
11683 + kdb_printf("invalid address %#lx\n",
11684 + entry_prev);
11685 + return 1;
11686 + }
11687 + if(flags & C_LISTHEAD_N){
11688 + check_prev_ptr(last, entry_prev);
11689 + } else {
11690 + check_prev_ptr(last, entry_next);
11691 + }
11692 + print_list_head(next);
11693 + last = entry;
11694 + if(flags & C_LISTHEAD_N){
11695 + entry = entry_next; /* next list_head */
11696 + } else {
11697 + entry = entry_prev; /* next list_head */
11698 + }
11699 + }
11700 +
11701 + if (memklt) {
11702 + /* print named sub-structure in C-like struct format. */
11703 + kl_print_member(
11704 + (void *)((unsigned long)next+mem_offset),
11705 + memklt, 0, C_HEX);
11706 + } else {
11707 + /* print entire structure in C-like struct format. */
11708 + kl_print_type((void *)next, klt, 0, C_HEX);
11709 + }
11710 +
11711 + if(!(flags & C_LISTHEAD)) {
11712 + last = next;
11713 + next = (kaddr_t) (*(uint64_t*)(next + offset));
11714 + }
11715 + }
11716 +
11717 + return(0);
11718 +}
11719 +
11720 +/*
11721 + * Implement the lcrash walk -s command
11722 + * see lcrash cmd_walk.c
11723 + */
11724 +int
11725 +kdb_walk(int argc, const char **argv)
11726 +{
11727 + int i, nonoptc=0, optc=0, flags=0, init_len=0;
11728 + char *cmd, *arg, *structp=NULL, *forwp=NULL, *memberp=NULL;
11729 + char *addrp=NULL;
11730 + uint64_t value;
11731 + kaddr_t start_addr;
11732 +
11733 + all_count=0;
11734 + deall_count=0;
11735 + if (!have_debug_file) {
11736 + kdb_printf("no debuginfo file\n");
11737 + return 0;
11738 + }
11739 + /* If there is nothing to evaluate, just return */
11740 + if (argc == 0) {
11741 + return 0;
11742 + }
11743 + cmd = (char *)*argv; /* s/b "walk" */
11744 + if (strcmp(cmd,"walk")) {
11745 + kdb_printf("got %s, not \"walk\"\n", cmd);
11746 + return 0;
11747 + }
11748 +
11749 + for (i=1; i<=argc; i++) {
11750 + arg = (char *)*(argv+i);
11751 + if (*arg == '-') {
11752 + optc++;
11753 + if (optc > 2) {
11754 + kdb_printf("too many options\n");
11755 + kdb_printf("see 'walkhelp'\n");
11756 + return 0;
11757 + }
11758 + if (*(arg+1) == 's') {
11759 + continue; /* ignore -s */
11760 + } else if (*(arg+1) == 'h') {
11761 + if ((init_len=kl_struct_len("list_head"))
11762 + == 0) {
11763 + kdb_printf(
11764 + "could not find list_head\n");
11765 + return 0;
11766 + }
11767 + if (*(arg+2) == 'p') {
11768 + flags = C_LISTHEAD;
11769 + flags |= C_LISTHEAD_P;
11770 + } else if (*(arg+2) == 'n') {
11771 + flags = C_LISTHEAD;
11772 + flags |= C_LISTHEAD_N;
11773 + } else {
11774 + kdb_printf("invalid -h option <%s>\n",
11775 + arg);
11776 + kdb_printf("see 'walkhelp'\n");
11777 + return 0;
11778 + }
11779 + } else {
11780 + kdb_printf("invalid option <%s>\n", arg);
11781 + kdb_printf("see 'walkhelp'\n");
11782 + return 0;
11783 + }
11784 + } else {
11785 + nonoptc++;
11786 + if (nonoptc > 4) {
11787 + kdb_printf("too many arguments\n");
11788 + kdb_printf("see 'walkhelp'\n");
11789 + return 0;
11790 + }
11791 + if (nonoptc == 1) {
11792 + structp = arg;
11793 + } else if (nonoptc == 2) {
11794 + forwp = arg;
11795 + } else if (nonoptc == 3) {
11796 + addrp = arg;
11797 + } else if (nonoptc == 4) {
11798 + /* the member is optional; if we get
11799 + a fourth, the previous was the member */
11800 + memberp = addrp;
11801 + addrp = arg;
11802 + } else {
11803 + kdb_printf("invalid argument <%s>\n", arg);
11804 + kdb_printf("see 'walkhelp'\n");
11805 + return 0;
11806 + }
11807 + }
11808 + }
11809 + if (nonoptc < 3) {
11810 + kdb_printf("too few arguments\n");
11811 + kdb_printf("see 'walkhelp'\n");
11812 + return 0;
11813 + }
11814 + if (!(flags & C_LISTHEAD)) {
11815 + if ((init_len=kl_struct_len(structp)) == 0) {
11816 + kdb_printf("could not find %s\n", structp);
11817 + return 0;
11818 + }
11819 + }
11820 +
11821 + /* Get the start address of the structure */
11822 + if (get_value(addrp, &value)) {
11823 + kdb_printf ("address %s invalid\n", addrp);
11824 + return 0;
11825 + }
11826 + start_addr = (kaddr_t)value;
11827 + if (invalid_address(start_addr, init_len)) {
11828 + kdb_printf ("address %#lx invalid\n", start_addr);
11829 + return 0;
11830 + }
11831 +
11832 + if (memberp) {
11833 + }
11834 +
11835 + if (walk_structs(structp, forwp, memberp, start_addr, flags)) {
11836 + kdb_printf ("walk_structs failed\n");
11837 + return 0;
11838 + }
11839 + /* kdb_printf("ptc allocated:%d deallocated:%d\n",
11840 + all_count, deall_count); */
11841 + return 0;
11842 +}
11843 +
11844 +/*
11845 + * Implement the lcrash px (print, pd) command
11846 + * see lcrash cmd_print.c
11847 + *
11848 + * px <expression>
11849 + * e.g. px *(task_struct *) <address>
11850 + */
11851 +int
11852 +kdb_debuginfo_print(int argc, const char **argv)
11853 +{
11854 + /* argc does not count the command itself, which is argv[0] */
11855 + char *cmd, *next, *end, *exp, *cp;
11856 + unsigned char *buf;
11857 + int i, j, iflags;
11858 + node_t *np;
11859 + uint64_t flags = 0;
11860 +
11861 + /* If there is nothing to evaluate, just return */
11862 + if (argc == 0) {
11863 + return 0;
11864 + }
11865 + all_count=0;
11866 + deall_count=0;
11867 +
11868 + cmd = (char *)*argv;
11869 +
11870 + /* Set up the flags value. If this command was invoked via
11871 + * "pd" or "px", then make sure the appropriate flag is set.
11872 + */
11873 + flags = 0;
11874 + if (!strcmp(cmd, "pd") || !strcmp(cmd, "print")) {
11875 + flags = 0;
11876 + } else if (!strcmp(cmd, "px")) {
11877 + flags |= C_HEX;
11878 + } else if (!strcmp(cmd, "whatis")) {
11879 + if (argc != 1) {
11880 + kdb_printf("usage: whatis <symbol | type>\n");
11881 + return 0;
11882 + }
11883 + cp = (char *)*(argv+1);
11884 + single_type(cp);
11885 + /* kdb_printf("allocated:%d deallocated:%d\n",
11886 + all_count, deall_count); */
11887 + return 0;
11888 + } else if (!strcmp(cmd, "sizeof")) {
11889 + if (!have_debug_file) {
11890 + kdb_printf("no debuginfo file\n");
11891 + return 0;
11892 + }
11893 + if (argc != 1) {
11894 + kdb_printf("usage: sizeof type\n");
11895 + return 0;
11896 + }
11897 + cp = (char *)*(argv+1);
11898 + sizeof_type(cp);
11899 + return 0;
11900 + } else {
11901 + kdb_printf("command error: %s\n", cmd);
11902 + return 0;
11903 + }
11904 +
11905 + /*
11906 + * Count the number of bytes necessary to hold the entire expression
11907 + * string.
11908 + */
11909 + for (i=1, j=0; i <= argc; i++) {
11910 + j += (strlen(*(argv+i)) + 1);
11911 + }
11912 +
11913 + /*
11914 + * Allocate space for the expression string and copy the individual
11915 + * arguments into it.
11916 + */
11917 + buf = kl_alloc_block(j);
11918 + if (!buf) {
11919 + return 0;
11920 + }
11921 +
11922 + for (i=1; i <= argc; i++) {
11923 + strcat(buf, *(argv+i));
11924 + /* put spaces between arguments */
11925 + if (i < argc) {
11926 + strcat(buf, " ");
11927 + }
11928 + }
11929 +
11930 + /* Walk through the expression string, expression by expression.
11931 + * Note that a comma (',') is the delimiting character between
11932 + * expressions.
11933 + */
11934 + next = buf;
11935 + while (next) {
11936 + if ((end = strchr(next, ','))) {
11937 + *end = (char)0;
11938 + }
11939 +
11940 + /* Copy the next expression to a separate expression string.
11941 + * A separate expresison string is necessary because it is
11942 + * likely to get freed up in eval() when variables get expanded.
11943 + */
11944 + i = strlen(next)+1;
11945 + exp = (char *)kl_alloc_block(i);
11946 + if (!exp) {
11947 + return 0;
11948 + }
11949 + strcpy(exp, next);
11950 +
11951 + /* Evaluate the expression */
11952 + np = eval(&exp, 0);
11953 + if (!np || eval_error) {
11954 + print_eval_error(cmd, exp,
11955 + (error_token ? error_token : (char*)NULL),
11956 + eval_error, CMD_NAME_FLG);
11957 + if (np) {
11958 + free_nodes(np);
11959 + }
11960 + kl_free_block(buf);
11961 + kl_free_block(exp);
11962 + free_eval_memory();
11963 + return 0;
11964 + }
11965 + iflags = flags;
11966 + if (print_eval_results(np, iflags)) {
11967 + free_nodes(np);
11968 + kl_free_block(buf);
11969 + free_eval_memory();
11970 + return 0;
11971 + }
11972 + kl_free_block(exp);
11973 +
11974 + if (end) {
11975 + next = end + 1;
11976 + kdb_printf(" ");
11977 + } else {
11978 + next = (char*)NULL;
11979 + kdb_printf("\n");
11980 + }
11981 + free_nodes(np);
11982 + }
11983 + free_eval_memory();
11984 + kl_free_block(buf);
11985 + /* kdb_printf("allocated:%d deallocated:%d\n",
11986 + all_count, deall_count); */
11987 + return 0;
11988 +}
11989 +
11990 +/*
11991 + * Display help for the px command
11992 + */
11993 +int
11994 +kdb_pxhelp(int argc, const char **argv)
11995 +{
11996 + if (have_debug_file) {
11997 + kdb_printf ("Some examples of using the px command:\n");
11998 + kdb_printf (" the whole structure:\n");
11999 + kdb_printf (" px *(task_struct *)0xe0000...\n");
12000 + kdb_printf (" one member:\n");
12001 + kdb_printf (" px (*(task_struct *)0xe0000...)->comm\n");
12002 + kdb_printf (" the address of a member\n");
12003 + kdb_printf (" px &((task_struct *)0xe0000...)->children\n");
12004 + kdb_printf (" a structure pointed to by a member:\n");
12005 + kdb_printf (" px ((*(class_device *)0xe0000...)->class)->name\n");
12006 + kdb_printf (" array element:\n");
12007 + kdb_printf (" px (cache_sizes *)0xa0000...[0]\n");
12008 + kdb_printf (" px (task_struct *)(0xe0000...)->cpus_allowed.bits[0]\n");
12009 + } else {
12010 + kdb_printf ("There is no debug info file.\n");
12011 + kdb_printf ("The px/pd/print commands can only evaluate ");
12012 + kdb_printf ("arithmetic expressions.\n");
12013 + }
12014 + return 0;
12015 +}
12016 +
12017 +/*
12018 + * Display help for the walk command
12019 + */
12020 +int
12021 +kdb_walkhelp(int argc, const char **argv)
12022 +{
12023 + if (!have_debug_file) {
12024 + kdb_printf("no debuginfo file\n");
12025 + return 0;
12026 + }
12027 + kdb_printf ("Using the walk command:\n");
12028 + kdb_printf (" (only the -s (symbolic) form is supported, so -s is ignored)\n");
12029 + kdb_printf ("\n");
12030 + kdb_printf (" If the list is not linked with list_head structures:\n");
12031 + kdb_printf (" walk [-s] struct name-of-forward-pointer address\n");
12032 + kdb_printf (" example: walk xyz_struct next 0xe00....\n");
12033 + kdb_printf ("\n");
12034 + kdb_printf (" If the list is linked with list_head structures, use -hn\n");
12035 + kdb_printf (" to walk the 'next' list, -hp for the 'prev' list\n");
12036 + kdb_printf (" walk -h[n|p] struct name-of-forward-pointer [member-to-show] address-of-list-head\n");
12037 + kdb_printf (" example, to show the entire task_struct:\n");
12038 + kdb_printf (" walk -hn task_struct tasks 0xe000....\n");
12039 + kdb_printf (" example, to show the task_struct member comm:\n");
12040 + kdb_printf (" walk -hn task_struct tasks comm 0xe000....\n");
12041 + kdb_printf (" (address is not the address of first member's list_head, ");
12042 + kdb_printf ("but of the anchoring list_head\n");
12043 + return 0;
12044 +}
12045 +
12046 +/*
12047 + * dup_block()
12048 + */
12049 +void *
12050 +dup_block(void *b, int len)
12051 +{
12052 + void *b2;
12053 +
12054 + if ((b2 = kl_alloc_block(len))) {
12055 + memcpy(b2, b, len); /* dst, src, sz */
12056 + }
12057 + return(b2);
12058 +}
12059 +
12060 +/*
12061 + * kl_reset_error()
12062 + */
12063 +void
12064 +kl_reset_error(void)
12065 +{
12066 + klib_error = 0;
12067 +}
12068 +
12069 +/*
12070 + * given a symbol name, look up its address
12071 + *
12072 + * in lcrash, this would return a pointer to the syment_t in
12073 + * a binary tree of them
12074 + *
12075 + * In this one, look up the symbol in the standard kdb way,
12076 + * which fills in the kdb_symtab_t.
12077 + * Then fill in the global syment_t "lkup_syment" -- assuming
12078 + * we'll only need one at a time!
12079 + *
12080 + * kl_lkup_symname returns the address of syment_t if the symbol is
12081 + * found, else null.
12082 + *
12083 + * Note: we allocate a syment_t the caller should kfree it
12084 + */
12085 +syment_t *
12086 +kl_lkup_symname (char *cp)
12087 +{
12088 + syment_t *sp;
12089 + kdb_symtab_t kdb_symtab;
12090 +
12091 + if (kdbgetsymval(cp, &kdb_symtab)) {
12092 + sp = (syment_t *)kl_alloc_block(sizeof(syment_t));
12093 + sp->s_addr = (kaddr_t)kdb_symtab.sym_start;
12094 + KL_ERROR = 0;
12095 + return (sp);
12096 + } else {
12097 + /* returns 0 if the symbol is not found */
12098 + KL_ERROR = KLE_INVALID_VALUE;
12099 + return ((syment_t *)0);
12100 + }
12101 +}
12102 +
12103 +/*
12104 + * kl_get_ra()
12105 + *
12106 + * This function returns its own return address.
12107 + * Usefule when trying to capture where we came from.
12108 + */
12109 +void*
12110 +kl_get_ra(void)
12111 +{
12112 + return (__builtin_return_address(0));
12113 +}
12114 +
12115 +/* start kl_util.c */
12116 +/*
12117 + * Definitions for the do_math() routine.
12118 + */
12119 +#define M_ADD '+'
12120 +#define M_SUBTRACT '-'
12121 +#define M_MULTIPLY '*'
12122 +#define M_DIVIDE '/'
12123 +
12124 +/*
12125 + * do_math() -- Calculate some math values based on a string argument
12126 + * passed into the function. For example, if you use:
12127 + *
12128 + * 0xffffc000*2+6/5-3*19-8
12129 + *
12130 + * And you will get the value 0xffff7fc0 back. I could
12131 + * probably optimize this a bit more, but right now, it
12132 + * works, which is good enough for me.
12133 + */
12134 +static uint64_t
12135 +do_math(char *str)
12136 +{
12137 + int i = 0;
12138 + char *buf, *loc;
12139 + uint64_t value1, value2;
12140 + syment_t *sp;
12141 +
12142 + buf = (char *)kl_alloc_block((strlen(str) + 1));
12143 + sprintf(buf, "%s", str);
12144 + for (i = strlen(str); i >= 0; i--) {
12145 + if ((str[i] == M_ADD) || (str[i] == M_SUBTRACT)) {
12146 + buf[i] = '\0';
12147 + value1 = do_math(buf);
12148 + value2 = do_math(&str[i+1]);
12149 + kl_free_block((void *)buf);
12150 + if (str[i] == M_SUBTRACT) {
12151 + return value1 - value2;
12152 + } else {
12153 + return value1 + value2;
12154 + }
12155 + }
12156 + }
12157 +
12158 + for (i = strlen(str); i >= 0; i--) {
12159 + if ((str[i] == M_MULTIPLY) || (str[i] == M_DIVIDE)) {
12160 + buf[i] = '\0';
12161 + value1 = do_math(buf);
12162 + value2 = do_math(&str[i+1]);
12163 + kl_free_block((void *)buf);
12164 + if (str[i] == M_MULTIPLY) {
12165 + return (value1 * value2);
12166 + } else {
12167 + if (value2 == 0) {
12168 + /* handle divide by zero */
12169 + /* XXX -- set proper error code */
12170 + klib_error = 1;
12171 + return (0);
12172 + } else {
12173 + return (value1 / value2);
12174 + }
12175 + }
12176 + }
12177 + }
12178 +
12179 + /*
12180 + * Otherwise, just process the value, and return it.
12181 + */
12182 + sp = kl_lkup_symname(buf);
12183 + if (KL_ERROR) {
12184 + KL_ERROR = 0;
12185 + value2 = kl_strtoull(buf, &loc, 10);
12186 + if (((!value2) && (buf[0] != '0')) || (*loc) ||
12187 + (!strncmp(buf, "0x", 2)) || (!strncmp(buf, "0X", 2))) {
12188 + value1 = (kaddr_t)kl_strtoull(buf, (char**)NULL, 16);
12189 + } else {
12190 + value1 = (unsigned)kl_strtoull(buf, (char**)NULL, 10);
12191 + }
12192 + } else {
12193 + value1 = (kaddr_t)sp->s_addr;
12194 + kl_free_block((void *)sp);
12195 + }
12196 + kl_free_block((void *)buf);
12197 + return (value1);
12198 +}
12199 +/*
12200 + * kl_get_value() -- Translate numeric input strings
12201 + *
12202 + * A generic routine for translating an input string (param) in a
12203 + * number of dfferent ways. If the input string is an equation
12204 + * (contains the characters '+', '-', '/', and '*'), then perform
12205 + * the math evaluation and return one of the following modes (if
12206 + * mode is passed):
12207 + *
12208 + * 0 -- if the resulting value is <= elements, if elements (number
12209 + * of elements in a table) is passed.
12210 + *
12211 + * 1 -- if the first character in param is a pound sign ('#').
12212 + *
12213 + * 3 -- the numeric result of an equation.
12214 + *
12215 + * If the input string is NOT an equation, mode (if passed) will be
12216 + * set in one of the following ways (depending on the contents of
12217 + * param and elements).
12218 + *
12219 + * o When the first character of param is a pound sign ('#'), mode
12220 + * is set equal to one and the trailing numeric value (assumed to
12221 + * be decimal) is returned.
12222 + *
12223 + * o When the first two characters in param are "0x" or "0X," or
12224 + * when when param contains one of the characers "abcdef," or when
12225 + * the length of the input value is eight characters. mode is set
12226 + * equal to two and the numeric value contained in param is
12227 + * translated as hexadecimal and returned.
12228 + *
12229 + * o The value contained in param is translated as decimal and mode
12230 + * is set equal to zero. The resulting value is then tested to see
12231 + * if it exceeds elements (if passed). If it does, then value is
12232 + * translated as hexadecimal and mode is set equal to two.
12233 + *
12234 + * Note that mode is only set when a pointer is passed in the mode
12235 + * paramater. Also note that when elements is set equal to zero, any
12236 + * non-hex (as determined above) value not starting with a pound sign
12237 + * will be translated as hexadecimal (mode will be set equal to two) --
12238 + * IF the length of the string of characters is less than 16 (kaddr_t).
12239 + *
12240 + */
12241 +int
12242 +kl_get_value(char *param, int *mode, int elements, uint64_t *value)
12243 +{
12244 + char *loc;
12245 + uint64_t v;
12246 +
12247 + kl_reset_error();
12248 +
12249 + /* Check to see if we are going to need to do any math
12250 + */
12251 + if (strpbrk(param, "+-/*")) {
12252 + if (!strncmp(param, "#", 1)) {
12253 + v = do_math(&param[1]);
12254 + if (mode) {
12255 + *mode = 1;
12256 + }
12257 + } else {
12258 + v = do_math(param);
12259 + if (mode) {
12260 + if (elements && (*value <= elements)) {
12261 + *mode = 0;
12262 + } else {
12263 + *mode = 3;
12264 + }
12265 + }
12266 + }
12267 + } else {
12268 + if (!strncmp(param, "#", 1)) {
12269 + if (!strncmp(param, "0x", 2)
12270 + || !strncmp(param, "0X", 2)
12271 + || strpbrk(param, "abcdef")) {
12272 + v = kl_strtoull(&param[1], &loc, 16);
12273 + } else {
12274 + v = kl_strtoull(&param[1], &loc, 10);
12275 + }
12276 + if (loc) {
12277 + KL_ERROR = KLE_INVALID_VALUE;
12278 + return (1);
12279 + }
12280 + if (mode) {
12281 + *mode = 1;
12282 + }
12283 + } else if (!strncmp(param, "0x", 2) || !strncmp(param, "0X", 2)
12284 + || strpbrk(param, "abcdef")) {
12285 + v = kl_strtoull(param, &loc, 16);
12286 + if (loc) {
12287 + KL_ERROR = KLE_INVALID_VALUE;
12288 + return (1);
12289 + }
12290 + if (mode) {
12291 + *mode = 2; /* HEX VALUE */
12292 + }
12293 + } else if (elements || (strlen(param) < 16) ||
12294 + (strlen(param) > 16)) {
12295 + v = kl_strtoull(param, &loc, 10);
12296 + if (loc) {
12297 + KL_ERROR = KLE_INVALID_VALUE;
12298 + return (1);
12299 + }
12300 + if (elements && (v >= elements)) {
12301 + v = (kaddr_t)kl_strtoull(param,
12302 + (char**)NULL, 16);
12303 + if (mode) {
12304 + *mode = 2; /* HEX VALUE */
12305 + }
12306 + } else if (mode) {
12307 + *mode = 0;
12308 + }
12309 + } else {
12310 + v = kl_strtoull(param, &loc, 16);
12311 + if (loc) {
12312 + KL_ERROR = KLE_INVALID_VALUE;
12313 + return (1);
12314 + }
12315 + if (mode) {
12316 + *mode = 2; /* ASSUME HEX VALUE */
12317 + }
12318 + }
12319 + }
12320 + *value = v;
12321 + return (0);
12322 +}
12323 +/* end kl_util.c */
12324 +
12325 +/* start kl_libutil.c */
12326 +static int
12327 +valid_digit(char c, int base)
12328 +{
12329 + switch(base) {
12330 + case 2:
12331 + if ((c >= '0') && (c <= '1')) {
12332 + return(1);
12333 + } else {
12334 + return(0);
12335 + }
12336 + case 8:
12337 + if ((c >= '0') && (c <= '7')) {
12338 + return(1);
12339 + } else {
12340 + return(0);
12341 + }
12342 + case 10:
12343 + if ((c >= '0') && (c <= '9')) {
12344 + return(1);
12345 + } else {
12346 + return(0);
12347 + }
12348 + case 16:
12349 + if (((c >= '0') && (c <= '9'))
12350 + || ((c >= 'a') && (c <= 'f'))
12351 + || ((c >= 'A') && (c <= 'F'))) {
12352 + return(1);
12353 + } else {
12354 + return(0);
12355 + }
12356 + }
12357 + return(0);
12358 +}
12359 +
12360 +static int
12361 +digit_value(char c, int base, int *val)
12362 +{
12363 + if (!valid_digit(c, base)) {
12364 + return(1);
12365 + }
12366 + switch (base) {
12367 + case 2:
12368 + case 8:
12369 + case 10:
12370 + *val = (int)((int)(c - 48));
12371 + break;
12372 + case 16:
12373 + if ((c >= 'a') && (c <= 'f')) {
12374 + *val = ((int)(c - 87));
12375 + } else if ((c >= 'A') && (c <= 'F')) {
12376 + *val = ((int)(c - 55));
12377 + } else {
12378 + *val = ((int)(c - 48));
12379 + }
12380 + }
12381 + return(0);
12382 +}
12383 +
12384 +uint64_t
12385 +kl_strtoull(char *str, char **loc, int base)
12386 +{
12387 + int dval;
12388 + uint64_t i = 1, v, value = 0;
12389 + char *c, *cp = str;
12390 +
12391 + *loc = (char *)NULL;
12392 + if (base == 0) {
12393 + if (!strncmp(cp, "0x", 2) || !strncmp(cp, "0X", 2)) {
12394 + base = 16;
12395 + } else if (cp[0] == '0') {
12396 + if (cp[1] == 'b') {
12397 + base = 2;
12398 + } else {
12399 + base = 8;
12400 + }
12401 + } else if (strpbrk(cp, "abcdefABCDEF")) {
12402 + base = 16;
12403 + } else {
12404 + base = 10;
12405 + }
12406 + }
12407 + if ((base == 8) && (*cp == '0')) {
12408 + cp += 1;
12409 + } else if ((base == 2) && !strncmp(cp, "0b", 2)) {
12410 + cp += 2;
12411 + } else if ((base == 16) &&
12412 + (!strncmp(cp, "0x", 2) || !strncmp(cp, "0X", 2))) {
12413 + cp += 2;
12414 + }
12415 + c = &cp[strlen(cp) - 1];
12416 + while (c >= cp) {
12417 +
12418 + if (digit_value(*c, base, &dval)) {
12419 + if (loc) {
12420 + *loc = c;
12421 + }
12422 + return(value);
12423 + }
12424 + v = dval * i;
12425 + if ((MAX_LONG_LONG - value) < v) {
12426 + return(MAX_LONG_LONG);
12427 + }
12428 + value += v;
12429 + i *= (uint64_t)base;
12430 + c--;
12431 + }
12432 + return(value);
12433 +}
12434 +/* end kl_libutil.c */
12435 +
12436 +/*
12437 + * dbg_hash_sym()
12438 + */
12439 +void
12440 +dbg_hash_sym(uint64_t typenum, dbg_sym_t *stp)
12441 +{
12442 + dbg_hashrec_t *shp, *hshp;
12443 +
12444 + if ((typenum == 0) || (!stp)) {
12445 + return;
12446 + }
12447 + shp = (dbg_hashrec_t *)kl_alloc_block(sizeof(dbg_hashrec_t));
12448 + shp->h_typenum = typenum;
12449 + shp->h_ptr = stp;
12450 + shp->h_next = (dbg_hashrec_t *)NULL;
12451 + if ((hshp = dbg_hash[TYPE_NUM_HASH(typenum)])) {
12452 + while (hshp->h_next) {
12453 + hshp = hshp->h_next;
12454 + }
12455 + hshp->h_next = shp;
12456 + } else {
12457 + dbg_hash[TYPE_NUM_HASH(typenum)] = shp;
12458 + }
12459 +}
12460 +
12461 +/*
12462 + * dbg_find_sym()
12463 + */
12464 +dbg_sym_t *
12465 +dbg_find_sym(char *name, int type, uint64_t typenum)
12466 +{
12467 + dbg_sym_t *stp = (dbg_sym_t *)NULL;
12468 +
12469 + if (name && strlen(name)) {
12470 + /* Cycle through the type flags and see if any records are
12471 + * present. Note that if multiple type flags or DBG_ALL is
12472 + * passed in, only the first occurance of 'name' will be
12473 + * found and returned. If name exists in multiple trees,
12474 + * then multiple searches are necessary to find them.
12475 + */
12476 + if (type & DBG_TYPE) {
12477 + if ((stp = (dbg_sym_t *)kl_find_btnode((btnode_t *)
12478 + type_tree, name, (int *)NULL))) {
12479 + goto found_sym;
12480 + }
12481 + }
12482 + if (type & DBG_TYPEDEF) {
12483 + if ((stp = (dbg_sym_t *)kl_find_btnode((btnode_t *)
12484 + typedef_tree, name, (int *)NULL))) {
12485 + goto found_sym;
12486 + }
12487 + }
12488 + if (!stp) {
12489 + return((dbg_sym_t*)NULL);
12490 + }
12491 + }
12492 +found_sym:
12493 + if (typenum) {
12494 + dbg_hashrec_t *hshp;
12495 +
12496 + if (stp) {
12497 + if (stp->sym_typenum == typenum) {
12498 + return(stp);
12499 + }
12500 + } else if ((hshp = dbg_hash[TYPE_NUM_HASH(typenum)])) {
12501 + while (hshp) {
12502 + if (hshp->h_typenum == typenum) {
12503 + return(hshp->h_ptr);
12504 + }
12505 + hshp = hshp->h_next;
12506 + }
12507 + }
12508 + }
12509 + return(stp);
12510 +}
12511 +
12512 +/*
12513 + * kl_find_type() -- find a KLT type by name.
12514 + */
12515 +kltype_t *
12516 +kl_find_type(char *name, int tnum)
12517 +{
12518 + dbg_sym_t *stp;
12519 + kltype_t *kltp = (kltype_t *)NULL;
12520 +
12521 + if (!have_debug_file) {
12522 + kdb_printf("no debuginfo file\n");
12523 + return kltp;
12524 + }
12525 +
12526 + if (!tnum || IS_TYPE(tnum)) {
12527 + if ((stp = dbg_find_sym(name, DBG_TYPE, 0))) {
12528 + kltp = (kltype_t *)stp->sym_kltype;
12529 + if (tnum && !(kltp->kl_type & tnum)) {
12530 + /* We have found a type by this name
12531 + * but it does not have the right
12532 + * type number (e.g., we're looking
12533 + * for a struct and we don't find
12534 + * a KLT_STRUCT type by this name).
12535 + */
12536 + return((kltype_t *)NULL);
12537 + }
12538 + }
12539 + }
12540 + if (!tnum || IS_TYPEDEF(tnum)) {
12541 + if ((stp = dbg_find_sym(name, DBG_TYPEDEF, 0))) {
12542 + kltp = (kltype_t *)stp->sym_kltype;
12543 + }
12544 + }
12545 + return(kltp);
12546 +}
12547 +
12548 +/*
12549 + * kl_first_btnode() -- non-recursive implementation.
12550 + */
12551 +btnode_t *
12552 +kl_first_btnode(btnode_t *np)
12553 +{
12554 + if (!np) {
12555 + return((btnode_t *)NULL);
12556 + }
12557 +
12558 + /* Walk down the left side 'til the end...
12559 + */
12560 + while (np->bt_left) {
12561 + np = np->bt_left;
12562 + }
12563 + return(np);
12564 +}
12565 +
12566 +/*
12567 + * kl_next_btnode() -- non-recursive implementation.
12568 + */
12569 +btnode_t *
12570 +kl_next_btnode(btnode_t *node)
12571 +{
12572 + btnode_t *np = node, *parent;
12573 +
12574 + if (np) {
12575 + if (np->bt_right) {
12576 + return(kl_first_btnode(np->bt_right));
12577 + } else {
12578 + parent = np->bt_parent;
12579 +next:
12580 + if (parent) {
12581 + if (parent->bt_left == np) {
12582 + return(parent);
12583 + }
12584 + np = parent;
12585 + parent = parent->bt_parent;
12586 + goto next;
12587 + }
12588 + }
12589 + }
12590 + return((btnode_t *)NULL);
12591 +}
12592 +
12593 +/*
12594 + * dbg_next_sym()
12595 + */
12596 +dbg_sym_t *
12597 +dbg_next_sym(dbg_sym_t *stp)
12598 +{
12599 + dbg_sym_t *next_stp;
12600 +
12601 + next_stp = (dbg_sym_t *)kl_next_btnode((btnode_t *)stp);
12602 + return(next_stp);
12603 +}
12604 +
12605 +/*
12606 + * kl_prev_btnode() -- non-recursive implementation.
12607 + */
12608 +btnode_t *
12609 +kl_prev_btnode(btnode_t *node)
12610 +{
12611 + btnode_t *np = node, *parent;
12612 +
12613 + if (np) {
12614 + if (np->bt_left) {
12615 + np = np->bt_left;
12616 + while (np->bt_right) {
12617 + np = np->bt_right;
12618 + }
12619 + return(np);
12620 + }
12621 + parent = np->bt_parent;
12622 +next:
12623 + if (parent) {
12624 + if (parent->bt_right == np) {
12625 + return(parent);
12626 + }
12627 + np = parent;
12628 + parent = parent->bt_parent;
12629 + goto next;
12630 + }
12631 + }
12632 + return((btnode_t *)NULL);
12633 +}
12634 +
12635 +/*
12636 + * dbg_prev_sym()
12637 + */
12638 +dbg_sym_t *
12639 +dbg_prev_sym(dbg_sym_t *stp)
12640 +{
12641 + dbg_sym_t *prev_stp;
12642 +
12643 + prev_stp = (dbg_sym_t *)kl_prev_btnode((btnode_t *)stp);
12644 + return(prev_stp);
12645 +}
12646 +
12647 +/*
12648 + * kl_find_next_type() -- find next KLT type
12649 + */
12650 +kltype_t *
12651 +kl_find_next_type(kltype_t *kltp, int type)
12652 +{
12653 + kltype_t *nkltp = NULL;
12654 + dbg_sym_t *nstp;
12655 +
12656 + if (kltp && kltp->kl_ptr) {
12657 + nstp = (dbg_sym_t *)kltp->kl_ptr;
12658 + nkltp = (kltype_t *)nstp->sym_kltype;
12659 + if (type) {
12660 + while(nkltp && !(nkltp->kl_type & type)) {
12661 + if ((nstp = dbg_next_sym(nstp))) {
12662 + nkltp = (kltype_t *)nstp->sym_kltype;
12663 + } else {
12664 + nkltp = (kltype_t *)NULL;
12665 + }
12666 + }
12667 + }
12668 + }
12669 + return(nkltp);
12670 +}
12671 +
12672 +/*
12673 + * dbg_first_sym()
12674 + */
12675 +dbg_sym_t *
12676 +dbg_first_sym(int type)
12677 +{
12678 + dbg_sym_t *stp = (dbg_sym_t *)NULL;
12679 +
12680 + switch(type) {
12681 + case DBG_TYPE:
12682 + stp = (dbg_sym_t *)
12683 + kl_first_btnode((btnode_t *)type_tree);
12684 + break;
12685 + case DBG_TYPEDEF:
12686 + stp = (dbg_sym_t *)
12687 + kl_first_btnode((btnode_t *)typedef_tree);
12688 + break;
12689 + }
12690 + return(stp);
12691 +}
12692 +
12693 +/*
12694 + * kl_first_type()
12695 + */
12696 +kltype_t *
12697 +kl_first_type(int tnum)
12698 +{
12699 + kltype_t *kltp = NULL;
12700 + dbg_sym_t *stp;
12701 +
12702 + if (IS_TYPE(tnum)) {
12703 + /* If (tnum == KLT_TYPE), then return the first type
12704 + * record, regardless of the type. Otherwise, search
12705 + * for the frst type that mapps into tnum.
12706 + */
12707 + if ((stp = dbg_first_sym(DBG_TYPE))) {
12708 + kltp = (kltype_t *)stp->sym_kltype;
12709 + if (tnum != KLT_TYPE) {
12710 + while (kltp && !(kltp->kl_type & tnum)) {
12711 + if ((stp = dbg_next_sym(stp))) {
12712 + kltp = (kltype_t *)stp->sym_kltype;
12713 + } else {
12714 + kltp = (kltype_t *)NULL;
12715 + }
12716 + }
12717 + }
12718 + }
12719 + } else if (IS_TYPEDEF(tnum)) {
12720 + if ((stp = dbg_first_sym(DBG_TYPEDEF))) {
12721 + kltp = (kltype_t *)stp->sym_kltype;
12722 + }
12723 + }
12724 + return(kltp);
12725 +}
12726 +
12727 +/*
12728 + * kl_next_type()
12729 + */
12730 +kltype_t *
12731 +kl_next_type(kltype_t *kltp)
12732 +{
12733 + dbg_sym_t *stp, *nstp;
12734 + kltype_t *nkltp = (kltype_t *)NULL;
12735 +
12736 + if (!kltp) {
12737 + return((kltype_t *)NULL);
12738 + }
12739 + stp = (dbg_sym_t *)kltp->kl_ptr;
12740 + if ((nstp = dbg_next_sym(stp))) {
12741 + nkltp = (kltype_t *)nstp->sym_kltype;
12742 + }
12743 + return(nkltp);
12744 +}
12745 +
12746 +/*
12747 + * kl_prev_type()
12748 + */
12749 +kltype_t *
12750 +kl_prev_type(kltype_t *kltp)
12751 +{
12752 + dbg_sym_t *stp, *pstp;
12753 + kltype_t *pkltp = (kltype_t *)NULL;
12754 +
12755 + if (!kltp) {
12756 + return((kltype_t *)NULL);
12757 + }
12758 + stp = (dbg_sym_t *)kltp->kl_ptr;
12759 + if ((pstp = dbg_prev_sym(stp))) {
12760 + pkltp = (kltype_t *)pstp->sym_kltype;
12761 + }
12762 + return(pkltp);
12763 +}
12764 +
12765 +/*
12766 + * kl_realtype()
12767 + */
12768 +kltype_t *
12769 +kl_realtype(kltype_t *kltp, int tnum)
12770 +{
12771 + kltype_t *rkltp = kltp;
12772 +
12773 + while (rkltp) {
12774 + if (tnum && (rkltp->kl_type == tnum)) {
12775 + break;
12776 + }
12777 + if (!rkltp->kl_realtype) {
12778 + break;
12779 + }
12780 + if (rkltp->kl_realtype == rkltp) {
12781 + break;
12782 + }
12783 + rkltp = rkltp->kl_realtype;
12784 + if (rkltp == kltp) {
12785 + break;
12786 + }
12787 + }
12788 + return(rkltp);
12789 +}
12790 +
12791 +/*
12792 + * dbg_find_typenum()
12793 + */
12794 +dbg_type_t *
12795 +dbg_find_typenum(uint64_t typenum)
12796 +{
12797 + dbg_sym_t *stp;
12798 + dbg_type_t *sp = (dbg_type_t *)NULL;
12799 +
12800 + if ((stp = dbg_find_sym(0, DBG_TYPE, typenum))) {
12801 + sp = (dbg_type_t *)stp->sym_kltype;
12802 + }
12803 + return(sp);
12804 +}
12805 +
12806 +/*
12807 + * find type by typenum
12808 + */
12809 +kltype_t *
12810 +kl_find_typenum(uint64_t typenum)
12811 +{
12812 + kltype_t *kltp;
12813 +
12814 + kltp = (kltype_t *)dbg_find_typenum(typenum);
12815 + return(kltp);
12816 +}
12817 +
12818 +/*
12819 + * kl_find_btnode() -- non-recursive implementation.
12820 + */
12821 +btnode_t *
12822 +_kl_find_btnode(btnode_t *np, char *key, int *max_depth, size_t len)
12823 +{
12824 + int ret;
12825 + btnode_t *next, *prev;
12826 +
12827 + if (np) {
12828 + if (max_depth) {
12829 + (*max_depth)++;
12830 + }
12831 + next = np;
12832 +again:
12833 + if (len) {
12834 + ret = strncmp(key, next->bt_key, len);
12835 + } else {
12836 + ret = strcmp(key, next->bt_key);
12837 + }
12838 + if (ret == 0) {
12839 + if ((prev = kl_prev_btnode(next))) {
12840 + if (len) {
12841 + ret = strncmp(key, prev->bt_key, len);
12842 + } else {
12843 + ret = strcmp(key, prev->bt_key);
12844 + }
12845 + if (ret == 0) {
12846 + next = prev;
12847 + goto again;
12848 + }
12849 + }
12850 + return(next);
12851 + } else if (ret < 0) {
12852 + if ((next = next->bt_left)) {
12853 + goto again;
12854 + }
12855 + } else {
12856 + if ((next = next->bt_right)) {
12857 + goto again;
12858 + }
12859 + }
12860 + }
12861 + return((btnode_t *)NULL);
12862 +}
12863 +
12864 +/*
12865 + * kl_type_size()
12866 + */
12867 +int
12868 +kl_type_size(kltype_t *kltp)
12869 +{
12870 + kltype_t *rkltp;
12871 +
12872 + if (!kltp) {
12873 + return(0);
12874 + }
12875 + if (!(rkltp = kl_realtype(kltp, 0))) {
12876 + return(0);
12877 + }
12878 + return(rkltp->kl_size);
12879 +}
12880 +
12881 +/*
12882 + * kl_struct_len()
12883 + */
12884 +int
12885 +kl_struct_len(char *s)
12886 +{
12887 + kltype_t *kltp;
12888 +
12889 + if ((kltp = kl_find_type(s, (KLT_TYPES)))) {
12890 + return kl_type_size(kltp);
12891 + }
12892 + return(0);
12893 +}
12894 +
12895 +/*
12896 + * kl_get_member()
12897 + */
12898 +kltype_t *
12899 +kl_get_member(kltype_t *kltp, char *f)
12900 +{
12901 + kltype_t *mp;
12902 +
12903 + if ((mp = kltp->kl_member)) {
12904 + while (mp) {
12905 + if (mp->kl_flags & TYP_ANONYMOUS_FLG) {
12906 + kltype_t *amp;
12907 +
12908 + if ((amp = kl_get_member(mp->kl_realtype, f))) {
12909 + return(amp);
12910 + }
12911 + } else if (!strcmp(mp->kl_name, f)) {
12912 + break;
12913 + }
12914 + mp = mp->kl_member;
12915 + }
12916 + }
12917 + return(mp);
12918 +}
12919 +
12920 +/*
12921 + * kl_member()
12922 + */
12923 +kltype_t *
12924 +kl_member(char *s, char *f)
12925 +{
12926 + kltype_t *kltp, *mp = NULL;
12927 +
12928 + if (!(kltp = kl_find_type(s, (KLT_STRUCT|KLT_UNION)))) {
12929 + if ((kltp = kl_find_type(s, KLT_TYPEDEF))) {
12930 + kltp = kl_realtype(kltp, 0);
12931 + }
12932 + }
12933 + if (kltp) {
12934 + mp = kl_get_member(kltp, f);
12935 + }
12936 + return(mp);
12937 +}
12938 +
12939 +
12940 +/*
12941 + * kl_get_member_offset()
12942 + */
12943 +int
12944 +kl_get_member_offset(kltype_t *kltp, char *f)
12945 +{
12946 + kltype_t *mp;
12947 +
12948 + if ((mp = kltp->kl_member)) {
12949 + while (mp) {
12950 + if (mp->kl_flags & TYP_ANONYMOUS_FLG) {
12951 + int off;
12952 +
12953 + /* Drill down to see if the member we are looking for is in
12954 + * an anonymous union or struct. Since this call is recursive,
12955 + * the drill down may actually be multi-layer.
12956 + */
12957 + off = kl_get_member_offset(mp->kl_realtype, f);
12958 + if (off >= 0) {
12959 + return(mp->kl_offset + off);
12960 + }
12961 + } else if (!strcmp(mp->kl_name, f)) {
12962 + return(mp->kl_offset);
12963 + }
12964 + mp = mp->kl_member;
12965 + }
12966 + }
12967 + return(-1);
12968 +}
12969 +
12970 +/*
12971 + * kl_member_offset()
12972 + */
12973 +int
12974 +kl_member_offset(char *s, char *f)
12975 +{
12976 + int off = -1;
12977 + kltype_t *kltp;
12978 +
12979 + if (!(kltp = kl_find_type(s, (KLT_STRUCT|KLT_UNION)))) {
12980 + if ((kltp = kl_find_type(s, KLT_TYPEDEF))) {
12981 + kltp = kl_realtype(kltp, 0);
12982 + }
12983 + }
12984 + if (kltp) {
12985 + off = kl_get_member_offset(kltp, f);
12986 + }
12987 + return(off);
12988 +}
12989 +
12990 +/*
12991 + * kl_is_member()
12992 + */
12993 +int
12994 +kl_is_member(char *s, char *f)
12995 +{
12996 + kltype_t *mp;
12997 +
12998 + if ((mp = kl_member(s, f))) {
12999 + return(1);
13000 + }
13001 + return(0);
13002 +}
13003 +
13004 +/*
13005 + * kl_member_size()
13006 + */
13007 +int
13008 +kl_member_size(char *s, char *f)
13009 +{
13010 + kltype_t *mp;
13011 +
13012 + if ((mp = kl_member(s, f))) {
13013 + return(mp->kl_size);
13014 + }
13015 + return(0);
13016 +}
13017 +
13018 +#define TAB_SPACES 8
13019 +#define LEVEL_INDENT(level, flags) {\
13020 + int i, j; \
13021 + if (!(flags & NO_INDENT)) { \
13022 + for (i = 0; i < level; i++) { \
13023 + for (j = 0; j < TAB_SPACES; j++) { \
13024 + kdb_printf(" "); \
13025 + } \
13026 + }\
13027 + } \
13028 +}
13029 +#define PRINT_NL(flags) \
13030 + if (!(flags & SUPPRESS_NL)) { \
13031 + kdb_printf("\n"); \
13032 + }
13033 +#define PRINT_SEMI_COLON(level, flags) \
13034 + if (level && (!(flags & SUPPRESS_SEMI_COLON))) { \
13035 + kdb_printf(";"); \
13036 + }
13037 +
13038 +/*
13039 + * print_realtype()
13040 + */
13041 +static void
13042 +print_realtype(kltype_t *kltp)
13043 +{
13044 + kltype_t *rkltp;
13045 +
13046 + if ((rkltp = kltp->kl_realtype)) {
13047 + while (rkltp && rkltp->kl_realtype) {
13048 + rkltp = rkltp->kl_realtype;
13049 + }
13050 + if (rkltp->kl_type == KLT_BASE) {
13051 + kdb_printf(" (%s)", rkltp->kl_name);
13052 + }
13053 + }
13054 +}
13055 +
13056 +int align_chk = 0;
13057 +/*
13058 + * kl_print_uint16()
13059 + *
13060 + */
13061 +void
13062 +kl_print_uint16(void *ptr, int flags)
13063 +{
13064 + unsigned long long a;
13065 +
13066 + /* Make sure the pointer is properly aligned (or we will
13067 + * * dump core)
13068 + * */
13069 + if (align_chk && (uaddr_t)ptr % 16) {
13070 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13071 + return;
13072 + }
13073 + a = *(unsigned long long *) ptr;
13074 + if (flags & C_HEX) {
13075 + kdb_printf("%#llx", a);
13076 + } else if (flags & C_BINARY) {
13077 + kdb_printf("0b");
13078 + kl_binary_print(a);
13079 + } else {
13080 + kdb_printf("%llu", a);
13081 + }
13082 +}
13083 +
13084 +#if 0
13085 +/*
13086 + * kl_print_float16()
13087 + *
13088 + */
13089 +void
13090 +kl_print_float16(void *ptr, int flags)
13091 +{
13092 + double a;
13093 +
13094 + /* Make sure the pointer is properly aligned (or we will
13095 + * * dump core)
13096 + * */
13097 + if (align_chk && (uaddr_t)ptr % 16) {
13098 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13099 + return;
13100 + }
13101 + a = *(double*) ptr;
13102 + kdb_printf("%f", a);
13103 +}
13104 +#endif
13105 +
13106 +/*
13107 + * kl_print_int16()
13108 + *
13109 + */
13110 +void
13111 +kl_print_int16(void *ptr, int flags)
13112 +{
13113 + long long a;
13114 +
13115 + /* Make sure the pointer is properly aligned (or we will
13116 + * * dump core)
13117 + * */
13118 + if (align_chk && (uaddr_t)ptr % 16) {
13119 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13120 + return;
13121 + }
13122 + a = *(long long *) ptr;
13123 + if (flags & C_HEX) {
13124 + kdb_printf("%#llx", a);
13125 + } else if (flags & C_BINARY) {
13126 + kdb_printf("0b");
13127 + kl_binary_print(a);
13128 + } else {
13129 + kdb_printf("%lld", a);
13130 + }
13131 +}
13132 +
13133 +/*
13134 + * kl_print_int8()
13135 + */
13136 +void
13137 +kl_print_int8(void *ptr, int flags)
13138 +{
13139 + long long a;
13140 +
13141 + /* Make sure the pointer is properly aligned (or we will
13142 + * dump core)
13143 + */
13144 + if (align_chk && (uaddr_t)ptr % 8) {
13145 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13146 + return;
13147 + }
13148 + a = *(long long *) ptr;
13149 + if (flags & C_HEX) {
13150 + kdb_printf("%#llx", a);
13151 + } else if (flags & C_BINARY) {
13152 + kdb_printf("0b");
13153 + kl_binary_print(a);
13154 + } else {
13155 + kdb_printf("%lld", a);
13156 + }
13157 +}
13158 +
13159 +#if 0
13160 +/*
13161 + * kl_print_float8()
13162 + */
13163 +void
13164 +kl_print_float8(void *ptr, int flags)
13165 +{
13166 + double a;
13167 +
13168 + /* Make sure the pointer is properly aligned (or we will
13169 + * dump core)
13170 + */
13171 + if (align_chk && (uaddr_t)ptr % 8) {
13172 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13173 + return;
13174 + }
13175 + a = *(double*) ptr;
13176 + kdb_printf("%f", a);
13177 +}
13178 +#endif
13179 +
13180 +/*
13181 + * kl_print_uint8()
13182 + */
13183 +void
13184 +kl_print_uint8(void *ptr, int flags)
13185 +{
13186 + unsigned long long a;
13187 +
13188 + /* Make sure the pointer is properly aligned (or we will
13189 + * dump core)
13190 + */
13191 + if (align_chk && (uaddr_t)ptr % 8) {
13192 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13193 + return;
13194 + }
13195 + a = *(unsigned long long *) ptr;
13196 + if (flags & C_HEX) {
13197 + kdb_printf("%#llx", a);
13198 + } else if (flags & C_BINARY) {
13199 + kdb_printf("0b");
13200 + kl_binary_print(a);
13201 + } else {
13202 + kdb_printf("%llu", a);
13203 + }
13204 +}
13205 +
13206 +/*
13207 + * kl_print_int4()
13208 + */
13209 +void
13210 +kl_print_int4(void *ptr, int flags)
13211 +{
13212 + int32_t a;
13213 +
13214 + /* Make sure the pointer is properly aligned (or we will
13215 + * dump core
13216 + */
13217 + if (align_chk && (uaddr_t)ptr % 4) {
13218 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13219 + return;
13220 + }
13221 + a = *(int32_t*) ptr;
13222 + if (flags & C_HEX) {
13223 + kdb_printf("0x%x", a);
13224 + } else if (flags & C_BINARY) {
13225 + uint64_t value = a & 0xffffffff;
13226 + kdb_printf("0b");
13227 + kl_binary_print(value);
13228 + } else {
13229 + kdb_printf("%d", a);
13230 + }
13231 +}
13232 +
13233 +#if 0
13234 +/*
13235 + * kl_print_float4()
13236 + */
13237 +void
13238 +kl_print_float4(void *ptr, int flags)
13239 +{
13240 + float a;
13241 +
13242 + /* Make sure the pointer is properly aligned (or we will
13243 + * dump core)
13244 + */
13245 + if (align_chk && (uaddr_t)ptr % 4) {
13246 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13247 + return;
13248 + }
13249 + a = *(float*) ptr;
13250 + kdb_printf("%f", a);
13251 +}
13252 +#endif
13253 +
13254 +/*
13255 + * kl_print_uint4()
13256 + */
13257 +void
13258 +kl_print_uint4(void *ptr, int flags)
13259 +{
13260 + uint32_t a;
13261 +
13262 + /* Make sure the pointer is properly aligned (or we will
13263 + * dump core)
13264 + */
13265 + if (align_chk && (uaddr_t)ptr % 4) {
13266 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13267 + return;
13268 + }
13269 + a = *(uint32_t*) ptr;
13270 + if (flags & C_HEX) {
13271 + kdb_printf("0x%x", a);
13272 + } else if (flags & C_BINARY) {
13273 + uint64_t value = a & 0xffffffff;
13274 + kdb_printf("0b");
13275 + kl_binary_print(value);
13276 + } else {
13277 + kdb_printf("%u", a);
13278 + }
13279 +}
13280 +
13281 +/*
13282 + * kl_print_int2()
13283 + */
13284 +void
13285 +kl_print_int2(void *ptr, int flags)
13286 +{
13287 + int16_t a;
13288 +
13289 + /* Make sure the pointer is properly aligned (or we will
13290 + * dump core
13291 + */
13292 + if (align_chk && (uaddr_t)ptr % 2) {
13293 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13294 + return;
13295 + }
13296 + a = *(int16_t*) ptr;
13297 + if (flags & C_HEX) {
13298 + kdb_printf("0x%hx", a);
13299 + } else if (flags & C_BINARY) {
13300 + uint64_t value = a & 0xffff;
13301 + kdb_printf("0b");
13302 + kl_binary_print(value);
13303 + } else {
13304 + kdb_printf("%hd", a);
13305 + }
13306 +}
13307 +
13308 +/*
13309 + * kl_print_uint2()
13310 + */
13311 +void
13312 +kl_print_uint2(void *ptr, int flags)
13313 +{
13314 + uint16_t a;
13315 +
13316 + /* Make sure the pointer is properly aligned (or we will
13317 + * dump core
13318 + */
13319 + if (align_chk && (uaddr_t)ptr % 2) {
13320 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13321 + return;
13322 + }
13323 + a = *(uint16_t*) ptr;
13324 + if (flags & C_HEX) {
13325 + kdb_printf("0x%hx", a);
13326 + } else if (flags & C_BINARY) {
13327 + uint64_t value = a & 0xffff;
13328 + kdb_printf("0b");
13329 + kl_binary_print(value);
13330 + } else {
13331 + kdb_printf("%hu", a);
13332 + }
13333 +}
13334 +
13335 +/*
13336 + * kl_print_char()
13337 + */
13338 +void
13339 +kl_print_char(void *ptr, int flags)
13340 +{
13341 + char c;
13342 +
13343 + if (flags & C_HEX) {
13344 + kdb_printf("0x%x", (*(char *)ptr) & 0xff);
13345 + } else if (flags & C_BINARY) {
13346 + uint64_t value = (*(char *)ptr) & 0xff;
13347 + kdb_printf("0b");
13348 + kl_binary_print(value);
13349 + } else {
13350 + c = *(char *)ptr;
13351 +
13352 + kdb_printf("\'\\%03o\'", (unsigned char)c);
13353 + switch (c) {
13354 + case '\a' :
13355 + kdb_printf(" = \'\\a\'");
13356 + break;
13357 + case '\b' :
13358 + kdb_printf(" = \'\\b\'");
13359 + break;
13360 + case '\t' :
13361 + kdb_printf(" = \'\\t\'");
13362 + break;
13363 + case '\n' :
13364 + kdb_printf(" = \'\\n\'");
13365 + break;
13366 + case '\f' :
13367 + kdb_printf(" = \'\\f\'");
13368 + break;
13369 + case '\r' :
13370 + kdb_printf(" = \'\\r\'");
13371 + break;
13372 + case '\e' :
13373 + kdb_printf(" = \'\\e\'");
13374 + break;
13375 + default :
13376 + if( !iscntrl((unsigned char) c) ) {
13377 + kdb_printf(" = \'%c\'", c);
13378 + }
13379 + break;
13380 + }
13381 + }
13382 +}
13383 +
13384 +/*
13385 + * kl_print_uchar()
13386 + */
13387 +void
13388 +kl_print_uchar(void *ptr, int flags)
13389 +{
13390 + if (flags & C_HEX) {
13391 + kdb_printf("0x%x", *(unsigned char *)ptr);
13392 + } else if (flags & C_BINARY) {
13393 + uint64_t value = (*(unsigned char *)ptr) & 0xff;
13394 + kdb_printf("0b");
13395 + kl_binary_print(value);
13396 + } else {
13397 + kdb_printf("%u", *(unsigned char *)ptr);
13398 + }
13399 +}
13400 +
13401 +/*
13402 + * kl_print_base()
13403 + */
13404 +void
13405 +kl_print_base(void *ptr, int size, int encoding, int flags)
13406 +{
13407 + /* FIXME: untested */
13408 + if (invalid_address((kaddr_t)ptr, size)) {
13409 + kdb_printf("ILLEGAL ADDRESS (%lx)", (uaddr_t)ptr);
13410 + return;
13411 + }
13412 + switch (size) {
13413 +
13414 + case 1:
13415 + if (encoding == ENC_UNSIGNED) {
13416 + kl_print_uchar(ptr, flags);
13417 + } else {
13418 + kl_print_char(ptr, flags);
13419 + }
13420 + break;
13421 +
13422 + case 2:
13423 + if (encoding == ENC_UNSIGNED) {
13424 + kl_print_uint2(ptr, flags);
13425 + } else {
13426 + kl_print_int2(ptr, flags);
13427 + }
13428 + break;
13429 +
13430 + case 4:
13431 + if (encoding == ENC_UNSIGNED) {
13432 + kl_print_uint4(ptr, flags);
13433 + } else if (encoding == ENC_FLOAT) {
13434 + printk("error: print of 4-byte float\n");
13435 + /* kl_print_float4(ptr, flags); */
13436 + } else {
13437 + kl_print_int4(ptr, flags);
13438 + }
13439 + break;
13440 +
13441 + case 8:
13442 + if (encoding == ENC_UNSIGNED) {
13443 + kl_print_uint8(ptr, flags);
13444 + } else if (encoding == ENC_FLOAT) {
13445 + printk("error: print of 8-byte float\n");
13446 + /* kl_print_float8(ptr, flags); */
13447 + } else {
13448 + kl_print_int8(ptr, flags);
13449 + }
13450 + break;
13451 +
13452 + case 16:
13453 + if (encoding == ENC_UNSIGNED) {
13454 + /* Ex: unsigned long long */
13455 + kl_print_uint16(ptr, flags);
13456 + } else if (encoding == ENC_FLOAT) {
13457 + printk("error: print of 16-byte float\n");
13458 + /* Ex: long double */
13459 + /* kl_print_float16(ptr, flags); */
13460 + } else {
13461 + /* Ex: long long */
13462 + kl_print_int16(ptr, flags);
13463 + }
13464 + break;
13465 +
13466 + default:
13467 + break;
13468 + }
13469 +}
13470 +
13471 +/*
13472 + * kl_print_base_value()
13473 + */
13474 +void
13475 +kl_print_base_value(void *ptr, kltype_t *kltp, int flags)
13476 +{
13477 + kltype_t *rkltp=NULL;
13478 +
13479 + if (kltp->kl_type != KLT_BASE) {
13480 + if (!(rkltp = kltp->kl_realtype)) {
13481 + return;
13482 + }
13483 + if (rkltp->kl_type != KLT_BASE) {
13484 + return;
13485 + }
13486 + } else {
13487 + rkltp = kltp;
13488 + }
13489 + kl_print_base(ptr, rkltp->kl_size, rkltp->kl_encoding, flags);
13490 +}
13491 +
13492 +/*
13493 + * kl_print_typedef_type()
13494 + */
13495 +void
13496 +kl_print_typedef_type(
13497 + void *ptr,
13498 + kltype_t *kltp,
13499 + int level,
13500 + int flags)
13501 +{
13502 + char *name;
13503 + kltype_t *rkltp;
13504 +
13505 + if (ptr) {
13506 + rkltp = kltp->kl_realtype;
13507 + while (rkltp->kl_type == KLT_TYPEDEF) {
13508 + if (rkltp->kl_realtype) {
13509 + rkltp = rkltp->kl_realtype;
13510 + }
13511 + }
13512 + if (rkltp->kl_type == KLT_POINTER) {
13513 + kl_print_pointer_type(ptr, kltp, level, flags);
13514 + return;
13515 + }
13516 + switch (rkltp->kl_type) {
13517 + case KLT_BASE:
13518 + kl_print_base_type(ptr, kltp,
13519 + level, flags);
13520 + break;
13521 +
13522 + case KLT_UNION:
13523 + case KLT_STRUCT:
13524 + kl_print_struct_type(ptr, kltp,
13525 + level, flags);
13526 + break;
13527 +
13528 + case KLT_ARRAY:
13529 + kl_print_array_type(ptr, kltp,
13530 + level, flags);
13531 + break;
13532 +
13533 + case KLT_ENUMERATION:
13534 + kl_print_enumeration_type(ptr,
13535 + kltp, level, flags);
13536 + break;
13537 +
13538 + default:
13539 + kl_print_base_type(ptr, kltp,
13540 + level, flags);
13541 + break;
13542 + }
13543 + } else {
13544 + LEVEL_INDENT(level, flags);
13545 + if (flags & NO_REALTYPE) {
13546 + rkltp = kltp;
13547 + } else {
13548 + rkltp = kltp->kl_realtype;
13549 + while (rkltp && rkltp->kl_type == KLT_POINTER) {
13550 + rkltp = rkltp->kl_realtype;
13551 + }
13552 + }
13553 + if (!rkltp) {
13554 + if (SUPPRESS_NAME) {
13555 + kdb_printf("<UNKNOWN>");
13556 + } else {
13557 + kdb_printf( "typedef <UNKNOWN>%s;",
13558 + kltp->kl_name);
13559 + }
13560 + return;
13561 + }
13562 + if (rkltp->kl_type == KLT_FUNCTION) {
13563 + if (kltp->kl_realtype->kl_type == KLT_POINTER) {
13564 + kdb_printf("typedef %s(*%s)();",
13565 + kltp->kl_typestr, kltp->kl_name);
13566 + } else {
13567 + kdb_printf( "typedef %s(%s)();",
13568 + kltp->kl_typestr, kltp->kl_name);
13569 + }
13570 + } else if (rkltp->kl_type == KLT_ARRAY) {
13571 + kl_print_array_type(ptr, rkltp, level, flags);
13572 + } else if (rkltp->kl_type == KLT_TYPEDEF) {
13573 + if (!(name = rkltp->kl_name)) {
13574 + name = rkltp->kl_typestr;
13575 + }
13576 +
13577 + if (SUPPRESS_NAME) {
13578 + kdb_printf("%s", name);
13579 + } else {
13580 + kdb_printf("typedef %s%s;",
13581 + name, kltp->kl_name);
13582 + }
13583 + print_realtype(rkltp);
13584 + } else {
13585 + kl_print_type(ptr, rkltp, level, flags);
13586 + }
13587 + PRINT_NL(flags);
13588 + }
13589 +}
13590 +
13591 +/*
13592 + * kl_print_pointer_type()
13593 + */
13594 +void
13595 +kl_print_pointer_type(
13596 + void *ptr,
13597 + kltype_t *kltp,
13598 + int level,
13599 + int flags)
13600 +{
13601 + kltype_t *itp;
13602 +
13603 + if (kltp->kl_type == KLT_MEMBER) {
13604 + itp = kltp->kl_realtype;
13605 + } else {
13606 + itp = kltp;
13607 + }
13608 +
13609 + /* See if this is a pointer to a function. If it is, then it
13610 + * has to be handled differently...
13611 + */
13612 + while (itp->kl_type == KLT_POINTER) {
13613 + if ((itp = itp->kl_realtype)) {
13614 + if (itp->kl_type == KLT_FUNCTION) {
13615 + kl_print_function_type(ptr,
13616 + kltp, level, flags);
13617 + return;
13618 + }
13619 + } else {
13620 + LEVEL_INDENT(level, flags);
13621 + kdb_printf("%s%s;\n",
13622 + kltp->kl_typestr, kltp->kl_name);
13623 + return;
13624 + }
13625 + }
13626 +
13627 + LEVEL_INDENT(level, flags);
13628 + if (ptr) {
13629 + kaddr_t tmp;
13630 + tmp = *(kaddr_t *)ptr;
13631 + flags |= SUPPRESS_SEMI_COLON;
13632 + if(kltp->kl_name){
13633 + if (*(kaddr_t *)ptr) {
13634 + kdb_printf("%s = 0x%"FMTPTR"x",
13635 + kltp->kl_name, tmp);
13636 + } else {
13637 + kdb_printf("%s = (nil)", kltp->kl_name);
13638 + }
13639 + } else {
13640 + if (tmp != 0) {
13641 + kdb_printf("0x%"FMTPTR"x", tmp);
13642 + } else {
13643 + kdb_printf( "(nil)");
13644 + }
13645 + }
13646 + } else {
13647 + if (kltp->kl_typestr) {
13648 + if (kltp->kl_name && !(flags & SUPPRESS_NAME)) {
13649 + kdb_printf("%s%s",
13650 + kltp->kl_typestr, kltp->kl_name);
13651 + } else {
13652 + kdb_printf("%s", kltp->kl_typestr);
13653 + }
13654 + } else {
13655 + kdb_printf("<UNKNOWN>");
13656 + }
13657 + }
13658 + PRINT_SEMI_COLON(level, flags);
13659 + PRINT_NL(flags);
13660 +}
13661 +
13662 +/*
13663 + * kl_print_function_type()
13664 + */
13665 +void
13666 +kl_print_function_type(
13667 + void *ptr,
13668 + kltype_t *kltp,
13669 + int level,
13670 + int flags)
13671 +{
13672 + LEVEL_INDENT(level, flags);
13673 + if (ptr) {
13674 + kaddr_t a;
13675 +
13676 + a = *(kaddr_t *)ptr;
13677 + kdb_printf("%s = 0x%"FMTPTR"x", kltp->kl_name, a);
13678 + } else {
13679 + if (flags & SUPPRESS_NAME) {
13680 + kdb_printf("%s(*)()", kltp->kl_typestr);
13681 + } else {
13682 + kdb_printf("%s(*%s)();",
13683 + kltp->kl_typestr, kltp->kl_name);
13684 + }
13685 + }
13686 + PRINT_NL(flags);
13687 +}
13688 +
13689 +/*
13690 + * kl_print_array_type()
13691 + */
13692 +void
13693 +kl_print_array_type(void *ptr, kltype_t *kltp, int level, int flags)
13694 +{
13695 + int i, count = 0, anon = 0, size, low, high, multi = 0;
13696 + char typestr[128], *name, *p;
13697 + kltype_t *rkltp, *etp, *retp;
13698 +
13699 + if (kltp->kl_type != KLT_ARRAY) {
13700 + if ((rkltp = kltp->kl_realtype)) {
13701 + while (rkltp->kl_type != KLT_ARRAY) {
13702 + if (!(rkltp = rkltp->kl_realtype)) {
13703 + break;
13704 + }
13705 + }
13706 + }
13707 + if (!rkltp) {
13708 + LEVEL_INDENT(level, flags);
13709 + kdb_printf("<ARRAY_TYPE>");
13710 + PRINT_SEMI_COLON(level, flags);
13711 + PRINT_NL(flags);
13712 + return;
13713 + }
13714 + } else {
13715 + rkltp = kltp;
13716 + }
13717 +
13718 + etp = rkltp->kl_elementtype;
13719 + if (!etp) {
13720 + LEVEL_INDENT(level, flags);
13721 + kdb_printf("<BAD_ELEMENT_TYPE> %s", rkltp->kl_name);
13722 + PRINT_SEMI_COLON(level, flags);
13723 + PRINT_NL(flags);
13724 + return;
13725 + }
13726 +
13727 + /* Set retp to point to the actual element type. This is necessary
13728 + * for multi-dimensional arrays, which link using the kl_elementtype
13729 + * member.
13730 + */
13731 + retp = etp;
13732 + while (retp->kl_type == KLT_ARRAY) {
13733 + retp = retp->kl_elementtype;
13734 + }
13735 + low = rkltp->kl_low_bounds + 1;
13736 + high = rkltp->kl_high_bounds;
13737 +
13738 + if (ptr) {
13739 +
13740 + p = ptr;
13741 +
13742 + if ((retp->kl_size == 1) && (retp->kl_encoding == ENC_CHAR)) {
13743 + if (kltp->kl_type == KLT_MEMBER) {
13744 + LEVEL_INDENT(level, flags);
13745 + }
13746 + if (flags & SUPPRESS_NAME) {
13747 + kdb_printf("\"");
13748 + flags &= ~SUPPRESS_NAME;
13749 + } else {
13750 + kdb_printf("%s = \"", kltp->kl_name);
13751 + }
13752 + for (i = 0; i < high; i++) {
13753 + if (*(char*)p == 0) {
13754 + break;
13755 + }
13756 + kdb_printf("%c", *(char *)p);
13757 + p++;
13758 + }
13759 + kdb_printf("\"");
13760 + PRINT_NL(flags);
13761 + } else {
13762 + if (kltp->kl_type == KLT_MEMBER) {
13763 + LEVEL_INDENT(level, flags);
13764 + }
13765 +
13766 + if (flags & SUPPRESS_NAME) {
13767 + kdb_printf("{\n");
13768 + flags &= ~SUPPRESS_NAME;
13769 + } else {
13770 + kdb_printf("%s = {\n", kltp->kl_name);
13771 + }
13772 +
13773 + if (retp->kl_type == KLT_POINTER) {
13774 + size = sizeof(void *);
13775 + } else {
13776 + while (retp->kl_realtype) {
13777 + retp = retp->kl_realtype;
13778 + }
13779 + size = retp->kl_size;
13780 + }
13781 + if ((retp->kl_type != KLT_STRUCT) &&
13782 + (retp->kl_type != KLT_UNION)) {
13783 + /* Turn off the printing of names for all
13784 + * but structs and unions.
13785 + */
13786 + flags |= SUPPRESS_NAME;
13787 + }
13788 + for (i = low; i <= high; i++) {
13789 +
13790 + LEVEL_INDENT(level + 1, flags);
13791 + kdb_printf("[%d] ", i);
13792 +
13793 + switch (retp->kl_type) {
13794 + case KLT_POINTER :
13795 + kl_print_pointer_type(
13796 + p, retp, level,
13797 + flags|NO_INDENT);
13798 + break;
13799 +
13800 + case KLT_TYPEDEF:
13801 + kl_print_typedef_type(
13802 + p, retp, level,
13803 + flags|NO_INDENT);
13804 + break;
13805 +
13806 + case KLT_BASE:
13807 + kl_print_base_value(p,
13808 + retp, flags|NO_INDENT);
13809 + kdb_printf("\n");
13810 + break;
13811 +
13812 + case KLT_ARRAY:
13813 + kl_print_array_type(p, retp,
13814 + level + 1,
13815 + flags|SUPPRESS_NAME);
13816 + break;
13817 +
13818 + case KLT_STRUCT:
13819 + case KLT_UNION:
13820 + kl_print_struct_type(p,
13821 + retp, level + 1,
13822 + flags|NO_INDENT);
13823 + break;
13824 +
13825 + default:
13826 + kl_print_base_value(
13827 + p, retp,
13828 + flags|NO_INDENT);
13829 + kdb_printf("\n");
13830 + break;
13831 + }
13832 + p = (void *)((uaddr_t)p + size);
13833 + }
13834 + LEVEL_INDENT(level, flags);
13835 + kdb_printf("}");
13836 + PRINT_SEMI_COLON(level, flags);
13837 + PRINT_NL(flags);
13838 + }
13839 + } else {
13840 + if (rkltp) {
13841 + count = (rkltp->kl_high_bounds -
13842 + rkltp->kl_low_bounds) + 1;
13843 + } else {
13844 + count = 1;
13845 + }
13846 +
13847 + if (!strcmp(retp->kl_typestr, "struct ") ||
13848 + !strcmp(retp->kl_typestr, "union ")) {
13849 + anon = 1;
13850 + }
13851 +next_dimension:
13852 + switch (retp->kl_type) {
13853 +
13854 + case KLT_UNION:
13855 + case KLT_STRUCT:
13856 + if (anon) {
13857 + if (multi) {
13858 + kdb_printf("[%d]", count);
13859 + break;
13860 + }
13861 + kl_print_struct_type(ptr, retp, level,
13862 + flags|
13863 + SUPPRESS_NL|
13864 + SUPPRESS_SEMI_COLON);
13865 + if (kltp->kl_type == KLT_MEMBER) {
13866 + kdb_printf(" %s[%d]",
13867 + kltp->kl_name, count);
13868 + } else {
13869 + kdb_printf(" [%d]", count);
13870 + }
13871 + break;
13872 + }
13873 + /* else drop through */
13874 +
13875 + default:
13876 + LEVEL_INDENT(level, flags);
13877 + if (multi) {
13878 + kdb_printf("[%d]", count);
13879 + break;
13880 + }
13881 + name = kltp->kl_name;
13882 + if (retp->kl_type == KLT_TYPEDEF) {
13883 + strcpy(typestr, retp->kl_name);
13884 + strcat(typestr, " ");
13885 + } else {
13886 + strcpy(typestr, retp->kl_typestr);
13887 + }
13888 + if (!name || (flags & SUPPRESS_NAME)) {
13889 + kdb_printf("%s[%d]", typestr, count);
13890 + } else {
13891 + kdb_printf("%s%s[%d]",
13892 + typestr, name, count);
13893 + }
13894 + }
13895 + if (etp->kl_type == KLT_ARRAY) {
13896 + count = etp->kl_high_bounds - etp->kl_low_bounds + 1;
13897 + etp = etp->kl_elementtype;
13898 + multi++;
13899 + goto next_dimension;
13900 + }
13901 + PRINT_SEMI_COLON(level, flags);
13902 + PRINT_NL(flags);
13903 + }
13904 +}
13905 +
13906 +/*
13907 + * kl_print_enumeration_type()
13908 + */
13909 +void
13910 +kl_print_enumeration_type(
13911 + void *ptr,
13912 + kltype_t *kltp,
13913 + int level,
13914 + int flags)
13915 +{
13916 + unsigned long long val = 0;
13917 + kltype_t *mp, *rkltp;
13918 +
13919 + rkltp = kl_realtype(kltp, KLT_ENUMERATION);
13920 + if (ptr) {
13921 + switch (kltp->kl_size) {
13922 + case 1:
13923 + val = *(unsigned long long *)ptr;
13924 + break;
13925 +
13926 + case 2:
13927 + val = *(uint16_t *)ptr;
13928 + break;
13929 +
13930 + case 4:
13931 + val = *(uint32_t *)ptr;
13932 + break;
13933 +
13934 + case 8:
13935 + val = *(uint64_t *)ptr;
13936 + break;
13937 + }
13938 + mp = rkltp->kl_member;
13939 + while (mp) {
13940 + if (mp->kl_value == val) {
13941 + break;
13942 + }
13943 + mp = mp->kl_member;
13944 + }
13945 + LEVEL_INDENT(level, flags);
13946 + if (mp) {
13947 + kdb_printf("%s = (%s=%lld)",
13948 + kltp->kl_name, mp->kl_name, val);
13949 + } else {
13950 + kdb_printf("%s = %lld", kltp->kl_name, val);
13951 + }
13952 + PRINT_NL(flags);
13953 + } else {
13954 + LEVEL_INDENT(level, flags);
13955 + kdb_printf ("%s {", kltp->kl_typestr);
13956 + mp = rkltp->kl_member;
13957 + while (mp) {
13958 + kdb_printf("%s = %d", mp->kl_name, mp->kl_value);
13959 + if ((mp = mp->kl_member)) {
13960 + kdb_printf(", ");
13961 + }
13962 + }
13963 + mp = kltp;
13964 + if (level) {
13965 + kdb_printf("} %s;", mp->kl_name);
13966 + } else {
13967 + kdb_printf("};");
13968 + }
13969 + PRINT_NL(flags);
13970 + }
13971 +}
13972 +
13973 +/*
13974 + * kl_binary_print()
13975 + */
13976 +void
13977 +kl_binary_print(uint64_t num)
13978 +{
13979 + int i, pre = 1;
13980 +
13981 + for (i = 63; i >= 0; i--) {
13982 + if (num & ((uint64_t)1 << i)) {
13983 + kdb_printf("1");
13984 + if (pre) {
13985 + pre = 0;
13986 + }
13987 + } else {
13988 + if (!pre) {
13989 + kdb_printf("0");
13990 + }
13991 + }
13992 + }
13993 + if (pre) {
13994 + kdb_printf("0");
13995 + }
13996 +}
13997 +
13998 +/*
13999 + * kl_get_bit_value()
14000 + *
14001 + * x = byte_size, y = bit_size, z = bit_offset
14002 + */
14003 +uint64_t
14004 +kl_get_bit_value(void *ptr, unsigned int x, unsigned int y, unsigned int z)
14005 +{
14006 + uint64_t value=0, mask;
14007 +
14008 + /* handle x bytes of buffer -- doing just memcpy won't work
14009 + * on big endian architectures
14010 + */
14011 + switch (x) {
14012 + case 5:
14013 + case 6:
14014 + case 7:
14015 + case 8:
14016 + x = 8;
14017 + value = *(uint64_t*) ptr;
14018 + break;
14019 + case 3:
14020 + case 4:
14021 + x = 4;
14022 + value = *(uint32_t*) ptr;
14023 + break;
14024 + case 2:
14025 + value = *(uint16_t*) ptr;
14026 + break;
14027 + case 1:
14028 + value = *(uint8_t *)ptr;
14029 + break;
14030 + default:
14031 + /* FIXME: set KL_ERROR */
14032 + return(0);
14033 + }
14034 + /*
14035 + o FIXME: correct handling of overlapping fields
14036 + */
14037 +
14038 + /* goto bit offset */
14039 + value = value >> z;
14040 +
14041 + /* mask bit size bits */
14042 + mask = (((uint64_t)1 << y) - 1);
14043 + return (value & mask);
14044 +}
14045 +
14046 +/*
14047 + * kl_print_bit_value()
14048 + *
14049 + * x = byte_size, y = bit_size, z = bit_offset
14050 + */
14051 +void
14052 +kl_print_bit_value(void *ptr, int x, int y, int z, int flags)
14053 +{
14054 + unsigned long long value;
14055 +
14056 + value = kl_get_bit_value(ptr, x, y, z);
14057 + if (flags & C_HEX) {
14058 + kdb_printf("%#llx", value);
14059 + } else if (flags & C_BINARY) {
14060 + kdb_printf("0b");
14061 + kl_binary_print(value);
14062 + } else {
14063 + kdb_printf("%lld", value);
14064 + }
14065 +}
14066 +
14067 +/*
14068 + * kl_print_base_type()
14069 + */
14070 +void
14071 +kl_print_base_type(void *ptr, kltype_t *kltp, int level, int flags)
14072 +{
14073 + LEVEL_INDENT(level, flags);
14074 + if (ptr) {
14075 + if (!(flags & SUPPRESS_NAME)) {
14076 + kdb_printf ("%s = ", kltp->kl_name);
14077 + }
14078 + }
14079 + if (kltp->kl_type == KLT_MEMBER) {
14080 + if (kltp->kl_bit_size < (kltp->kl_size * 8)) {
14081 + if (ptr) {
14082 + kl_print_bit_value(ptr, kltp->kl_size,
14083 + kltp->kl_bit_size,
14084 + kltp->kl_bit_offset, flags);
14085 + } else {
14086 + if (kltp->kl_name) {
14087 + kdb_printf ("%s%s :%d;",
14088 + kltp->kl_typestr,
14089 + kltp->kl_name,
14090 + kltp->kl_bit_size);
14091 + } else {
14092 + kdb_printf ("%s :%d;",
14093 + kltp->kl_typestr,
14094 + kltp->kl_bit_size);
14095 + }
14096 + }
14097 + PRINT_NL(flags);
14098 + return;
14099 + }
14100 + }
14101 + if (ptr) {
14102 + kltype_t *rkltp;
14103 +
14104 + rkltp = kl_realtype(kltp, 0);
14105 + if (rkltp->kl_encoding == ENC_UNDEFINED) {
14106 + /* This is a void value
14107 + */
14108 + kdb_printf("<VOID>");
14109 + } else {
14110 + kl_print_base(ptr, kltp->kl_size,
14111 + rkltp->kl_encoding, flags);
14112 + }
14113 + } else {
14114 + if (kltp->kl_type == KLT_MEMBER) {
14115 + if (flags & SUPPRESS_NAME) {
14116 + kdb_printf ("%s", kltp->kl_typestr);
14117 + } else {
14118 + if (kltp->kl_name) {
14119 + kdb_printf("%s%s;", kltp->kl_typestr,
14120 + kltp->kl_name);
14121 + } else {
14122 + kdb_printf ("%s :%d;",
14123 + kltp->kl_typestr,
14124 + kltp->kl_bit_size);
14125 + }
14126 + }
14127 + } else {
14128 + if (SUPPRESS_NAME) {
14129 + kdb_printf("%s", kltp->kl_name);
14130 + } else {
14131 + kdb_printf("%s;", kltp->kl_name);
14132 + }
14133 + }
14134 + }
14135 + PRINT_NL(flags);
14136 +}
14137 +
14138 +/*
14139 + * kl_print_member()
14140 + */
14141 +void
14142 +kl_print_member(void *ptr, kltype_t *mp, int level, int flags)
14143 +{
14144 + int kl_type = 0;
14145 + kltype_t *rkltp;
14146 +
14147 + if (flags & C_SHOWOFFSET) {
14148 + kdb_printf("%#x ", mp->kl_offset);
14149 + }
14150 +
14151 + if ((rkltp = mp->kl_realtype)) {
14152 + kl_type = rkltp->kl_type;
14153 + } else
14154 + kl_type = mp->kl_type;
14155 + switch (kl_type) {
14156 + case KLT_STRUCT:
14157 + case KLT_UNION:
14158 + kl_print_struct_type(ptr, mp, level, flags);
14159 + break;
14160 + case KLT_ARRAY:
14161 + kl_print_array_type(ptr, mp, level, flags);
14162 + break;
14163 + case KLT_POINTER:
14164 + kl_print_pointer_type(ptr, mp, level, flags);
14165 + break;
14166 + case KLT_FUNCTION:
14167 + kl_print_function_type(ptr, mp, level, flags);
14168 + break;
14169 + case KLT_BASE:
14170 + kl_print_base_type(ptr, mp, level, flags);
14171 + break;
14172 + case KLT_ENUMERATION:
14173 + kl_print_enumeration_type(ptr, mp, level, flags);
14174 + break;
14175 + case KLT_TYPEDEF:
14176 + while (rkltp && rkltp->kl_realtype) {
14177 + if (rkltp->kl_realtype == rkltp) {
14178 + break;
14179 + }
14180 + rkltp = rkltp->kl_realtype;
14181 + }
14182 + if (ptr) {
14183 + kl_print_typedef_type(ptr, mp,
14184 + level, flags);
14185 + break;
14186 + }
14187 + LEVEL_INDENT(level, flags);
14188 + if (flags & SUPPRESS_NAME) {
14189 + if (rkltp && (mp->kl_bit_size <
14190 + (rkltp->kl_size * 8))) {
14191 + kdb_printf ("%s :%d",
14192 + mp->kl_typestr,
14193 + mp->kl_bit_size);
14194 + } else {
14195 + kdb_printf("%s",
14196 + mp->kl_realtype->kl_name);
14197 + }
14198 + print_realtype(mp->kl_realtype);
14199 + } else {
14200 + if (rkltp && (mp->kl_bit_size <
14201 + (rkltp->kl_size * 8))) {
14202 + if (mp->kl_name) {
14203 + kdb_printf ("%s%s :%d;",
14204 + mp->kl_typestr,
14205 + mp->kl_name,
14206 + mp->kl_bit_size);
14207 + } else {
14208 + kdb_printf ("%s :%d;",
14209 + mp->kl_typestr,
14210 + mp->kl_bit_size);
14211 + }
14212 + } else {
14213 + kdb_printf("%s %s;",
14214 + mp->kl_realtype->kl_name,
14215 + mp->kl_name);
14216 + }
14217 + }
14218 + PRINT_NL(flags);
14219 + break;
14220 +
14221 + default:
14222 + LEVEL_INDENT(level, flags);
14223 + if (mp->kl_typestr) {
14224 + kdb_printf("%s%s;",
14225 + mp->kl_typestr, mp->kl_name);
14226 + } else {
14227 + kdb_printf("<\?\?\? kl_type:%d> %s;",
14228 + kl_type, mp->kl_name);
14229 + }
14230 + PRINT_NL(flags);
14231 + break;
14232 + }
14233 +}
14234 +
14235 +/*
14236 + * kl_print_struct_type()
14237 + */
14238 +void
14239 +kl_print_struct_type(void *buf, kltype_t *kltp, int level, int flags)
14240 +{
14241 + int orig_flags = flags;
14242 + void *ptr = NULL;
14243 + kltype_t *mp, *rkltp;
14244 +
14245 + /* If we are printing out an actual struct, then don't print any
14246 + * semi colons.
14247 + */
14248 + if (buf) {
14249 + flags |= SUPPRESS_SEMI_COLON;
14250 + }
14251 +
14252 + LEVEL_INDENT(level, flags);
14253 + if ((level == 0) || (flags & NO_INDENT)) {
14254 + kdb_printf("%s{\n", kltp->kl_typestr);
14255 + } else {
14256 + if (buf) {
14257 + if (level && !(kltp->kl_flags & TYP_ANONYMOUS_FLG)) {
14258 + kdb_printf("%s = %s{\n",
14259 + kltp->kl_name, kltp->kl_typestr);
14260 + } else {
14261 + kdb_printf("%s{\n", kltp->kl_typestr);
14262 + }
14263 + flags &= (~SUPPRESS_NL);
14264 + } else {
14265 + if (kltp->kl_typestr) {
14266 + kdb_printf("%s{\n", kltp->kl_typestr);
14267 + } else {
14268 + kdb_printf("<UNKNOWN> {\n");
14269 + }
14270 + }
14271 + }
14272 +
14273 + /* If the SUPPRESS_NL, SUPPRESS_SEMI_COLON, and SUPPRESS_NAME flags
14274 + * are set and buf is NULL, then turn them off as they only apply
14275 + * at the end of the struct. We save the original flags for that
14276 + * purpose.
14277 + */
14278 + if (!buf) {
14279 + flags &= ~(SUPPRESS_NL|SUPPRESS_SEMI_COLON|SUPPRESS_NAME);
14280 + }
14281 +
14282 + /* If the NO_INDENT is set, we need to turn it off at this
14283 + * point -- just in case we come across a member of this struct
14284 + * that is also a struct.
14285 + */
14286 + if (flags & NO_INDENT) {
14287 + flags &= ~(NO_INDENT);
14288 + }
14289 +
14290 + if (kltp->kl_type == KLT_MEMBER) {
14291 + rkltp = kl_realtype(kltp, 0);
14292 + } else {
14293 + rkltp = kltp;
14294 + }
14295 + level++;
14296 + if ((mp = rkltp->kl_member)) {
14297 + while (mp) {
14298 + if (buf) {
14299 + ptr = buf + mp->kl_offset;
14300 + }
14301 + kl_print_member(ptr, mp, level, flags);
14302 + mp = mp->kl_member;
14303 + }
14304 + } else {
14305 + if (kltp->kl_flags & TYP_INCOMPLETE_FLG) {
14306 + LEVEL_INDENT(level, flags);
14307 + kdb_printf("<INCOMPLETE TYPE>\n");
14308 + }
14309 + }
14310 + level--;
14311 + LEVEL_INDENT(level, flags);
14312 +
14313 + /* kl_size = 0 for empty structs */
14314 + if (ptr || ((kltp->kl_size == 0) && buf)) {
14315 + kdb_printf("}");
14316 + } else if ((kltp->kl_type == KLT_MEMBER) &&
14317 + !(orig_flags & SUPPRESS_NAME) &&
14318 + !(kltp->kl_flags & TYP_ANONYMOUS_FLG)) {
14319 + kdb_printf("} %s", kltp->kl_name);
14320 + } else {
14321 + kdb_printf("}");
14322 + }
14323 + PRINT_SEMI_COLON(level, orig_flags);
14324 + PRINT_NL(orig_flags);
14325 +}
14326 +
14327 +/*
14328 + * kl_print_type()
14329 + */
14330 +void
14331 +kl_print_type(void *buf, kltype_t *kltp, int level, int flags)
14332 +{
14333 + void *ptr;
14334 +
14335 + if (buf) {
14336 + if (kltp->kl_offset) {
14337 + ptr = (void *)((uaddr_t)buf + kltp->kl_offset);
14338 + } else {
14339 + ptr = buf;
14340 + }
14341 + } else {
14342 + ptr = 0;
14343 + }
14344 +
14345 + /* Only allow binary printing for base types
14346 + */
14347 + if (kltp->kl_type != KLT_BASE) {
14348 + flags &= (~C_BINARY);
14349 + }
14350 + switch (kltp->kl_type) {
14351 +
14352 + case KLT_TYPEDEF:
14353 + kl_print_typedef_type(ptr, kltp, level, flags);
14354 + break;
14355 +
14356 + case KLT_STRUCT:
14357 + case KLT_UNION:
14358 + kl_print_struct_type(ptr, kltp, level, flags);
14359 + break;
14360 +
14361 + case KLT_MEMBER:
14362 + kl_print_member(ptr, kltp, level, flags);
14363 + break;
14364 +
14365 + case KLT_POINTER:
14366 + kl_print_pointer_type(ptr, kltp, level, flags);
14367 + break;
14368 +
14369 + case KLT_FUNCTION:
14370 + LEVEL_INDENT(level, flags);
14371 + kl_print_function_type(ptr, kltp, level, flags);
14372 + break;
14373 +
14374 + case KLT_ARRAY:
14375 + kl_print_array_type(ptr, kltp, level, flags);
14376 + break;
14377 +
14378 + case KLT_ENUMERATION:
14379 + kl_print_enumeration_type(ptr,
14380 + kltp, level, flags);
14381 + break;
14382 +
14383 + case KLT_BASE:
14384 + kl_print_base_type(ptr, kltp, level, flags);
14385 + break;
14386 +
14387 + default:
14388 + LEVEL_INDENT(level, flags);
14389 + if (flags & SUPPRESS_NAME) {
14390 + kdb_printf ("%s", kltp->kl_name);
14391 + } else {
14392 + kdb_printf ("%s %s;",
14393 + kltp->kl_name, kltp->kl_name);
14394 + }
14395 + PRINT_NL(flags);
14396 + }
14397 +}
14398 +
14399 +/*
14400 + * eval is from lcrash eval.c
14401 + */
14402 +
14403 +/* Forward declarations */
14404 +static void free_node(node_t *);
14405 +static node_t *make_node(token_t *, int);
14406 +static node_t *get_node_list(token_t *, int);
14407 +static node_t *do_eval(int);
14408 +static int is_unary(int);
14409 +static int is_binary(int);
14410 +static int precedence(int);
14411 +static node_t *get_sizeof(void);
14412 +static int replace_cast(node_t *, int);
14413 +static int replace_unary(node_t *, int);
14414 +static node_t *replace(node_t *, int);
14415 +static void array_to_element(node_t*, node_t*);
14416 +static int type_to_number(node_t *);
14417 +kltype_t *number_to_type(node_t *);
14418 +static type_t *eval_type(node_t *);
14419 +static type_t *get_type(char *, int);
14420 +static int add_rchild(node_t *, node_t *);
14421 +static void free_nodelist(node_t *);
14422 +
14423 +/* Global variables
14424 + */
14425 +static int logical_flag;
14426 +static node_t *node_list = (node_t *)NULL;
14427 +uint64_t eval_error;
14428 +char *error_token;
14429 +
14430 +/*
14431 + * set_eval_error()
14432 + */
14433 +static void
14434 +set_eval_error(uint64_t ecode)
14435 +{
14436 + eval_error = ecode;
14437 +}
14438 +
14439 +/*
14440 + * is_typestr()
14441 + *
14442 + * We check for "struct", "union", etc. separately because they
14443 + * would not be an actual part of the type name. We also assume
14444 + * that the string passed in
14445 + *
14446 + * - does not have any leading blanks or tabs
14447 + * - is NULL terminated
14448 + * - contains only one type name to check
14449 + * - does not contain any '*' characters
14450 + */
14451 +static int
14452 +is_typestr(char *str)
14453 +{
14454 + int len;
14455 +
14456 + len = strlen(str);
14457 + if ((len >= 6) && !strncmp(str, "struct", 6)) {
14458 + return(1);
14459 + } else if ((len >= 5) &&!strncmp(str, "union", 5)) {
14460 + return(1);
14461 + } else if ((len >= 5) &&!strncmp(str, "short", 5)) {
14462 + return(1);
14463 + } else if ((len >= 8) &&!strncmp(str, "unsigned", 8)) {
14464 + return(1);
14465 + } else if ((len >= 6) &&!strncmp(str, "signed", 6)) {
14466 + return(1);
14467 + } else if ((len >= 4) &&!strncmp(str, "long", 4)) {
14468 + return(1);
14469 + }
14470 + /* Strip off any trailing blanks
14471 + */
14472 + while(*str && ((str[strlen(str) - 1] == ' ')
14473 + || (str[strlen(str) - 1] == '\t'))) {
14474 + str[strlen(str) - 1] = 0;
14475 + }
14476 + if (kl_find_type(str, KLT_TYPES)) {
14477 + return (1);
14478 + }
14479 + return(0);
14480 +}
14481 +
14482 +/*
14483 + * free_tokens()
14484 + */
14485 +static void
14486 +free_tokens(token_t *tp)
14487 +{
14488 + token_t *t, *tnext;
14489 +
14490 + t = tp;
14491 + while (t) {
14492 + tnext = t->next;
14493 + if (t->string) {
14494 + kl_free_block((void *)t->string);
14495 + }
14496 + kl_free_block((void *)t);
14497 + t = tnext;
14498 + }
14499 +}
14500 +
14501 +/*
14502 + * process_text()
14503 + */
14504 +static int
14505 +process_text(char **str, token_t *tok)
14506 +{
14507 + char *cp = *str;
14508 + char *s = NULL;
14509 + int len = 0;
14510 +
14511 + /* Check and see if this token is a STRING or CHARACTER
14512 + * type (beginning with a single or double quote).
14513 + */
14514 + if (*cp == '\'') {
14515 + /* make sure that only a single character is between
14516 + * the single quotes (it can be an escaped character
14517 + * too).
14518 + */
14519 + s = strpbrk((cp + 1), "\'");
14520 + if (!s) {
14521 + set_eval_error(E_SINGLE_QUOTE);
14522 + error_token = tok->ptr;
14523 + return(1);
14524 + }
14525 + len = (uaddr_t)s - (uaddr_t)cp;
14526 + if ((*(cp+1) == '\\')) {
14527 + if (*(cp+2) == '0') {
14528 + long int val;
14529 + unsigned long uval;
14530 + char *ep;
14531 +
14532 + uval = kl_strtoull((char*)(cp+2),
14533 + (char **)&ep, 8);
14534 + val = uval;
14535 + if ((val > 255) || (*ep != '\'')) {
14536 + set_eval_error(E_BAD_CHAR);
14537 + error_token = tok->ptr;
14538 + return(1);
14539 + }
14540 + } else if (*(cp+3) != '\'') {
14541 + set_eval_error(E_BAD_CHAR);
14542 + error_token = tok->ptr;
14543 + return(1);
14544 + }
14545 + tok->type = CHARACTER;
14546 + } else if (len == 2) {
14547 + tok->type = CHARACTER;
14548 + } else {
14549 +
14550 + /* Treat as a single token entry. It's possible
14551 + * that what's between the single quotes is a
14552 + * type name. That will be determined later on.
14553 + */
14554 + tok->type = STRING;
14555 + }
14556 + *str = cp + len;
14557 + } else if (*cp == '\"') {
14558 + s = strpbrk((cp + 1), "\"");
14559 + if (!s) {
14560 + set_eval_error(E_BAD_STRING);
14561 + error_token = tok->ptr;
14562 + return(1);
14563 + }
14564 + len = (uaddr_t)s - (uaddr_t)cp;
14565 + tok->type = TEXT;
14566 + *str = cp + len;
14567 + }
14568 + if ((tok->type == STRING) || (tok->type == TEXT)) {
14569 +
14570 + if ((tok->type == TEXT) && (strlen(cp) > (len + 1))) {
14571 +
14572 + /* Check to see if there is a comma or semi-colon
14573 + * directly following the string. If there is,
14574 + * then the string is OK (the following characters
14575 + * are part of the next expression). Also, it's OK
14576 + * to have trailing blanks as long as that's all
14577 + * threre is.
14578 + */
14579 + char *c;
14580 +
14581 + c = s + 1;
14582 + while (*c) {
14583 + if ((*c == ',') || (*c == ';')) {
14584 + break;
14585 + } else if (*c != ' ') {
14586 + set_eval_error(E_END_EXPECTED);
14587 + tok->ptr = c;
14588 + error_token = tok->ptr;
14589 + return(1);
14590 + }
14591 + c++;
14592 + }
14593 + /* Truncate the trailing blanks (they are not
14594 + * part of the string).
14595 + */
14596 + if (c != (s + 1)) {
14597 + *(s + 1) = 0;
14598 + }
14599 + }
14600 + tok->string = (char *)kl_alloc_block(len);
14601 + memcpy(tok->string, (cp + 1), len - 1);
14602 + tok->string[len - 1] = 0;
14603 + }
14604 + return(0);
14605 +}
14606 +
14607 +/*
14608 + * get_token_list()
14609 + */
14610 +static token_t *
14611 +get_token_list(char *str)
14612 +{
14613 + int paren_count = 0;
14614 + char *cp;
14615 + token_t *tok = (token_t*)NULL, *tok_head = (token_t*)NULL;
14616 + token_t *tok_last = (token_t*)NULL;
14617 +
14618 + cp = str;
14619 + eval_error = 0;
14620 +
14621 + while (*cp) {
14622 +
14623 + /* Skip past any "white space" (spaces and tabs).
14624 + */
14625 + switch (*cp) {
14626 + case ' ' :
14627 + case '\t' :
14628 + case '`' :
14629 + cp++;
14630 + continue;
14631 + default :
14632 + break;
14633 + }
14634 +
14635 + /* Allocate space for the next token */
14636 + tok = (token_t *)kl_alloc_block(sizeof(token_t));
14637 + tok->ptr = cp;
14638 +
14639 + switch(*cp) {
14640 +
14641 + /* Check for operators
14642 + */
14643 + case '+' :
14644 + if (*((char*)cp + 1) == '+') {
14645 +
14646 + /* We aren't doing asignment here,
14647 + * so the ++ operator is not
14648 + * considered valid.
14649 + */
14650 + set_eval_error(E_BAD_OPERATOR);
14651 + error_token = tok_last->ptr;
14652 + free_tokens(tok_head);
14653 + free_tokens(tok);
14654 + return ((token_t*)NULL);
14655 + } else if (!tok_last ||
14656 + (tok_last->operator &&
14657 + (tok_last->operator != CLOSE_PAREN))) {
14658 + tok->operator = UNARY_PLUS;
14659 + } else {
14660 + tok->operator = ADD;
14661 + }
14662 + break;
14663 +
14664 + case '-' :
14665 + if (*((char*)cp + 1) == '-') {
14666 +
14667 + /* We aren't doing asignment here, so
14668 + * the -- operator is not considered
14669 + * valid.
14670 + */
14671 + set_eval_error(E_BAD_OPERATOR);
14672 + error_token = tok_last->ptr;
14673 + free_tokens(tok_head);
14674 + free_tokens(tok);
14675 + return ((token_t*)NULL);
14676 + } else if (*((char*)cp + 1) == '>') {
14677 + tok->operator = RIGHT_ARROW;
14678 + cp++;
14679 + } else if (!tok_last || (tok_last->operator &&
14680 + (tok_last->operator != CLOSE_PAREN))) {
14681 + tok->operator = UNARY_MINUS;
14682 + } else {
14683 + tok->operator = SUBTRACT;
14684 + }
14685 + break;
14686 +
14687 + case '.' :
14688 + /* XXX - need to check to see if this is a
14689 + * decimal point in the middle fo a floating
14690 + * point value.
14691 + */
14692 + tok->operator = DOT;
14693 + break;
14694 +
14695 + case '*' :
14696 + /* XXX - need a better way to tell if this is
14697 + * an INDIRECTION. perhaps check the next
14698 + * token?
14699 + */
14700 + if (!tok_last || (tok_last->operator &&
14701 + ((tok_last->operator != CLOSE_PAREN) &&
14702 + (tok_last->operator != CAST)))) {
14703 + tok->operator = INDIRECTION;
14704 + } else {
14705 + tok->operator = MULTIPLY;
14706 + }
14707 + break;
14708 +
14709 + case '/' :
14710 + tok->operator = DIVIDE;
14711 + break;
14712 +
14713 + case '%' :
14714 + tok->operator = MODULUS;
14715 + break;
14716 +
14717 + case '(' : {
14718 + char *s, *s1, *s2;
14719 + int len;
14720 +
14721 + /* Make sure the previous token is an operator
14722 + */
14723 + if (tok_last && !tok_last->operator) {
14724 + set_eval_error(E_SYNTAX_ERROR);
14725 + error_token = tok_last->ptr;
14726 + free_tokens(tok_head);
14727 + free_tokens(tok);
14728 + return ((token_t*)NULL);
14729 + }
14730 +
14731 + if (tok_last &&
14732 + ((tok_last->operator == RIGHT_ARROW) ||
14733 + (tok_last->operator == DOT))) {
14734 + set_eval_error(E_SYNTAX_ERROR);
14735 + error_token = tok_last->ptr;
14736 + free_tokens(tok_head);
14737 + free_tokens(tok);
14738 + return ((token_t*)NULL);
14739 + }
14740 +
14741 + /* Check here to see if following tokens
14742 + * constitute a cast.
14743 + */
14744 +
14745 + /* Skip past any "white space" (spaces
14746 + * and tabs)
14747 + */
14748 + while ((*(cp+1) == ' ') || (*(cp+1) == '\t')) {
14749 + cp++;
14750 + }
14751 + if ((*(cp+1) == '(') || isdigit(*(cp+1)) ||
14752 + (*(cp+1) == '+') || (*(cp+1) == '-') ||
14753 + (*(cp+1) == '*') || (*(cp+1) == '&') ||
14754 + (*(cp+1) == ')')){
14755 + tok->operator = OPEN_PAREN;
14756 + paren_count++;
14757 + break;
14758 + }
14759 +
14760 + /* Make sure we have a CLOSE_PAREN.
14761 + */
14762 + if (!(s1 = strchr(cp+1, ')'))) {
14763 + set_eval_error(E_OPEN_PAREN);
14764 + error_token = tok->ptr;
14765 + free_tokens(tok_head);
14766 + free_tokens(tok);
14767 + return ((token_t*)NULL);
14768 + }
14769 + /* Check to see if this is NOT a simple
14770 + * typecast.
14771 + */
14772 + if (!(s2 = strchr(cp+1, '.'))) {
14773 + s2 = strstr(cp+1, "->");
14774 + }
14775 + if (s2 && (s2 < s1)) {
14776 + tok->operator = OPEN_PAREN;
14777 + paren_count++;
14778 + break;
14779 + }
14780 +
14781 + if ((s = strpbrk(cp+1, "*)"))) {
14782 + char str[128];
14783 +
14784 + len = (uaddr_t)s - (uaddr_t)(cp+1);
14785 + strncpy(str, cp+1, len);
14786 + str[len] = 0;
14787 + if (!is_typestr(str)) {
14788 + set_eval_error(E_BAD_TYPE);
14789 + error_token = tok->ptr;
14790 + free_tokens(tok_head);
14791 + free_tokens(tok);
14792 + return ((token_t*)NULL);
14793 + }
14794 + if (!(s = strpbrk((cp+1), ")"))) {
14795 + set_eval_error(E_OPEN_PAREN);
14796 + error_token = tok->ptr;
14797 + free_tokens(tok_head);
14798 + free_tokens(tok);
14799 + return ((token_t*)NULL);
14800 + }
14801 + len = (uaddr_t)s - (uaddr_t)(cp+1);
14802 + tok->string = (char *)
14803 + kl_alloc_block(len + 1);
14804 + memcpy(tok->string, (cp+1), len);
14805 + tok->string[len] = 0;
14806 + tok->operator = CAST;
14807 + cp = (char *)((uaddr_t)(cp+1) + len);
14808 + break;
14809 + }
14810 + tok->operator = OPEN_PAREN;
14811 + paren_count++;
14812 + break;
14813 + }
14814 +
14815 + case ')' :
14816 + if (tok_last && ((tok_last->operator ==
14817 + RIGHT_ARROW) ||
14818 + (tok_last->operator == DOT))) {
14819 + set_eval_error(E_SYNTAX_ERROR);
14820 + error_token = tok_last->ptr;
14821 + free_tokens(tok_head);
14822 + free_tokens(tok);
14823 + return ((token_t*)NULL);
14824 + }
14825 + tok->operator = CLOSE_PAREN;
14826 + paren_count--;
14827 + break;
14828 +
14829 + case '&' :
14830 + if (*((char*)cp + 1) == '&') {
14831 + tok->operator = LOGICAL_AND;
14832 + cp++;
14833 + } else if (!tok_last || (tok_last &&
14834 + (tok_last->operator &&
14835 + tok_last->operator !=
14836 + CLOSE_PAREN))) {
14837 + tok->operator = ADDRESS;
14838 + } else {
14839 + tok->operator = BITWISE_AND;
14840 + }
14841 + break;
14842 +
14843 + case '|' :
14844 + if (*((char*)cp + 1) == '|') {
14845 + tok->operator = LOGICAL_OR;
14846 + cp++;
14847 + } else {
14848 + tok->operator = BITWISE_OR;
14849 + }
14850 + break;
14851 +
14852 + case '=' :
14853 + if (*((char*)cp + 1) == '=') {
14854 + tok->operator = EQUAL;
14855 + cp++;
14856 + } else {
14857 + /* ASIGNMENT -- NOT IMPLEMENTED
14858 + */
14859 + tok->operator = NOT_YET;
14860 + }
14861 + break;
14862 +
14863 + case '<' :
14864 + if (*((char*)cp + 1) == '<') {
14865 + tok->operator = LEFT_SHIFT;
14866 + cp++;
14867 + } else if (*((char*)cp + 1) == '=') {
14868 + tok->operator = LESS_THAN_OR_EQUAL;
14869 + cp++;
14870 + } else {
14871 + tok->operator = LESS_THAN;
14872 + }
14873 + break;
14874 +
14875 + case '>' :
14876 + if (*((char*)(cp + 1)) == '>') {
14877 + tok->operator = RIGHT_SHIFT;
14878 + cp++;
14879 + } else if (*((char*)cp + 1) == '=') {
14880 + tok->operator = GREATER_THAN_OR_EQUAL;
14881 + cp++;
14882 + } else {
14883 + tok->operator = GREATER_THAN;
14884 + }
14885 + break;
14886 +
14887 + case '!' :
14888 + if (*((char*)cp + 1) == '=') {
14889 + tok->operator = NOT_EQUAL;
14890 + cp++;
14891 + } else {
14892 + tok->operator = LOGICAL_NEGATION;
14893 + }
14894 + break;
14895 +
14896 + case '$' :
14897 + set_eval_error(E_NOT_IMPLEMENTED);
14898 + error_token = tok->ptr;
14899 + free_tokens(tok_head);
14900 + free_tokens(tok);
14901 + return((token_t*)NULL);
14902 + case '~' :
14903 + tok->operator = ONES_COMPLEMENT;
14904 + break;
14905 +
14906 + case '^' :
14907 + tok->operator = BITWISE_EXCLUSIVE_OR;
14908 + break;
14909 +
14910 + case '?' :
14911 + set_eval_error(E_NOT_IMPLEMENTED);
14912 + error_token = tok->ptr;
14913 + free_tokens(tok_head);
14914 + free_tokens(tok);
14915 + return((token_t*)NULL);
14916 + case ':' :
14917 + set_eval_error(E_NOT_IMPLEMENTED);
14918 + error_token = tok->ptr;
14919 + free_tokens(tok_head);
14920 + free_tokens(tok);
14921 + return((token_t*)NULL);
14922 + case '[' :
14923 + tok->operator = OPEN_SQUARE_BRACKET;;
14924 + break;
14925 +
14926 + case ']' :
14927 + tok->operator = CLOSE_SQUARE_BRACKET;;
14928 + break;
14929 +
14930 + default: {
14931 +
14932 + char *s;
14933 + int len;
14934 +
14935 + /* See if the last token is a RIGHT_ARROW
14936 + * or a DOT. If it is, then this token must
14937 + * be the name of a struct/union member.
14938 + */
14939 + if (tok_last &&
14940 + ((tok_last->operator == RIGHT_ARROW) ||
14941 + (tok_last->operator == DOT))) {
14942 + tok->type = MEMBER;
14943 + } else if (process_text(&cp, tok)) {
14944 + free_tokens(tok_head);
14945 + free_tokens(tok);
14946 + return((token_t*)NULL);
14947 + }
14948 + if (tok->type == TEXT) {
14949 + return(tok);
14950 + } else if (tok->type == STRING) {
14951 + if (is_typestr(tok->string)) {
14952 + tok->type = TYPE_DEF;
14953 + } else {
14954 + tok->operator = TEXT;
14955 + return(tok);
14956 + }
14957 + break;
14958 + } else if (tok->type == CHARACTER) {
14959 + break;
14960 + }
14961 +
14962 + /* Check and See if the entire string is
14963 + * a typename (valid only for whatis case).
14964 + */
14965 + s = strpbrk(cp,
14966 + ".\t+-*/()[]|~!$&%^<>?:&=^\"\'");
14967 + if (!s && !tok->type && is_typestr(cp)) {
14968 + tok->type = TYPE_DEF;
14969 + len = strlen(cp) + 1;
14970 + tok->string = (char *)
14971 + kl_alloc_block(len);
14972 + memcpy(tok->string, cp, len - 1);
14973 + tok->string[len - 1] = 0;
14974 + cp = (char *)((uaddr_t)cp + len - 2);
14975 + break;
14976 + }
14977 +
14978 + /* Now check for everything else
14979 + */
14980 + if ((s = strpbrk(cp,
14981 + " .\t+-*/()[]|~!$&%^<>?:&=^\"\'"))) {
14982 + len = (uaddr_t)s - (uaddr_t)cp + 1;
14983 + } else {
14984 + len = strlen(cp) + 1;
14985 + }
14986 +
14987 + tok->string =
14988 + (char *)kl_alloc_block(len);
14989 + memcpy(tok->string, cp, len - 1);
14990 + tok->string[len - 1] = 0;
14991 +
14992 + cp = (char *)((uaddr_t)cp + len - 2);
14993 +
14994 + /* Check to see if this is the keyword
14995 + * "sizeof". If not, then check to see if
14996 + * the string is a member name.
14997 + */
14998 + if (!strcmp(tok->string, "sizeof")) {
14999 + tok->operator = SIZEOF;
15000 + kl_free_block((void *)tok->string);
15001 + tok->string = 0;
15002 + } else if (tok_last &&
15003 + ((tok_last->operator == RIGHT_ARROW) ||
15004 + (tok_last->operator == DOT))) {
15005 + tok->type = MEMBER;
15006 + } else {
15007 + tok->type = STRING;
15008 + }
15009 + break;
15010 + }
15011 + }
15012 + if (!(tok->type)) {
15013 + tok->type = OPERATOR;
15014 + }
15015 + if (!tok_head) {
15016 + tok_head = tok_last = tok;
15017 + } else {
15018 + tok_last->next = tok;
15019 + tok_last = tok;
15020 + }
15021 + cp++;
15022 + }
15023 + if (paren_count < 0) {
15024 + set_eval_error(E_CLOSE_PAREN);
15025 + error_token = tok->ptr;
15026 + free_tokens(tok_head);
15027 + return((token_t*)NULL);
15028 + } else if (paren_count > 0) {
15029 + set_eval_error(E_OPEN_PAREN);
15030 + error_token = tok->ptr;
15031 + free_tokens(tok_head);
15032 + return((token_t*)NULL);
15033 + }
15034 + return(tok_head);
15035 +}
15036 +
15037 +/*
15038 + * valid_binary_args()
15039 + */
15040 +int
15041 +valid_binary_args(node_t *np, node_t *left, node_t *right)
15042 +{
15043 + int op = np->operator;
15044 +
15045 + if ((op == RIGHT_ARROW) || (op == DOT)) {
15046 + if (!left) {
15047 + set_eval_error(E_MISSING_STRUCTURE);
15048 + error_token = np->tok_ptr;
15049 + return(0);
15050 + } else if (!(left->node_type == TYPE_DEF) &&
15051 + !(left->node_type == MEMBER) &&
15052 + !(left->operator == CLOSE_PAREN) &&
15053 + !(left->operator == CLOSE_SQUARE_BRACKET)) {
15054 + set_eval_error(E_BAD_STRUCTURE);
15055 + error_token = left->tok_ptr;
15056 + return(0);
15057 + }
15058 + if (!right || (!(right->node_type == MEMBER))) {
15059 + set_eval_error(E_BAD_MEMBER);
15060 + error_token = np->tok_ptr;
15061 + return(0);
15062 + }
15063 + return(1);
15064 + }
15065 + if (!left || !right) {
15066 + set_eval_error(E_MISSING_OPERAND);
15067 + error_token = np->tok_ptr;
15068 + return(0);
15069 + }
15070 + switch (left->operator) {
15071 + case CLOSE_PAREN:
15072 + case CLOSE_SQUARE_BRACKET:
15073 + break;
15074 + default:
15075 + switch(left->node_type) {
15076 + case NUMBER:
15077 + case STRING:
15078 + case TEXT:
15079 + case CHARACTER:
15080 + case EVAL_VAR:
15081 + case MEMBER:
15082 + break;
15083 + default:
15084 + set_eval_error(E_BAD_OPERAND);
15085 + error_token = np->tok_ptr;
15086 + return(0);
15087 + }
15088 + }
15089 + switch (right->operator) {
15090 + case OPEN_PAREN:
15091 + break;
15092 + default:
15093 + switch(right->node_type) {
15094 + case NUMBER:
15095 + case STRING:
15096 + case TEXT:
15097 + case CHARACTER:
15098 + case EVAL_VAR:
15099 + case MEMBER:
15100 + break;
15101 + default:
15102 + set_eval_error(E_BAD_OPERAND);
15103 + error_token = np->tok_ptr;
15104 + return(0);
15105 + }
15106 + }
15107 + return(1);
15108 +}
15109 +
15110 +/*
15111 + * get_node_list()
15112 + */
15113 +static node_t *
15114 +get_node_list(token_t *tp, int flags)
15115 +{
15116 + node_t *root = (node_t *)NULL;
15117 + node_t *np = (node_t *)NULL;
15118 + node_t *last = (node_t *)NULL;
15119 +
15120 + /* Loop through the tokens and convert them to nodes.
15121 + */
15122 + while (tp) {
15123 + np = make_node(tp, flags);
15124 + if (eval_error) {
15125 + return((node_t *)NULL);
15126 + }
15127 + if (root) {
15128 + last->next = np;
15129 + last = np;
15130 + } else {
15131 + root = last = np;
15132 + }
15133 + tp = tp->next;
15134 + }
15135 + last->next = (node_t *)NULL; /* cpw patch */
15136 + last = (node_t *)NULL;
15137 + for (np = root; np; np = np->next) {
15138 + if (is_binary(np->operator)) {
15139 + if (!valid_binary_args(np, last, np->next)) {
15140 + free_nodelist(root);
15141 + return((node_t *)NULL);
15142 + }
15143 + }
15144 + last = np;
15145 + }
15146 + return(root);
15147 +}
15148 +
15149 +/*
15150 + * next_node()
15151 + */
15152 +static node_t *
15153 +next_node(void)
15154 +{
15155 + node_t *np;
15156 + if ((np = node_list)) {
15157 + node_list = node_list->next;
15158 + np->next = (node_t*)NULL;
15159 + }
15160 + return(np);
15161 +}
15162 +
15163 +/*
15164 + * eval_unary()
15165 + */
15166 +static node_t *
15167 +eval_unary(node_t *curnp, int flags)
15168 +{
15169 + node_t *n0, *n1;
15170 +
15171 + n0 = curnp;
15172 +
15173 + /* Peek ahead and make sure there is a next node.
15174 + * Also check to see if the next node requires
15175 + * a recursive call to do_eval(). If it does, we'll
15176 + * let the do_eval() call take care of pulling it
15177 + * off the list.
15178 + */
15179 + if (!node_list) {
15180 + set_eval_error(E_SYNTAX_ERROR);
15181 + error_token = n0->tok_ptr;
15182 + free_nodes(n0);
15183 + return((node_t*)NULL);
15184 + }
15185 + if (n0->operator == CAST) {
15186 + if (node_list->operator == CLOSE_PAREN) {
15187 +
15188 + /* Free the CLOSE_PAREN and return
15189 + */
15190 + free_node(next_node());
15191 + return(n0);
15192 + }
15193 + if (!(node_list->node_type == NUMBER) &&
15194 + !(node_list->node_type == VADDR) &&
15195 + !((node_list->operator == ADDRESS) ||
15196 + (node_list->operator == CAST) ||
15197 + (node_list->operator == UNARY_MINUS) ||
15198 + (node_list->operator == UNARY_PLUS) ||
15199 + (node_list->operator == INDIRECTION) ||
15200 + (node_list->operator == OPEN_PAREN))) {
15201 + set_eval_error(E_SYNTAX_ERROR);
15202 + error_token = node_list->tok_ptr;
15203 + free_nodes(n0);
15204 + return((node_t*)NULL);
15205 + }
15206 + }
15207 + if ((n0->operator == INDIRECTION) ||
15208 + (n0->operator == ADDRESS) ||
15209 + (n0->operator == OPEN_PAREN) ||
15210 + is_unary(node_list->operator)) {
15211 + n1 = do_eval(flags);
15212 + if (eval_error) {
15213 + free_nodes(n0);
15214 + free_nodes(n1);
15215 + return((node_t*)NULL);
15216 + }
15217 + } else {
15218 + n1 = next_node();
15219 + }
15220 +
15221 + if (n1->operator == OPEN_PAREN) {
15222 + /* Get the value contained within the parenthesis.
15223 + * If there was an error, just return.
15224 + */
15225 + free_node(n1);
15226 + n1 = do_eval(flags);
15227 + if (eval_error) {
15228 + free_nodes(n1);
15229 + free_nodes(n0);
15230 + return((node_t*)NULL);
15231 + }
15232 + }
15233 +
15234 + n0->right = n1;
15235 + if (replace_unary(n0, flags) == -1) {
15236 + if (!eval_error) {
15237 + set_eval_error(E_SYNTAX_ERROR);
15238 + error_token = n0->tok_ptr;
15239 + }
15240 + free_nodes(n0);
15241 + return((node_t*)NULL);
15242 + }
15243 + return(n0);
15244 +}
15245 +
15246 +/*
15247 + * do_eval() -- Reduces an equation to a single value.
15248 + *
15249 + * Any parenthesis (and nested parenthesis) within the equation will
15250 + * be solved first via recursive calls to do_eval().
15251 + */
15252 +static node_t *
15253 +do_eval(int flags)
15254 +{
15255 + node_t *root = (node_t*)NULL, *curnp, *n0, *n1;
15256 +
15257 + /* Loop through the list of nodes until we run out of nodes
15258 + * or we hit a CLOSE_PAREN. If we hit an OPEN_PAREN, make a
15259 + * recursive call to do_eval().
15260 + */
15261 + curnp = next_node();
15262 + while (curnp) {
15263 + n0 = n1 = (node_t *)NULL;
15264 +
15265 + if (curnp->operator == OPEN_PAREN) {
15266 + /* Get the value contained within the parenthesis.
15267 + * If there was an error, just return.
15268 + */
15269 + free_node(curnp);
15270 + n0 = do_eval(flags);
15271 + if (eval_error) {
15272 + free_nodes(n0);
15273 + free_nodes(root);
15274 + return((node_t *)NULL);
15275 + }
15276 +
15277 + } else if (curnp->operator == SIZEOF) {
15278 + /* Free the SIZEOF node and then make a call
15279 + * to the get_sizeof() function (which will
15280 + * get the next node off the list).
15281 + */
15282 + n0 = get_sizeof();
15283 + if (eval_error) {
15284 + if (!error_token) {
15285 + error_token = curnp->tok_ptr;
15286 + }
15287 + free_node(curnp);
15288 + free_nodes(root);
15289 + return((node_t *)NULL);
15290 + }
15291 + free_node(curnp);
15292 + curnp = (node_t *)NULL;
15293 + } else if (is_unary(curnp->operator)) {
15294 + n0 = eval_unary(curnp, flags);
15295 + } else {
15296 + n0 = curnp;
15297 + curnp = (node_t *)NULL;
15298 + }
15299 + if (eval_error) {
15300 + free_nodes(n0);
15301 + free_nodes(root);
15302 + return((node_t *)NULL);
15303 + }
15304 +
15305 + /* n0 should now contain a non-operator node. Check to see if
15306 + * there is a next token. If there isn't, just add the last
15307 + * rchild and return.
15308 + */
15309 + if (!node_list) {
15310 + if (root) {
15311 + add_rchild(root, n0);
15312 + } else {
15313 + root = n0;
15314 + }
15315 + replace(root, flags);
15316 + if (eval_error) {
15317 + free_nodes(root);
15318 + return((node_t *)NULL);
15319 + }
15320 + return(root);
15321 + }
15322 +
15323 + /* Make sure the next token is an operator.
15324 + */
15325 + if (!node_list->operator) {
15326 + free_nodes(root);
15327 + free_node(n0);
15328 + set_eval_error(E_SYNTAX_ERROR);
15329 + error_token = node_list->tok_ptr;
15330 + return((node_t *)NULL);
15331 + } else if ((node_list->operator == CLOSE_PAREN) ||
15332 + (node_list->operator == CLOSE_SQUARE_BRACKET)) {
15333 +
15334 + if (root) {
15335 + add_rchild(root, n0);
15336 + } else {
15337 + root = n0;
15338 + }
15339 +
15340 + /* Reduce the resulting tree to a single value
15341 + */
15342 + replace(root, flags);
15343 + if (eval_error) {
15344 + free_nodes(root);
15345 + return((node_t *)NULL);
15346 + }
15347 +
15348 + /* Step over the CLOSE_PAREN or CLOSE_SQUARE_BRACKET
15349 + * and then return.
15350 + */
15351 + free_node(next_node());
15352 + return(root);
15353 + } else if (node_list->operator == OPEN_SQUARE_BRACKET) {
15354 +next_dimension1:
15355 + /* skip over the OPEN_SQUARE_BRACKET token
15356 + */
15357 + free_node(next_node());
15358 +
15359 + /* Get the value contained within the brackets. This
15360 + * value must represent an array index (value or
15361 + * equation).
15362 + */
15363 + n1 = do_eval(0);
15364 + if (eval_error) {
15365 + free_nodes(root);
15366 + free_node(n0);
15367 + free_node(n1);
15368 + return((node_t *)NULL);
15369 + }
15370 +
15371 + /* Convert the array (or pointer type) to an
15372 + * element type using the index value obtained
15373 + * above. Make sure that n0 contains some sort
15374 + * of type definition first, however.
15375 + */
15376 + if (n0->node_type != TYPE_DEF) {
15377 + set_eval_error(E_BAD_TYPE);
15378 + error_token = n0->tok_ptr;
15379 + free_nodes(n0);
15380 + free_nodes(n1);
15381 + free_nodes(root);
15382 + return((node_t *)NULL);
15383 + }
15384 + array_to_element(n0, n1);
15385 + free_node(n1);
15386 + if (eval_error) {
15387 + free_nodes(root);
15388 + free_nodes(n0);
15389 + return((node_t *)NULL);
15390 + }
15391 +
15392 + /* If there aren't any more nodes, just
15393 + * return.
15394 + */
15395 + if (!node_list) {
15396 + return(n0);
15397 + }
15398 + if (node_list->operator == OPEN_SQUARE_BRACKET) {
15399 + goto next_dimension1;
15400 + }
15401 + } else if (!is_binary(node_list->operator)) {
15402 + set_eval_error(E_BAD_OPERATOR);
15403 + error_token = node_list->tok_ptr;
15404 + free_nodes(root);
15405 + free_nodes(n0);
15406 + return((node_t *)NULL);
15407 + }
15408 +
15409 + /* Now get the operator node
15410 + */
15411 + if (!(n1 = next_node())) {
15412 + set_eval_error(E_SYNTAX_ERROR);
15413 + error_token = n0->tok_ptr;
15414 + free_nodes(n0);
15415 + free_nodes(root);
15416 + return((node_t *)NULL);
15417 + }
15418 +
15419 + /* Check to see if this binary operator is RIGHT_ARROW or DOT.
15420 + * If it is, we need to reduce it to a single value node now.
15421 + */
15422 + while ((n1->operator == RIGHT_ARROW) || (n1->operator == DOT)) {
15423 +
15424 + /* The next node must contain the name of the
15425 + * struct|union member.
15426 + */
15427 + if (!node_list || (node_list->node_type != MEMBER)) {
15428 + set_eval_error(E_BAD_MEMBER);
15429 + error_token = n1->tok_ptr;
15430 + free_nodes(n0);
15431 + free_nodes(n1);
15432 + free_nodes(root);
15433 + return((node_t *)NULL);
15434 + }
15435 + n1->left = n0;
15436 +
15437 + /* Now get the next node and link it as the
15438 + * right child.
15439 + */
15440 + if (!(n0 = next_node())) {
15441 + set_eval_error(E_SYNTAX_ERROR);
15442 + error_token = n1->tok_ptr;
15443 + free_nodes(n1);
15444 + free_nodes(root);
15445 + return((node_t *)NULL);
15446 + }
15447 + n1->right = n0;
15448 + if (!(n0 = replace(n1, flags))) {
15449 + if (!(eval_error)) {
15450 + set_eval_error(E_SYNTAX_ERROR);
15451 + error_token = n1->tok_ptr;
15452 + }
15453 + free_nodes(n1);
15454 + free_nodes(root);
15455 + return((node_t *)NULL);
15456 + }
15457 + n1 = (node_t *)NULL;
15458 +
15459 + /* Check to see if there is a next node. If there
15460 + * is, check to see if it is the operator CLOSE_PAREN.
15461 + * If it is, then return (skipping over the
15462 + * CLOSE_PAREN first).
15463 + */
15464 + if (node_list && ((node_list->operator == CLOSE_PAREN)
15465 + || (node_list->operator ==
15466 + CLOSE_SQUARE_BRACKET))) {
15467 + if (root) {
15468 + add_rchild(root, n0);
15469 + } else {
15470 + root = n0;
15471 + }
15472 +
15473 + /* Reduce the resulting tree to a single
15474 + * value
15475 + */
15476 + replace(root, flags);
15477 + if (eval_error) {
15478 + free_nodes(root);
15479 + return((node_t *)NULL);
15480 + }
15481 +
15482 + /* Advance the token pointer past the
15483 + * CLOSE_PAREN and then return.
15484 + */
15485 + free_node(next_node());
15486 + return(root);
15487 + }
15488 +
15489 + /* Check to see if the next node is an
15490 + * OPEN_SQUARE_BRACKET. If it is, then we have to
15491 + * reduce the contents of the square brackets to
15492 + * an index array.
15493 + */
15494 + if (node_list && (node_list->operator
15495 + == OPEN_SQUARE_BRACKET)) {
15496 +
15497 + /* Advance the token pointer and call
15498 + * do_eval() again.
15499 + */
15500 + free_node(next_node());
15501 +next_dimension2:
15502 + n1 = do_eval(0);
15503 + if (eval_error) {
15504 + free_node(n0);
15505 + free_node(n1);
15506 + free_nodes(root);
15507 + return((node_t *)NULL);
15508 + }
15509 +
15510 + /* Convert the array (or pointer type) to
15511 + * an element type using the index value
15512 + * obtained above. Make sure that n0
15513 + * contains some sort of type definition
15514 + * first, however.
15515 + */
15516 + if (n0->node_type != TYPE_DEF) {
15517 + set_eval_error(E_BAD_TYPE);
15518 + error_token = n0->tok_ptr;
15519 + free_node(n0);
15520 + free_node(n1);
15521 + free_node(root);
15522 + return((node_t *)NULL);
15523 + }
15524 + array_to_element(n0, n1);
15525 + free_node(n1);
15526 + if (eval_error) {
15527 + free_node(n0);
15528 + free_node(root);
15529 + return((node_t *)NULL);
15530 + }
15531 + }
15532 +
15533 + /* Now get the next operator node (if there is one).
15534 + */
15535 + if (!node_list) {
15536 + if (root) {
15537 + add_rchild(root, n0);
15538 + } else {
15539 + root = n0;
15540 + }
15541 + return(root);
15542 + }
15543 + n1 = next_node();
15544 + if (n1->operator == OPEN_SQUARE_BRACKET) {
15545 + goto next_dimension2;
15546 + }
15547 + }
15548 +
15549 + if (n1 && ((n1->operator == CLOSE_PAREN) ||
15550 + (n1->operator == CLOSE_SQUARE_BRACKET))) {
15551 + free_node(n1);
15552 + if (root) {
15553 + add_rchild(root, n0);
15554 + } else {
15555 + root = n0;
15556 + }
15557 + replace(root, flags);
15558 + if (eval_error) {
15559 + free_nodes(root);
15560 + return((node_t *)NULL);
15561 + }
15562 + return(root);
15563 + }
15564 +
15565 + if (!root) {
15566 + root = n1;
15567 + n1->left = n0;
15568 + } else if (precedence(root->operator)
15569 + >= precedence(n1->operator)) {
15570 + add_rchild(root, n0);
15571 + n1->left = root;
15572 + root = n1;
15573 + } else {
15574 + if (!root->right) {
15575 + n1->left = n0;
15576 + root->right = n1;
15577 + } else {
15578 + add_rchild(root, n0);
15579 + n1->left = root->right;
15580 + root->right = n1;
15581 + }
15582 + }
15583 + curnp = next_node();
15584 + } /* while(curnp) */
15585 + return(root);
15586 +}
15587 +
15588 +/*
15589 + * is_unary()
15590 + */
15591 +static int
15592 +is_unary(int op)
15593 +{
15594 + switch (op) {
15595 + case LOGICAL_NEGATION :
15596 + case ADDRESS :
15597 + case INDIRECTION :
15598 + case UNARY_MINUS :
15599 + case UNARY_PLUS :
15600 + case ONES_COMPLEMENT :
15601 + case CAST :
15602 + return(1);
15603 +
15604 + default :
15605 + return(0);
15606 + }
15607 +}
15608 +
15609 +
15610 +/*
15611 + * is_binary()
15612 + */
15613 +static int
15614 +is_binary(int op)
15615 +{
15616 + switch (op) {
15617 +
15618 + case BITWISE_OR :
15619 + case BITWISE_EXCLUSIVE_OR :
15620 + case BITWISE_AND :
15621 + case RIGHT_SHIFT :
15622 + case LEFT_SHIFT :
15623 + case ADD :
15624 + case SUBTRACT :
15625 + case MULTIPLY :
15626 + case DIVIDE :
15627 + case MODULUS :
15628 + case LOGICAL_OR :
15629 + case LOGICAL_AND :
15630 + case EQUAL :
15631 + case NOT_EQUAL :
15632 + case LESS_THAN :
15633 + case GREATER_THAN :
15634 + case LESS_THAN_OR_EQUAL :
15635 + case GREATER_THAN_OR_EQUAL :
15636 + case RIGHT_ARROW :
15637 + case DOT :
15638 + return(1);
15639 +
15640 + default :
15641 + return(0);
15642 + }
15643 +}
15644 +
15645 +/*
15646 + * precedence()
15647 + */
15648 +static int
15649 +precedence(int a)
15650 +{
15651 + if ((a >= CONDITIONAL) && (a <= CONDITIONAL_ELSE)) {
15652 + return(1);
15653 + } else if (a == LOGICAL_OR) {
15654 + return(2);
15655 + } else if (a == LOGICAL_AND) {
15656 + return(3);
15657 + } else if (a == BITWISE_OR) {
15658 + return(4);
15659 + } else if (a == BITWISE_EXCLUSIVE_OR) {
15660 + return(5);
15661 + } else if (a == BITWISE_AND) {
15662 + return(6);
15663 + } else if ((a >= EQUAL) && (a <= NOT_EQUAL)) {
15664 + return(7);
15665 + } else if ((a >= LESS_THAN) && (a <= GREATER_THAN_OR_EQUAL)) {
15666 + return(8);
15667 + } else if ((a >= RIGHT_SHIFT) && (a <= LEFT_SHIFT)) {
15668 + return(9);
15669 + } else if ((a >= ADD) && (a <= SUBTRACT)) {
15670 + return(10);
15671 + } else if ((a >= MULTIPLY) && (a <= MODULUS)) {
15672 + return(11);
15673 + } else if ((a >= LOGICAL_NEGATION) && (a <= SIZEOF)) {
15674 + return(12);
15675 + } else if ((a >= RIGHT_ARROW) && (a <= DOT)) {
15676 + return(13);
15677 + } else {
15678 + return(0);
15679 + }
15680 +}
15681 +
15682 +/*
15683 + * esc_char()
15684 + */
15685 +char
15686 +esc_char(char *str)
15687 +{
15688 + long int val;
15689 + unsigned long uval;
15690 + char ch;
15691 +
15692 + if (strlen(str) > 1) {
15693 + uval = kl_strtoull(str, (char **)NULL, 8);
15694 + val = uval;
15695 + ch = (char)val;
15696 + } else {
15697 + ch = str[0];
15698 + }
15699 + switch (ch) {
15700 + case 'a' :
15701 + return((char)7);
15702 + case 'b' :
15703 + return((char)8);
15704 + case 't' :
15705 + return((char)9);
15706 + case 'n' :
15707 + return((char)10);
15708 + case 'f' :
15709 + return((char)12);
15710 + case 'r' :
15711 + return((char)13);
15712 + case 'e' :
15713 + return((char)27);
15714 + default:
15715 + return(ch);
15716 + }
15717 +}
15718 +
15719 +/*
15720 + * make_node()
15721 + */
15722 +static node_t *
15723 +make_node(token_t *t, int flags)
15724 +{
15725 + node_t *np;
15726 +
15727 + set_eval_error(0);
15728 + np = (node_t*)kl_alloc_block(sizeof(*np));
15729 +
15730 + if (t->type == OPERATOR) {
15731 +
15732 + /* Check to see if this token represents a typecast
15733 + */
15734 + if (t->operator == CAST) {
15735 + type_t *tp;
15736 +
15737 + if (!(np->type = get_type(t->string, flags))) {
15738 + set_eval_error(E_BAD_CAST);
15739 + error_token = t->ptr;
15740 + free_nodes(np);
15741 + return((node_t*)NULL);
15742 + }
15743 +
15744 + /* Determin if this is a pointer to a type
15745 + */
15746 + tp = np->type;
15747 + if (tp->flag == POINTER_FLAG) {
15748 + np->flags = POINTER_FLAG;
15749 + tp = tp->t_next;
15750 + while (tp->flag == POINTER_FLAG) {
15751 + tp = tp->t_next;
15752 + }
15753 + }
15754 + switch(tp->flag) {
15755 + case KLTYPE_FLAG:
15756 + np->flags |= KLTYPE_FLAG;
15757 + break;
15758 +
15759 + default:
15760 + free_nodes(np);
15761 + set_eval_error(E_BAD_CAST);
15762 + error_token = t->ptr;
15763 + return((node_t*)NULL);
15764 + }
15765 + if (!t->next) {
15766 + if (flags & C_WHATIS) {
15767 + np->node_type = TYPE_DEF;
15768 + } else {
15769 + set_eval_error(E_BAD_CAST);
15770 + error_token = t->ptr;
15771 + return((node_t*)NULL);
15772 + }
15773 + } else {
15774 + np->node_type = OPERATOR;
15775 + np->operator = CAST;
15776 + }
15777 + } else {
15778 + np->node_type = OPERATOR;
15779 + np->operator = t->operator;
15780 + }
15781 + } else if (t->type == MEMBER) {
15782 + np->name = (char *)dup_block((void *)t->string, strlen(t->string)+1);
15783 + np->node_type = MEMBER;
15784 + } else if ((t->type == STRING) || (t->type == TYPE_DEF)) {
15785 + syment_t *sp;
15786 + dbg_sym_t *stp;
15787 + dbg_type_t *sttp;
15788 +
15789 + if ((sp = kl_lkup_symname(t->string))) {
15790 + if (!(flags & C_NOVARS)) {
15791 + int has_type = 0;
15792 +
15793 + /* The string is a symbol name. We'll treat it as
15794 + * a global kernel variable and, at least, gather in
15795 + * the address of the symbol and the value it points
15796 + * to.
15797 + */
15798 + np->address = sp->s_addr;
15799 + np->flags |= ADDRESS_FLAG;
15800 + np->name = t->string;
15801 + t->string = (char*)NULL;
15802 +
15803 + /* Need to see if there is type information available
15804 + * for this variable. Since this mapping is not
15805 + * available yet, we will just attach a type struct
15806 + * for either uint32_t or uint64_t (depending on the
15807 + * size of a kernel pointer). That will at least let
15808 + * us do something and will prevent the scenario where
15809 + * we have a type node with out a pointer to a type
15810 + * struct!
15811 + */
15812 + np->node_type = TYPE_DEF;
15813 + np->flags |= KLTYPE_FLAG;
15814 + np->value = *((kaddr_t *)np->address);
15815 + /* try to get the actual type info for the variable */
15816 + if(((stp = dbg_find_sym(sp->s_name, DBG_VAR,
15817 + (uint64_t)0)) != NULL)){
15818 + if((sttp = (dbg_type_t *)
15819 + kl_find_typenum(stp->sym_typenum))
15820 + != NULL){
15821 + /* kl_get_typestring(sttp); */
15822 + has_type = 1;
15823 + if(sttp->st_klt.kl_type == KLT_POINTER){
15824 + np->flags ^= KLTYPE_FLAG;
15825 + np->flags |= POINTER_FLAG;
15826 + np->type =
15827 + get_type(sttp->st_typestr,
15828 + flags);
15829 + } else {
15830 + np->type =
15831 + kl_alloc_block(sizeof(type_t));
15832 + np->type->un.kltp =
15833 + &sttp->st_klt;
15834 + }
15835 + }
15836 + }
15837 + /* no type info for the variable found */
15838 + if(!has_type){
15839 + if (ptrsz64) {
15840 + np->type = get_type("uint64_t", flags);
15841 + } else {
15842 + np->type = get_type("uint32_t", flags);
15843 + }
15844 + }
15845 + }
15846 + kl_free_block((void *)sp);
15847 + } else if (flags & (C_WHATIS|C_SIZEOF)) {
15848 +
15849 + kltype_t *kltp;
15850 +
15851 + if ((kltp = kl_find_type(t->string, KLT_TYPES))) {
15852 +
15853 + np->node_type = TYPE_DEF;
15854 + np->flags = KLTYPE_FLAG;
15855 + np->type = (type_t*)
15856 + kl_alloc_block(sizeof(type_t));
15857 + np->type->flag = KLTYPE_FLAG;
15858 + np->type->t_kltp = kltp;
15859 + } else {
15860 + if (get_value(t->string,
15861 + (uint64_t *)&np->value)) {
15862 + set_eval_error(E_BAD_VALUE);
15863 + error_token = t->ptr;
15864 + free_nodes(np);
15865 + return((node_t*)NULL);
15866 + }
15867 + if (!strncmp(t->string, "0x", 2) ||
15868 + !strncmp(t->string, "0X", 2)) {
15869 + np->flags |= UNSIGNED_FLAG;
15870 + }
15871 + np->node_type = NUMBER;
15872 + }
15873 + np->tok_ptr = t->ptr;
15874 + return(np);
15875 + } else {
15876 + if (get_value(t->string, (uint64_t *)&np->value)) {
15877 + set_eval_error(E_BAD_VALUE);
15878 + error_token = t->ptr;
15879 + free_nodes(np);
15880 + return((node_t*)NULL);
15881 + }
15882 + if (np->value > 0xffffffff) {
15883 + np->byte_size = 8;
15884 + } else {
15885 + np->byte_size = 4;
15886 + }
15887 + if (!strncmp(t->string, "0x", 2) ||
15888 + !strncmp(t->string, "0X", 2)) {
15889 + np->flags |= UNSIGNED_FLAG;
15890 + }
15891 + np->node_type = NUMBER;
15892 + }
15893 + } else if (t->type == CHARACTER) {
15894 + char *cp;
15895 +
15896 + /* Step over the single quote
15897 + */
15898 + cp = (t->ptr + 1);
15899 + if (*cp == '\\') {
15900 + int i = 0;
15901 + char str[16];
15902 +
15903 + /* Step over the back slash
15904 + */
15905 + cp++;
15906 + while (*cp != '\'') {
15907 + str[i++] = *cp++;
15908 + }
15909 + str[i] = 0;
15910 + np->value = esc_char(str);
15911 + } else {
15912 + np->value = *cp;
15913 + }
15914 + np->type = get_type("char", flags);
15915 + np->node_type = TYPE_DEF;
15916 + np->flags |= KLTYPE_FLAG;
15917 + } else if (t->type == TEXT) {
15918 + np->node_type = TEXT;
15919 + np->name = t->string;
15920 + /* So the block doesn't get freed twice */
15921 + t->string = (char*)NULL;
15922 + } else {
15923 + set_eval_error(E_SYNTAX_ERROR);
15924 + error_token = t->ptr;
15925 + return((node_t*)NULL);
15926 + }
15927 + np->tok_ptr = t->ptr;
15928 + return(np);
15929 +}
15930 +
15931 +/*
15932 + * add_node()
15933 + */
15934 +static int
15935 +add_node(node_t *root, node_t *new_node)
15936 +{
15937 + node_t *n = root;
15938 +
15939 + /* Find the most lower-right node
15940 + */
15941 + while (n->right) {
15942 + n = n->right;
15943 + }
15944 +
15945 + /* If the node we found is a leaf node, return an error (we will
15946 + * have to insert the node instead).
15947 + */
15948 + if (n->node_type == NUMBER) {
15949 + return(-1);
15950 + } else {
15951 + n->right = new_node;
15952 + }
15953 + return(0);
15954 +}
15955 +
15956 +/*
15957 + * add_rchild()
15958 + */
15959 +static int
15960 +add_rchild(node_t *root, node_t *new_node)
15961 +{
15962 + if (add_node(root, new_node) == -1) {
15963 + return(-1);
15964 + }
15965 + return(0);
15966 +}
15967 +
15968 +/*
15969 + * free_type()
15970 + */
15971 +static void
15972 +free_type(type_t *head)
15973 +{
15974 + type_t *t0, *t1;
15975 +
15976 + t0 = head;
15977 + while(t0) {
15978 + if (t0->flag == POINTER_FLAG) {
15979 + t1 = t0->t_next;
15980 + kl_free_block((void *)t0);
15981 + t0 = t1;
15982 + } else {
15983 + if (t0->flag != KLTYPE_FLAG) {
15984 + kl_free_block((void *)t0->t_kltp);
15985 + }
15986 + kl_free_block((void *)t0);
15987 + t0 = (type_t *)NULL;
15988 + }
15989 + }
15990 + return;
15991 +}
15992 +
15993 +/*
15994 + * get_type() -- Convert a typecast string into a type.
15995 + *
15996 + * Returns a pointer to a struct containing type information.
15997 + * The type of struct returned is indicated by the contents
15998 + * of type. If the typecast contains an asterisk, set ptr_type
15999 + * equal to one, otherwise set it equal to zero.
16000 + */
16001 +static type_t *
16002 +get_type(char *s, int flags)
16003 +{
16004 + int len, type = 0;
16005 + char *cp, typename[128];
16006 + type_t *t, *head, *last;
16007 + kltype_t *kltp;
16008 +
16009 + head = last = (type_t *)NULL;
16010 +
16011 + /* Get the type string
16012 + */
16013 + if (!strncmp(s, "struct", 6)) {
16014 + if ((cp = strpbrk(s + 7, " \t*"))) {
16015 + len = cp - (s + 7);
16016 + } else {
16017 + len = strlen(s + 7);
16018 + }
16019 + memcpy(typename, s + 7, len);
16020 + } else if (!strncmp(s, "union", 5)) {
16021 + if ((cp = strpbrk(s + 6, " \t*"))) {
16022 + len = cp - (s + 6);
16023 + } else {
16024 + len = strlen(s + 6);
16025 + }
16026 + memcpy(typename, s + 6, len);
16027 + } else {
16028 + if ((cp = strpbrk(s, "*)"))) {
16029 + len = cp - s;
16030 + } else {
16031 + len = strlen(s);
16032 + }
16033 + memcpy(typename, s, len);
16034 + }
16035 +
16036 + /* Strip off any trailing spaces
16037 + */
16038 + while (len && ((typename[len - 1] == ' ') ||
16039 + (typename[len - 1] == '\t'))) {
16040 + len--;
16041 + }
16042 + typename[len] = 0;
16043 +
16044 + if (!(kltp = kl_find_type(typename, KLT_TYPES))) {
16045 + return ((type_t *)NULL);
16046 + }
16047 + type = KLTYPE_FLAG;
16048 +
16049 + /* check to see if this cast is a pointer to a type, a pointer
16050 + * to a pointer to a type, etc.
16051 + */
16052 + cp = s;
16053 + while ((cp = strpbrk(cp, "*"))) {
16054 + t = (type_t *)kl_alloc_block(sizeof(type_t));
16055 + t->flag = POINTER_FLAG;
16056 + if (last) {
16057 + last->t_next = t;
16058 + last = t;
16059 + } else {
16060 + head = last = t;
16061 + }
16062 + cp++;
16063 + }
16064 +
16065 + /* Allocate a type block that will point to the type specific
16066 + * record.
16067 + */
16068 + t = (type_t *)kl_alloc_block(sizeof(type_t));
16069 + t->flag = type;
16070 +
16071 + switch (t->flag) {
16072 +
16073 + case KLTYPE_FLAG:
16074 + t->t_kltp = kltp;
16075 + break;
16076 +
16077 + default:
16078 + free_type(head);
16079 + return((type_t*)NULL);
16080 + }
16081 + if (last) {
16082 + last->t_next = t;
16083 + } else {
16084 + head = t;
16085 + }
16086 + return(head);
16087 +}
16088 +
16089 +/*
16090 + * free_node()
16091 + */
16092 +static void
16093 +free_node(node_t *np)
16094 +{
16095 + /* If there is nothing to free, just return.
16096 + */
16097 + if (!np) {
16098 + return;
16099 + }
16100 + if (np->name) {
16101 + kl_free_block((void *)np->name);
16102 + }
16103 + free_type(np->type);
16104 + kl_free_block((void *)np);
16105 +}
16106 +
16107 +/*
16108 + * free_nodes()
16109 + */
16110 +void
16111 +free_nodes(node_t *np)
16112 +{
16113 + node_t *q;
16114 +
16115 + /* If there is nothing to free, just return.
16116 + */
16117 + if (!np) {
16118 + return;
16119 + }
16120 + if ((q = np->left)) {
16121 + free_nodes(q);
16122 + }
16123 + if ((q = np->right)) {
16124 + free_nodes(q);
16125 + }
16126 + if (np->name) {
16127 + kl_free_block((void *)np->name);
16128 + }
16129 + free_type(np->type);
16130 + kl_free_block((void *)np);
16131 +}
16132 +
16133 +/*
16134 + * free_nodelist()
16135 + */
16136 +static void
16137 +free_nodelist(node_t *np)
16138 +{
16139 + node_t *nnp;
16140 +
16141 + while(np) {
16142 + nnp = np->next;
16143 + free_node(np);
16144 + np = nnp;
16145 + }
16146 +}
16147 +
16148 +extern int alloc_debug;
16149 +
16150 +/*
16151 + * free_eval_memory()
16152 + */
16153 +void
16154 +free_eval_memory(void)
16155 +{
16156 + free_nodelist(node_list);
16157 + node_list = (node_t*)NULL;
16158 +}
16159 +
16160 +/*
16161 + * get_sizeof()
16162 + */
16163 +static node_t *
16164 +get_sizeof()
16165 +{
16166 + node_t *curnp, *n0 = NULL;
16167 +
16168 + if (!(curnp = next_node())) {
16169 + set_eval_error(E_SYNTAX_ERROR);
16170 + return((node_t*)NULL);
16171 + }
16172 +
16173 + /* The next token should be a CAST or an open paren.
16174 + * If it's something else, then return an error.
16175 + */
16176 + if (curnp->operator == OPEN_PAREN) {
16177 + free_nodes(curnp);
16178 + n0 = do_eval(C_SIZEOF);
16179 + if (eval_error) {
16180 + error_token = n0->tok_ptr;
16181 + free_nodes(n0);
16182 + return((node_t*)NULL);
16183 + }
16184 + } else if (curnp->operator == CAST) {
16185 + n0 = curnp;
16186 + } else {
16187 + set_eval_error(E_BAD_TYPE);
16188 + error_token = n0->tok_ptr;
16189 + free_nodes(n0);
16190 + return((node_t*)NULL);
16191 + }
16192 +
16193 + if (!n0->type) {
16194 + set_eval_error(E_NOTYPE);
16195 + error_token = n0->tok_ptr;
16196 + free_nodes(n0);
16197 + return((node_t*)NULL);
16198 + }
16199 +
16200 + if (n0->type->flag & POINTER_FLAG) {
16201 + n0->value = sizeof(void *);
16202 + } else if (n0->type->flag & KLTYPE_FLAG) {
16203 + kltype_t *kltp;
16204 +
16205 + kltp = kl_realtype(n0->type->t_kltp, 0);
16206 +
16207 + if (kltp->kl_bit_size) {
16208 + n0->value = kltp->kl_bit_size / 8;
16209 + if (kltp->kl_bit_size % 8) {
16210 + n0->value += 1;
16211 + }
16212 + } else {
16213 + n0->value = kltp->kl_size;
16214 + }
16215 + } else {
16216 + set_eval_error(E_BAD_TYPE);
16217 + error_token = n0->tok_ptr;
16218 + free_nodes(n0);
16219 + return((node_t*)NULL);
16220 + }
16221 + n0->node_type = NUMBER;
16222 + n0->flags = 0;
16223 + n0->operator = 0;
16224 + n0->byte_size = 0;
16225 + n0->address = 0;
16226 + if (n0->type) {
16227 + free_type(n0->type);
16228 + n0->type = 0;
16229 + }
16230 + return(n0);
16231 +}
16232 +
16233 +/*
16234 + * apply_unary()
16235 + */
16236 +static int
16237 +apply_unary(node_t *n, uint64_t *value)
16238 +{
16239 + if (!n || !n->right) {
16240 + return(-1);
16241 + }
16242 +
16243 + switch (n->operator) {
16244 +
16245 + case UNARY_MINUS :
16246 + *value = (0 - n->right->value);
16247 + break;
16248 +
16249 + case UNARY_PLUS :
16250 + *value = (n->right->value);
16251 + break;
16252 +
16253 + case ONES_COMPLEMENT :
16254 + *value = ~(n->right->value);
16255 + break;
16256 +
16257 + case LOGICAL_NEGATION :
16258 + if (n->right->value) {
16259 + *value = 0;
16260 + } else {
16261 + *value = 1;
16262 + }
16263 + logical_flag++;
16264 + break;
16265 +
16266 + default :
16267 + break;
16268 + }
16269 + return(0);
16270 +}
16271 +
16272 +/*
16273 + * pointer_math()
16274 + */
16275 +static int
16276 +pointer_math(node_t *np, uint64_t *value, int type, int flags)
16277 +{
16278 + int size;
16279 + uint64_t lvalue, rvalue;
16280 + type_t *tp = NULL, *tp1;
16281 +
16282 + if (type < 0) {
16283 + if (np->left->flags & POINTER_FLAG) {
16284 +
16285 + /* Since we only allow pointer math,
16286 + * anything other than a pointer causes
16287 + * failure.
16288 + */
16289 + tp = (type_t*)np->left->type;
16290 + if (tp->flag != POINTER_FLAG) {
16291 + set_eval_error(E_SYNTAX_ERROR);
16292 + error_token = np->left->tok_ptr;
16293 + return(-1);
16294 + }
16295 +
16296 + tp = tp->t_next;
16297 +
16298 + switch (tp->flag) {
16299 +
16300 + case POINTER_FLAG :
16301 + size = sizeof(void *);
16302 + break;
16303 +
16304 + case KLTYPE_FLAG : {
16305 + /* Get the size of the real type,
16306 + * not just the size of a pointer
16307 + * If there isn't any type info,
16308 + * then just set size equal to the
16309 + * size of a pointer.
16310 + */
16311 + kltype_t *kltp, *rkltp;
16312 +
16313 + kltp = tp->t_kltp;
16314 + rkltp = kl_realtype(kltp, 0);
16315 + if (!(size = rkltp->kl_size)) {
16316 + if (kltp != rkltp) {
16317 + size = kltp->kl_size;
16318 + } else {
16319 + size = sizeof(void *);
16320 + }
16321 + }
16322 + break;
16323 + }
16324 +
16325 + default :
16326 + set_eval_error(E_SYNTAX_ERROR);
16327 + error_token = np->left->tok_ptr;
16328 + return(-1);
16329 + }
16330 + lvalue = np->left->value;
16331 + } else {
16332 + size = sizeof(void *);
16333 + lvalue = np->left->address;
16334 + }
16335 + switch (np->operator) {
16336 + case ADD :
16337 + *value = lvalue + (np->right->value * size);
16338 + break;
16339 +
16340 + case SUBTRACT :
16341 + *value = lvalue - (np->right->value * size);
16342 + break;
16343 +
16344 + default :
16345 + set_eval_error(E_BAD_OPERATOR);
16346 + error_token = np->tok_ptr;
16347 + return(-1);
16348 + }
16349 + } else if (type > 0) {
16350 + if (np->right->flags & POINTER_FLAG) {
16351 +
16352 + /* Since we only allow pointer math,
16353 + * anything other than a pointer causes
16354 + * failure.
16355 + */
16356 + tp = (type_t*)np->right->type;
16357 + if (tp->flag != POINTER_FLAG) {
16358 + set_eval_error(E_SYNTAX_ERROR);
16359 + error_token = np->right->tok_ptr;
16360 + return(-1);
16361 + }
16362 +
16363 + tp = tp->t_next;
16364 +
16365 + switch (tp->flag) {
16366 +
16367 + case POINTER_FLAG :
16368 + size = sizeof(void *);
16369 + break;
16370 +
16371 + case KLTYPE_FLAG :
16372 + size = tp->t_kltp->kl_size;
16373 + break;
16374 +
16375 + default :
16376 + set_eval_error(E_SYNTAX_ERROR);
16377 + error_token = np->right->tok_ptr;
16378 + return(-1);
16379 + }
16380 + rvalue = np->right->value;
16381 + } else {
16382 + size = sizeof(void *);
16383 + rvalue = np->right->address;
16384 + }
16385 + switch (np->operator) {
16386 + case ADD :
16387 + *value = rvalue + (np->left->value * size);
16388 + break;
16389 +
16390 + case SUBTRACT :
16391 + *value = rvalue - (np->left->value * size);
16392 + break;
16393 +
16394 + default :
16395 + set_eval_error(E_BAD_OPERATOR);
16396 + error_token = np->tok_ptr;
16397 + return(-1);
16398 + }
16399 + } else {
16400 + return(-1);
16401 + }
16402 + tp1 = (type_t *)kl_alloc_block(sizeof(type_t));
16403 + tp1->flag = POINTER_FLAG;
16404 + np->type = tp1;
16405 + while (tp->flag == POINTER_FLAG) {
16406 + tp1->t_next = (type_t *)kl_alloc_block(sizeof(type_t));
16407 + tp1->flag = POINTER_FLAG;
16408 + tp1 = tp1->t_next;
16409 + tp = tp->t_next;
16410 + }
16411 + if (tp) {
16412 + tp1->t_next = (type_t *)kl_alloc_block(sizeof(type_t));
16413 + tp1 = tp1->t_next;
16414 + tp1->flag = KLTYPE_FLAG;
16415 + tp1->t_kltp = tp->t_kltp;
16416 + if (type < 0) {
16417 + if (np->left->flags & POINTER_FLAG) {
16418 + np->flags |= POINTER_FLAG;
16419 + } else {
16420 + np->flags |= VADDR;
16421 + }
16422 + } else {
16423 + if (np->right->flags & POINTER_FLAG) {
16424 + np->flags |= POINTER_FLAG;
16425 + } else {
16426 + np->flags |= VADDR;
16427 + }
16428 + }
16429 + }
16430 + return(0);
16431 +}
16432 +
16433 +/*
16434 + * check_unsigned()
16435 + */
16436 +int
16437 +check_unsigned(node_t *np)
16438 +{
16439 + kltype_t *kltp, *rkltp;
16440 +
16441 + if (np->flags & UNSIGNED_FLAG) {
16442 + return(1);
16443 + }
16444 + if (!np->type) {
16445 + return(0);
16446 + }
16447 + if (np->type->flag == POINTER_FLAG) {
16448 + return(0);
16449 + }
16450 + kltp = np->type->t_kltp;
16451 + if ((rkltp = kl_realtype(kltp, 0))) {
16452 + if (rkltp->kl_encoding == ENC_UNSIGNED) {
16453 + np->flags |= UNSIGNED_FLAG;
16454 + return(1);
16455 + }
16456 + }
16457 + return(0);
16458 +}
16459 +
16460 +/*
16461 + * apply()
16462 + */
16463 +static int
16464 +apply(node_t *np, uint64_t *value, int flags)
16465 +{
16466 + int ltype, rtype, do_signed = 0;
16467 +
16468 + /* There must be two operands
16469 + */
16470 + if (!np->right || !np->left) {
16471 + set_eval_error(E_MISSING_OPERAND);
16472 + error_token = np->tok_ptr;
16473 + return(-1);
16474 + }
16475 +
16476 + if (np->right->node_type == OPERATOR) {
16477 + replace(np->right, flags);
16478 + if (eval_error) {
16479 + return(-1);
16480 + }
16481 + }
16482 +
16483 + ltype = np->left->node_type;
16484 + rtype = np->right->node_type;
16485 + if ((ltype == TYPE_DEF) || (ltype == VADDR)) {
16486 + if ((rtype == TYPE_DEF) || (rtype == VADDR)) {
16487 + set_eval_error(E_NO_VALUE);
16488 + error_token = np->tok_ptr;
16489 + return(-1);
16490 + }
16491 + if (check_unsigned(np->left)) {
16492 + np->flags |= UNSIGNED_FLAG;
16493 + } else {
16494 + do_signed++;
16495 + }
16496 + if (!type_to_number(np->left)) {
16497 + return(pointer_math(np, value, -1, flags));
16498 + }
16499 + np->byte_size = np->left->byte_size;
16500 + } else if ((rtype == TYPE_DEF) || (rtype == VADDR)) {
16501 + if ((ltype == TYPE_DEF) || (ltype == VADDR)) {
16502 + error_token = np->tok_ptr;
16503 + set_eval_error(E_NO_VALUE);
16504 + return(-1);
16505 + }
16506 + if (check_unsigned(np->right)) {
16507 + np->flags |= UNSIGNED_FLAG;
16508 + } else {
16509 + do_signed++;
16510 + }
16511 + if (!type_to_number(np->right)) {
16512 + return(pointer_math(np, value, 1, flags));
16513 + }
16514 + np->byte_size = np->right->byte_size;
16515 + } else if ((np->left->flags & UNSIGNED_FLAG) ||
16516 + (np->right->flags & UNSIGNED_FLAG)) {
16517 + np->flags |= UNSIGNED_FLAG;
16518 + } else {
16519 + do_signed++;
16520 + }
16521 +
16522 + if (do_signed) {
16523 + switch (np->operator) {
16524 + case ADD :
16525 + *value = (int64_t)np->left->value +
16526 + (int64_t)np->right->value;
16527 + break;
16528 +
16529 + case SUBTRACT :
16530 + *value = (int64_t)np->left->value -
16531 + (int64_t)np->right->value;
16532 + break;
16533 +
16534 + case MULTIPLY :
16535 + *value = (int64_t)np->left->value *
16536 + (int64_t)np->right->value;
16537 + break;
16538 +
16539 + case DIVIDE :
16540 + if ((int64_t)np->right->value == 0) {
16541 + set_eval_error(E_DIVIDE_BY_ZERO);
16542 + error_token = np->right->tok_ptr;
16543 + return(-1);
16544 + }
16545 + *value = (int64_t)np->left->value /
16546 + (int64_t)np->right->value;
16547 + break;
16548 +
16549 + case BITWISE_OR :
16550 + *value = (int64_t)np->left->value |
16551 + (int64_t)np->right->value;
16552 + break;
16553 +
16554 + case BITWISE_AND :
16555 + *value = (int64_t)np->left->value &
16556 + (int64_t)np->right->value;
16557 + break;
16558 +
16559 + case MODULUS :
16560 + if ((int64_t)np->right->value == 0) {
16561 + set_eval_error(E_DIVIDE_BY_ZERO);
16562 + error_token = np->right->tok_ptr;
16563 + return(-1);
16564 + }
16565 + *value = (int64_t)np->left->value %
16566 + (int64_t)np->right->value;
16567 + break;
16568 +
16569 + case RIGHT_SHIFT :
16570 + *value =
16571 + (int64_t)np->left->value >>
16572 + (int64_t)np->right->value;
16573 + break;
16574 +
16575 + case LEFT_SHIFT :
16576 + *value =
16577 + (int64_t)np->left->value <<
16578 + (int64_t)np->right->value;
16579 + break;
16580 +
16581 + case LOGICAL_OR :
16582 + if ((int64_t)np->left->value ||
16583 + (int64_t)np->right->value) {
16584 + *value = 1;
16585 + } else {
16586 + *value = 0;
16587 + }
16588 + logical_flag++;
16589 + break;
16590 +
16591 + case LOGICAL_AND :
16592 + if ((int64_t)np->left->value &&
16593 + (int64_t)np->right->value) {
16594 + *value = 1;
16595 + } else {
16596 + *value = 0;
16597 + }
16598 + logical_flag++;
16599 + break;
16600 +
16601 + case EQUAL :
16602 + if ((int64_t)np->left->value ==
16603 + (int64_t)np->right->value) {
16604 + *value = 1;
16605 + } else {
16606 + *value = 0;
16607 + }
16608 + logical_flag++;
16609 + break;
16610 +
16611 + case NOT_EQUAL :
16612 + if ((int64_t)np->left->value !=
16613 + (int64_t)np->right->value) {
16614 + *value = 1;
16615 + } else {
16616 + *value = 0;
16617 + }
16618 + logical_flag++;
16619 + break;
16620 +
16621 + case LESS_THAN :
16622 + if ((int64_t)np->left->value <
16623 + (int64_t)np->right->value) {
16624 + *value = 1;
16625 + } else {
16626 + *value = 0;
16627 + }
16628 + logical_flag++;
16629 + break;
16630 +
16631 + case GREATER_THAN :
16632 + if ((int64_t)np->left->value >
16633 + (int64_t)np->right->value) {
16634 + *value = 1;
16635 + } else {
16636 + *value = 0;
16637 + }
16638 + logical_flag++;
16639 + break;
16640 +
16641 + case LESS_THAN_OR_EQUAL :
16642 + if ((int64_t)np->left->value <=
16643 + (int64_t)np->right->value) {
16644 + *value = 1;
16645 + } else {
16646 + *value = 0;
16647 + }
16648 + logical_flag++;
16649 + break;
16650 +
16651 + case GREATER_THAN_OR_EQUAL :
16652 + if ((int64_t)np->left->value >=
16653 + (int64_t)np->right->value) {
16654 + *value = 1;
16655 + } else {
16656 + *value = 0;
16657 + }
16658 + logical_flag++;
16659 + break;
16660 +
16661 + default :
16662 + break;
16663 + }
16664 + } else {
16665 + switch (np->operator) {
16666 + case ADD :
16667 + *value = np->left->value + np->right->value;
16668 + break;
16669 +
16670 + case SUBTRACT :
16671 + *value = np->left->value - np->right->value;
16672 + break;
16673 +
16674 + case MULTIPLY :
16675 + *value = np->left->value * np->right->value;
16676 + break;
16677 +
16678 + case DIVIDE :
16679 + *value = np->left->value / np->right->value;
16680 + break;
16681 +
16682 + case BITWISE_OR :
16683 + *value = np->left->value | np->right->value;
16684 + break;
16685 +
16686 + case BITWISE_AND :
16687 + *value = np->left->value & np->right->value;
16688 + break;
16689 +
16690 + case MODULUS :
16691 + *value = np->left->value % np->right->value;
16692 + break;
16693 +
16694 + case RIGHT_SHIFT :
16695 + *value = np->left->value >> np->right->value;
16696 + break;
16697 +
16698 + case LEFT_SHIFT :
16699 + *value = np->left->value << np->right->value;
16700 + break;
16701 +
16702 + case LOGICAL_OR :
16703 + if (np->left->value || np->right->value) {
16704 + *value = 1;
16705 + } else {
16706 + *value = 0;
16707 + }
16708 + logical_flag++;
16709 + break;
16710 +
16711 + case LOGICAL_AND :
16712 + if (np->left->value && np->right->value) {
16713 + *value = 1;
16714 + } else {
16715 + *value = 0;
16716 + }
16717 + logical_flag++;
16718 + break;
16719 +
16720 + case EQUAL :
16721 + if (np->left->value == np->right->value) {
16722 + *value = 1;
16723 + } else {
16724 + *value = 0;
16725 + }
16726 + logical_flag++;
16727 + break;
16728 +
16729 + case NOT_EQUAL :
16730 + if (np->left->value != np->right->value) {
16731 + *value = 1;
16732 + } else {
16733 + *value = 0;
16734 + }
16735 + logical_flag++;
16736 + break;
16737 +
16738 + case LESS_THAN :
16739 + if (np->left->value < np->right->value) {
16740 + *value = 1;
16741 + } else {
16742 + *value = 0;
16743 + }
16744 + logical_flag++;
16745 + break;
16746 +
16747 + case GREATER_THAN :
16748 + if (np->left->value > np->right->value) {
16749 + *value = 1;
16750 + } else {
16751 + *value = 0;
16752 + }
16753 + logical_flag++;
16754 + break;
16755 +
16756 + case LESS_THAN_OR_EQUAL :
16757 + if (np->left->value <= np->right->value) {
16758 + *value = 1;
16759 + } else {
16760 + *value = 0;
16761 + }
16762 + logical_flag++;
16763 + break;
16764 +
16765 + case GREATER_THAN_OR_EQUAL :
16766 + if (np->left->value >= np->right->value) {
16767 + *value = 1;
16768 + } else {
16769 + *value = 0;
16770 + }
16771 + logical_flag++;
16772 + break;
16773 +
16774 + default :
16775 + break;
16776 + }
16777 + }
16778 + return(0);
16779 +}
16780 +
16781 +/*
16782 + * member_to_type()
16783 + */
16784 +static type_t *
16785 +member_to_type(kltype_t *kltp, int flags)
16786 +{
16787 + kltype_t *rkltp;
16788 + type_t *tp, *head = (type_t *)NULL, *last = (type_t *)NULL;
16789 +
16790 + /* Make sure this is a member
16791 + */
16792 + if (kltp->kl_type != KLT_MEMBER) {
16793 + return((type_t *)NULL);
16794 + }
16795 +
16796 + rkltp = kltp->kl_realtype;
16797 + while (rkltp && rkltp->kl_type == KLT_POINTER) {
16798 + tp = (type_t *)kl_alloc_block(sizeof(type_t));
16799 + tp->flag = POINTER_FLAG;
16800 + if (last) {
16801 + last->t_next = tp;
16802 + last = tp;
16803 + } else {
16804 + head = last = tp;
16805 + }
16806 + rkltp = rkltp->kl_realtype;
16807 + }
16808 +
16809 + /* If We step past all the pointer records and don't point
16810 + * at anything, this must be a void pointer. Setup a VOID
16811 + * type struct so that we can maintain a pointer to some
16812 + * type info.
16813 + */
16814 + if (!rkltp) {
16815 + tp = (type_t *)kl_alloc_block(sizeof(type_t));
16816 + tp->flag = VOID_FLAG;
16817 + tp->t_kltp = kltp;
16818 + if (last) {
16819 + last->t_next = tp;
16820 + last = tp;
16821 + } else {
16822 + head = last = tp;
16823 + }
16824 + return(head);
16825 + }
16826 +
16827 + tp = (type_t *)kl_alloc_block(sizeof(type_t));
16828 + tp->flag = KLTYPE_FLAG;
16829 + tp->t_kltp = kltp;
16830 + if (last) {
16831 + last->t_next = tp;
16832 + } else {
16833 + head = tp;
16834 + }
16835 + return(head);
16836 +}
16837 +
16838 +/*
16839 + * replace() --
16840 + *
16841 + * Replace the tree with a node containing the numerical result of
16842 + * the equation. If pointer math is performed, the result will have
16843 + * the same type as the pointer.
16844 + */
16845 +static node_t *
16846 +replace(node_t *np, int flags)
16847 +{
16848 + int offset;
16849 + uint64_t value;
16850 + node_t *q;
16851 +
16852 + if (!np) {
16853 + return((node_t *)NULL);
16854 + }
16855 +
16856 + if (np->node_type == OPERATOR) {
16857 + if (!(q = np->left)) {
16858 + return((node_t *)NULL);
16859 + }
16860 + while (q) {
16861 + if (!replace(q, flags)) {
16862 + return((node_t *)NULL);
16863 + }
16864 + q = q->right;
16865 + }
16866 +
16867 + if ((np->operator == RIGHT_ARROW) || (np->operator == DOT)) {
16868 + kaddr_t addr = 0;
16869 + type_t *tp;
16870 +
16871 + if (!have_debug_file) {
16872 + kdb_printf("no debuginfo file\n");
16873 + return 0;
16874 + }
16875 +
16876 + /* The left node must point to a TYPE_DEF
16877 + */
16878 + if (np->left->node_type != TYPE_DEF) {
16879 + if (np->left->flags & NOTYPE_FLAG) {
16880 + set_eval_error(E_NOTYPE);
16881 + error_token = np->left->tok_ptr;
16882 + } else {
16883 + set_eval_error(E_BAD_TYPE);
16884 + error_token = np->left->tok_ptr;
16885 + }
16886 + return((node_t *)NULL);
16887 + }
16888 +
16889 + /* Get the type information. Check to see if we
16890 + * have a pointer to a type. If we do, we need
16891 + * to strip off the pointer and get the type info.
16892 + */
16893 + if (np->left->type->flag == POINTER_FLAG) {
16894 + tp = np->left->type->t_next;
16895 + kl_free_block((void *)np->left->type);
16896 + } else {
16897 + tp = np->left->type;
16898 + }
16899 +
16900 + /* We need to zero out the left child's type pointer
16901 + * to prevent the type structs from being prematurely
16902 + * freed (upon success). We have to remember, however,
16903 + * to the free the type information before we return.
16904 + */
16905 + np->left->type = (type_t*)NULL;
16906 +
16907 + /* tp should now point at a type_t struct that
16908 + * references a kltype_t struct. If it points
16909 + * to anything else, return failure.
16910 + *
16911 + */
16912 + if (tp->flag != KLTYPE_FLAG) {
16913 + set_eval_error(E_BAD_TYPE);
16914 + error_token = np->left->tok_ptr;
16915 + free_type(tp);
16916 + return((node_t *)NULL);
16917 + }
16918 +
16919 + switch (tp->flag) {
16920 + case KLTYPE_FLAG: {
16921 + /* Make sure that the type referenced
16922 + * is a struct, union, or pointer to
16923 + * a struct or union. If it isn't one
16924 + * of these, then return failure.
16925 + */
16926 + kltype_t *kltp, *kltmp;
16927 +
16928 + kltp = kl_realtype(tp->t_kltp, 0);
16929 + if ((kltp->kl_type != KLT_STRUCT) &&
16930 + (kltp->kl_type != KLT_UNION)) {
16931 + error_token =
16932 + np->left->tok_ptr;
16933 + set_eval_error(E_BAD_TYPE);
16934 + free_type(tp);
16935 + return((node_t *)NULL);
16936 + }
16937 +
16938 + /* Get type information for member.
16939 + * If member is a pointer to a type,
16940 + * get the pointer address and load
16941 + * it into value. In any event, load
16942 + * the struct/union address plus the
16943 + * offset of the member.
16944 + */
16945 + kltmp = kl_get_member(kltp,
16946 + np->right->name);
16947 + if (!kltmp) {
16948 + set_eval_error(E_BAD_MEMBER);
16949 + error_token =
16950 + np->right->tok_ptr;
16951 + free_type(tp);
16952 + return((node_t *)NULL);
16953 + }
16954 +
16955 + /* We can't just use the offset value
16956 + * for the member. That's because it
16957 + * may be from an anonymous struct or
16958 + * union within another struct
16959 + * definition.
16960 + */
16961 + offset = kl_get_member_offset(kltp,
16962 + np->right->name);
16963 + np->type = member_to_type(kltmp, flags);
16964 + if (!np->type) {
16965 + set_eval_error(E_BAD_MEMBER);
16966 + error_token =
16967 + np->right->tok_ptr;
16968 + free_type(tp);
16969 + return((node_t *)NULL);
16970 + }
16971 +
16972 + /* Now free the struct type information
16973 + */
16974 + free_type(tp);
16975 + np->node_type = TYPE_DEF;
16976 + np->flags |= KLTYPE_FLAG;
16977 + np->operator = 0;
16978 + addr = 0;
16979 + if (np->left->flags & POINTER_FLAG) {
16980 + addr = np->left->value +
16981 + offset;
16982 + } else if (np->left->flags &
16983 + ADDRESS_FLAG) {
16984 + addr = np->left->address +
16985 + offset;
16986 + }
16987 + if (addr) {
16988 + np->address = addr;
16989 + np->flags |= ADDRESS_FLAG;
16990 + }
16991 +
16992 + if (np->type->flag == POINTER_FLAG) {
16993 + np->flags |= POINTER_FLAG;
16994 + np->value = *((kaddr_t *)addr);
16995 + } else {
16996 + np->value = addr;
16997 + }
16998 + break;
16999 + }
17000 + }
17001 + free_nodes(np->left);
17002 + free_nodes(np->right);
17003 + np->left = np->right = (node_t*)NULL;
17004 + return(np);
17005 + } else {
17006 + if (!np->left || !np->right) {
17007 + set_eval_error(E_MISSING_OPERAND);
17008 + error_token = np->tok_ptr;
17009 + return((node_t *)NULL);
17010 + }
17011 + if (np->left->byte_size && np->right->byte_size) {
17012 + if (np->left->byte_size >
17013 + np->right->byte_size) {
17014 +
17015 + /* Left byte_size is greater than right
17016 + */
17017 + np->byte_size = np->left->byte_size;
17018 + np->type = np->left->type;
17019 + np->flags = np->left->flags;
17020 + free_type(np->right->type);
17021 + } else if (np->left->byte_size <
17022 + np->right->byte_size) {
17023 +
17024 + /* Right byte_size is greater than left
17025 + */
17026 + np->byte_size = np->right->byte_size;
17027 + np->type = np->right->type;
17028 + np->flags = np->right->flags;
17029 + free_type(np->left->type);
17030 + } else {
17031 +
17032 + /* Left and right byte_size is equal
17033 + */
17034 + if (np->left->flags & UNSIGNED_FLAG) {
17035 + np->byte_size =
17036 + np->left->byte_size;
17037 + np->type = np->left->type;
17038 + np->flags = np->left->flags;
17039 + free_type(np->right->type);
17040 + } else if (np->right->flags &
17041 + UNSIGNED_FLAG) {
17042 + np->byte_size =
17043 + np->right->byte_size;
17044 + np->type = np->right->type;
17045 + np->flags = np->right->flags;
17046 + free_type(np->left->type);
17047 + } else {
17048 + np->byte_size =
17049 + np->left->byte_size;
17050 + np->type = np->left->type;
17051 + np->flags = np->left->flags;
17052 + free_type(np->right->type);
17053 + }
17054 + }
17055 + } else if (np->left->byte_size) {
17056 + np->byte_size = np->left->byte_size;
17057 + np->type = np->left->type;
17058 + np->flags = np->left->flags;
17059 + free_type(np->right->type);
17060 + } else if (np->right->byte_size) {
17061 + np->byte_size = np->right->byte_size;
17062 + np->type = np->right->type;
17063 + np->flags = np->right->flags;
17064 + } else {
17065 + /* XXX - No byte sizes
17066 + */
17067 + }
17068 +
17069 + if (apply(np, &value, flags)) {
17070 + return((node_t *)NULL);
17071 + }
17072 + }
17073 + np->right->type = np->left->type = (type_t*)NULL;
17074 +
17075 + /* Flesh out the rest of the node struct.
17076 + */
17077 + if (np->type) {
17078 + np->node_type = TYPE_DEF;
17079 + np->flags |= KLTYPE_FLAG;
17080 + } else {
17081 + np->node_type = NUMBER;
17082 + np->flags &= ~(KLTYPE_FLAG);
17083 + }
17084 + np->operator = 0;
17085 + np->value = value;
17086 + kl_free_block((void *)np->left);
17087 + kl_free_block((void *)np->right);
17088 + np->left = np->right = (node_t*)NULL;
17089 + }
17090 + return(np);
17091 +}
17092 +
17093 +/*
17094 + * replace_cast()
17095 + */
17096 +static int
17097 +replace_cast(node_t *n, int flags)
17098 +{
17099 + type_t *t;
17100 +
17101 + if (!n) {
17102 + set_eval_error(E_SYNTAX_ERROR);
17103 + return(-1);
17104 + } else if (!n->right) {
17105 + set_eval_error(E_SYNTAX_ERROR);
17106 + error_token = n->tok_ptr;
17107 + return(-1);
17108 + }
17109 + if (n->flags & POINTER_FLAG) {
17110 + if (n->right->node_type == VADDR) {
17111 + if (n->right->flags & ADDRESS_FLAG) {
17112 + n->value = n->right->address;
17113 + } else {
17114 + set_eval_error(E_SYNTAX_ERROR);
17115 + error_token = n->right->tok_ptr;
17116 + return(-1);
17117 + }
17118 +
17119 + } else {
17120 + n->value = n->right->value;
17121 + n->address = 0;
17122 + }
17123 + } else if (n->right->flags & ADDRESS_FLAG) {
17124 + n->flags |= ADDRESS_FLAG;
17125 + n->address = n->right->address;
17126 + n->value = n->right->value;
17127 + } else {
17128 + kltype_t *kltp;
17129 +
17130 + if (!(t = eval_type(n))) {
17131 + set_eval_error(E_BAD_TYPE);
17132 + error_token = n->tok_ptr;
17133 + return(-1);
17134 + }
17135 + if (t->t_kltp->kl_type != KLT_BASE) {
17136 +
17137 + kltp = kl_realtype(t->t_kltp, 0);
17138 + if (kltp->kl_type != KLT_BASE) {
17139 + set_eval_error(E_BAD_CAST);
17140 + error_token = n->tok_ptr;
17141 + return(-1);
17142 + }
17143 + }
17144 + n->value = n->right->value;
17145 + n->type = t;
17146 + }
17147 + n->node_type = TYPE_DEF;
17148 + n->operator = 0;
17149 + free_node(n->right);
17150 + n->right = (node_t *)NULL;
17151 + return(0);
17152 +}
17153 +
17154 +/*
17155 + * replace_indirection()
17156 + */
17157 +static int
17158 +replace_indirection(node_t *n, int flags)
17159 +{
17160 + kaddr_t addr;
17161 + type_t *t, *tp, *rtp;
17162 +
17163 + /* Make sure there is a right child and that it is a TYPE_DEF.
17164 + */
17165 + if (!n->right) {
17166 + set_eval_error(E_BAD_TYPE);
17167 + error_token = n->tok_ptr;
17168 + return(-1);
17169 + } else if (n->right->node_type != TYPE_DEF) {
17170 + set_eval_error(E_BAD_TYPE);
17171 + error_token = n->right->tok_ptr;
17172 + return(-1);
17173 + }
17174 +
17175 + /* Make sure the right node contains a pointer or address value.
17176 + * Note that it's possible for the whatis command to generate
17177 + * this case without any actual pointer/address value.
17178 + */
17179 + if (!(n->right->flags & (POINTER_FLAG|ADDRESS_FLAG))) {
17180 + set_eval_error(E_BAD_POINTER);
17181 + error_token = n->right->tok_ptr;
17182 + return(-1);
17183 + }
17184 +
17185 + /* Get the pointer to the first type struct and make sure
17186 + * it's a pointer.
17187 + */
17188 + if (!(tp = n->right->type) || (tp->flag != POINTER_FLAG)) {
17189 + set_eval_error(E_BAD_TYPE);
17190 + error_token = n->right->tok_ptr;
17191 + return(-1);
17192 + }
17193 +
17194 + /* Make sure we have a pointer to a type structure.
17195 + */
17196 + if (!(n->right->flags & KLTYPE_FLAG)) {
17197 + set_eval_error(E_BAD_TYPE);
17198 + error_token = n->right->tok_ptr;
17199 + return(-1);
17200 + }
17201 +
17202 + n->node_type = TYPE_DEF;
17203 + n->flags = KLTYPE_FLAG;
17204 + n->operator = 0;
17205 +
17206 + if (!(t = tp->t_next)) {
17207 + set_eval_error(E_BAD_TYPE);
17208 + error_token = n->right->tok_ptr;
17209 + return(-1);
17210 + }
17211 +
17212 + if (!(rtp = eval_type(n->right))) {
17213 + set_eval_error(E_BAD_TYPE);
17214 + error_token = n->right->tok_ptr;
17215 + return(-1);
17216 + }
17217 +
17218 + /* Zero out the type field in the right child so
17219 + * it wont accidently be freed when the right child
17220 + * is freed (upon success).
17221 + */
17222 + n->right->type = (type_t*)NULL;
17223 +
17224 + n->type = t;
17225 +
17226 + /* Free the pointer struct
17227 + */
17228 + kl_free_block((void *)tp);
17229 +
17230 + /* Get the pointer address
17231 + */
17232 + addr = n->address = n->right->value;
17233 + n->flags |= ADDRESS_FLAG;
17234 +
17235 + if (rtp->t_kltp->kl_type == KLT_MEMBER) {
17236 + /* If this is a member, we have to step over the KLT_MEMBER
17237 + * struct and then make sure we have a KLT_POINTER struct.
17238 + * If we do, we step over it too...otherwise return an
17239 + * error.
17240 + */
17241 + if (rtp->t_kltp->kl_realtype->kl_type != KLT_POINTER) {
17242 + set_eval_error(E_BAD_TYPE);
17243 + error_token = n->right->tok_ptr;
17244 + return(-1);
17245 + }
17246 + rtp->t_kltp = rtp->t_kltp->kl_realtype;
17247 + }
17248 +
17249 + if (rtp->t_kltp->kl_type == KLT_POINTER) {
17250 + /* Strip off the pointer type record so that
17251 + * we pick up the actual type definition with
17252 + * our indirection.
17253 + */
17254 + rtp->t_kltp = rtp->t_kltp->kl_realtype;
17255 + if (rtp->t_kltp->kl_name &&
17256 + !strcmp(rtp->t_kltp->kl_name, "char")) {
17257 + n->flags |= STRING_FLAG;
17258 + }
17259 + }
17260 +
17261 +
17262 + /* If this is a pointer to a pointer, get the next
17263 + * pointer value.
17264 + */
17265 + if (n->type->flag == POINTER_FLAG) {
17266 + n->value = *((kaddr_t *)addr);
17267 +
17268 + /* Set the appropriate node flag values
17269 + */
17270 + n->flags |= POINTER_FLAG;
17271 + free_node(n->right);
17272 + n->left = n->right = (node_t *)NULL;
17273 + return(0);
17274 + }
17275 + /* Zero out the type field in the right child so it doesn't
17276 + * accidently get freed up when the right child is freed
17277 + * (upon success).
17278 + */
17279 + n->right->type = (type_t*)NULL;
17280 + free_node(n->right);
17281 + n->left = n->right = (node_t *)NULL;
17282 + return(0);
17283 +}
17284 +
17285 +/*
17286 + * replace_unary()
17287 + *
17288 + * Convert a unary operator node that contains a pointer to a value
17289 + * with a node containing the numerical result. Free the node that
17290 + * originally contained the value.
17291 + */
17292 +static int
17293 +replace_unary(node_t *n, int flags)
17294 +{
17295 + uint64_t value;
17296 +
17297 + if (!n->right) {
17298 + set_eval_error(E_MISSING_OPERAND);
17299 + error_token = n->tok_ptr;
17300 + return(-1);
17301 + }
17302 + if (is_unary(n->right->operator)) {
17303 + if (replace_unary(n->right, flags) == -1) {
17304 + return(-1);
17305 + }
17306 + }
17307 + if (n->operator == CAST) {
17308 + return(replace_cast(n, flags));
17309 + } else if (n->operator == INDIRECTION) {
17310 + return(replace_indirection(n, flags));
17311 + } else if (n->operator == ADDRESS) {
17312 + type_t *t;
17313 +
17314 + if (n->right->node_type == TYPE_DEF) {
17315 + if (!(n->right->flags & ADDRESS_FLAG)) {
17316 + set_eval_error(E_NO_ADDRESS);
17317 + error_token = n->right->tok_ptr;
17318 + return(-1);
17319 + }
17320 + t = n->right->type;
17321 + } else {
17322 + set_eval_error(E_BAD_TYPE);
17323 + error_token = n->right->tok_ptr;
17324 + return(-1);
17325 + }
17326 + n->type = (type_t*)kl_alloc_block(sizeof(type_t));
17327 + n->type->flag = POINTER_FLAG;
17328 + n->type->t_next = t;
17329 + n->node_type = TYPE_DEF;
17330 + n->operator = 0;
17331 + n->value = n->right->address;
17332 + n->flags = POINTER_FLAG;
17333 + if (!(t = eval_type(n))) {
17334 + set_eval_error(E_BAD_TYPE);
17335 + error_token = n->tok_ptr;
17336 + return(-1);
17337 + }
17338 + n->flags |= t->flag;
17339 + n->right->type = 0;
17340 + free_nodes(n->right);
17341 + n->left = n->right = (node_t *)NULL;
17342 + return(0);
17343 + } else if (apply_unary(n, &value) == -1) {
17344 + return(-1);
17345 + }
17346 + free_nodes(n->right);
17347 + n->node_type = NUMBER;
17348 + n->operator = 0;
17349 + n->left = n->right = (node_t *)NULL;
17350 + memcpy(&n->value, &value, sizeof(uint64_t));
17351 + return(0);
17352 +}
17353 +
17354 +/*
17355 + * pointer_to_element()
17356 + */
17357 +static void
17358 +pointer_to_element(node_t *n0, node_t *n1)
17359 +{
17360 + int size;
17361 + kltype_t *kltp, *rkltp;
17362 + type_t *tp;
17363 +
17364 + if (!(tp = n0->type)) {
17365 + set_eval_error(E_BAD_INDEX);
17366 + error_token = n0->tok_ptr;
17367 + return;
17368 + }
17369 + if (tp->t_next->flag == POINTER_FLAG) {
17370 + size = sizeof(void *);
17371 + } else {
17372 + kltp = tp->t_next->t_kltp;
17373 + if (!(rkltp = kl_realtype(kltp, 0))) {
17374 + set_eval_error(E_BAD_INDEX);
17375 + error_token = n0->tok_ptr;
17376 + return;
17377 + }
17378 + size = rkltp->kl_size;
17379 + }
17380 +
17381 + /* Get the details on the array element
17382 + */
17383 + n0->flags |= ADDRESS_FLAG;
17384 + n0->address = n0->value + (n1->value * size);
17385 + n0->type = tp->t_next;
17386 + kl_free_block((char *)tp);
17387 + if (tp->t_next->flag == POINTER_FLAG) {
17388 + n0->flags |= POINTER_FLAG;
17389 + n0->value = *((kaddr_t *)n0->address);
17390 + } else {
17391 + n0->flags &= (~POINTER_FLAG);
17392 + n0->value = 0;
17393 + }
17394 +}
17395 +
17396 +/*
17397 + * array_to_element()
17398 + */
17399 +static void
17400 +array_to_element(node_t *n0, node_t *n1)
17401 +{
17402 + kltype_t *kltp, *rkltp, *ip, *ep;
17403 + type_t *tp, *troot = (type_t *)NULL;
17404 +
17405 + if (!(tp = n0->type)) {
17406 + set_eval_error(E_BAD_INDEX);
17407 + error_token = n0->tok_ptr;
17408 + return;
17409 + }
17410 +
17411 + /* If we are indexing a pointer, then make a call to the
17412 + * pointer_to_element() and return.
17413 + */
17414 + if (tp->flag == POINTER_FLAG) {
17415 + return(pointer_to_element(n0, n1));
17416 + }
17417 +
17418 + if (!(kltp = n0->type->t_kltp)) {
17419 + set_eval_error(E_BAD_INDEX);
17420 + error_token = n0->tok_ptr;
17421 + return;
17422 + }
17423 + if (!(rkltp = kl_realtype(kltp, KLT_ARRAY))) {
17424 + set_eval_error(E_BAD_INDEX);
17425 + error_token = n0->tok_ptr;
17426 + return;
17427 + }
17428 + ip = rkltp->kl_indextype;
17429 + ep = rkltp->kl_elementtype;
17430 + if (!ip || !ep) {
17431 + set_eval_error(E_BAD_INDEX);
17432 + error_token = n1->tok_ptr;
17433 + return;
17434 + }
17435 + /* Get the details on the array element
17436 + */
17437 + n0->address = n0->address + (n1->value * ep->kl_size);
17438 + if (ep->kl_type == KLT_POINTER) {
17439 + n0->flags |= POINTER_FLAG;
17440 + n0->value = *((kaddr_t *)n0->address);
17441 + } else {
17442 + n0->value = 0;
17443 + }
17444 + n0->flags |= ADDRESS_FLAG;
17445 + kltp = ep;
17446 + while (kltp->kl_type == KLT_POINTER) {
17447 + if (troot) {
17448 + tp->t_next = (type_t*)kl_alloc_block(sizeof(type_t));
17449 + tp = tp->t_next;
17450 + } else {
17451 + tp = (type_t*)kl_alloc_block(sizeof(type_t));
17452 + troot = tp;
17453 + }
17454 + tp->flag = POINTER_FLAG;
17455 + kltp = kltp->kl_realtype;
17456 + }
17457 + if (troot) {
17458 + tp->t_next = (type_t*)kl_alloc_block(sizeof(type_t));
17459 + tp = tp->t_next;
17460 + n0->type = troot;
17461 + } else {
17462 + tp = (type_t*)kl_alloc_block(sizeof(type_t));
17463 + n0->type = tp;
17464 + }
17465 + tp->flag = KLTYPE_FLAG;
17466 + tp->t_kltp = ep;
17467 +}
17468 +
17469 +/*
17470 + * number_to_size()
17471 + */
17472 +int
17473 +number_to_size(node_t *np)
17474 +{
17475 + int unsigned_flag = 0;
17476 +
17477 + if (np->node_type != NUMBER) {
17478 + set_eval_error(E_BAD_TYPE);
17479 + error_token = np->tok_ptr;
17480 + return(0);
17481 + }
17482 + if (np->flags & UNSIGNED_FLAG) {
17483 + unsigned_flag = 1;
17484 + }
17485 + if ((np->value >= 0) && (np->value <= 0xffffffff)) {
17486 + return(4);
17487 + } else if (((np->value >> 32) & 0xffffffff) == 0xffffffff) {
17488 + if (unsigned_flag) {
17489 + return(8);
17490 + } else if (sizeof(void *) == 4) {
17491 + return(4);
17492 + } else {
17493 + return(8);
17494 + }
17495 + }
17496 + return(8);
17497 +}
17498 +
17499 +/*
17500 + * number_to_type()
17501 + */
17502 +kltype_t *
17503 +number_to_type(node_t *np)
17504 +{
17505 + int unsigned_flag = 0;
17506 + kltype_t *kltp, *rkltp = (kltype_t *)NULL;
17507 +
17508 + if (np->node_type != NUMBER) {
17509 + set_eval_error(E_BAD_TYPE);
17510 + error_token = np->tok_ptr;
17511 + return((kltype_t *)NULL);
17512 + }
17513 + if (np->flags & UNSIGNED_FLAG) {
17514 + unsigned_flag = 1;
17515 + }
17516 + if ((np->value >= 0) && (np->value <= 0xffffffff)) {
17517 + if (unsigned_flag) {
17518 + kltp = kl_find_type("uint32_t", KLT_TYPEDEF);
17519 + } else {
17520 + kltp = kl_find_type("int32_t", KLT_TYPEDEF);
17521 + }
17522 + } else if (((np->value >> 32) & 0xffffffff) == 0xffffffff) {
17523 + if (unsigned_flag) {
17524 + kltp = kl_find_type("uint64_t", KLT_TYPEDEF);
17525 + } else if (sizeof(void *) == 4) {
17526 + kltp = kl_find_type("int32_t", KLT_TYPEDEF);
17527 + } else {
17528 + kltp = kl_find_type("int64_t", KLT_TYPEDEF);
17529 + }
17530 + } else {
17531 + if (unsigned_flag) {
17532 + kltp = kl_find_type("uint64_t", KLT_TYPEDEF);
17533 + } else {
17534 + kltp = kl_find_type("int64_t", KLT_TYPEDEF);
17535 + }
17536 + }
17537 + if (kltp) {
17538 + if (!(rkltp = kl_realtype(kltp, 0))) {
17539 + rkltp = kltp;
17540 + }
17541 + } else {
17542 + set_eval_error(E_BAD_TYPE);
17543 + error_token = np->tok_ptr;
17544 + }
17545 + return(rkltp);
17546 +}
17547 +
17548 +/*
17549 + * type_to_number()
17550 + *
17551 + * Convert a base type to a numeric value. Return 1 on successful
17552 + * conversion, 0 if nothing was done.
17553 + */
17554 +static int
17555 +type_to_number(node_t *np)
17556 +{
17557 + int byte_size, bit_offset, bit_size, encoding;
17558 + uint64_t value, value1;
17559 + kltype_t *kltp, *rkltp;
17560 +
17561 + /* Sanity check...
17562 + */
17563 + if (np->node_type != TYPE_DEF) {
17564 + set_eval_error(E_NOTYPE);
17565 + error_token = np->tok_ptr;
17566 + return(0);
17567 + }
17568 + if (!np->type) {
17569 + set_eval_error(E_NOTYPE);
17570 + error_token = np->tok_ptr;
17571 + return(0);
17572 + }
17573 + if (np->type->flag == POINTER_FLAG) {
17574 + return(0);
17575 + }
17576 +
17577 + /* Get the real type record and make sure that it is
17578 + * for a base type.
17579 + */
17580 + kltp = np->type->t_kltp;
17581 + rkltp = kl_realtype(kltp, 0);
17582 + if (rkltp->kl_type != KLT_BASE) {
17583 + set_eval_error(E_NOTYPE);
17584 + error_token = np->tok_ptr;
17585 + return(0);
17586 + }
17587 +
17588 + byte_size = rkltp->kl_size;
17589 + bit_offset = rkltp->kl_bit_offset;
17590 + if (!(bit_size = rkltp->kl_bit_size)) {
17591 + bit_size = byte_size * 8;
17592 + }
17593 + encoding = rkltp->kl_encoding;
17594 + if (np->flags & ADDRESS_FLAG) {
17595 + /* FIXME: untested */
17596 + if (invalid_address(np->address, byte_size)) {
17597 + kdb_printf("ILLEGAL ADDRESS (%lx)",
17598 + (uaddr_t)np->address);
17599 + return (0);
17600 + }
17601 + kl_get_block(np->address, byte_size,(void *)&value1,(void *)0);
17602 + } else {
17603 + value1 = np->value;
17604 + }
17605 + value = kl_get_bit_value(&value1, byte_size, bit_size, bit_offset);
17606 + switch (byte_size) {
17607 +
17608 + case 1 :
17609 + if (encoding == ENC_UNSIGNED) {
17610 + np->value = (unsigned char)value;
17611 + np->flags |= UNSIGNED_FLAG;
17612 + } else if (encoding == ENC_SIGNED) {
17613 + np->value = (signed char)value;
17614 + } else {
17615 + np->value = (char)value;
17616 + }
17617 + break;
17618 +
17619 + case 2 :
17620 + if (encoding == ENC_UNSIGNED) {
17621 + np->value = (uint16_t)value;
17622 + np->flags |= UNSIGNED_FLAG;
17623 + } else {
17624 + np->value = (int16_t)value;
17625 + }
17626 + break;
17627 +
17628 + case 4 :
17629 + if (encoding == ENC_UNSIGNED) {
17630 + np->value = (uint32_t)value;
17631 + np->flags |= UNSIGNED_FLAG;
17632 + } else {
17633 + np->value = (int32_t)value;
17634 + }
17635 + break;
17636 +
17637 + case 8 :
17638 + if (encoding == ENC_UNSIGNED) {
17639 + np->value = (uint64_t)value;
17640 + np->flags |= UNSIGNED_FLAG;
17641 + } else {
17642 + np->value = (int64_t)value;
17643 + }
17644 + break;
17645 +
17646 + default :
17647 + set_eval_error(E_BAD_TYPE);
17648 + error_token = np->tok_ptr;
17649 + return(0);
17650 + }
17651 + np->byte_size = byte_size;
17652 + np->node_type = NUMBER;
17653 + return(1);
17654 +}
17655 +
17656 +/*
17657 + * eval_type()
17658 + */
17659 +static type_t *
17660 +eval_type(node_t *n)
17661 +{
17662 + type_t *t;
17663 +
17664 + if (!(t = n->type)) {
17665 + return((type_t*)NULL);
17666 + }
17667 + while (t->flag == POINTER_FLAG) {
17668 + t = t->t_next;
17669 +
17670 + /* If for some reason, there is no type pointer (this shouldn't
17671 + * happen but...), we have to make sure that we don't try to
17672 + * reference a NULL pointer and get a SEGV. Return an error if
17673 + * 't' is NULL.
17674 + */
17675 + if (!t) {
17676 + return((type_t*)NULL);
17677 + }
17678 + }
17679 + if (t->flag == KLTYPE_FLAG) {
17680 + return (t);
17681 + }
17682 + return((type_t*)NULL);
17683 +}
17684 +
17685 +/*
17686 + * expand_variables()
17687 + */
17688 +static char *
17689 +expand_variables(char *exp, int flags)
17690 +{
17691 + return((char *)NULL);
17692 +}
17693 +
17694 +/*
17695 + * eval()
17696 + */
17697 +node_t *
17698 +eval(char **exp, int flags)
17699 +{
17700 + token_t *tok;
17701 + node_t *n, *root;
17702 + char *e, *s;
17703 +
17704 + eval_error = 0;
17705 + logical_flag = 0;
17706 +
17707 + /* Make sure there is an expression to evaluate
17708 + */
17709 + if (!(*exp)) {
17710 + return ((node_t*)NULL);
17711 + }
17712 +
17713 + /* Expand any variables that are in the expression string. If
17714 + * a new string is allocated by the expand_variables() function,
17715 + * we need to make sure the original expression string gets
17716 + * freed. In any event, point s at the current expression string
17717 + * so that it gets freed up when we are done.
17718 + */
17719 + if ((e = expand_variables(*exp, 0))) {
17720 + kl_free_block((void *)*exp);
17721 + *exp = e;
17722 + } else if (eval_error) {
17723 + eval_error |= E_BAD_EVAR;
17724 + error_token = *exp;
17725 + }
17726 + s = *exp;
17727 + tok = get_token_list(s);
17728 + if (eval_error) {
17729 + return((node_t*)NULL);
17730 + }
17731 +
17732 + /* Get the node_list and evaluate the expression.
17733 + */
17734 + node_list = get_node_list(tok, flags);
17735 + if (eval_error) {
17736 + free_nodelist(node_list);
17737 + node_list = (node_t*)NULL;
17738 + free_tokens(tok);
17739 + return((node_t*)NULL);
17740 + }
17741 + if (!(n = do_eval(flags))) {
17742 + if (!eval_error) {
17743 + set_eval_error(E_SYNTAX_ERROR);
17744 + error_token = s + strlen(s) - 1;
17745 + }
17746 + free_nodes(n);
17747 + free_tokens(tok);
17748 + return((node_t*)NULL);
17749 + }
17750 +
17751 + if (!(root = replace(n, flags))) {
17752 + if (eval_error) {
17753 + free_nodes(n);
17754 + free_tokens(tok);
17755 + return((node_t*)NULL);
17756 + }
17757 + root = n;
17758 + }
17759 +
17760 + /* Check to see if the the result should
17761 + * be interpreted as 'true' or 'false'
17762 + */
17763 + if (logical_flag && ((root->value == 0) || (root->value == 1))) {
17764 + root->flags |= BOOLIAN_FLAG;
17765 + }
17766 + free_tokens(tok);
17767 + return(root);
17768 +}
17769 +
17770 +/*
17771 + * print_number()
17772 + */
17773 +void
17774 +print_number(node_t *np, int flags)
17775 +{
17776 + int size;
17777 + unsigned long long value;
17778 +
17779 + if ((size = number_to_size(np)) && (size != sizeof(uint64_t))) {
17780 + value = np->value & (((uint64_t)1 << (uint64_t)(size*8))-1);
17781 + } else {
17782 + value = np->value;
17783 + }
17784 + if (flags & C_HEX) {
17785 + kdb_printf("0x%llx", value);
17786 + } else if (flags & C_BINARY) {
17787 + kdb_printf("0b");
17788 + kl_binary_print(value);
17789 + } else {
17790 + if (np->flags & UNSIGNED_FLAG) {
17791 + kdb_printf("%llu", value);
17792 + } else {
17793 + kdb_printf("%lld", np->value);
17794 + }
17795 + }
17796 +}
17797 +
17798 +/*
17799 + * print_string()
17800 + */
17801 +void
17802 +print_string(kaddr_t addr, int size)
17803 +{
17804 + int i;
17805 + char *str;
17806 +
17807 + if (!size) {
17808 + size = 255;
17809 + }
17810 + /* FIXME: untested */
17811 + if (invalid_address(addr, size)) {
17812 + klib_error = KLE_INVALID_PADDR;
17813 + return;
17814 + }
17815 + str = (char*)kl_alloc_block(size);
17816 + kl_get_block(addr, size, (void *)str, (void *)0);
17817 + kdb_printf("\"%s", str);
17818 + for (i = 0; i < size; i++) {
17819 + if (!str[i]) {
17820 + break;
17821 + }
17822 + }
17823 + if (KL_ERROR || (i == size)) {
17824 + kdb_printf("...");
17825 + }
17826 + kdb_printf("\"");
17827 + kl_free_block(str);
17828 +}
17829 +
17830 +/*
17831 + * kl_print_error()
17832 + */
17833 +void
17834 +kl_print_error(void)
17835 +{
17836 + int ecode;
17837 +
17838 + ecode = klib_error & 0xffffffff;
17839 + switch(ecode) {
17840 +
17841 + /** General klib error codes
17842 + **/
17843 + case KLE_NO_MEMORY:
17844 + kdb_printf("insufficient memory");
17845 + break;
17846 + case KLE_OPEN_ERROR:
17847 + kdb_printf("unable to open file");
17848 + break;
17849 + case KLE_ZERO_BLOCK:
17850 + kdb_printf("tried to allocate a zero-sized block");
17851 + break;
17852 + case KLE_INVALID_VALUE:
17853 + kdb_printf("invalid input value");
17854 + break;
17855 + case KLE_NULL_BUFF:
17856 + kdb_printf( "NULL buffer pointer");
17857 + break;
17858 + case KLE_ZERO_SIZE:
17859 + kdb_printf("zero sized block requested");
17860 + break;
17861 + case KLE_ACTIVE:
17862 + kdb_printf("operation not supported on a live system");
17863 + break;
17864 + case KLE_UNSUPPORTED_ARCH:
17865 + kdb_printf("unsupported architecture");
17866 + break;
17867 + case KLE_MISC_ERROR:
17868 + kdb_printf("KLIB error");
17869 + break;
17870 + case KLE_NOT_SUPPORTED:
17871 + kdb_printf("operation not supported");
17872 + break;
17873 + case KLE_UNKNOWN_ERROR:
17874 + kdb_printf("unknown error");
17875 + break;
17876 +
17877 + /** memory error codes
17878 + **/
17879 + case KLE_BAD_MAP_FILE:
17880 + kdb_printf("bad map file");
17881 + break;
17882 + case KLE_BAD_DUMP:
17883 + kdb_printf("bad dump file");
17884 + break;
17885 + case KLE_BAD_DUMPTYPE:
17886 + kdb_printf("bad dumptype");
17887 + break;
17888 + case KLE_INVALID_LSEEK:
17889 + kdb_printf("lseek error");
17890 + break;
17891 + case KLE_INVALID_READ:
17892 + kdb_printf("not found in dump file");
17893 + break;
17894 + case KLE_BAD_KERNINFO:
17895 + kdb_printf("bad kerninfo struct");
17896 + break;
17897 + case KLE_INVALID_PADDR:
17898 + kdb_printf("invalid physical address");
17899 + break;
17900 + case KLE_INVALID_VADDR:
17901 + kdb_printf("invalid virtual address");
17902 + break;
17903 + case KLE_INVALID_VADDR_ALIGN:
17904 + kdb_printf("invalid vaddr alignment");
17905 + break;
17906 + case KLE_INVALID_MAPPING:
17907 + kdb_printf("invalid address mapping");
17908 + break;
17909 + case KLE_PAGE_NOT_PRESENT:
17910 + kdb_printf("page not present");
17911 + break;
17912 + case KLE_BAD_ELF_FILE:
17913 + kdb_printf("bad elf file");
17914 + break;
17915 + case KLE_ARCHIVE_FILE:
17916 + kdb_printf("archive file");
17917 + break;
17918 + case KLE_MAP_FILE_PRESENT:
17919 + kdb_printf("map file present");
17920 + break;
17921 + case KLE_BAD_MAP_FILENAME:
17922 + kdb_printf("bad map filename");
17923 + break;
17924 + case KLE_BAD_DUMP_FILENAME:
17925 + kdb_printf("bad dump filename");
17926 + break;
17927 + case KLE_BAD_NAMELIST_FILE:
17928 + kdb_printf("bad namelist file");
17929 + break;
17930 + case KLE_BAD_NAMELIST_FILENAME:
17931 + kdb_printf("bad namelist filename");
17932 + break;
17933 +
17934 + /** symbol error codes
17935 + **/
17936 + case KLE_NO_SYMTAB:
17937 + kdb_printf("no symtab");
17938 + break;
17939 + case KLE_NO_SYMBOLS:
17940 + kdb_printf("no symbol information");
17941 + break;
17942 + case KLE_NO_MODULE_LIST:
17943 + kdb_printf("kernel without module support");
17944 + break;
17945 +
17946 + /** kernel data error codes
17947 + **/
17948 + case KLE_INVALID_KERNELSTACK:
17949 + kdb_printf("invalid kernel stack");
17950 + break;
17951 + case KLE_INVALID_STRUCT_SIZE:
17952 + kdb_printf("invalid struct size");
17953 + break;
17954 + case KLE_BEFORE_RAM_OFFSET:
17955 + kdb_printf("physical address proceeds start of RAM");
17956 + break;
17957 + case KLE_AFTER_MAXPFN:
17958 + kdb_printf("PFN exceeds maximum PFN");
17959 + break;
17960 + case KLE_AFTER_PHYSMEM:
17961 + kdb_printf("address exceeds physical memory");
17962 + break;
17963 + case KLE_AFTER_MAXMEM:
17964 + kdb_printf("address exceeds maximum physical address");
17965 + break;
17966 + case KLE_PHYSMEM_NOT_INSTALLED:
17967 + kdb_printf("physical memory not installed");
17968 + break;
17969 + case KLE_NO_DEFTASK:
17970 + kdb_printf("default task not set");
17971 + break;
17972 + case KLE_PID_NOT_FOUND:
17973 + kdb_printf("PID not found");
17974 + break;
17975 + case KLE_DEFTASK_NOT_ON_CPU:
17976 + kdb_printf("default task not running on a cpu");
17977 + break;
17978 + case KLE_NO_CURCPU:
17979 + kdb_printf("current cpu could not be determined");
17980 + break;
17981 +
17982 + case KLE_KERNEL_MAGIC_MISMATCH:
17983 + kdb_printf("kernel_magic mismatch "
17984 + "of map and memory image");
17985 + break;
17986 +
17987 + case KLE_INVALID_DUMP_HEADER:
17988 + kdb_printf("invalid dump header in dump");
17989 + break;
17990 +
17991 + case KLE_DUMP_INDEX_CREATION:
17992 + kdb_printf("cannot create index file");
17993 + break;
17994 +
17995 + case KLE_DUMP_HEADER_ONLY:
17996 + kdb_printf("dump only has a dump header");
17997 + break;
17998 +
17999 + case KLE_NO_END_SYMBOL:
18000 + kdb_printf("no _end symbol in kernel");
18001 + break;
18002 +
18003 + case KLE_NO_CPU:
18004 + kdb_printf("CPU not installed");
18005 + break;
18006 +
18007 + default:
18008 + break;
18009 + }
18010 + kdb_printf("\n");
18011 +}
18012 +
18013 +/*
18014 + * kl_print_string()
18015 + *
18016 + * print out a string, translating all embeded control characters
18017 + * (e.g., '\n' for newline, '\t' for tab, etc.)
18018 + */
18019 +void
18020 +kl_print_string(char *s)
18021 +{
18022 + char *sp, *cp;
18023 +
18024 + kl_reset_error();
18025 +
18026 + if (!(sp = s)) {
18027 + klib_error = KLE_BAD_STRING;
18028 + return;
18029 + }
18030 + /* FIXME: untested */
18031 + if (invalid_address((kaddr_t)sp, 1)) {
18032 + klib_error = KLE_INVALID_PADDR;
18033 + return;
18034 + }
18035 +
18036 + while (sp) {
18037 + if ((cp = strchr(sp, '\\'))) {
18038 + switch (*(cp + 1)) {
18039 +
18040 + case 'n' :
18041 + *cp++ = '\n';
18042 + *cp++ = 0;
18043 + break;
18044 +
18045 + case 't' :
18046 + *cp++ = '\t';
18047 + *cp++ = 0;
18048 + break;
18049 +
18050 + default :
18051 + if (*(cp + 1) == 0) {
18052 + klib_error = KLE_BAD_STRING;
18053 + return;
18054 + }
18055 + /* Change the '\' character to a zero
18056 + * and then print the string (the rest
18057 + * of the string will be picked
18058 + * up on the next pass).
18059 + */
18060 + *cp++ = 0;
18061 + break;
18062 + }
18063 + kdb_printf("%s", sp);
18064 + sp = cp;
18065 + } else {
18066 + kdb_printf("%s", sp);
18067 + sp = 0;
18068 + }
18069 + }
18070 +}
18071 +
18072 +/*
18073 + * print_eval_results()
18074 + */
18075 +int
18076 +print_eval_results(node_t *np, int flags)
18077 +{
18078 + int size, i, count, ptr_cnt = 0;
18079 + kaddr_t addr;
18080 + char *typestr;
18081 + kltype_t *kltp, *rkltp = NULL, *nkltp;
18082 + type_t *tp;
18083 +
18084 + /* Print the results
18085 + */
18086 + switch (np->node_type) {
18087 +
18088 + case NUMBER:
18089 + print_number(np, flags);
18090 + break;
18091 +
18092 + case TYPE_DEF: {
18093 +
18094 + /* First, determine the number of levels of indirection
18095 + * by determining the number of pointer type records.
18096 + */
18097 + if ((tp = np->type)) {
18098 + while (tp && (tp->flag == POINTER_FLAG)) {
18099 + ptr_cnt++;
18100 + tp = tp->t_next;
18101 + }
18102 + if (tp) {
18103 + rkltp = tp->t_kltp;
18104 + }
18105 + }
18106 + if (!rkltp) {
18107 + kdb_printf("Type information not available\n");
18108 + return(1);
18109 + }
18110 +
18111 + if (ptr_cnt) {
18112 +
18113 + /* If this is a member, we need to get the
18114 + * first type record.
18115 + */
18116 + if (rkltp->kl_type == KLT_MEMBER) {
18117 + /* We need to get down to the first
18118 + * real type record...
18119 + */
18120 + rkltp = rkltp->kl_realtype;
18121 + }
18122 +
18123 + /* step over any KLT_POINTER type records.
18124 + */
18125 + while (rkltp && rkltp->kl_type == KLT_POINTER) {
18126 + rkltp = rkltp->kl_realtype;
18127 + }
18128 + if (!rkltp) {
18129 + kdb_printf("Bad type information\n");
18130 + return(1);
18131 + }
18132 + typestr = rkltp->kl_typestr;
18133 + if (rkltp->kl_type == KLT_FUNCTION) {
18134 + kdb_printf("%s(", typestr);
18135 + } else if (rkltp->kl_type == KLT_ARRAY) {
18136 + kdb_printf("(%s(", typestr);
18137 + } else {
18138 + kdb_printf("(%s", typestr);
18139 + }
18140 + for (i = 0; i < ptr_cnt; i++) {
18141 + kdb_printf("*");
18142 + }
18143 + if (rkltp->kl_type == KLT_FUNCTION) {
18144 + kdb_printf(")(");
18145 + } else if (rkltp->kl_type == KLT_ARRAY) {
18146 + kdb_printf(")");
18147 +
18148 + nkltp = rkltp;
18149 + while (nkltp->kl_type == KLT_ARRAY) {
18150 + count = nkltp->kl_high_bounds -
18151 + nkltp->kl_low_bounds + 1;
18152 + kdb_printf("[%d]", count);
18153 + nkltp = nkltp->kl_elementtype;
18154 + }
18155 + }
18156 + kdb_printf(") ");
18157 + kdb_printf("0x%llx", np->value);
18158 +
18159 + if (ptr_cnt > 1) {
18160 + break;
18161 + }
18162 +
18163 + if ((rkltp->kl_type == KLT_BASE) &&
18164 + rkltp->kl_encoding == ENC_CHAR) {
18165 + kdb_printf(" = ");
18166 + print_string(np->value, 0);
18167 + }
18168 + break;
18169 + }
18170 + if (np->flags & KLTYPE_FLAG) {
18171 + void * ptr;
18172 +
18173 + /* Get the type information. It's possible
18174 + * that the type is a member. In which case,
18175 + * the size may only be from this record
18176 + * (which would be the casse if this is an
18177 + * array). We must check the original type
18178 + * record first, and try the realtype record
18179 + * if the value is zero.
18180 + */
18181 + kltp = np->type->t_kltp;
18182 +
18183 + if (kltp->kl_type == KLT_MEMBER) {
18184 + rkltp = kltp->kl_realtype;
18185 + } else {
18186 + rkltp = kltp;
18187 + }
18188 +
18189 + /* Check to see if this is a typedef. If
18190 + * it is, then it might be a typedef for
18191 + * a pointer type. Don't walk to the last
18192 + * type record.
18193 + */
18194 + while (rkltp->kl_type == KLT_TYPEDEF) {
18195 + rkltp = rkltp->kl_realtype;
18196 + }
18197 +
18198 + if (rkltp->kl_type == KLT_POINTER) {
18199 + kdb_printf("0x%llx", np->value);
18200 + break;
18201 + }
18202 + if((rkltp->kl_name != 0) &&
18203 + !(strcmp(rkltp->kl_name, "void"))) {
18204 + /* we are about to dereference
18205 + * a void pointer.
18206 + */
18207 + kdb_printf("Can't dereference a "
18208 + "generic pointer.\n");
18209 + return(1);
18210 + }
18211 +
18212 + size = rkltp->kl_size;
18213 + if (!size || (size < 0)) {
18214 + size = kltp->kl_size;
18215 + }
18216 +
18217 + if(rkltp->kl_type==KLT_ARRAY) {
18218 + size = rkltp->kl_high_bounds -
18219 + rkltp->kl_low_bounds + 1;
18220 + if(rkltp->kl_elementtype == NULL){
18221 + kdb_printf("Incomplete array"
18222 + " type.\n");
18223 + return(1);
18224 + }
18225 + if(rkltp->kl_elementtype->kl_type ==
18226 + KLT_POINTER){
18227 + size *= sizeof(void *);
18228 + } else {
18229 + size *= rkltp->kl_elementtype->kl_size;
18230 + }
18231 + }
18232 + if(size){
18233 + ptr = kl_alloc_block(size);
18234 + } else {
18235 + ptr = NULL;
18236 + }
18237 + if ((rkltp->kl_type == KLT_BASE) &&
18238 + !(np->flags & ADDRESS_FLAG)) {
18239 + switch (size) {
18240 + case 1:
18241 + *(unsigned char *)ptr =
18242 + np->value;
18243 + break;
18244 +
18245 + case 2:
18246 + *(unsigned short *)ptr =
18247 + np->value;
18248 + break;
18249 +
18250 + case 4:
18251 + *(unsigned int *)ptr =
18252 + np->value;
18253 + break;
18254 +
18255 + case 8:
18256 + *(unsigned long long *)
18257 + ptr = np->value;
18258 + break;
18259 + }
18260 + kl_print_type(ptr, rkltp, 0,
18261 + flags|SUPPRESS_NAME);
18262 + kl_free_block(ptr);
18263 + return(1);
18264 + }
18265 +
18266 + if(size){
18267 + addr = np->address;
18268 + if (invalid_address(addr, size)) {
18269 + kdb_printf (
18270 + "invalid address %#lx\n",
18271 + addr);
18272 + return 1;
18273 + }
18274 + kl_get_block(addr, size, (void *)ptr,
18275 + (void *)0);
18276 + if (KL_ERROR) {
18277 + kl_print_error();
18278 + kl_free_block(ptr);
18279 + return(1);
18280 + }
18281 + }
18282 + /* Print out the actual type
18283 + */
18284 + switch (rkltp->kl_type) {
18285 + case KLT_STRUCT:
18286 + case KLT_UNION:
18287 + kl_print_type(ptr, rkltp, 0,
18288 + flags);
18289 + break;
18290 +
18291 + case KLT_ARRAY:
18292 + kl_print_type(ptr, rkltp, 0,
18293 + flags| SUPPRESS_NAME);
18294 + break;
18295 +
18296 + default:
18297 + kl_print_type(ptr, rkltp, 0,
18298 + (flags|
18299 + SUPPRESS_NAME|
18300 + SUPPRESS_NL));
18301 + break;
18302 + }
18303 + if(ptr){
18304 + kl_free_block(ptr);
18305 + }
18306 + }
18307 + break;
18308 + }
18309 +
18310 + case VADDR:
18311 + /* If we get here, there was no type info available.
18312 + * The ADDRESS_FLAG should be set (otherwise we
18313 + * would have returned an error). So, print out
18314 + * the address.
18315 + */
18316 + kdb_printf("0x%lx", np->address);
18317 + break;
18318 +
18319 + default:
18320 + if (np->node_type == TEXT) {
18321 + kl_print_string(np->name);
18322 + if (KL_ERROR) {
18323 + kl_print_error();
18324 + return(1);
18325 + }
18326 + } else if (np->node_type == CHARACTER) {
18327 + kdb_printf("\'%c\'", (char)np->value);
18328 + }
18329 + break;
18330 + }
18331 + return(0);
18332 +}
18333 +
18334 +/*
18335 + * print_eval_error()
18336 + */
18337 +void
18338 +print_eval_error(
18339 + char *cmdname,
18340 + char *s,
18341 + char *bad_ptr,
18342 + uint64_t error,
18343 + int flags)
18344 +{
18345 + int i, cmd_len;
18346 +
18347 + kdb_printf("%s %s\n", cmdname, s);
18348 + cmd_len = strlen(cmdname);
18349 +
18350 + if (!bad_ptr) {
18351 + for (i = 0; i < (strlen(s) + cmd_len); i++) {
18352 + kdb_printf(" ");
18353 + }
18354 + } else {
18355 + for (i = 0; i < (bad_ptr - s + 1 + cmd_len); i++) {
18356 + kdb_printf(" ");
18357 + }
18358 + }
18359 + kdb_printf("^ ");
18360 + switch (error) {
18361 + case E_OPEN_PAREN :
18362 + kdb_printf("Too many open parenthesis\n");
18363 + break;
18364 +
18365 + case E_CLOSE_PAREN :
18366 + kdb_printf("Too many close parenthesis\n");
18367 + break;
18368 +
18369 + case E_BAD_STRUCTURE :
18370 + kdb_printf("Invalid structure\n");
18371 + break;
18372 +
18373 + case E_MISSING_STRUCTURE :
18374 + kdb_printf("Missing structure\n");
18375 + break;
18376 +
18377 + case E_BAD_MEMBER :
18378 + kdb_printf("No such member\n");
18379 + break;
18380 +
18381 + case E_BAD_OPERATOR :
18382 + kdb_printf("Invalid operator\n");
18383 + break;
18384 +
18385 + case E_MISSING_OPERAND :
18386 + kdb_printf("Missing operand\n");
18387 + break;
18388 +
18389 + case E_BAD_OPERAND :
18390 + kdb_printf("Invalid operand\n");
18391 + break;
18392 +
18393 + case E_BAD_TYPE :
18394 + kdb_printf("Invalid type\n");
18395 + if (!have_debug_file) {
18396 + kdb_printf("no debuginfo file\n");
18397 + return;
18398 + }
18399 + break;
18400 +
18401 + case E_NOTYPE :
18402 + kdb_printf("Could not find type information\n");
18403 + break;
18404 +
18405 + case E_BAD_POINTER :
18406 + kdb_printf("Invalid pointer\n");
18407 + break;
18408 +
18409 + case E_BAD_INDEX :
18410 + kdb_printf("Invalid array index\n");
18411 + break;
18412 +
18413 + case E_BAD_CHAR :
18414 + kdb_printf("Invalid character value\n");
18415 + break;
18416 +
18417 + case E_BAD_STRING :
18418 + kdb_printf("Non-termining string\n");
18419 + break;
18420 +
18421 + case E_END_EXPECTED :
18422 + kdb_printf(
18423 + "Expected end of print statement\n");
18424 + break;
18425 +
18426 + case E_BAD_EVAR :
18427 + kdb_printf("Invalid eval variable\n");
18428 + break;
18429 +
18430 + case E_BAD_VALUE :
18431 + kdb_printf("Invalid value\n");
18432 + break;
18433 +
18434 + case E_NO_VALUE :
18435 + kdb_printf("No value supplied\n");
18436 + break;
18437 +
18438 + case E_DIVIDE_BY_ZERO :
18439 + kdb_printf("Divide by zero\n");
18440 + break;
18441 +
18442 + case E_BAD_CAST :
18443 + kdb_printf("Invalid cast\n");
18444 + break;
18445 +
18446 + case E_NO_ADDRESS :
18447 + kdb_printf("Not an address\n");
18448 + break;
18449 +
18450 + case E_SINGLE_QUOTE :
18451 + kdb_printf("Missing single quote\n");
18452 + break;
18453 +
18454 + case E_BAD_WHATIS :
18455 + kdb_printf("Invalid whatis Operation\n");
18456 + break;
18457 +
18458 + case E_NOT_IMPLEMENTED :
18459 + kdb_printf("Not implemented\n");
18460 + break;
18461 +
18462 + default :
18463 + kdb_printf("Syntax error\n");
18464 + break;
18465 + }
18466 +}
18467 +
18468 +/*
18469 + * single_type()
18470 + */
18471 +void
18472 +single_type(char *str)
18473 +{
18474 + char buffer[256], *type_name;
18475 + kltype_t *kltp;
18476 + syment_t *sp;
18477 +
18478 + type_name = buffer;
18479 + strcpy(type_name, str);
18480 +
18481 + if (have_debug_file) {
18482 + if ((kltp = kl_find_type(type_name, KLT_TYPE))) {
18483 + kl_print_type((void *)NULL, kltp, 0, C_SHOWOFFSET);
18484 + return;
18485 + }
18486 + if ((kltp = kl_find_type(type_name, KLT_TYPEDEF))) {
18487 + kdb_printf ("typedef %s:\n", type_name);
18488 + kl_print_type((void *)NULL, kltp, 0, C_SHOWOFFSET);
18489 + return;
18490 + }
18491 + }
18492 + if ((sp = kl_lkup_symname(type_name))) {
18493 + kdb_printf ("symbol %s value: %#lx\n", str, sp->s_addr);
18494 + kl_free_block((void *)sp);
18495 + return;
18496 + }
18497 + kdb_printf("could not find type or symbol information for %s\n",
18498 + type_name);
18499 + return;
18500 +}
18501 +
18502 +/*
18503 + * sizeof_type()
18504 + */
18505 +void
18506 +sizeof_type(char *str)
18507 +{
18508 + char buffer[256], *type_name;
18509 + kltype_t *kltp;
18510 +
18511 + type_name = buffer;
18512 + strcpy(type_name, str);
18513 +
18514 + if ((kltp = kl_find_type(type_name, KLT_TYPE))) {
18515 + kdb_printf ("%s %d %#x\n", kltp->kl_typestr,
18516 + kltp->kl_size, kltp->kl_size);
18517 + return;
18518 + }
18519 + if ((kltp = kl_find_type(type_name, KLT_TYPEDEF))) {
18520 + kdb_printf ("%s %d %#x\n", kltp->kl_typestr,
18521 + kltp->kl_size, kltp->kl_size);
18522 + return;
18523 + }
18524 + kdb_printf("could not find type information for %s\n", type_name);
18525 +}
18526 +
18527 +EXPORT_SYMBOL(have_debug_file);
18528 +EXPORT_SYMBOL(type_tree);
18529 +EXPORT_SYMBOL(typedef_tree);
18530 +
18531 +#if defined(CONFIG_X86_32)
18532 +/* needed for i386: */
18533 +#include <linux/types.h>
18534 +#include <asm/div64.h>
18535 +/*
18536 + * Generic C version of full 64 bit by 64 bit division
18537 + *
18538 + * This program is free software; you can redistribute it and/or
18539 + * modify it under the terms of the GNU General Public License
18540 + * version 2 as published by the Free Software Foundation.
18541 + *
18542 + * Code generated for this function might be very inefficient
18543 + * for some CPUs, can be overridden by linking arch-specific
18544 + * assembly versions such as arch/sparc/lib/udivdi.S
18545 + */
18546 +uint64_t
18547 +__udivdi3(uint64_t dividend, uint64_t divisor)
18548 +{
18549 + uint32_t d = divisor;
18550 + /* Scale divisor to 32 bits */
18551 + if (divisor > 0xffffffffULL) {
18552 + unsigned int shift = fls(divisor >> 32);
18553 + d = divisor >> shift;
18554 + dividend >>= shift;
18555 + }
18556 + /* avoid 64 bit division if possible */
18557 + if (dividend >> 32)
18558 + do_div(dividend, d);
18559 + else
18560 + dividend = (uint32_t) dividend / d;
18561 + return dividend;
18562 +}
18563 +
18564 +int64_t
18565 +__divdi3(int64_t dividend, int64_t divisor)
18566 +{
18567 + int32_t d = divisor;
18568 + /* Scale divisor to 32 bits */
18569 + if (divisor > 0xffffffffLL) {
18570 + unsigned int shift = fls(divisor >> 32);
18571 + d = divisor >> shift;
18572 + dividend >>= shift;
18573 + }
18574 + /* avoid 64 bit division if possible */
18575 + if (dividend >> 32)
18576 + do_div(dividend, d);
18577 + else
18578 + dividend = (int32_t) dividend / d;
18579 + return dividend;
18580 +}
18581 +
18582 +uint64_t
18583 +__umoddi3(uint64_t dividend, uint64_t divisor)
18584 +{
18585 + return dividend - (__udivdi3(dividend, divisor) * divisor);
18586 +}
18587 +
18588 +int64_t
18589 +__moddi3(int64_t dividend, int64_t divisor)
18590 +{
18591 + return dividend - (__divdi3(dividend, divisor) * divisor);
18592 +}
18593 +#endif /* CONFIG_x86_32 */
18594 --- /dev/null
18595 +++ b/kdb/kdbmain.c
18596 @@ -0,0 +1,4333 @@
18597 +/*
18598 + * Kernel Debugger Architecture Independent Main Code
18599 + *
18600 + * This file is subject to the terms and conditions of the GNU General Public
18601 + * License. See the file "COPYING" in the main directory of this archive
18602 + * for more details.
18603 + *
18604 + * Copyright (C) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
18605 + * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
18606 + * Xscale (R) modifications copyright (C) 2003 Intel Corporation.
18607 + */
18608 +
18609 +/*
18610 + * Updated for Xscale (R) architecture support
18611 + * Eddie Dong <eddie.dong@intel.com> 8 Jan 03
18612 + */
18613 +
18614 +#include <linux/ctype.h>
18615 +#include <linux/string.h>
18616 +#include <linux/kernel.h>
18617 +#include <linux/reboot.h>
18618 +#include <linux/sched.h>
18619 +#include <linux/sysrq.h>
18620 +#include <linux/smp.h>
18621 +#include <linux/utsname.h>
18622 +#include <linux/vmalloc.h>
18623 +#include <linux/module.h>
18624 +#include <linux/mm.h>
18625 +#include <linux/init.h>
18626 +#include <linux/kallsyms.h>
18627 +#include <linux/kdb.h>
18628 +#include <linux/kdbprivate.h>
18629 +#include <linux/notifier.h>
18630 +#include <linux/interrupt.h>
18631 +#include <linux/delay.h>
18632 +#include <linux/nmi.h>
18633 +#include <linux/ptrace.h>
18634 +#include <linux/sysctl.h>
18635 +#if defined(CONFIG_LKCD_DUMP) || defined(CONFIG_LKCD_DUMP_MODULE)
18636 +#include <linux/dump.h>
18637 +#endif
18638 +#include <linux/cpu.h>
18639 +#include <linux/kdebug.h>
18640 +#ifdef CONFIG_KDB_KDUMP
18641 +#include <linux/kexec.h>
18642 +#endif
18643 +
18644 +#include <acpi/acpi_bus.h>
18645 +
18646 +#include <asm/system.h>
18647 +#include <asm/kdebug.h>
18648 +#include <linux/proc_fs.h>
18649 +#include <asm/uaccess.h>
18650 +char kdb_debug_info_filename[256] = {""};
18651 +EXPORT_SYMBOL(kdb_debug_info_filename);
18652 +#define GREP_LEN 256
18653 +char kdb_grep_string[GREP_LEN];
18654 +int kdb_grepping_flag;
18655 +EXPORT_SYMBOL(kdb_grepping_flag);
18656 +int kdb_grep_leading;
18657 +int kdb_grep_trailing;
18658 +
18659 +/*
18660 + * Kernel debugger state flags
18661 + */
18662 +volatile int kdb_flags;
18663 +atomic_t kdb_event;
18664 +atomic_t kdb_8250;
18665 +
18666 +/*
18667 + * kdb_lock protects updates to kdb_initial_cpu. Used to
18668 + * single thread processors through the kernel debugger.
18669 + */
18670 +static DEFINE_SPINLOCK(kdb_lock);
18671 +volatile int kdb_initial_cpu = -1; /* cpu number that owns kdb */
18672 +int kdb_seqno = 2; /* how many times kdb has been entered */
18673 +
18674 +volatile int kdb_nextline = 1;
18675 +static volatile int kdb_new_cpu; /* Which cpu to switch to */
18676 +
18677 +volatile int kdb_state[NR_CPUS]; /* Per cpu state */
18678 +
18679 +const struct task_struct *kdb_current_task;
18680 +EXPORT_SYMBOL(kdb_current_task);
18681 +struct pt_regs *kdb_current_regs;
18682 +
18683 +#ifdef CONFIG_KDB_OFF
18684 +int kdb_on = 0; /* Default is off */
18685 +#else
18686 +int kdb_on = 1; /* Default is on */
18687 +#endif /* CONFIG_KDB_OFF */
18688 +
18689 +const char *kdb_diemsg;
18690 +static int kdb_go_count;
18691 +#ifdef CONFIG_KDB_CONTINUE_CATASTROPHIC
18692 +static unsigned int kdb_continue_catastrophic = CONFIG_KDB_CONTINUE_CATASTROPHIC;
18693 +#else
18694 +static unsigned int kdb_continue_catastrophic = 0;
18695 +#endif
18696 +
18697 +#ifdef kdba_setjmp
18698 + /*
18699 + * Must have a setjmp buffer per CPU. Switching cpus will
18700 + * cause the jump buffer to be setup for the new cpu, and
18701 + * subsequent switches (and pager aborts) will use the
18702 + * appropriate per-processor values.
18703 + */
18704 +kdb_jmp_buf *kdbjmpbuf;
18705 +#endif /* kdba_setjmp */
18706 +
18707 + /*
18708 + * kdb_commands describes the available commands.
18709 + */
18710 +static kdbtab_t *kdb_commands;
18711 +static int kdb_max_commands;
18712 +
18713 +typedef struct _kdbmsg {
18714 + int km_diag; /* kdb diagnostic */
18715 + char *km_msg; /* Corresponding message text */
18716 +} kdbmsg_t;
18717 +
18718 +#define KDBMSG(msgnum, text) \
18719 + { KDB_##msgnum, text }
18720 +
18721 +static kdbmsg_t kdbmsgs[] = {
18722 + KDBMSG(NOTFOUND,"Command Not Found"),
18723 + KDBMSG(ARGCOUNT, "Improper argument count, see usage."),
18724 + KDBMSG(BADWIDTH, "Illegal value for BYTESPERWORD use 1, 2, 4 or 8, 8 is only allowed on 64 bit systems"),
18725 + KDBMSG(BADRADIX, "Illegal value for RADIX use 8, 10 or 16"),
18726 + KDBMSG(NOTENV, "Cannot find environment variable"),
18727 + KDBMSG(NOENVVALUE, "Environment variable should have value"),
18728 + KDBMSG(NOTIMP, "Command not implemented"),
18729 + KDBMSG(ENVFULL, "Environment full"),
18730 + KDBMSG(ENVBUFFULL, "Environment buffer full"),
18731 + KDBMSG(TOOMANYBPT, "Too many breakpoints defined"),
18732 +#ifdef CONFIG_CPU_XSCALE
18733 + KDBMSG(TOOMANYDBREGS, "More breakpoints than ibcr registers defined"),
18734 +#else
18735 + KDBMSG(TOOMANYDBREGS, "More breakpoints than db registers defined"),
18736 +#endif
18737 + KDBMSG(DUPBPT, "Duplicate breakpoint address"),
18738 + KDBMSG(BPTNOTFOUND, "Breakpoint not found"),
18739 + KDBMSG(BADMODE, "Invalid IDMODE"),
18740 + KDBMSG(BADINT, "Illegal numeric value"),
18741 + KDBMSG(INVADDRFMT, "Invalid symbolic address format"),
18742 + KDBMSG(BADREG, "Invalid register name"),
18743 + KDBMSG(BADCPUNUM, "Invalid cpu number"),
18744 + KDBMSG(BADLENGTH, "Invalid length field"),
18745 + KDBMSG(NOBP, "No Breakpoint exists"),
18746 + KDBMSG(BADADDR, "Invalid address"),
18747 +};
18748 +#undef KDBMSG
18749 +
18750 +static const int __nkdb_err = sizeof(kdbmsgs) / sizeof(kdbmsg_t);
18751 +
18752 +
18753 +/*
18754 + * Initial environment. This is all kept static and local to
18755 + * this file. We don't want to rely on the memory allocation
18756 + * mechanisms in the kernel, so we use a very limited allocate-only
18757 + * heap for new and altered environment variables. The entire
18758 + * environment is limited to a fixed number of entries (add more
18759 + * to __env[] if required) and a fixed amount of heap (add more to
18760 + * KDB_ENVBUFSIZE if required).
18761 + */
18762 +
18763 +static char *__env[] = {
18764 +#if defined(CONFIG_SMP)
18765 + "PROMPT=[%d]kdb> ",
18766 + "MOREPROMPT=[%d]more> ",
18767 +#else
18768 + "PROMPT=kdb> ",
18769 + "MOREPROMPT=more> ",
18770 +#endif
18771 + "RADIX=16",
18772 + "LINES=24",
18773 + "COLUMNS=80",
18774 + "MDCOUNT=8", /* lines of md output */
18775 + "BTARGS=9", /* 9 possible args in bt */
18776 + KDB_PLATFORM_ENV,
18777 + "DTABCOUNT=30",
18778 + "NOSECT=1",
18779 + (char *)0,
18780 + (char *)0,
18781 + (char *)0,
18782 + (char *)0,
18783 + (char *)0,
18784 + (char *)0,
18785 + (char *)0,
18786 + (char *)0,
18787 + (char *)0,
18788 + (char *)0,
18789 + (char *)0,
18790 + (char *)0,
18791 + (char *)0,
18792 + (char *)0,
18793 + (char *)0,
18794 + (char *)0,
18795 + (char *)0,
18796 + (char *)0,
18797 + (char *)0,
18798 + (char *)0,
18799 + (char *)0,
18800 + (char *)0,
18801 + (char *)0,
18802 +};
18803 +
18804 +static const int __nenv = (sizeof(__env) / sizeof(char *));
18805 +
18806 +/* external commands: */
18807 +int kdb_debuginfo_print(int argc, const char **argv);
18808 +int kdb_pxhelp(int argc, const char **argv);
18809 +int kdb_walkhelp(int argc, const char **argv);
18810 +int kdb_walk(int argc, const char **argv);
18811 +
18812 +/*
18813 + * kdb_serial_str is the sequence that the user must enter on a serial
18814 + * console to invoke kdb. It can be a single character such as "\001"
18815 + * (control-A) or multiple characters such as "\eKDB". NOTE: All except the
18816 + * last character are passed through to the application reading from the serial
18817 + * console.
18818 + *
18819 + * I tried to make the sequence a CONFIG_ option but most of CML1 cannot cope
18820 + * with '\' in strings. CML2 would have been able to do it but we lost CML2.
18821 + * KAO.
18822 + */
18823 +const char kdb_serial_str[] = "\eKDB";
18824 +EXPORT_SYMBOL(kdb_serial_str);
18825 +
18826 +struct task_struct *
18827 +kdb_curr_task(int cpu)
18828 +{
18829 + struct task_struct *p = curr_task(cpu);
18830 +#ifdef _TIF_MCA_INIT
18831 + struct kdb_running_process *krp = kdb_running_process + cpu;
18832 + if ((task_thread_info(p)->flags & _TIF_MCA_INIT) && krp->p)
18833 + p = krp->p;
18834 +#endif
18835 + return p;
18836 +}
18837 +
18838 +/*
18839 + * kdbgetenv
18840 + *
18841 + * This function will return the character string value of
18842 + * an environment variable.
18843 + *
18844 + * Parameters:
18845 + * match A character string representing an environment variable.
18846 + * Outputs:
18847 + * None.
18848 + * Returns:
18849 + * NULL No environment variable matches 'match'
18850 + * char* Pointer to string value of environment variable.
18851 + * Locking:
18852 + * No locking considerations required.
18853 + * Remarks:
18854 + */
18855 +char *
18856 +kdbgetenv(const char *match)
18857 +{
18858 + char **ep = __env;
18859 + int matchlen = strlen(match);
18860 + int i;
18861 +
18862 + for(i=0; i<__nenv; i++) {
18863 + char *e = *ep++;
18864 +
18865 + if (!e) continue;
18866 +
18867 + if ((strncmp(match, e, matchlen) == 0)
18868 + && ((e[matchlen] == '\0')
18869 + ||(e[matchlen] == '='))) {
18870 + char *cp = strchr(e, '=');
18871 + return (cp ? ++cp :"");
18872 + }
18873 + }
18874 + return NULL;
18875 +}
18876 +
18877 +/*
18878 + * kdballocenv
18879 + *
18880 + * This function is used to allocate bytes for environment entries.
18881 + *
18882 + * Parameters:
18883 + * match A character string representing a numeric value
18884 + * Outputs:
18885 + * *value the unsigned long represntation of the env variable 'match'
18886 + * Returns:
18887 + * Zero on success, a kdb diagnostic on failure.
18888 + * Locking:
18889 + * No locking considerations required. Must be called with all
18890 + * processors halted.
18891 + * Remarks:
18892 + * We use a static environment buffer (envbuffer) to hold the values
18893 + * of dynamically generated environment variables (see kdb_set). Buffer
18894 + * space once allocated is never free'd, so over time, the amount of space
18895 + * (currently 512 bytes) will be exhausted if env variables are changed
18896 + * frequently.
18897 + */
18898 +static char *
18899 +kdballocenv(size_t bytes)
18900 +{
18901 +#define KDB_ENVBUFSIZE 512
18902 + static char envbuffer[KDB_ENVBUFSIZE];
18903 + static int envbufsize;
18904 + char *ep = NULL;
18905 +
18906 + if ((KDB_ENVBUFSIZE - envbufsize) >= bytes) {
18907 + ep = &envbuffer[envbufsize];
18908 + envbufsize += bytes;
18909 + }
18910 + return ep;
18911 +}
18912 +
18913 +/*
18914 + * kdbgetulenv
18915 + *
18916 + * This function will return the value of an unsigned long-valued
18917 + * environment variable.
18918 + *
18919 + * Parameters:
18920 + * match A character string representing a numeric value
18921 + * Outputs:
18922 + * *value the unsigned long represntation of the env variable 'match'
18923 + * Returns:
18924 + * Zero on success, a kdb diagnostic on failure.
18925 + * Locking:
18926 + * No locking considerations required.
18927 + * Remarks:
18928 + */
18929 +
18930 +static int
18931 +kdbgetulenv(const char *match, unsigned long *value)
18932 +{
18933 + char *ep;
18934 +
18935 + ep = kdbgetenv(match);
18936 + if (!ep) return KDB_NOTENV;
18937 + if (strlen(ep) == 0) return KDB_NOENVVALUE;
18938 +
18939 + *value = simple_strtoul(ep, NULL, 0);
18940 +
18941 + return 0;
18942 +}
18943 +
18944 +/*
18945 + * kdbgetintenv
18946 + *
18947 + * This function will return the value of an integer-valued
18948 + * environment variable.
18949 + *
18950 + * Parameters:
18951 + * match A character string representing an integer-valued env variable
18952 + * Outputs:
18953 + * *value the integer representation of the environment variable 'match'
18954 + * Returns:
18955 + * Zero on success, a kdb diagnostic on failure.
18956 + * Locking:
18957 + * No locking considerations required.
18958 + * Remarks:
18959 + */
18960 +
18961 +int
18962 +kdbgetintenv(const char *match, int *value) {
18963 + unsigned long val;
18964 + int diag;
18965 +
18966 + diag = kdbgetulenv(match, &val);
18967 + if (!diag) {
18968 + *value = (int) val;
18969 + }
18970 + return diag;
18971 +}
18972 +
18973 +/*
18974 + * kdbgetularg
18975 + *
18976 + * This function will convert a numeric string
18977 + * into an unsigned long value.
18978 + *
18979 + * Parameters:
18980 + * arg A character string representing a numeric value
18981 + * Outputs:
18982 + * *value the unsigned long represntation of arg.
18983 + * Returns:
18984 + * Zero on success, a kdb diagnostic on failure.
18985 + * Locking:
18986 + * No locking considerations required.
18987 + * Remarks:
18988 + */
18989 +
18990 +int
18991 +kdbgetularg(const char *arg, unsigned long *value)
18992 +{
18993 + char *endp;
18994 + unsigned long val;
18995 +
18996 + val = simple_strtoul(arg, &endp, 0);
18997 +
18998 + if (endp == arg) {
18999 + /*
19000 + * Try base 16, for us folks too lazy to type the
19001 + * leading 0x...
19002 + */
19003 + val = simple_strtoul(arg, &endp, 16);
19004 + if (endp == arg)
19005 + return KDB_BADINT;
19006 + }
19007 +
19008 + *value = val;
19009 +
19010 + return 0;
19011 +}
19012 +
19013 +/*
19014 + * kdb_set
19015 + *
19016 + * This function implements the 'set' command. Alter an existing
19017 + * environment variable or create a new one.
19018 + *
19019 + * Inputs:
19020 + * argc argument count
19021 + * argv argument vector
19022 + * Outputs:
19023 + * None.
19024 + * Returns:
19025 + * zero for success, a kdb diagnostic if error
19026 + * Locking:
19027 + * none.
19028 + * Remarks:
19029 + */
19030 +
19031 +static int
19032 +kdb_set(int argc, const char **argv)
19033 +{
19034 + int i;
19035 + char *ep;
19036 + size_t varlen, vallen;
19037 +
19038 + /*
19039 + * we can be invoked two ways:
19040 + * set var=value argv[1]="var", argv[2]="value"
19041 + * set var = value argv[1]="var", argv[2]="=", argv[3]="value"
19042 + * - if the latter, shift 'em down.
19043 + */
19044 + if (argc == 3) {
19045 + argv[2] = argv[3];
19046 + argc--;
19047 + }
19048 +
19049 + if (argc != 2)
19050 + return KDB_ARGCOUNT;
19051 +
19052 + /*
19053 + * Check for internal variables
19054 + */
19055 + if (strcmp(argv[1], "KDBDEBUG") == 0) {
19056 + unsigned int debugflags;
19057 + char *cp;
19058 +
19059 + debugflags = simple_strtoul(argv[2], &cp, 0);
19060 + if (cp == argv[2] || debugflags & ~KDB_DEBUG_FLAG_MASK) {
19061 + kdb_printf("kdb: illegal debug flags '%s'\n",
19062 + argv[2]);
19063 + return 0;
19064 + }
19065 + kdb_flags = (kdb_flags & ~(KDB_DEBUG_FLAG_MASK << KDB_DEBUG_FLAG_SHIFT))
19066 + | (debugflags << KDB_DEBUG_FLAG_SHIFT);
19067 +
19068 + return 0;
19069 + }
19070 +
19071 + /*
19072 + * Tokenizer squashed the '=' sign. argv[1] is variable
19073 + * name, argv[2] = value.
19074 + */
19075 + varlen = strlen(argv[1]);
19076 + vallen = strlen(argv[2]);
19077 + ep = kdballocenv(varlen + vallen + 2);
19078 + if (ep == (char *)0)
19079 + return KDB_ENVBUFFULL;
19080 +
19081 + sprintf(ep, "%s=%s", argv[1], argv[2]);
19082 +
19083 + ep[varlen+vallen+1]='\0';
19084 +
19085 + for(i=0; i<__nenv; i++) {
19086 + if (__env[i]
19087 + && ((strncmp(__env[i], argv[1], varlen)==0)
19088 + && ((__env[i][varlen] == '\0')
19089 + || (__env[i][varlen] == '=')))) {
19090 + __env[i] = ep;
19091 + return 0;
19092 + }
19093 + }
19094 +
19095 + /*
19096 + * Wasn't existing variable. Fit into slot.
19097 + */
19098 + for(i=0; i<__nenv-1; i++) {
19099 + if (__env[i] == (char *)0) {
19100 + __env[i] = ep;
19101 + return 0;
19102 + }
19103 + }
19104 +
19105 + return KDB_ENVFULL;
19106 +}
19107 +
19108 +static int
19109 +kdb_check_regs(void)
19110 +{
19111 + if (!kdb_current_regs) {
19112 + kdb_printf("No current kdb registers."
19113 + " You may need to select another task\n");
19114 + return KDB_BADREG;
19115 + }
19116 + return 0;
19117 +}
19118 +
19119 +/*
19120 + * kdbgetaddrarg
19121 + *
19122 + * This function is responsible for parsing an
19123 + * address-expression and returning the value of
19124 + * the expression, symbol name, and offset to the caller.
19125 + *
19126 + * The argument may consist of a numeric value (decimal or
19127 + * hexidecimal), a symbol name, a register name (preceeded
19128 + * by the percent sign), an environment variable with a numeric
19129 + * value (preceeded by a dollar sign) or a simple arithmetic
19130 + * expression consisting of a symbol name, +/-, and a numeric
19131 + * constant value (offset).
19132 + *
19133 + * Parameters:
19134 + * argc - count of arguments in argv
19135 + * argv - argument vector
19136 + * *nextarg - index to next unparsed argument in argv[]
19137 + * regs - Register state at time of KDB entry
19138 + * Outputs:
19139 + * *value - receives the value of the address-expression
19140 + * *offset - receives the offset specified, if any
19141 + * *name - receives the symbol name, if any
19142 + * *nextarg - index to next unparsed argument in argv[]
19143 + *
19144 + * Returns:
19145 + * zero is returned on success, a kdb diagnostic code is
19146 + * returned on error.
19147 + *
19148 + * Locking:
19149 + * No locking requirements.
19150 + *
19151 + * Remarks:
19152 + *
19153 + */
19154 +
19155 +int
19156 +kdbgetaddrarg(int argc, const char **argv, int *nextarg,
19157 + kdb_machreg_t *value, long *offset,
19158 + char **name)
19159 +{
19160 + kdb_machreg_t addr;
19161 + unsigned long off = 0;
19162 + int positive;
19163 + int diag;
19164 + int found = 0;
19165 + char *symname;
19166 + char symbol = '\0';
19167 + char *cp;
19168 + kdb_symtab_t symtab;
19169 +
19170 + /*
19171 + * Process arguments which follow the following syntax:
19172 + *
19173 + * symbol | numeric-address [+/- numeric-offset]
19174 + * %register
19175 + * $environment-variable
19176 + */
19177 +
19178 + if (*nextarg > argc) {
19179 + return KDB_ARGCOUNT;
19180 + }
19181 +
19182 + symname = (char *)argv[*nextarg];
19183 +
19184 + /*
19185 + * If there is no whitespace between the symbol
19186 + * or address and the '+' or '-' symbols, we
19187 + * remember the character and replace it with a
19188 + * null so the symbol/value can be properly parsed
19189 + */
19190 + if ((cp = strpbrk(symname, "+-")) != NULL) {
19191 + symbol = *cp;
19192 + *cp++ = '\0';
19193 + }
19194 +
19195 + if (symname[0] == '$') {
19196 + diag = kdbgetulenv(&symname[1], &addr);
19197 + if (diag)
19198 + return diag;
19199 + } else if (symname[0] == '%') {
19200 + if ((diag = kdb_check_regs()))
19201 + return diag;
19202 + diag = kdba_getregcontents(&symname[1], kdb_current_regs, &addr);
19203 + if (diag)
19204 + return diag;
19205 + } else {
19206 + found = kdbgetsymval(symname, &symtab);
19207 + if (found) {
19208 + addr = symtab.sym_start;
19209 + } else {
19210 + diag = kdbgetularg(argv[*nextarg], &addr);
19211 + if (diag)
19212 + return diag;
19213 + }
19214 + }
19215 +
19216 + if (!found)
19217 + found = kdbnearsym(addr, &symtab);
19218 +
19219 + (*nextarg)++;
19220 +
19221 + if (name)
19222 + *name = symname;
19223 + if (value)
19224 + *value = addr;
19225 + if (offset && name && *name)
19226 + *offset = addr - symtab.sym_start;
19227 +
19228 + if ((*nextarg > argc)
19229 + && (symbol == '\0'))
19230 + return 0;
19231 +
19232 + /*
19233 + * check for +/- and offset
19234 + */
19235 +
19236 + if (symbol == '\0') {
19237 + if ((argv[*nextarg][0] != '+')
19238 + && (argv[*nextarg][0] != '-')) {
19239 + /*
19240 + * Not our argument. Return.
19241 + */
19242 + return 0;
19243 + } else {
19244 + positive = (argv[*nextarg][0] == '+');
19245 + (*nextarg)++;
19246 + }
19247 + } else
19248 + positive = (symbol == '+');
19249 +
19250 + /*
19251 + * Now there must be an offset!
19252 + */
19253 + if ((*nextarg > argc)
19254 + && (symbol == '\0')) {
19255 + return KDB_INVADDRFMT;
19256 + }
19257 +
19258 + if (!symbol) {
19259 + cp = (char *)argv[*nextarg];
19260 + (*nextarg)++;
19261 + }
19262 +
19263 + diag = kdbgetularg(cp, &off);
19264 + if (diag)
19265 + return diag;
19266 +
19267 + if (!positive)
19268 + off = -off;
19269 +
19270 + if (offset)
19271 + *offset += off;
19272 +
19273 + if (value)
19274 + *value += off;
19275 +
19276 + return 0;
19277 +}
19278 +
19279 +static void
19280 +kdb_cmderror(int diag)
19281 +{
19282 + int i;
19283 +
19284 + if (diag >= 0) {
19285 + kdb_printf("no error detected (diagnostic is %d)\n", diag);
19286 + return;
19287 + }
19288 +
19289 + for(i=0; i<__nkdb_err; i++) {
19290 + if (kdbmsgs[i].km_diag == diag) {
19291 + kdb_printf("diag: %d: %s\n", diag, kdbmsgs[i].km_msg);
19292 + return;
19293 + }
19294 + }
19295 +
19296 + kdb_printf("Unknown diag %d\n", -diag);
19297 +}
19298 +
19299 +/*
19300 + * kdb_defcmd, kdb_defcmd2
19301 + *
19302 + * This function implements the 'defcmd' command which defines one
19303 + * command as a set of other commands, terminated by endefcmd.
19304 + * kdb_defcmd processes the initial 'defcmd' command, kdb_defcmd2
19305 + * is invoked from kdb_parse for the following commands until
19306 + * 'endefcmd'.
19307 + *
19308 + * Inputs:
19309 + * argc argument count
19310 + * argv argument vector
19311 + * Outputs:
19312 + * None.
19313 + * Returns:
19314 + * zero for success, a kdb diagnostic if error
19315 + * Locking:
19316 + * none.
19317 + * Remarks:
19318 + */
19319 +
19320 +struct defcmd_set {
19321 + int count;
19322 + int usable;
19323 + char *name;
19324 + char *usage;
19325 + char *help;
19326 + char **command;
19327 +};
19328 +static struct defcmd_set *defcmd_set;
19329 +static int defcmd_set_count;
19330 +static int defcmd_in_progress;
19331 +
19332 +/* Forward references */
19333 +static int kdb_exec_defcmd(int argc, const char **argv);
19334 +
19335 +static int
19336 +kdb_defcmd2(const char *cmdstr, const char *argv0)
19337 +{
19338 + struct defcmd_set *s = defcmd_set + defcmd_set_count - 1;
19339 + char **save_command = s->command;
19340 + if (strcmp(argv0, "endefcmd") == 0) {
19341 + defcmd_in_progress = 0;
19342 + if (!s->count)
19343 + s->usable = 0;
19344 + if (s->usable)
19345 + kdb_register(s->name, kdb_exec_defcmd, s->usage, s->help, 0);
19346 + return 0;
19347 + }
19348 + if (!s->usable)
19349 + return KDB_NOTIMP;
19350 + s->command = kmalloc((s->count + 1) * sizeof(*(s->command)), GFP_KDB);
19351 + if (!s->command) {
19352 + kdb_printf("Could not allocate new kdb_defcmd table for %s\n", cmdstr);
19353 + s->usable = 0;
19354 + return KDB_NOTIMP;
19355 + }
19356 + memcpy(s->command, save_command, s->count * sizeof(*(s->command)));
19357 + s->command[s->count++] = kdb_strdup(cmdstr, GFP_KDB);
19358 + kfree(save_command);
19359 + return 0;
19360 +}
19361 +
19362 +static int
19363 +kdb_defcmd(int argc, const char **argv)
19364 +{
19365 + struct defcmd_set *save_defcmd_set = defcmd_set, *s;
19366 + if (defcmd_in_progress) {
19367 + kdb_printf("kdb: nested defcmd detected, assuming missing endefcmd\n");
19368 + kdb_defcmd2("endefcmd", "endefcmd");
19369 + }
19370 + if (argc == 0) {
19371 + int i;
19372 + for (s = defcmd_set; s < defcmd_set + defcmd_set_count; ++s) {
19373 + kdb_printf("defcmd %s \"%s\" \"%s\"\n", s->name, s->usage, s->help);
19374 + for (i = 0; i < s->count; ++i)
19375 + kdb_printf("%s", s->command[i]);
19376 + kdb_printf("endefcmd\n");
19377 + }
19378 + return 0;
19379 + }
19380 + if (argc != 3)
19381 + return KDB_ARGCOUNT;
19382 + defcmd_set = kmalloc((defcmd_set_count + 1) * sizeof(*defcmd_set), GFP_KDB);
19383 + if (!defcmd_set) {
19384 + kdb_printf("Could not allocate new defcmd_set entry for %s\n", argv[1]);
19385 + defcmd_set = save_defcmd_set;
19386 + return KDB_NOTIMP;
19387 + }
19388 + memcpy(defcmd_set, save_defcmd_set, defcmd_set_count * sizeof(*defcmd_set));
19389 + kfree(save_defcmd_set);
19390 + s = defcmd_set + defcmd_set_count;
19391 + memset(s, 0, sizeof(*s));
19392 + s->usable = 1;
19393 + s->name = kdb_strdup(argv[1], GFP_KDB);
19394 + s->usage = kdb_strdup(argv[2], GFP_KDB);
19395 + s->help = kdb_strdup(argv[3], GFP_KDB);
19396 + if (s->usage[0] == '"') {
19397 + strcpy(s->usage, s->usage+1);
19398 + s->usage[strlen(s->usage)-1] = '\0';
19399 + }
19400 + if (s->help[0] == '"') {
19401 + strcpy(s->help, s->help+1);
19402 + s->help[strlen(s->help)-1] = '\0';
19403 + }
19404 + ++defcmd_set_count;
19405 + defcmd_in_progress = 1;
19406 + return 0;
19407 +}
19408 +
19409 +/*
19410 + * kdb_exec_defcmd
19411 + *
19412 + * Execute the set of commands associated with this defcmd name.
19413 + *
19414 + * Inputs:
19415 + * argc argument count
19416 + * argv argument vector
19417 + * Outputs:
19418 + * None.
19419 + * Returns:
19420 + * zero for success, a kdb diagnostic if error
19421 + * Locking:
19422 + * none.
19423 + * Remarks:
19424 + */
19425 +
19426 +static int
19427 +kdb_exec_defcmd(int argc, const char **argv)
19428 +{
19429 + int i, ret;
19430 + struct defcmd_set *s;
19431 + if (argc != 0)
19432 + return KDB_ARGCOUNT;
19433 + for (s = defcmd_set, i = 0; i < defcmd_set_count; ++i, ++s) {
19434 + if (strcmp(s->name, argv[0]) == 0)
19435 + break;
19436 + }
19437 + if (i == defcmd_set_count) {
19438 + kdb_printf("kdb_exec_defcmd: could not find commands for %s\n", argv[0]);
19439 + return KDB_NOTIMP;
19440 + }
19441 + for (i = 0; i < s->count; ++i) {
19442 + /* Recursive use of kdb_parse, do not use argv after this point */
19443 + argv = NULL;
19444 + kdb_printf("[%s]kdb> %s\n", s->name, s->command[i]);
19445 + if ((ret = kdb_parse(s->command[i])))
19446 + return ret;
19447 + }
19448 + return 0;
19449 +}
19450 +
19451 +/* Command history */
19452 +#define KDB_CMD_HISTORY_COUNT 32
19453 +#define CMD_BUFLEN 200 /* kdb_printf: max printline size == 256 */
19454 +static unsigned int cmd_head=0, cmd_tail=0;
19455 +static unsigned int cmdptr;
19456 +static char cmd_hist[KDB_CMD_HISTORY_COUNT][CMD_BUFLEN];
19457 +static char cmd_cur[CMD_BUFLEN];
19458 +
19459 +/*
19460 + * The "str" argument may point to something like | grep xyz
19461 + *
19462 + */
19463 +static void
19464 +parse_grep(const char *str)
19465 +{
19466 + int len;
19467 + char *cp = (char *)str, *cp2;
19468 +
19469 + /* sanity check: we should have been called with the \ first */
19470 + if (*cp != '|')
19471 + return;
19472 + cp++;
19473 + while (isspace(*cp)) cp++;
19474 + if (strncmp(cp,"grep ",5)) {
19475 + kdb_printf ("invalid 'pipe', see grephelp\n");
19476 + return;
19477 + }
19478 + cp += 5;
19479 + while (isspace(*cp)) cp++;
19480 + cp2 = strchr(cp, '\n');
19481 + if (cp2)
19482 + *cp2 = '\0'; /* remove the trailing newline */
19483 + len = strlen(cp);
19484 + if (len == 0) {
19485 + kdb_printf ("invalid 'pipe', see grephelp\n");
19486 + return;
19487 + }
19488 + /* now cp points to a nonzero length search string */
19489 + if (*cp == '"') {
19490 + /* allow it be "x y z" by removing the "'s - there must
19491 + be two of them */
19492 + cp++;
19493 + cp2 = strchr(cp, '"');
19494 + if (!cp2) {
19495 + kdb_printf ("invalid quoted string, see grephelp\n");
19496 + return;
19497 + }
19498 + *cp2 = '\0'; /* end the string where the 2nd " was */
19499 + }
19500 + kdb_grep_leading = 0;
19501 + if (*cp == '^') {
19502 + kdb_grep_leading = 1;
19503 + cp++;
19504 + }
19505 + len = strlen(cp);
19506 + kdb_grep_trailing = 0;
19507 + if (*(cp+len-1) == '$') {
19508 + kdb_grep_trailing = 1;
19509 + *(cp+len-1) = '\0';
19510 + }
19511 + len = strlen(cp);
19512 + if (!len) return;
19513 + if (len >= GREP_LEN) {
19514 + kdb_printf ("search string too long\n");
19515 + return;
19516 + }
19517 + strcpy(kdb_grep_string, cp);
19518 + kdb_grepping_flag++;
19519 + return;
19520 +}
19521 +
19522 +/*
19523 + * kdb_parse
19524 + *
19525 + * Parse the command line, search the command table for a
19526 + * matching command and invoke the command function.
19527 + * This function may be called recursively, if it is, the second call
19528 + * will overwrite argv and cbuf. It is the caller's responsibility to
19529 + * save their argv if they recursively call kdb_parse().
19530 + *
19531 + * Parameters:
19532 + * cmdstr The input command line to be parsed.
19533 + * regs The registers at the time kdb was entered.
19534 + * Outputs:
19535 + * None.
19536 + * Returns:
19537 + * Zero for success, a kdb diagnostic if failure.
19538 + * Locking:
19539 + * None.
19540 + * Remarks:
19541 + * Limited to 20 tokens.
19542 + *
19543 + * Real rudimentary tokenization. Basically only whitespace
19544 + * is considered a token delimeter (but special consideration
19545 + * is taken of the '=' sign as used by the 'set' command).
19546 + *
19547 + * The algorithm used to tokenize the input string relies on
19548 + * there being at least one whitespace (or otherwise useless)
19549 + * character between tokens as the character immediately following
19550 + * the token is altered in-place to a null-byte to terminate the
19551 + * token string.
19552 + */
19553 +
19554 +#define MAXARGC 20
19555 +
19556 +int
19557 +kdb_parse(const char *cmdstr)
19558 +{
19559 + static char *argv[MAXARGC];
19560 + static int argc = 0;
19561 + static char cbuf[CMD_BUFLEN+2];
19562 + char *cp;
19563 + char *cpp, quoted;
19564 + kdbtab_t *tp;
19565 + int i, escaped, ignore_errors = 0, check_grep;
19566 +
19567 + /*
19568 + * First tokenize the command string.
19569 + */
19570 + cp = (char *)cmdstr;
19571 + kdb_grepping_flag = check_grep = 0;
19572 +
19573 + if (KDB_FLAG(CMD_INTERRUPT)) {
19574 + /* Previous command was interrupted, newline must not repeat the command */
19575 + KDB_FLAG_CLEAR(CMD_INTERRUPT);
19576 + argc = 0; /* no repeat */
19577 + }
19578 +
19579 + if (*cp != '\n' && *cp != '\0') {
19580 + argc = 0;
19581 + cpp = cbuf;
19582 + while (*cp) {
19583 + /* skip whitespace */
19584 + while (isspace(*cp)) cp++;
19585 + if ((*cp == '\0') || (*cp == '\n') || (*cp == '#' && !defcmd_in_progress))
19586 + break;
19587 + /* special case: check for | grep pattern */
19588 + if (*cp == '|') {
19589 + check_grep++;
19590 + break;
19591 + }
19592 + if (cpp >= cbuf + CMD_BUFLEN) {
19593 + kdb_printf("kdb_parse: command buffer overflow, command ignored\n%s\n", cmdstr);
19594 + return KDB_NOTFOUND;
19595 + }
19596 + if (argc >= MAXARGC - 1) {
19597 + kdb_printf("kdb_parse: too many arguments, command ignored\n%s\n", cmdstr);
19598 + return KDB_NOTFOUND;
19599 + }
19600 + argv[argc++] = cpp;
19601 + escaped = 0;
19602 + quoted = '\0';
19603 + /* Copy to next unquoted and unescaped whitespace or '=' */
19604 + while (*cp && *cp != '\n' && (escaped || quoted || !isspace(*cp))) {
19605 + if (cpp >= cbuf + CMD_BUFLEN)
19606 + break;
19607 + if (escaped) {
19608 + escaped = 0;
19609 + *cpp++ = *cp++;
19610 + continue;
19611 + }
19612 + if (*cp == '\\') {
19613 + escaped = 1;
19614 + ++cp;
19615 + continue;
19616 + }
19617 + if (*cp == quoted) {
19618 + quoted = '\0';
19619 + } else if (*cp == '\'' || *cp == '"') {
19620 + quoted = *cp;
19621 + }
19622 + if ((*cpp = *cp++) == '=' && !quoted)
19623 + break;
19624 + ++cpp;
19625 + }
19626 + *cpp++ = '\0'; /* Squash a ws or '=' character */
19627 + }
19628 + }
19629 + if (!argc)
19630 + return 0;
19631 + if (check_grep)
19632 + parse_grep(cp);
19633 + if (defcmd_in_progress) {
19634 + int result = kdb_defcmd2(cmdstr, argv[0]);
19635 + if (!defcmd_in_progress) {
19636 + argc = 0; /* avoid repeat on endefcmd */
19637 + *(argv[0]) = '\0';
19638 + }
19639 + return result;
19640 + }
19641 + if (argv[0][0] == '-' && argv[0][1] && (argv[0][1] < '0' || argv[0][1] > '9')) {
19642 + ignore_errors = 1;
19643 + ++argv[0];
19644 + }
19645 +
19646 + for(tp=kdb_commands, i=0; i < kdb_max_commands; i++,tp++) {
19647 + if (tp->cmd_name) {
19648 + /*
19649 + * If this command is allowed to be abbreviated,
19650 + * check to see if this is it.
19651 + */
19652 +
19653 + if (tp->cmd_minlen
19654 + && (strlen(argv[0]) <= tp->cmd_minlen)) {
19655 + if (strncmp(argv[0],
19656 + tp->cmd_name,
19657 + tp->cmd_minlen) == 0) {
19658 + break;
19659 + }
19660 + }
19661 +
19662 + if (strcmp(argv[0], tp->cmd_name)==0) {
19663 + break;
19664 + }
19665 + }
19666 + }
19667 +
19668 + /*
19669 + * If we don't find a command by this name, see if the first
19670 + * few characters of this match any of the known commands.
19671 + * e.g., md1c20 should match md.
19672 + */
19673 + if (i == kdb_max_commands) {
19674 + for(tp=kdb_commands, i=0; i < kdb_max_commands; i++,tp++) {
19675 + if (tp->cmd_name) {
19676 + if (strncmp(argv[0],
19677 + tp->cmd_name,
19678 + strlen(tp->cmd_name))==0) {
19679 + break;
19680 + }
19681 + }
19682 + }
19683 + }
19684 +
19685 + if (i < kdb_max_commands) {
19686 + int result;
19687 + KDB_STATE_SET(CMD);
19688 + result = (*tp->cmd_func)(argc-1,
19689 + (const char**)argv);
19690 + if (result && ignore_errors && result > KDB_CMD_GO)
19691 + result = 0;
19692 + KDB_STATE_CLEAR(CMD);
19693 + switch (tp->cmd_repeat) {
19694 + case KDB_REPEAT_NONE:
19695 + argc = 0;
19696 + if (argv[0])
19697 + *(argv[0]) = '\0';
19698 + break;
19699 + case KDB_REPEAT_NO_ARGS:
19700 + argc = 1;
19701 + if (argv[1])
19702 + *(argv[1]) = '\0';
19703 + break;
19704 + case KDB_REPEAT_WITH_ARGS:
19705 + break;
19706 + }
19707 + return result;
19708 + }
19709 +
19710 + /*
19711 + * If the input with which we were presented does not
19712 + * map to an existing command, attempt to parse it as an
19713 + * address argument and display the result. Useful for
19714 + * obtaining the address of a variable, or the nearest symbol
19715 + * to an address contained in a register.
19716 + */
19717 + {
19718 + kdb_machreg_t value;
19719 + char *name = NULL;
19720 + long offset;
19721 + int nextarg = 0;
19722 +
19723 + if (kdbgetaddrarg(0, (const char **)argv, &nextarg,
19724 + &value, &offset, &name)) {
19725 + return KDB_NOTFOUND;
19726 + }
19727 +
19728 + kdb_printf("%s = ", argv[0]);
19729 + kdb_symbol_print(value, NULL, KDB_SP_DEFAULT);
19730 + kdb_printf("\n");
19731 + return 0;
19732 + }
19733 +}
19734 +
19735 +
19736 +static int
19737 +handle_ctrl_cmd(char *cmd)
19738 +{
19739 +#define CTRL_P 16
19740 +#define CTRL_N 14
19741 +
19742 + /* initial situation */
19743 + if (cmd_head == cmd_tail) return 0;
19744 +
19745 + switch(*cmd) {
19746 + case CTRL_P:
19747 + if (cmdptr != cmd_tail)
19748 + cmdptr = (cmdptr-1) % KDB_CMD_HISTORY_COUNT;
19749 + strncpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
19750 + return 1;
19751 + case CTRL_N:
19752 + if (cmdptr != cmd_head)
19753 + cmdptr = (cmdptr+1) % KDB_CMD_HISTORY_COUNT;
19754 + strncpy(cmd_cur, cmd_hist[cmdptr], CMD_BUFLEN);
19755 + return 1;
19756 + }
19757 + return 0;
19758 +}
19759 +
19760 +/*
19761 + * kdb_do_dump
19762 + *
19763 + * Call the dump() function if the kernel is configured for LKCD.
19764 + * Inputs:
19765 + * None.
19766 + * Outputs:
19767 + * None.
19768 + * Returns:
19769 + * None. dump() may or may not return.
19770 + * Locking:
19771 + * none.
19772 + * Remarks:
19773 + */
19774 +
19775 +static void
19776 +kdb_do_dump(void)
19777 +{
19778 +#if defined(CONFIG_LKCD_DUMP) || defined(CONFIG_LKCD_DUMP_MODULE)
19779 + kdb_printf("Forcing dump (if configured)\n");
19780 + console_loglevel = 8; /* to see the dump messages */
19781 + dump("kdb_do_dump");
19782 +#endif
19783 +}
19784 +
19785 +/*
19786 + * kdb_reboot
19787 + *
19788 + * This function implements the 'reboot' command. Reboot the system
19789 + * immediately.
19790 + *
19791 + * Inputs:
19792 + * argc argument count
19793 + * argv argument vector
19794 + * Outputs:
19795 + * None.
19796 + * Returns:
19797 + * zero for success, a kdb diagnostic if error
19798 + * Locking:
19799 + * none.
19800 + * Remarks:
19801 + * Shouldn't return from this function.
19802 + */
19803 +
19804 +static int
19805 +kdb_reboot(int argc, const char **argv)
19806 +{
19807 + emergency_restart();
19808 + kdb_printf("Hmm, kdb_reboot did not reboot, spinning here\n");
19809 + while (1) {};
19810 + /* NOTREACHED */
19811 + return 0;
19812 +}
19813 +
19814 +#ifdef CONFIG_KDB_KDUMP
19815 +
19816 +int kdb_kdump_state = KDB_KDUMP_RESET; /* KDB kdump state */
19817 +
19818 +static int kdb_cpu(int argc, const char **argv);
19819 +
19820 +/*
19821 + * kdb_kdump_check
19822 + *
19823 + * This is where the kdump on monarch cpu is handled.
19824 + *
19825 + */
19826 +void kdb_kdump_check(struct pt_regs *regs)
19827 +{
19828 + if (kdb_kdump_state != KDB_KDUMP_RESET) {
19829 + crash_kexec(regs);
19830 +
19831 + /* If the call above returned then something
19832 + didn't work */
19833 + kdb_printf("kdb_kdump_check: crash_kexec failed!\n");
19834 + kdb_printf(" Please check if the kdump kernel has been properly loaded\n");
19835 + kdb_kdump_state = KDB_KDUMP_RESET;
19836 + }
19837 +}
19838 +
19839 +
19840 +/*
19841 + * kdb_kdump
19842 + *
19843 + * This function implements the 'kdump' command.
19844 + *
19845 + * Inputs:
19846 + * argc argument count
19847 + * argv argument vector
19848 + * envp environment vector
19849 + * regs registers at time kdb was entered.
19850 + * Outputs:
19851 + * None.
19852 + * Returns:
19853 + * zero for success, a kdb diagnostic if error
19854 + * Locking:
19855 + * none.
19856 + * Remarks:
19857 + * Shouldn't return from this function.
19858 + */
19859 +
19860 +static int
19861 +kdb_kdump(int argc, const char **argv)
19862 +{
19863 + char cpu_id[6]; /* up to 99,999 cpus */
19864 + const char *cpu_argv[] = {NULL, cpu_id, NULL};
19865 + int ret;
19866 +
19867 + kdb_kdump_state = KDB_KDUMP_KDUMP;
19868 + /* Switch back to the initial cpu before process kdump command */
19869 + if (smp_processor_id() != kdb_initial_cpu) {
19870 + sprintf(cpu_id, "%d", kdb_initial_cpu);
19871 + ret = kdb_cpu(1, cpu_argv);
19872 + if (ret != KDB_CMD_CPU) {
19873 + kdb_printf("kdump: Failed to switch to initial cpu %d;"
19874 + " aborted\n", kdb_initial_cpu);
19875 + kdb_kdump_state = KDB_KDUMP_RESET;
19876 + }
19877 + } else
19878 + ret = KDB_CMD_CPU;
19879 +
19880 + return ret;
19881 +}
19882 +
19883 +#endif /* CONFIG_KDB_KDUMP */
19884 +
19885 +static int
19886 +kdb_quiet(int reason)
19887 +{
19888 + return (reason == KDB_REASON_CPU_UP || reason == KDB_REASON_SILENT);
19889 +}
19890 +
19891 +/*
19892 + * kdb_local
19893 + *
19894 + * The main code for kdb. This routine is invoked on a specific
19895 + * processor, it is not global. The main kdb() routine ensures
19896 + * that only one processor at a time is in this routine. This
19897 + * code is called with the real reason code on the first entry
19898 + * to a kdb session, thereafter it is called with reason SWITCH,
19899 + * even if the user goes back to the original cpu.
19900 + *
19901 + * Inputs:
19902 + * reason The reason KDB was invoked
19903 + * error The hardware-defined error code
19904 + * regs The exception frame at time of fault/breakpoint. NULL
19905 + * for reason SILENT or CPU_UP, otherwise valid.
19906 + * db_result Result code from the break or debug point.
19907 + * Returns:
19908 + * 0 KDB was invoked for an event which it wasn't responsible
19909 + * 1 KDB handled the event for which it was invoked.
19910 + * KDB_CMD_GO User typed 'go'.
19911 + * KDB_CMD_CPU User switched to another cpu.
19912 + * KDB_CMD_SS Single step.
19913 + * KDB_CMD_SSB Single step until branch.
19914 + * Locking:
19915 + * none
19916 + * Remarks:
19917 + * none
19918 + */
19919 +
19920 +static int
19921 +kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, kdb_dbtrap_t db_result)
19922 +{
19923 + char *cmdbuf;
19924 + int diag;
19925 + struct task_struct *kdb_current = kdb_curr_task(smp_processor_id());
19926 +
19927 +#ifdef CONFIG_KDB_KDUMP
19928 + kdb_kdump_check(regs);
19929 +#endif
19930 +
19931 + /* If kdb has been entered for an event which has been/will be
19932 + * recovered then silently return. We have to get this far into kdb in
19933 + * order to synchronize all the cpus, typically only one cpu (monarch)
19934 + * knows that the event is recoverable but the other cpus (slaves) may
19935 + * also be driven into kdb before that decision is made by the monarch.
19936 + *
19937 + * To pause in kdb even for recoverable events, 'set RECOVERY_PAUSE 1'
19938 + */
19939 + KDB_DEBUG_STATE("kdb_local 1", reason);
19940 + if (reason == KDB_REASON_ENTER
19941 + && KDB_FLAG(RECOVERY)
19942 + && !KDB_FLAG(CATASTROPHIC)) {
19943 + int recovery_pause = 0;
19944 + kdbgetintenv("RECOVERY_PAUSE", &recovery_pause);
19945 + if (recovery_pause == 0)
19946 + reason = KDB_REASON_SILENT;
19947 + else
19948 + kdb_printf("%s: Recoverable error detected but"
19949 + " RECOVERY_PAUSE is set, staying in KDB\n",
19950 + __FUNCTION__);
19951 + }
19952 +
19953 + KDB_DEBUG_STATE("kdb_local 2", reason);
19954 + kdb_go_count = 0;
19955 + if (kdb_quiet(reason)) {
19956 + /* no message */
19957 + } else if (reason == KDB_REASON_DEBUG) {
19958 + /* special case below */
19959 + } else {
19960 + kdb_printf("\nEntering kdb (current=0x%p, pid %d) ", kdb_current, kdb_current->pid);
19961 +#if defined(CONFIG_SMP)
19962 + kdb_printf("on processor %d ", smp_processor_id());
19963 +#endif
19964 + }
19965 +
19966 + switch (reason) {
19967 + case KDB_REASON_DEBUG:
19968 + {
19969 + /*
19970 + * If re-entering kdb after a single step
19971 + * command, don't print the message.
19972 + */
19973 + switch(db_result) {
19974 + case KDB_DB_BPT:
19975 + kdb_printf("\nEntering kdb (0x%p, pid %d) ", kdb_current, kdb_current->pid);
19976 +#if defined(CONFIG_SMP)
19977 + kdb_printf("on processor %d ", smp_processor_id());
19978 +#endif
19979 + kdb_printf("due to Debug @ " kdb_machreg_fmt "\n", kdba_getpc(regs));
19980 + break;
19981 + case KDB_DB_SSB:
19982 + /*
19983 + * In the midst of ssb command. Just return.
19984 + */
19985 + KDB_DEBUG_STATE("kdb_local 3", reason);
19986 + return KDB_CMD_SSB; /* Continue with SSB command */
19987 +
19988 + break;
19989 + case KDB_DB_SS:
19990 + break;
19991 + case KDB_DB_SSBPT:
19992 + KDB_DEBUG_STATE("kdb_local 4", reason);
19993 + return 1; /* kdba_db_trap did the work */
19994 + default:
19995 + kdb_printf("kdb: Bad result from kdba_db_trap: %d\n",
19996 + db_result);
19997 + break;
19998 + }
19999 +
20000 + }
20001 + break;
20002 + case KDB_REASON_ENTER:
20003 + if (KDB_STATE(KEYBOARD))
20004 + kdb_printf("due to Keyboard Entry\n");
20005 + else {
20006 + kdb_printf("due to KDB_ENTER()\n");
20007 + }
20008 + break;
20009 + case KDB_REASON_KEYBOARD:
20010 + KDB_STATE_SET(KEYBOARD);
20011 + kdb_printf("due to Keyboard Entry\n");
20012 + break;
20013 + case KDB_REASON_ENTER_SLAVE: /* drop through, slaves only get released via cpu switch */
20014 + case KDB_REASON_SWITCH:
20015 + kdb_printf("due to cpu switch\n");
20016 + if (KDB_STATE(GO_SWITCH)) {
20017 + KDB_STATE_CLEAR(GO_SWITCH);
20018 + KDB_DEBUG_STATE("kdb_local 5", reason);
20019 + return KDB_CMD_GO;
20020 + }
20021 + break;
20022 + case KDB_REASON_OOPS:
20023 + kdb_printf("Oops: %s\n", kdb_diemsg);
20024 + kdb_printf("due to oops @ " kdb_machreg_fmt "\n", kdba_getpc(regs));
20025 + kdba_dumpregs(regs, NULL, NULL);
20026 + break;
20027 + case KDB_REASON_NMI:
20028 + kdb_printf("due to NonMaskable Interrupt @ " kdb_machreg_fmt "\n",
20029 + kdba_getpc(regs));
20030 + kdba_dumpregs(regs, NULL, NULL);
20031 + break;
20032 + case KDB_REASON_BREAK:
20033 + kdb_printf("due to Breakpoint @ " kdb_machreg_fmt "\n", kdba_getpc(regs));
20034 + /*
20035 + * Determine if this breakpoint is one that we
20036 + * are interested in.
20037 + */
20038 + if (db_result != KDB_DB_BPT) {
20039 + kdb_printf("kdb: error return from kdba_bp_trap: %d\n", db_result);
20040 + KDB_DEBUG_STATE("kdb_local 6", reason);
20041 + return 0; /* Not for us, dismiss it */
20042 + }
20043 + break;
20044 + case KDB_REASON_RECURSE:
20045 + kdb_printf("due to Recursion @ " kdb_machreg_fmt "\n", kdba_getpc(regs));
20046 + break;
20047 + case KDB_REASON_CPU_UP:
20048 + case KDB_REASON_SILENT:
20049 + KDB_DEBUG_STATE("kdb_local 7", reason);
20050 + if (reason == KDB_REASON_CPU_UP)
20051 + kdba_cpu_up();
20052 + return KDB_CMD_GO; /* Silent entry, silent exit */
20053 + break;
20054 + default:
20055 + kdb_printf("kdb: unexpected reason code: %d\n", reason);
20056 + KDB_DEBUG_STATE("kdb_local 8", reason);
20057 + return 0; /* Not for us, dismiss it */
20058 + }
20059 +
20060 + kdba_local_arch_setup();
20061 +
20062 + kdba_set_current_task(kdb_current);
20063 +
20064 + while (1) {
20065 + /*
20066 + * Initialize pager context.
20067 + */
20068 + kdb_nextline = 1;
20069 + KDB_STATE_CLEAR(SUPPRESS);
20070 +#ifdef kdba_setjmp
20071 + /*
20072 + * Use kdba_setjmp/kdba_longjmp to break out of
20073 + * the pager early and to attempt to recover from kdb errors.
20074 + */
20075 + KDB_STATE_CLEAR(LONGJMP);
20076 + if (kdbjmpbuf) {
20077 + if (kdba_setjmp(&kdbjmpbuf[smp_processor_id()])) {
20078 + /* Command aborted (usually in pager) */
20079 + continue;
20080 + }
20081 + else
20082 + KDB_STATE_SET(LONGJMP);
20083 + }
20084 +#endif /* kdba_setjmp */
20085 +
20086 + cmdbuf = cmd_cur;
20087 + *cmdbuf = '\0';
20088 + *(cmd_hist[cmd_head])='\0';
20089 +
20090 + if (KDB_FLAG(ONLY_DO_DUMP)) {
20091 + /* kdb is off but a catastrophic error requires a dump.
20092 + * Take the dump and reboot.
20093 + * Turn on logging so the kdb output appears in the log
20094 + * buffer in the dump.
20095 + */
20096 + const char *setargs[] = { "set", "LOGGING", "1" };
20097 + kdb_set(2, setargs);
20098 + kdb_do_dump();
20099 + kdb_reboot(0, NULL);
20100 + /*NOTREACHED*/
20101 + }
20102 +
20103 +do_full_getstr:
20104 +#if defined(CONFIG_SMP)
20105 + snprintf(kdb_prompt_str, CMD_BUFLEN, kdbgetenv("PROMPT"), smp_processor_id());
20106 +#else
20107 + snprintf(kdb_prompt_str, CMD_BUFLEN, kdbgetenv("PROMPT"));
20108 +#endif
20109 + if (defcmd_in_progress)
20110 + strncat(kdb_prompt_str, "[defcmd]", CMD_BUFLEN);
20111 +
20112 + /*
20113 + * Fetch command from keyboard
20114 + */
20115 + cmdbuf = kdb_getstr(cmdbuf, CMD_BUFLEN, kdb_prompt_str);
20116 + if (*cmdbuf != '\n') {
20117 + if (*cmdbuf < 32) {
20118 + if(cmdptr == cmd_head) {
20119 + strncpy(cmd_hist[cmd_head], cmd_cur, CMD_BUFLEN);
20120 + *(cmd_hist[cmd_head]+strlen(cmd_hist[cmd_head])-1) = '\0';
20121 + }
20122 + if(!handle_ctrl_cmd(cmdbuf))
20123 + *(cmd_cur+strlen(cmd_cur)-1) = '\0';
20124 + cmdbuf = cmd_cur;
20125 + goto do_full_getstr;
20126 + }
20127 + else
20128 + strncpy(cmd_hist[cmd_head], cmd_cur, CMD_BUFLEN);
20129 +
20130 + cmd_head = (cmd_head+1) % KDB_CMD_HISTORY_COUNT;
20131 + if (cmd_head == cmd_tail) cmd_tail = (cmd_tail+1) % KDB_CMD_HISTORY_COUNT;
20132 +
20133 + }
20134 +
20135 + cmdptr = cmd_head;
20136 + diag = kdb_parse(cmdbuf);
20137 + if (diag == KDB_NOTFOUND) {
20138 + kdb_printf("Unknown kdb command: '%s'\n", cmdbuf);
20139 + diag = 0;
20140 + }
20141 + if (diag == KDB_CMD_GO
20142 + || diag == KDB_CMD_CPU
20143 + || diag == KDB_CMD_SS
20144 + || diag == KDB_CMD_SSB)
20145 + break;
20146 +
20147 + if (diag)
20148 + kdb_cmderror(diag);
20149 + }
20150 +
20151 + kdba_local_arch_cleanup();
20152 +
20153 + KDB_DEBUG_STATE("kdb_local 9", diag);
20154 + return diag;
20155 +}
20156 +
20157 +
20158 +/*
20159 + * kdb_print_state
20160 + *
20161 + * Print the state data for the current processor for debugging.
20162 + *
20163 + * Inputs:
20164 + * text Identifies the debug point
20165 + * value Any integer value to be printed, e.g. reason code.
20166 + * Returns:
20167 + * None.
20168 + * Locking:
20169 + * none
20170 + * Remarks:
20171 + * none
20172 + */
20173 +
20174 +void kdb_print_state(const char *text, int value)
20175 +{
20176 + kdb_printf("state: %s cpu %d value %d initial %d state %x\n",
20177 + text, smp_processor_id(), value, kdb_initial_cpu, kdb_state[smp_processor_id()]);
20178 +}
20179 +
20180 +/*
20181 + * kdb_previous_event
20182 + *
20183 + * Return a count of cpus that are leaving kdb, i.e. the number
20184 + * of processors that are still handling the previous kdb event.
20185 + *
20186 + * Inputs:
20187 + * None.
20188 + * Returns:
20189 + * Count of cpus in previous event.
20190 + * Locking:
20191 + * none
20192 + * Remarks:
20193 + * none
20194 + */
20195 +
20196 +static int
20197 +kdb_previous_event(void)
20198 +{
20199 + int i, leaving = 0;
20200 + for (i = 0; i < NR_CPUS; ++i) {
20201 + if (KDB_STATE_CPU(LEAVING, i))
20202 + ++leaving;
20203 + }
20204 + return leaving;
20205 +}
20206 +
20207 +/*
20208 + * kdb_wait_for_cpus
20209 + *
20210 + * Invoked once at the start of a kdb event, from the controlling cpu. Wait a
20211 + * short period for the other cpus to enter kdb state.
20212 + *
20213 + * Inputs:
20214 + * none
20215 + * Returns:
20216 + * none
20217 + * Locking:
20218 + * none
20219 + * Remarks:
20220 + * none
20221 + */
20222 +
20223 +int kdb_wait_for_cpus_secs;
20224 +
20225 +static void
20226 +kdb_wait_for_cpus(void)
20227 +{
20228 +#ifdef CONFIG_SMP
20229 + int online = 0, kdb_data = 0, prev_kdb_data = 0, c, time;
20230 + mdelay(100);
20231 + for (time = 0; time < kdb_wait_for_cpus_secs; ++time) {
20232 + online = 0;
20233 + kdb_data = 0;
20234 + for_each_online_cpu(c) {
20235 + ++online;
20236 + if (kdb_running_process[c].seqno >= kdb_seqno - 1)
20237 + ++kdb_data;
20238 + }
20239 + if (online == kdb_data)
20240 + break;
20241 + if (prev_kdb_data != kdb_data) {
20242 + kdb_nextline = 0; /* no prompt yet */
20243 + kdb_printf(" %d out of %d cpus in kdb, waiting for the rest, timeout in %d second(s)\n",
20244 + kdb_data, online, kdb_wait_for_cpus_secs - time);
20245 + prev_kdb_data = kdb_data;
20246 + }
20247 + touch_nmi_watchdog();
20248 + mdelay(1000);
20249 + /* Architectures may want to send a more forceful interrupt */
20250 + if (time == min(kdb_wait_for_cpus_secs / 2, 5))
20251 + kdba_wait_for_cpus();
20252 + if (time % 4 == 0)
20253 + kdb_printf(".");
20254 + }
20255 + if (time) {
20256 + int wait = online - kdb_data;
20257 + if (wait == 0)
20258 + kdb_printf("All cpus are now in kdb\n");
20259 + else
20260 + kdb_printf("%d cpu%s not in kdb, %s state is unknown\n",
20261 + wait,
20262 + wait == 1 ? " is" : "s are",
20263 + wait == 1 ? "its" : "their");
20264 + }
20265 +#endif /* CONFIG_SMP */
20266 +}
20267 +
20268 +/*
20269 + * kdb_main_loop
20270 + *
20271 + * The main kdb loop. After initial setup and assignment of the controlling
20272 + * cpu, all cpus are in this loop. One cpu is in control and will issue the kdb
20273 + * prompt, the others will spin until 'go' or cpu switch.
20274 + *
20275 + * To get a consistent view of the kernel stacks for all processes, this routine
20276 + * is invoked from the main kdb code via an architecture specific routine.
20277 + * kdba_main_loop is responsible for making the kernel stacks consistent for all
20278 + * processes, there should be no difference between a blocked process and a
20279 + * running process as far as kdb is concerned.
20280 + *
20281 + * Inputs:
20282 + * reason The reason KDB was invoked
20283 + * error The hardware-defined error code
20284 + * reason2 kdb's current reason code. Initially error but can change
20285 + * acording to kdb state.
20286 + * db_result Result code from break or debug point.
20287 + * regs The exception frame at time of fault/breakpoint. If reason
20288 + * is SILENT or CPU_UP then regs is NULL, otherwise it
20289 + * should always be valid.
20290 + * Returns:
20291 + * 0 KDB was invoked for an event which it wasn't responsible
20292 + * 1 KDB handled the event for which it was invoked.
20293 + * Locking:
20294 + * none
20295 + * Remarks:
20296 + * none
20297 + */
20298 +
20299 +int
20300 +kdb_main_loop(kdb_reason_t reason, kdb_reason_t reason2, int error,
20301 + kdb_dbtrap_t db_result, struct pt_regs *regs)
20302 +{
20303 + int result = 1;
20304 + /* Stay in kdb() until 'go', 'ss[b]' or an error */
20305 + while (1) {
20306 + /*
20307 + * All processors except the one that is in control
20308 + * will spin here.
20309 + */
20310 + KDB_DEBUG_STATE("kdb_main_loop 1", reason);
20311 + while (KDB_STATE(HOLD_CPU)) {
20312 + /* state KDB is turned off by kdb_cpu to see if the
20313 + * other cpus are still live, each cpu in this loop
20314 + * turns it back on.
20315 + */
20316 + if (!KDB_STATE(KDB)) {
20317 + KDB_STATE_SET(KDB);
20318 + }
20319 +
20320 +#if defined(CONFIG_KDB_KDUMP)
20321 + if (KDB_STATE(KEXEC)) {
20322 + struct pt_regs r;
20323 + if (regs == NULL)
20324 + regs = &r;
20325 +
20326 + kdba_kdump_shutdown_slave(regs);
20327 + return 0;
20328 + }
20329 +#endif
20330 + }
20331 +
20332 + KDB_STATE_CLEAR(SUPPRESS);
20333 + KDB_DEBUG_STATE("kdb_main_loop 2", reason);
20334 + if (KDB_STATE(LEAVING))
20335 + break; /* Another cpu said 'go' */
20336 +
20337 + if (!kdb_quiet(reason))
20338 + kdb_wait_for_cpus();
20339 + /* Still using kdb, this processor is in control */
20340 + result = kdb_local(reason2, error, regs, db_result);
20341 + KDB_DEBUG_STATE("kdb_main_loop 3", result);
20342 +
20343 + if (result == KDB_CMD_CPU) {
20344 + /* Cpu switch, hold the current cpu, release the target one. */
20345 + reason2 = KDB_REASON_SWITCH;
20346 + KDB_STATE_SET(HOLD_CPU);
20347 + KDB_STATE_CLEAR_CPU(HOLD_CPU, kdb_new_cpu);
20348 + continue;
20349 + }
20350 +
20351 + if (result == KDB_CMD_SS) {
20352 + KDB_STATE_SET(DOING_SS);
20353 + break;
20354 + }
20355 +
20356 + if (result == KDB_CMD_SSB) {
20357 + KDB_STATE_SET(DOING_SS);
20358 + KDB_STATE_SET(DOING_SSB);
20359 + break;
20360 + }
20361 +
20362 + if (result && result != 1 && result != KDB_CMD_GO)
20363 + kdb_printf("\nUnexpected kdb_local return code %d\n", result);
20364 +
20365 + KDB_DEBUG_STATE("kdb_main_loop 4", reason);
20366 + break;
20367 + }
20368 + if (KDB_STATE(DOING_SS))
20369 + KDB_STATE_CLEAR(SSBPT);
20370 + return result;
20371 +}
20372 +
20373 +/* iapc_boot_arch was defined in ACPI 2.0, FADT revision 3 onwards. For any
20374 + * FADT prior to revision 3, we have to assume that we have an i8042 I/O
20375 + * device. ACPI initialises after KDB initialises but before using KDB, so
20376 + * check iapc_boot_arch on each entry to KDB.
20377 + */
20378 +static void
20379 +kdb_check_i8042(void)
20380 +{
20381 + KDB_FLAG_CLEAR(NO_I8042);
20382 +#ifdef CONFIG_ACPI
20383 + if (acpi_gbl_FADT.header.revision >= 3 &&
20384 + (acpi_gbl_FADT.boot_flags & BAF_8042_KEYBOARD_CONTROLLER) == 0)
20385 + KDB_FLAG_SET(NO_I8042);
20386 +#endif /* CONFIG_ACPI */
20387 +}
20388 +
20389 +/*
20390 + * kdb
20391 + *
20392 + * This function is the entry point for the kernel debugger. It
20393 + * provides a command parser and associated support functions to
20394 + * allow examination and control of an active kernel.
20395 + *
20396 + * The breakpoint trap code should invoke this function with
20397 + * one of KDB_REASON_BREAK (int 03) or KDB_REASON_DEBUG (debug register)
20398 + *
20399 + * the die_if_kernel function should invoke this function with
20400 + * KDB_REASON_OOPS.
20401 + *
20402 + * In single step mode, one cpu is released to run without
20403 + * breakpoints. Interrupts and NMI are reset to their original values,
20404 + * the cpu is allowed to do one instruction which causes a trap
20405 + * into kdb with KDB_REASON_DEBUG.
20406 + *
20407 + * Inputs:
20408 + * reason The reason KDB was invoked
20409 + * error The hardware-defined error code
20410 + * regs The exception frame at time of fault/breakpoint. If reason
20411 + * is SILENT or CPU_UP then regs is NULL, otherwise it
20412 + * should always be valid.
20413 + * Returns:
20414 + * 0 KDB was invoked for an event which it wasn't responsible
20415 + * 1 KDB handled the event for which it was invoked.
20416 + * Locking:
20417 + * none
20418 + * Remarks:
20419 + * No assumptions of system state. This function may be invoked
20420 + * with arbitrary locks held. It will stop all other processors
20421 + * in an SMP environment, disable all interrupts and does not use
20422 + * the operating systems keyboard driver.
20423 + *
20424 + * This code is reentrant but only for cpu switch. Any other
20425 + * reentrancy is an error, although kdb will attempt to recover.
20426 + *
20427 + * At the start of a kdb session the initial processor is running
20428 + * kdb() and the other processors can be doing anything. When the
20429 + * initial processor calls smp_kdb_stop() the other processors are
20430 + * driven through kdb_ipi which calls kdb() with reason SWITCH.
20431 + * That brings all processors into this routine, one with a "real"
20432 + * reason code, the other with SWITCH.
20433 + *
20434 + * Because the other processors are driven via smp_kdb_stop(),
20435 + * they enter here from the NMI handler. Until the other
20436 + * processors exit from here and exit from kdb_ipi, they will not
20437 + * take any more NMI requests. The initial cpu will still take NMI.
20438 + *
20439 + * Multiple race and reentrancy conditions, each with different
20440 + * advoidance mechanisms.
20441 + *
20442 + * Two cpus hit debug points at the same time.
20443 + *
20444 + * kdb_lock and kdb_initial_cpu ensure that only one cpu gets
20445 + * control of kdb. The others spin on kdb_initial_cpu until
20446 + * they are driven through NMI into kdb_ipi. When the initial
20447 + * cpu releases the others from NMI, they resume trying to get
20448 + * kdb_initial_cpu to start a new event.
20449 + *
20450 + * A cpu is released from kdb and starts a new event before the
20451 + * original event has completely ended.
20452 + *
20453 + * kdb_previous_event() prevents any cpu from entering
20454 + * kdb_initial_cpu state until the previous event has completely
20455 + * ended on all cpus.
20456 + *
20457 + * An exception occurs inside kdb.
20458 + *
20459 + * kdb_initial_cpu detects recursive entry to kdb and attempts
20460 + * to recover. The recovery uses longjmp() which means that
20461 + * recursive calls to kdb never return. Beware of assumptions
20462 + * like
20463 + *
20464 + * ++depth;
20465 + * kdb();
20466 + * --depth;
20467 + *
20468 + * If the kdb call is recursive then longjmp takes over and
20469 + * --depth is never executed.
20470 + *
20471 + * NMI handling.
20472 + *
20473 + * NMI handling is tricky. The initial cpu is invoked by some kdb event,
20474 + * this event could be NMI driven but usually is not. The other cpus are
20475 + * driven into kdb() via kdb_ipi which uses NMI so at the start the other
20476 + * cpus will not accept NMI. Some operations such as SS release one cpu
20477 + * but hold all the others. Releasing a cpu means it drops back to
20478 + * whatever it was doing before the kdb event, this means it drops out of
20479 + * kdb_ipi and hence out of NMI status. But the software watchdog uses
20480 + * NMI and we do not want spurious watchdog calls into kdb. kdba_read()
20481 + * resets the watchdog counters in its input polling loop, when a kdb
20482 + * command is running it is subject to NMI watchdog events.
20483 + *
20484 + * Another problem with NMI handling is the NMI used to drive the other
20485 + * cpus into kdb cannot be distinguished from the watchdog NMI. State
20486 + * flag WAIT_IPI indicates that a cpu is waiting for NMI via kdb_ipi,
20487 + * if not set then software NMI is ignored by kdb_ipi.
20488 + *
20489 + * Cpu switching.
20490 + *
20491 + * All cpus are in kdb (or they should be), all but one are
20492 + * spinning on KDB_STATE(HOLD_CPU). Only one cpu is not in
20493 + * HOLD_CPU state, only that cpu can handle commands.
20494 + *
20495 + * Go command entered.
20496 + *
20497 + * If necessary, go will switch to the initial cpu first. If the event
20498 + * was caused by a software breakpoint (assumed to be global) that
20499 + * requires single-step to get over the breakpoint then only release the
20500 + * initial cpu, after the initial cpu has single-stepped the breakpoint
20501 + * then release the rest of the cpus. If SSBPT is not required then
20502 + * release all the cpus at once.
20503 + */
20504 +
20505 +int
20506 +kdb(kdb_reason_t reason, int error, struct pt_regs *regs)
20507 +{
20508 + kdb_intstate_t int_state; /* Interrupt state */
20509 + kdb_reason_t reason2 = reason;
20510 + int result = 0; /* Default is kdb did not handle it */
20511 + int ss_event, old_regs_saved = 0;
20512 + struct pt_regs *old_regs = NULL;
20513 + kdb_dbtrap_t db_result=KDB_DB_NOBPT;
20514 + preempt_disable();
20515 + atomic_inc(&kdb_event);
20516 +
20517 + switch(reason) {
20518 + case KDB_REASON_OOPS:
20519 + case KDB_REASON_NMI:
20520 + KDB_FLAG_SET(CATASTROPHIC); /* kernel state is dubious now */
20521 + break;
20522 + default:
20523 + break;
20524 + }
20525 + switch(reason) {
20526 + case KDB_REASON_ENTER:
20527 + case KDB_REASON_ENTER_SLAVE:
20528 + case KDB_REASON_BREAK:
20529 + case KDB_REASON_DEBUG:
20530 + case KDB_REASON_OOPS:
20531 + case KDB_REASON_SWITCH:
20532 + case KDB_REASON_KEYBOARD:
20533 + case KDB_REASON_NMI:
20534 + if (regs && regs != get_irq_regs()) {
20535 + old_regs = set_irq_regs(regs);
20536 + old_regs_saved = 1;
20537 + }
20538 + break;
20539 + default:
20540 + break;
20541 + }
20542 + if (kdb_continue_catastrophic > 2) {
20543 + kdb_printf("kdb_continue_catastrophic is out of range, setting to 2\n");
20544 + kdb_continue_catastrophic = 2;
20545 + }
20546 + if (!kdb_on && KDB_FLAG(CATASTROPHIC) && kdb_continue_catastrophic == 2) {
20547 + KDB_FLAG_SET(ONLY_DO_DUMP);
20548 + }
20549 + if (!kdb_on && !KDB_FLAG(ONLY_DO_DUMP))
20550 + goto out;
20551 +
20552 + KDB_DEBUG_STATE("kdb 1", reason);
20553 + KDB_STATE_CLEAR(SUPPRESS);
20554 +
20555 + /* Filter out userspace breakpoints first, no point in doing all
20556 + * the kdb smp fiddling when it is really a gdb trap.
20557 + * Save the single step status first, kdba_db_trap clears ss status.
20558 + * kdba_b[dp]_trap sets SSBPT if required.
20559 + */
20560 + ss_event = KDB_STATE(DOING_SS) || KDB_STATE(SSBPT);
20561 +#ifdef CONFIG_CPU_XSCALE
20562 + if ( KDB_STATE(A_XSC_ICH) ) {
20563 + /* restore changed I_BIT */
20564 + KDB_STATE_CLEAR(A_XSC_ICH);
20565 + kdba_restore_retirq(regs, KDB_STATE(A_XSC_IRQ));
20566 + if ( !ss_event ) {
20567 + kdb_printf("Stranger!!! Why IRQ bit is changed====\n");
20568 + }
20569 + }
20570 +#endif
20571 + if (reason == KDB_REASON_BREAK) {
20572 + db_result = kdba_bp_trap(regs, error); /* Only call this once */
20573 + }
20574 + if (reason == KDB_REASON_DEBUG) {
20575 + db_result = kdba_db_trap(regs, error); /* Only call this once */
20576 + }
20577 +
20578 + if ((reason == KDB_REASON_BREAK || reason == KDB_REASON_DEBUG)
20579 + && db_result == KDB_DB_NOBPT) {
20580 + KDB_DEBUG_STATE("kdb 2", reason);
20581 + goto out; /* Not one of mine */
20582 + }
20583 +
20584 + /* Turn off single step if it was being used */
20585 + if (ss_event) {
20586 + kdba_clearsinglestep(regs);
20587 + /* Single step after a breakpoint removes the need for a delayed reinstall */
20588 + if (reason == KDB_REASON_BREAK || reason == KDB_REASON_DEBUG)
20589 + KDB_STATE_CLEAR(SSBPT);
20590 + }
20591 +
20592 + /* kdb can validly reenter but only for certain well defined conditions */
20593 + if (reason == KDB_REASON_DEBUG
20594 + && !KDB_STATE(HOLD_CPU)
20595 + && ss_event)
20596 + KDB_STATE_SET(REENTRY);
20597 + else
20598 + KDB_STATE_CLEAR(REENTRY);
20599 +
20600 + /* Wait for previous kdb event to completely exit before starting
20601 + * a new event.
20602 + */
20603 + while (kdb_previous_event())
20604 + ;
20605 + KDB_DEBUG_STATE("kdb 3", reason);
20606 +
20607 + /*
20608 + * If kdb is already active, print a message and try to recover.
20609 + * If recovery is not possible and recursion is allowed or
20610 + * forced recursion without recovery is set then try to recurse
20611 + * in kdb. Not guaranteed to work but it makes an attempt at
20612 + * debugging the debugger.
20613 + */
20614 + if (reason != KDB_REASON_SWITCH &&
20615 + reason != KDB_REASON_ENTER_SLAVE) {
20616 + if (KDB_IS_RUNNING() && !KDB_STATE(REENTRY)) {
20617 + int recover = 1;
20618 + unsigned long recurse = 0;
20619 + kdb_printf("kdb: Debugger re-entered on cpu %d, new reason = %d\n",
20620 + smp_processor_id(), reason);
20621 + /* Should only re-enter from released cpu */
20622 +
20623 + if (KDB_STATE(HOLD_CPU)) {
20624 + kdb_printf(" Strange, cpu %d should not be running\n", smp_processor_id());
20625 + recover = 0;
20626 + }
20627 + if (!KDB_STATE(CMD)) {
20628 + kdb_printf(" Not executing a kdb command\n");
20629 + recover = 0;
20630 + }
20631 + if (!KDB_STATE(LONGJMP)) {
20632 + kdb_printf(" No longjmp available for recovery\n");
20633 + recover = 0;
20634 + }
20635 + kdbgetulenv("RECURSE", &recurse);
20636 + if (recurse > 1) {
20637 + kdb_printf(" Forced recursion is set\n");
20638 + recover = 0;
20639 + }
20640 + if (recover) {
20641 + kdb_printf(" Attempting to abort command and recover\n");
20642 +#ifdef kdba_setjmp
20643 + kdba_longjmp(&kdbjmpbuf[smp_processor_id()], 0);
20644 +#endif /* kdba_setjmp */
20645 + }
20646 + if (recurse) {
20647 + if (KDB_STATE(RECURSE)) {
20648 + kdb_printf(" Already in recursive mode\n");
20649 + } else {
20650 + kdb_printf(" Attempting recursive mode\n");
20651 + KDB_STATE_SET(RECURSE);
20652 + KDB_STATE_SET(REENTRY);
20653 + reason2 = KDB_REASON_RECURSE;
20654 + recover = 1;
20655 + }
20656 + }
20657 + if (!recover) {
20658 + kdb_printf(" Cannot recover, allowing event to proceed\n");
20659 + /*temp*/
20660 + while (KDB_IS_RUNNING())
20661 + cpu_relax();
20662 + goto out;
20663 + }
20664 + }
20665 + } else if (reason == KDB_REASON_SWITCH && !KDB_IS_RUNNING()) {
20666 + kdb_printf("kdb: CPU switch without kdb running, I'm confused\n");
20667 + goto out;
20668 + }
20669 +
20670 + /*
20671 + * Disable interrupts, breakpoints etc. on this processor
20672 + * during kdb command processing
20673 + */
20674 + KDB_STATE_SET(KDB);
20675 + kdba_disableint(&int_state);
20676 + if (!KDB_STATE(KDB_CONTROL)) {
20677 + kdb_bp_remove_local();
20678 + KDB_STATE_SET(KDB_CONTROL);
20679 + }
20680 +
20681 + /*
20682 + * If not entering the debugger due to CPU switch or single step
20683 + * reentry, serialize access here.
20684 + * The processors may race getting to this point - if,
20685 + * for example, more than one processor hits a breakpoint
20686 + * at the same time. We'll serialize access to kdb here -
20687 + * other processors will loop here, and the NMI from the stop
20688 + * IPI will take them into kdb as switch candidates. Once
20689 + * the initial processor releases the debugger, the rest of
20690 + * the processors will race for it.
20691 + *
20692 + * The above describes the normal state of affairs, where two or more
20693 + * cpus that are entering kdb at the "same" time are assumed to be for
20694 + * separate events. However some processes such as ia64 MCA/INIT will
20695 + * drive all the cpus into error processing at the same time. For that
20696 + * case, all of the cpus entering kdb at the "same" time are really a
20697 + * single event.
20698 + *
20699 + * That case is handled by the use of KDB_ENTER by one cpu (the
20700 + * monarch) and KDB_ENTER_SLAVE on the other cpus (the slaves).
20701 + * KDB_ENTER_SLAVE maps to KDB_REASON_ENTER_SLAVE. The slave events
20702 + * will be treated as if they had just responded to the kdb IPI, i.e.
20703 + * as if they were KDB_REASON_SWITCH.
20704 + *
20705 + * Because of races across multiple cpus, ENTER_SLAVE can occur before
20706 + * the main ENTER. Hold up ENTER_SLAVE here until the main ENTER
20707 + * arrives.
20708 + */
20709 +
20710 + if (reason == KDB_REASON_ENTER_SLAVE) {
20711 + spin_lock(&kdb_lock);
20712 + while (!KDB_IS_RUNNING()) {
20713 + spin_unlock(&kdb_lock);
20714 + while (!KDB_IS_RUNNING())
20715 + cpu_relax();
20716 + spin_lock(&kdb_lock);
20717 + }
20718 + reason = KDB_REASON_SWITCH;
20719 + KDB_STATE_SET(HOLD_CPU);
20720 + spin_unlock(&kdb_lock);
20721 + }
20722 +
20723 + if (reason == KDB_REASON_SWITCH || KDB_STATE(REENTRY))
20724 + ; /* drop through */
20725 + else {
20726 + KDB_DEBUG_STATE("kdb 4", reason);
20727 + spin_lock(&kdb_lock);
20728 + while (KDB_IS_RUNNING() || kdb_previous_event()) {
20729 + spin_unlock(&kdb_lock);
20730 + while (KDB_IS_RUNNING() || kdb_previous_event())
20731 + cpu_relax();
20732 + spin_lock(&kdb_lock);
20733 + }
20734 + KDB_DEBUG_STATE("kdb 5", reason);
20735 +
20736 + kdb_initial_cpu = smp_processor_id();
20737 + ++kdb_seqno;
20738 + spin_unlock(&kdb_lock);
20739 + if (!kdb_quiet(reason))
20740 + notify_die(DIE_KDEBUG_ENTER, "KDEBUG ENTER", regs, error, 0, 0);
20741 + }
20742 +
20743 + if (smp_processor_id() == kdb_initial_cpu
20744 + && !KDB_STATE(REENTRY)) {
20745 + KDB_STATE_CLEAR(HOLD_CPU);
20746 + KDB_STATE_CLEAR(WAIT_IPI);
20747 + kdb_check_i8042();
20748 + /*
20749 + * Remove the global breakpoints. This is only done
20750 + * once from the initial processor on initial entry.
20751 + */
20752 + if (!kdb_quiet(reason) || smp_processor_id() == 0)
20753 + kdb_bp_remove_global();
20754 +
20755 + /*
20756 + * If SMP, stop other processors. The other processors
20757 + * will enter kdb() with KDB_REASON_SWITCH and spin in
20758 + * kdb_main_loop().
20759 + */
20760 + KDB_DEBUG_STATE("kdb 6", reason);
20761 + if (NR_CPUS > 1 && !kdb_quiet(reason)) {
20762 + int i;
20763 + for (i = 0; i < NR_CPUS; ++i) {
20764 + if (!cpu_online(i))
20765 + continue;
20766 + if (i != kdb_initial_cpu) {
20767 + KDB_STATE_SET_CPU(HOLD_CPU, i);
20768 + KDB_STATE_SET_CPU(WAIT_IPI, i);
20769 + }
20770 + }
20771 + KDB_DEBUG_STATE("kdb 7", reason);
20772 + smp_kdb_stop();
20773 + KDB_DEBUG_STATE("kdb 8", reason);
20774 + }
20775 + }
20776 +
20777 + if (KDB_STATE(GO1)) {
20778 + kdb_bp_remove_global(); /* They were set for single-step purposes */
20779 + KDB_STATE_CLEAR(GO1);
20780 + reason = KDB_REASON_SILENT; /* Now silently go */
20781 + }
20782 +
20783 + /* Set up a consistent set of process stacks before talking to the user */
20784 + KDB_DEBUG_STATE("kdb 9", result);
20785 + result = kdba_main_loop(reason, reason2, error, db_result, regs);
20786 + reason = reason2; /* back to original event type */
20787 +
20788 + KDB_DEBUG_STATE("kdb 10", result);
20789 + kdba_adjust_ip(reason, error, regs);
20790 + KDB_STATE_CLEAR(LONGJMP);
20791 + KDB_DEBUG_STATE("kdb 11", result);
20792 + /* go which requires single-step over a breakpoint must only release
20793 + * one cpu.
20794 + */
20795 + if (result == KDB_CMD_GO && KDB_STATE(SSBPT))
20796 + KDB_STATE_SET(GO1);
20797 +
20798 + if (smp_processor_id() == kdb_initial_cpu &&
20799 + !KDB_STATE(DOING_SS) &&
20800 + !KDB_STATE(RECURSE)) {
20801 + /*
20802 + * (Re)install the global breakpoints and cleanup the cached
20803 + * symbol table. This is only done once from the initial
20804 + * processor on go.
20805 + */
20806 + KDB_DEBUG_STATE("kdb 12", reason);
20807 + if (!kdb_quiet(reason) || smp_processor_id() == 0) {
20808 + kdb_bp_install_global(regs);
20809 + kdbnearsym_cleanup();
20810 + debug_kusage();
20811 + }
20812 + if (!KDB_STATE(GO1)) {
20813 + /*
20814 + * Release all other cpus which will see KDB_STATE(LEAVING) is set.
20815 + */
20816 + int i;
20817 + for (i = 0; i < NR_CPUS; ++i) {
20818 + if (KDB_STATE_CPU(KDB, i))
20819 + KDB_STATE_SET_CPU(LEAVING, i);
20820 + KDB_STATE_CLEAR_CPU(WAIT_IPI, i);
20821 + KDB_STATE_CLEAR_CPU(HOLD_CPU, i);
20822 + }
20823 + /* Wait until all the other processors leave kdb */
20824 + while (kdb_previous_event() != 1)
20825 + ;
20826 + if (!kdb_quiet(reason))
20827 + notify_die(DIE_KDEBUG_LEAVE, "KDEBUG LEAVE", regs, error, 0, 0);
20828 + kdb_initial_cpu = -1; /* release kdb control */
20829 + KDB_DEBUG_STATE("kdb 13", reason);
20830 + }
20831 + }
20832 +
20833 + KDB_DEBUG_STATE("kdb 14", result);
20834 + kdba_restoreint(&int_state);
20835 +#ifdef CONFIG_CPU_XSCALE
20836 + if ( smp_processor_id() == kdb_initial_cpu &&
20837 + ( KDB_STATE(SSBPT) | KDB_STATE(DOING_SS) )
20838 + ) {
20839 + kdba_setsinglestep(regs);
20840 + // disable IRQ in stack frame
20841 + KDB_STATE_SET(A_XSC_ICH);
20842 + if ( kdba_disable_retirq(regs) ) {
20843 + KDB_STATE_SET(A_XSC_IRQ);
20844 + }
20845 + else {
20846 + KDB_STATE_CLEAR(A_XSC_IRQ);
20847 + }
20848 + }
20849 +#endif
20850 +
20851 + /* Only do this work if we are really leaving kdb */
20852 + if (!(KDB_STATE(DOING_SS) || KDB_STATE(SSBPT) || KDB_STATE(RECURSE))) {
20853 + KDB_DEBUG_STATE("kdb 15", result);
20854 + kdb_bp_install_local(regs);
20855 + if (old_regs_saved)
20856 + set_irq_regs(old_regs);
20857 + KDB_STATE_CLEAR(KDB_CONTROL);
20858 + }
20859 +
20860 + KDB_DEBUG_STATE("kdb 16", result);
20861 + KDB_FLAG_CLEAR(CATASTROPHIC);
20862 + KDB_STATE_CLEAR(IP_ADJUSTED); /* Re-adjust ip next time in */
20863 + KDB_STATE_CLEAR(KEYBOARD);
20864 + KDB_STATE_CLEAR(KDB); /* Main kdb state has been cleared */
20865 + KDB_STATE_CLEAR(RECURSE);
20866 + KDB_STATE_CLEAR(LEAVING); /* No more kdb work after this */
20867 + KDB_DEBUG_STATE("kdb 17", reason);
20868 +out:
20869 + atomic_dec(&kdb_event);
20870 + preempt_enable();
20871 + return result != 0;
20872 +}
20873 +
20874 +/*
20875 + * kdb_mdr
20876 + *
20877 + * This function implements the guts of the 'mdr' command.
20878 + *
20879 + * mdr <addr arg>,<byte count>
20880 + *
20881 + * Inputs:
20882 + * addr Start address
20883 + * count Number of bytes
20884 + * Outputs:
20885 + * None.
20886 + * Returns:
20887 + * Always 0. Any errors are detected and printed by kdb_getarea.
20888 + * Locking:
20889 + * none.
20890 + * Remarks:
20891 + */
20892 +
20893 +static int
20894 +kdb_mdr(kdb_machreg_t addr, unsigned int count)
20895 +{
20896 + unsigned char c;
20897 + while (count--) {
20898 + if (kdb_getarea(c, addr))
20899 + return 0;
20900 + kdb_printf("%02x", c);
20901 + addr++;
20902 + }
20903 + kdb_printf("\n");
20904 + return 0;
20905 +}
20906 +
20907 +/*
20908 + * kdb_md
20909 + *
20910 + * This function implements the 'md', 'md1', 'md2', 'md4', 'md8'
20911 + * 'mdr' and 'mds' commands.
20912 + *
20913 + * md|mds [<addr arg> [<line count> [<radix>]]]
20914 + * mdWcN [<addr arg> [<line count> [<radix>]]]
20915 + * where W = is the width (1, 2, 4 or 8) and N is the count.
20916 + * for eg., md1c20 reads 20 bytes, 1 at a time.
20917 + * mdr <addr arg>,<byte count>
20918 + *
20919 + * Inputs:
20920 + * argc argument count
20921 + * argv argument vector
20922 + * Outputs:
20923 + * None.
20924 + * Returns:
20925 + * zero for success, a kdb diagnostic if error
20926 + * Locking:
20927 + * none.
20928 + * Remarks:
20929 + */
20930 +
20931 +static void
20932 +kdb_md_line(const char *fmtstr, kdb_machreg_t addr,
20933 + int symbolic, int nosect, int bytesperword,
20934 + int num, int repeat, int phys)
20935 +{
20936 + /* print just one line of data */
20937 + kdb_symtab_t symtab;
20938 + char cbuf[32];
20939 + char *c = cbuf;
20940 + int i;
20941 + unsigned long word;
20942 +
20943 + memset(cbuf, '\0', sizeof(cbuf));
20944 + if (phys)
20945 + kdb_printf("phys " kdb_machreg_fmt0 " ", addr);
20946 + else
20947 + kdb_printf(kdb_machreg_fmt0 " ", addr);
20948 +
20949 + for (i = 0; i < num && repeat--; i++) {
20950 + if (phys) {
20951 + if (kdb_getphysword(&word, addr, bytesperword))
20952 + break;
20953 + } else if (kdb_getword(&word, addr, bytesperword))
20954 + break;
20955 + kdb_printf(fmtstr, word);
20956 + if (symbolic)
20957 + kdbnearsym(word, &symtab);
20958 + else
20959 + memset(&symtab, 0, sizeof(symtab));
20960 + if (symtab.sym_name) {
20961 + kdb_symbol_print(word, &symtab, 0);
20962 + if (!nosect) {
20963 + kdb_printf("\n");
20964 + kdb_printf(" %s %s "
20965 + kdb_machreg_fmt " " kdb_machreg_fmt " " kdb_machreg_fmt,
20966 + symtab.mod_name,
20967 + symtab.sec_name,
20968 + symtab.sec_start,
20969 + symtab.sym_start,
20970 + symtab.sym_end);
20971 + }
20972 + addr += bytesperword;
20973 + } else {
20974 + union {
20975 + u64 word;
20976 + unsigned char c[8];
20977 + } wc;
20978 + unsigned char *cp;
20979 +#ifdef __BIG_ENDIAN
20980 + cp = wc.c + 8 - bytesperword;
20981 +#else
20982 + cp = wc.c;
20983 +#endif
20984 + wc.word = word;
20985 +#define printable_char(c) ({unsigned char __c = c; isascii(__c) && isprint(__c) ? __c : '.';})
20986 + switch (bytesperword) {
20987 + case 8:
20988 + *c++ = printable_char(*cp++);
20989 + *c++ = printable_char(*cp++);
20990 + *c++ = printable_char(*cp++);
20991 + *c++ = printable_char(*cp++);
20992 + addr += 4;
20993 + case 4:
20994 + *c++ = printable_char(*cp++);
20995 + *c++ = printable_char(*cp++);
20996 + addr += 2;
20997 + case 2:
20998 + *c++ = printable_char(*cp++);
20999 + addr++;
21000 + case 1:
21001 + *c++ = printable_char(*cp++);
21002 + addr++;
21003 + break;
21004 + }
21005 +#undef printable_char
21006 + }
21007 + }
21008 + kdb_printf("%*s %s\n", (int)((num-i)*(2*bytesperword + 1)+1), " ", cbuf);
21009 +}
21010 +
21011 +static int
21012 +kdb_md(int argc, const char **argv)
21013 +{
21014 + static kdb_machreg_t last_addr;
21015 + static int last_radix, last_bytesperword, last_repeat;
21016 + int radix = 16, mdcount = 8, bytesperword = KDB_WORD_SIZE, repeat;
21017 + int nosect = 0;
21018 + char fmtchar, fmtstr[64];
21019 + kdb_machreg_t addr;
21020 + unsigned long word;
21021 + long offset = 0;
21022 + int symbolic = 0;
21023 + int valid = 0;
21024 + int phys = 0;
21025 +
21026 + kdbgetintenv("MDCOUNT", &mdcount);
21027 + kdbgetintenv("RADIX", &radix);
21028 + kdbgetintenv("BYTESPERWORD", &bytesperword);
21029 +
21030 + /* Assume 'md <addr>' and start with environment values */
21031 + repeat = mdcount * 16 / bytesperword;
21032 +
21033 + if (strcmp(argv[0], "mdr") == 0) {
21034 + if (argc != 2)
21035 + return KDB_ARGCOUNT;
21036 + valid = 1;
21037 + } else if (isdigit(argv[0][2])) {
21038 + bytesperword = (int)(argv[0][2] - '0');
21039 + if (bytesperword == 0) {
21040 + bytesperword = last_bytesperword;
21041 + if (bytesperword == 0) {
21042 + bytesperword = 4;
21043 + }
21044 + }
21045 + last_bytesperword = bytesperword;
21046 + repeat = mdcount * 16 / bytesperword;
21047 + if (!argv[0][3])
21048 + valid = 1;
21049 + else if (argv[0][3] == 'c' && argv[0][4]) {
21050 + char *p;
21051 + repeat = simple_strtoul(argv[0]+4, &p, 10);
21052 + mdcount = ((repeat * bytesperword) + 15) / 16;
21053 + valid = !*p;
21054 + }
21055 + last_repeat = repeat;
21056 + } else if (strcmp(argv[0], "md") == 0)
21057 + valid = 1;
21058 + else if (strcmp(argv[0], "mds") == 0)
21059 + valid = 1;
21060 + else if (strcmp(argv[0], "mdp") == 0) {
21061 + phys = valid = 1;
21062 + }
21063 + if (!valid)
21064 + return KDB_NOTFOUND;
21065 +
21066 + if (argc == 0) {
21067 + if (last_addr == 0)
21068 + return KDB_ARGCOUNT;
21069 + addr = last_addr;
21070 + radix = last_radix;
21071 + bytesperword = last_bytesperword;
21072 + repeat = last_repeat;
21073 + mdcount = ((repeat * bytesperword) + 15) / 16;
21074 + }
21075 +
21076 + if (argc) {
21077 + kdb_machreg_t val;
21078 + int diag, nextarg = 1;
21079 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
21080 + if (diag)
21081 + return diag;
21082 + if (argc > nextarg+2)
21083 + return KDB_ARGCOUNT;
21084 +
21085 + if (argc >= nextarg) {
21086 + diag = kdbgetularg(argv[nextarg], &val);
21087 + if (!diag) {
21088 + mdcount = (int) val;
21089 + repeat = mdcount * 16 / bytesperword;
21090 + }
21091 + }
21092 + if (argc >= nextarg+1) {
21093 + diag = kdbgetularg(argv[nextarg+1], &val);
21094 + if (!diag)
21095 + radix = (int) val;
21096 + }
21097 + }
21098 +
21099 + if (strcmp(argv[0], "mdr") == 0) {
21100 + return kdb_mdr(addr, mdcount);
21101 + }
21102 +
21103 + switch (radix) {
21104 + case 10:
21105 + fmtchar = 'd';
21106 + break;
21107 + case 16:
21108 + fmtchar = 'x';
21109 + break;
21110 + case 8:
21111 + fmtchar = 'o';
21112 + break;
21113 + default:
21114 + return KDB_BADRADIX;
21115 + }
21116 +
21117 + last_radix = radix;
21118 +
21119 + if (bytesperword > KDB_WORD_SIZE)
21120 + return KDB_BADWIDTH;
21121 +
21122 + switch (bytesperword) {
21123 + case 8:
21124 + sprintf(fmtstr, "%%16.16l%c ", fmtchar);
21125 + break;
21126 + case 4:
21127 + sprintf(fmtstr, "%%8.8l%c ", fmtchar);
21128 + break;
21129 + case 2:
21130 + sprintf(fmtstr, "%%4.4l%c ", fmtchar);
21131 + break;
21132 + case 1:
21133 + sprintf(fmtstr, "%%2.2l%c ", fmtchar);
21134 + break;
21135 + default:
21136 + return KDB_BADWIDTH;
21137 + }
21138 +
21139 + last_repeat = repeat;
21140 + last_bytesperword = bytesperword;
21141 +
21142 + if (strcmp(argv[0], "mds") == 0) {
21143 + symbolic = 1;
21144 + /* Do not save these changes as last_*, they are temporary mds
21145 + * overrides.
21146 + */
21147 + bytesperword = KDB_WORD_SIZE;
21148 + repeat = mdcount;
21149 + kdbgetintenv("NOSECT", &nosect);
21150 + }
21151 +
21152 + /* Round address down modulo BYTESPERWORD */
21153 +
21154 + addr &= ~(bytesperword-1);
21155 +
21156 + while (repeat > 0) {
21157 + unsigned long a;
21158 + int n, z, num = (symbolic ? 1 : (16 / bytesperword));
21159 +
21160 + for (a = addr, z = 0; z < repeat; a += bytesperword, ++z) {
21161 + if (phys) {
21162 + if (kdb_getphysword(&word, a, bytesperword)
21163 + || word)
21164 + break;
21165 + } else if (kdb_getword(&word, a, bytesperword) || word)
21166 + break;
21167 + }
21168 + n = min(num, repeat);
21169 + kdb_md_line(fmtstr, addr, symbolic, nosect, bytesperword, num, repeat, phys);
21170 + addr += bytesperword * n;
21171 + repeat -= n;
21172 + z = (z + num - 1) / num;
21173 + if (z > 2) {
21174 + int s = num * (z-2);
21175 + kdb_printf(kdb_machreg_fmt0 "-" kdb_machreg_fmt0 " zero suppressed\n",
21176 + addr, addr + bytesperword * s - 1);
21177 + addr += bytesperword * s;
21178 + repeat -= s;
21179 + }
21180 + }
21181 + last_addr = addr;
21182 +
21183 + return 0;
21184 +}
21185 +
21186 +/*
21187 + * kdb_mm
21188 + *
21189 + * This function implements the 'mm' command.
21190 + *
21191 + * mm address-expression new-value
21192 + *
21193 + * Inputs:
21194 + * argc argument count
21195 + * argv argument vector
21196 + * Outputs:
21197 + * None.
21198 + * Returns:
21199 + * zero for success, a kdb diagnostic if error
21200 + * Locking:
21201 + * none.
21202 + * Remarks:
21203 + * mm works on machine words, mmW works on bytes.
21204 + */
21205 +
21206 +static int
21207 +kdb_mm(int argc, const char **argv)
21208 +{
21209 + int diag;
21210 + kdb_machreg_t addr;
21211 + long offset = 0;
21212 + unsigned long contents;
21213 + int nextarg;
21214 + int width;
21215 +
21216 + if (argv[0][2] && !isdigit(argv[0][2]))
21217 + return KDB_NOTFOUND;
21218 +
21219 + if (argc < 2) {
21220 + return KDB_ARGCOUNT;
21221 + }
21222 +
21223 + nextarg = 1;
21224 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
21225 + return diag;
21226 +
21227 + if (nextarg > argc)
21228 + return KDB_ARGCOUNT;
21229 +
21230 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &contents, NULL, NULL)))
21231 + return diag;
21232 +
21233 + if (nextarg != argc + 1)
21234 + return KDB_ARGCOUNT;
21235 +
21236 + width = argv[0][2] ? (argv[0][2] - '0') : (KDB_WORD_SIZE);
21237 + if ((diag = kdb_putword(addr, contents, width)))
21238 + return diag;
21239 +
21240 + kdb_printf(kdb_machreg_fmt " = " kdb_machreg_fmt "\n", addr, contents);
21241 +
21242 + return 0;
21243 +}
21244 +
21245 +/*
21246 + * kdb_go
21247 + *
21248 + * This function implements the 'go' command.
21249 + *
21250 + * go [address-expression]
21251 + *
21252 + * Inputs:
21253 + * argc argument count
21254 + * argv argument vector
21255 + * Outputs:
21256 + * None.
21257 + * Returns:
21258 + * KDB_CMD_GO for success, a kdb diagnostic if error
21259 + * Locking:
21260 + * none.
21261 + * Remarks:
21262 + */
21263 +
21264 +static int
21265 +kdb_go(int argc, const char **argv)
21266 +{
21267 + kdb_machreg_t addr;
21268 + int diag;
21269 + int nextarg;
21270 + long offset;
21271 + struct pt_regs *regs = get_irq_regs();
21272 +
21273 + if (argc == 1) {
21274 + if (smp_processor_id() != kdb_initial_cpu) {
21275 + kdb_printf("go <address> must be issued from the initial cpu, do cpu %d first\n", kdb_initial_cpu);
21276 + return KDB_ARGCOUNT;
21277 + }
21278 + nextarg = 1;
21279 + diag = kdbgetaddrarg(argc, argv, &nextarg,
21280 + &addr, &offset, NULL);
21281 + if (diag)
21282 + return diag;
21283 +
21284 + kdba_setpc(regs, addr);
21285 + } else if (argc)
21286 + return KDB_ARGCOUNT;
21287 +
21288 + diag = KDB_CMD_GO;
21289 + if (KDB_FLAG(CATASTROPHIC)) {
21290 + kdb_printf("Catastrophic error detected\n");
21291 + kdb_printf("kdb_continue_catastrophic=%d, ",
21292 + kdb_continue_catastrophic);
21293 + if (kdb_continue_catastrophic == 0 && kdb_go_count++ == 0) {
21294 + kdb_printf("type go a second time if you really want to continue\n");
21295 + return 0;
21296 + }
21297 + if (kdb_continue_catastrophic == 2) {
21298 + kdb_do_dump();
21299 + kdb_printf("forcing reboot\n");
21300 + kdb_reboot(0, NULL);
21301 + }
21302 + kdb_printf("attempting to continue\n");
21303 + }
21304 + if (smp_processor_id() != kdb_initial_cpu) {
21305 + char buf[80];
21306 + kdb_printf("go was not issued from initial cpu, switching back to cpu %d\n", kdb_initial_cpu);
21307 + sprintf(buf, "cpu %d\n", kdb_initial_cpu);
21308 + /* Recursive use of kdb_parse, do not use argv after this point */
21309 + argv = NULL;
21310 + diag = kdb_parse(buf);
21311 + if (diag == KDB_CMD_CPU)
21312 + KDB_STATE_SET_CPU(GO_SWITCH, kdb_initial_cpu);
21313 + }
21314 + return diag;
21315 +}
21316 +
21317 +/*
21318 + * kdb_rd
21319 + *
21320 + * This function implements the 'rd' command.
21321 + *
21322 + * rd display all general registers.
21323 + * rd c display all control registers.
21324 + * rd d display all debug registers.
21325 + *
21326 + * Inputs:
21327 + * argc argument count
21328 + * argv argument vector
21329 + * Outputs:
21330 + * None.
21331 + * Returns:
21332 + * zero for success, a kdb diagnostic if error
21333 + * Locking:
21334 + * none.
21335 + * Remarks:
21336 + */
21337 +
21338 +static int
21339 +kdb_rd(int argc, const char **argv)
21340 +{
21341 + int diag;
21342 + if (argc == 0) {
21343 + if ((diag = kdb_check_regs()))
21344 + return diag;
21345 + return kdba_dumpregs(kdb_current_regs, NULL, NULL);
21346 + }
21347 +
21348 + if (argc > 2) {
21349 + return KDB_ARGCOUNT;
21350 + }
21351 +
21352 + if ((diag = kdb_check_regs()))
21353 + return diag;
21354 + return kdba_dumpregs(kdb_current_regs, argv[1], argc==2 ? argv[2]: NULL);
21355 +}
21356 +
21357 +/*
21358 + * kdb_rm
21359 + *
21360 + * This function implements the 'rm' (register modify) command.
21361 + *
21362 + * rm register-name new-contents
21363 + *
21364 + * Inputs:
21365 + * argc argument count
21366 + * argv argument vector
21367 + * Outputs:
21368 + * None.
21369 + * Returns:
21370 + * zero for success, a kdb diagnostic if error
21371 + * Locking:
21372 + * none.
21373 + * Remarks:
21374 + * Currently doesn't allow modification of control or
21375 + * debug registers.
21376 + */
21377 +
21378 +static int
21379 +kdb_rm(int argc, const char **argv)
21380 +{
21381 + int diag;
21382 + int ind = 0;
21383 + kdb_machreg_t contents;
21384 +
21385 + if (argc != 2) {
21386 + return KDB_ARGCOUNT;
21387 + }
21388 +
21389 + /*
21390 + * Allow presence or absence of leading '%' symbol.
21391 + */
21392 +
21393 + if (argv[1][0] == '%')
21394 + ind = 1;
21395 +
21396 + diag = kdbgetularg(argv[2], &contents);
21397 + if (diag)
21398 + return diag;
21399 +
21400 + if ((diag = kdb_check_regs()))
21401 + return diag;
21402 + diag = kdba_setregcontents(&argv[1][ind], kdb_current_regs, contents);
21403 + if (diag)
21404 + return diag;
21405 +
21406 + return 0;
21407 +}
21408 +
21409 +#if defined(CONFIG_MAGIC_SYSRQ)
21410 +/*
21411 + * kdb_sr
21412 + *
21413 + * This function implements the 'sr' (SYSRQ key) command which
21414 + * interfaces to the soi-disant MAGIC SYSRQ functionality.
21415 + *
21416 + * sr <magic-sysrq-code>
21417 + *
21418 + * Inputs:
21419 + * argc argument count
21420 + * argv argument vector
21421 + * Outputs:
21422 + * None.
21423 + * Returns:
21424 + * zero for success, a kdb diagnostic if error
21425 + * Locking:
21426 + * none.
21427 + * Remarks:
21428 + * None.
21429 + */
21430 +static int
21431 +kdb_sr(int argc, const char **argv)
21432 +{
21433 + extern int __sysrq_enabled;
21434 + if (argc != 1) {
21435 + return KDB_ARGCOUNT;
21436 + }
21437 + if (!__sysrq_enabled) {
21438 + kdb_printf("Auto activating sysrq\n");
21439 + __sysrq_enabled = 1;
21440 + }
21441 +
21442 + handle_sysrq(*argv[1], NULL);
21443 +
21444 + return 0;
21445 +}
21446 +#endif /* CONFIG_MAGIC_SYSRQ */
21447 +
21448 +/*
21449 + * kdb_ef
21450 + *
21451 + * This function implements the 'regs' (display exception frame)
21452 + * command. This command takes an address and expects to find
21453 + * an exception frame at that address, formats and prints it.
21454 + *
21455 + * regs address-expression
21456 + *
21457 + * Inputs:
21458 + * argc argument count
21459 + * argv argument vector
21460 + * Outputs:
21461 + * None.
21462 + * Returns:
21463 + * zero for success, a kdb diagnostic if error
21464 + * Locking:
21465 + * none.
21466 + * Remarks:
21467 + * Not done yet.
21468 + */
21469 +
21470 +static int
21471 +kdb_ef(int argc, const char **argv)
21472 +{
21473 + int diag;
21474 + kdb_machreg_t addr;
21475 + long offset;
21476 + int nextarg;
21477 +
21478 + if (argc == 1) {
21479 + nextarg = 1;
21480 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
21481 + if (diag)
21482 + return diag;
21483 +
21484 + return kdba_dumpregs((struct pt_regs *)addr, NULL, NULL);
21485 + }
21486 +
21487 + return KDB_ARGCOUNT;
21488 +}
21489 +
21490 +#if defined(CONFIG_MODULES)
21491 +extern struct list_head *kdb_modules;
21492 +extern void free_module(struct module *);
21493 +
21494 +/* modules using other modules */
21495 +struct module_use
21496 +{
21497 + struct list_head list;
21498 + struct module *module_which_uses;
21499 +};
21500 +
21501 +/*
21502 + * kdb_lsmod
21503 + *
21504 + * This function implements the 'lsmod' command. Lists currently
21505 + * loaded kernel modules.
21506 + *
21507 + * Mostly taken from userland lsmod.
21508 + *
21509 + * Inputs:
21510 + * argc argument count
21511 + * argv argument vector
21512 + * Outputs:
21513 + * None.
21514 + * Returns:
21515 + * zero for success, a kdb diagnostic if error
21516 + * Locking:
21517 + * none.
21518 + * Remarks:
21519 + *
21520 + */
21521 +
21522 +static int
21523 +kdb_lsmod(int argc, const char **argv)
21524 +{
21525 + struct module *mod;
21526 +
21527 + if (argc != 0)
21528 + return KDB_ARGCOUNT;
21529 +
21530 + kdb_printf("Module Size modstruct Used by\n");
21531 + list_for_each_entry(mod, kdb_modules, list) {
21532 +
21533 + kdb_printf("%-20s%8u 0x%p ", mod->name,
21534 + mod->core_size, (void *)mod);
21535 +#ifdef CONFIG_MODULE_UNLOAD
21536 + kdb_printf("%4d ", module_refcount(mod));
21537 +#endif
21538 + if (mod->state == MODULE_STATE_GOING)
21539 + kdb_printf(" (Unloading)");
21540 + else if (mod->state == MODULE_STATE_COMING)
21541 + kdb_printf(" (Loading)");
21542 + else
21543 + kdb_printf(" (Live)");
21544 +
21545 +#ifdef CONFIG_MODULE_UNLOAD
21546 + {
21547 + struct module_use *use;
21548 + kdb_printf(" [ ");
21549 + list_for_each_entry(use, &mod->modules_which_use_me, list)
21550 + kdb_printf("%s ", use->module_which_uses->name);
21551 + kdb_printf("]\n");
21552 + }
21553 +#endif
21554 + }
21555 +
21556 + return 0;
21557 +}
21558 +
21559 +#endif /* CONFIG_MODULES */
21560 +
21561 +/*
21562 + * kdb_env
21563 + *
21564 + * This function implements the 'env' command. Display the current
21565 + * environment variables.
21566 + *
21567 + * Inputs:
21568 + * argc argument count
21569 + * argv argument vector
21570 + * Outputs:
21571 + * None.
21572 + * Returns:
21573 + * zero for success, a kdb diagnostic if error
21574 + * Locking:
21575 + * none.
21576 + * Remarks:
21577 + */
21578 +
21579 +static int
21580 +kdb_env(int argc, const char **argv)
21581 +{
21582 + int i;
21583 +
21584 + for(i=0; i<__nenv; i++) {
21585 + if (__env[i]) {
21586 + kdb_printf("%s\n", __env[i]);
21587 + }
21588 + }
21589 +
21590 + if (KDB_DEBUG(MASK))
21591 + kdb_printf("KDBFLAGS=0x%x\n", kdb_flags);
21592 +
21593 + return 0;
21594 +}
21595 +
21596 +/*
21597 + * kdb_dmesg
21598 + *
21599 + * This function implements the 'dmesg' command to display the contents
21600 + * of the syslog buffer.
21601 + *
21602 + * dmesg [lines] [adjust]
21603 + *
21604 + * Inputs:
21605 + * argc argument count
21606 + * argv argument vector
21607 + * Outputs:
21608 + * None.
21609 + * Returns:
21610 + * zero for success, a kdb diagnostic if error
21611 + * Locking:
21612 + * none.
21613 + * Remarks:
21614 + * None.
21615 + */
21616 +
21617 +static int
21618 +kdb_dmesg(int argc, const char **argv)
21619 +{
21620 + char *syslog_data[4], *start, *end, c = '\0', *p;
21621 + int diag, logging, logsize, lines = 0, adjust = 0, n;
21622 +
21623 + if (argc > 2)
21624 + return KDB_ARGCOUNT;
21625 + if (argc) {
21626 + char *cp;
21627 + lines = simple_strtol(argv[1], &cp, 0);
21628 + if (*cp)
21629 + lines = 0;
21630 + if (argc > 1) {
21631 + adjust = simple_strtoul(argv[2], &cp, 0);
21632 + if (*cp || adjust < 0)
21633 + adjust = 0;
21634 + }
21635 + }
21636 +
21637 + /* disable LOGGING if set */
21638 + diag = kdbgetintenv("LOGGING", &logging);
21639 + if (!diag && logging) {
21640 + const char *setargs[] = { "set", "LOGGING", "0" };
21641 + kdb_set(2, setargs);
21642 + }
21643 +
21644 + /* syslog_data[0,1] physical start, end+1. syslog_data[2,3] logical start, end+1. */
21645 + kdb_syslog_data(syslog_data);
21646 + if (syslog_data[2] == syslog_data[3])
21647 + return 0;
21648 + logsize = syslog_data[1] - syslog_data[0];
21649 + start = syslog_data[2];
21650 + end = syslog_data[3];
21651 +#define KDB_WRAP(p) (((p - syslog_data[0]) % logsize) + syslog_data[0])
21652 + for (n = 0, p = start; p < end; ++p) {
21653 + if ((c = *KDB_WRAP(p)) == '\n')
21654 + ++n;
21655 + }
21656 + if (c != '\n')
21657 + ++n;
21658 + if (lines < 0) {
21659 + if (adjust >= n)
21660 + kdb_printf("buffer only contains %d lines, nothing printed\n", n);
21661 + else if (adjust - lines >= n)
21662 + kdb_printf("buffer only contains %d lines, last %d lines printed\n",
21663 + n, n - adjust);
21664 + if (adjust) {
21665 + for (; start < end && adjust; ++start) {
21666 + if (*KDB_WRAP(start) == '\n')
21667 + --adjust;
21668 + }
21669 + if (start < end)
21670 + ++start;
21671 + }
21672 + for (p = start; p < end && lines; ++p) {
21673 + if (*KDB_WRAP(p) == '\n')
21674 + ++lines;
21675 + }
21676 + end = p;
21677 + } else if (lines > 0) {
21678 + int skip = n - (adjust + lines);
21679 + if (adjust >= n) {
21680 + kdb_printf("buffer only contains %d lines, nothing printed\n", n);
21681 + skip = n;
21682 + } else if (skip < 0) {
21683 + lines += skip;
21684 + skip = 0;
21685 + kdb_printf("buffer only contains %d lines, first %d lines printed\n",
21686 + n, lines);
21687 + }
21688 + for (; start < end && skip; ++start) {
21689 + if (*KDB_WRAP(start) == '\n')
21690 + --skip;
21691 + }
21692 + for (p = start; p < end && lines; ++p) {
21693 + if (*KDB_WRAP(p) == '\n')
21694 + --lines;
21695 + }
21696 + end = p;
21697 + }
21698 + /* Do a line at a time (max 200 chars) to reduce protocol overhead */
21699 + c = '\n';
21700 + while (start != end) {
21701 + char buf[201];
21702 + p = buf;
21703 + while (start < end && (c = *KDB_WRAP(start)) && (p - buf) < sizeof(buf)-1) {
21704 + ++start;
21705 + *p++ = c;
21706 + if (c == '\n')
21707 + break;
21708 + }
21709 + *p = '\0';
21710 + kdb_printf("%s", buf);
21711 + }
21712 + if (c != '\n')
21713 + kdb_printf("\n");
21714 +
21715 + return 0;
21716 +}
21717 +
21718 +/*
21719 + * kdb_cpu
21720 + *
21721 + * This function implements the 'cpu' command.
21722 + *
21723 + * cpu [<cpunum>]
21724 + *
21725 + * Inputs:
21726 + * argc argument count
21727 + * argv argument vector
21728 + * Outputs:
21729 + * None.
21730 + * Returns:
21731 + * KDB_CMD_CPU for success, a kdb diagnostic if error
21732 + * Locking:
21733 + * none.
21734 + * Remarks:
21735 + * All cpu's should be spinning in kdb(). However just in case
21736 + * a cpu did not take the smp_kdb_stop NMI, check that a cpu
21737 + * entered kdb() before passing control to it.
21738 + */
21739 +
21740 +static void
21741 +kdb_cpu_status(void)
21742 +{
21743 + int i, start_cpu, first_print = 1;
21744 + char state, prev_state = '?';
21745 +
21746 + kdb_printf("Currently on cpu %d\n", smp_processor_id());
21747 + kdb_printf("Available cpus: ");
21748 + for (start_cpu = -1, i = 0; i < NR_CPUS; i++) {
21749 + if (!cpu_online(i))
21750 + state = 'F'; /* cpu is offline */
21751 + else {
21752 + struct kdb_running_process *krp = kdb_running_process+i;
21753 + if (KDB_STATE_CPU(KDB, i)) {
21754 + state = ' '; /* cpu is responding to kdb */
21755 + if (kdb_task_state_char(krp->p) == 'I')
21756 + state = 'I'; /* running the idle task */
21757 + } else if (krp->seqno && krp->p && krp->seqno >= kdb_seqno - 1)
21758 + state = '+'; /* some kdb data, but not responding */
21759 + else
21760 + state = '*'; /* no kdb data */
21761 + }
21762 + if (state != prev_state) {
21763 + if (prev_state != '?') {
21764 + if (!first_print)
21765 + kdb_printf(", ");
21766 + first_print = 0;
21767 + kdb_printf("%d", start_cpu);
21768 + if (start_cpu < i-1)
21769 + kdb_printf("-%d", i-1);
21770 + if (prev_state != ' ')
21771 + kdb_printf("(%c)", prev_state);
21772 + }
21773 + prev_state = state;
21774 + start_cpu = i;
21775 + }
21776 + }
21777 + /* print the trailing cpus, ignoring them if they are all offline */
21778 + if (prev_state != 'F') {
21779 + if (!first_print)
21780 + kdb_printf(", ");
21781 + kdb_printf("%d", start_cpu);
21782 + if (start_cpu < i-1)
21783 + kdb_printf("-%d", i-1);
21784 + if (prev_state != ' ')
21785 + kdb_printf("(%c)", prev_state);
21786 + }
21787 + kdb_printf("\n");
21788 +}
21789 +
21790 +static int
21791 +kdb_cpu(int argc, const char **argv)
21792 +{
21793 + unsigned long cpunum;
21794 + int diag, i;
21795 +
21796 + /* ask the other cpus if they are still active */
21797 + for (i=0; i<NR_CPUS; i++) {
21798 + if (cpu_online(i))
21799 + KDB_STATE_CLEAR_CPU(KDB, i);
21800 + }
21801 + KDB_STATE_SET(KDB);
21802 + barrier();
21803 + /* wait for the other cpus to notice and set state KDB again,
21804 + * see kdb_main_loop
21805 + */
21806 + udelay(1000);
21807 +
21808 + if (argc == 0) {
21809 + kdb_cpu_status();
21810 + return 0;
21811 + }
21812 +
21813 + if (argc != 1)
21814 + return KDB_ARGCOUNT;
21815 +
21816 + diag = kdbgetularg(argv[1], &cpunum);
21817 + if (diag)
21818 + return diag;
21819 +
21820 + /*
21821 + * Validate cpunum
21822 + */
21823 + if ((cpunum > NR_CPUS)
21824 + || !cpu_online(cpunum)
21825 + || !KDB_STATE_CPU(KDB, cpunum))
21826 + return KDB_BADCPUNUM;
21827 +
21828 + kdb_new_cpu = cpunum;
21829 +
21830 + /*
21831 + * Switch to other cpu
21832 + */
21833 + return KDB_CMD_CPU;
21834 +}
21835 +
21836 +/* The user may not realize that ps/bta with no parameters does not print idle
21837 + * or sleeping system daemon processes, so tell them how many were suppressed.
21838 + */
21839 +void
21840 +kdb_ps_suppressed(void)
21841 +{
21842 + int idle = 0, daemon = 0;
21843 + unsigned long mask_I = kdb_task_state_string("I"),
21844 + mask_M = kdb_task_state_string("M");
21845 + unsigned long cpu;
21846 + const struct task_struct *p, *g;
21847 + for (cpu = 0; cpu < NR_CPUS; ++cpu) {
21848 + if (!cpu_online(cpu))
21849 + continue;
21850 + p = kdb_curr_task(cpu);
21851 + if (kdb_task_state(p, mask_I))
21852 + ++idle;
21853 + }
21854 + kdb_do_each_thread(g, p) {
21855 + if (kdb_task_state(p, mask_M))
21856 + ++daemon;
21857 + } kdb_while_each_thread(g, p);
21858 + if (idle || daemon) {
21859 + if (idle)
21860 + kdb_printf("%d idle process%s (state I)%s\n",
21861 + idle, idle == 1 ? "" : "es",
21862 + daemon ? " and " : "");
21863 + if (daemon)
21864 + kdb_printf("%d sleeping system daemon (state M) process%s",
21865 + daemon, daemon == 1 ? "" : "es");
21866 + kdb_printf(" suppressed,\nuse 'ps A' to see all.\n");
21867 + }
21868 +}
21869 +
21870 +/*
21871 + * kdb_ps
21872 + *
21873 + * This function implements the 'ps' command which shows
21874 + * a list of the active processes.
21875 + *
21876 + * ps [DRSTCZEUIMA] All processes, optionally filtered by state
21877 + *
21878 + * Inputs:
21879 + * argc argument count
21880 + * argv argument vector
21881 + * Outputs:
21882 + * None.
21883 + * Returns:
21884 + * zero for success, a kdb diagnostic if error
21885 + * Locking:
21886 + * none.
21887 + * Remarks:
21888 + */
21889 +
21890 +void
21891 +kdb_ps1(const struct task_struct *p)
21892 +{
21893 + struct kdb_running_process *krp = kdb_running_process + kdb_process_cpu(p);
21894 + kdb_printf("0x%p %8d %8d %d %4d %c 0x%p %c%s\n",
21895 + (void *)p, p->pid, p->parent->pid,
21896 + kdb_task_has_cpu(p), kdb_process_cpu(p),
21897 + kdb_task_state_char(p),
21898 + (void *)(&p->thread),
21899 + p == kdb_curr_task(smp_processor_id()) ? '*': ' ',
21900 + p->comm);
21901 + if (kdb_task_has_cpu(p)) {
21902 + if (!krp->seqno || !krp->p)
21903 + kdb_printf(" Error: no saved data for this cpu\n");
21904 + else {
21905 + if (krp->seqno < kdb_seqno - 1)
21906 + kdb_printf(" Warning: process state is stale\n");
21907 + if (krp->p != p)
21908 + kdb_printf(" Error: does not match running process table (0x%p)\n", krp->p);
21909 + }
21910 + }
21911 +}
21912 +
21913 +static int
21914 +kdb_ps(int argc, const char **argv)
21915 +{
21916 + struct task_struct *g, *p;
21917 + unsigned long mask, cpu;
21918 +
21919 + if (argc == 0)
21920 + kdb_ps_suppressed();
21921 + kdb_printf("%-*s Pid Parent [*] cpu State %-*s Command\n",
21922 + (int)(2*sizeof(void *))+2, "Task Addr",
21923 + (int)(2*sizeof(void *))+2, "Thread");
21924 + mask = kdb_task_state_string(argc ? argv[1] : NULL);
21925 + /* Run the active tasks first */
21926 + for (cpu = 0; cpu < NR_CPUS; ++cpu) {
21927 + if (!cpu_online(cpu))
21928 + continue;
21929 + p = kdb_curr_task(cpu);
21930 + if (kdb_task_state(p, mask))
21931 + kdb_ps1(p);
21932 + }
21933 + kdb_printf("\n");
21934 + /* Now the real tasks */
21935 + kdb_do_each_thread(g, p) {
21936 + if (kdb_task_state(p, mask))
21937 + kdb_ps1(p);
21938 + } kdb_while_each_thread(g, p);
21939 +
21940 + return 0;
21941 +}
21942 +
21943 +/*
21944 + * kdb_pid
21945 + *
21946 + * This function implements the 'pid' command which switches
21947 + * the currently active process.
21948 + *
21949 + * pid [<pid> | R]
21950 + *
21951 + * Inputs:
21952 + * argc argument count
21953 + * argv argument vector
21954 + * Outputs:
21955 + * None.
21956 + * Returns:
21957 + * zero for success, a kdb diagnostic if error
21958 + * Locking:
21959 + * none.
21960 + * Remarks:
21961 + */
21962 +
21963 +
21964 +static int
21965 +kdb_pid(int argc, const char **argv)
21966 +{
21967 + struct task_struct *p;
21968 + unsigned long val;
21969 + int diag;
21970 +
21971 + if (argc > 1)
21972 + return KDB_ARGCOUNT;
21973 +
21974 + if (argc) {
21975 + if (strcmp(argv[1], "R") == 0) {
21976 + p = KDB_RUNNING_PROCESS_ORIGINAL[kdb_initial_cpu].p;
21977 + } else {
21978 + diag = kdbgetularg(argv[1], &val);
21979 + if (diag)
21980 + return KDB_BADINT;
21981 +
21982 + p = find_task_by_pid_type_ns(PIDTYPE_PID, (pid_t)val,
21983 + &init_pid_ns);
21984 + if (!p) {
21985 + kdb_printf("No task with pid=%d\n", (pid_t)val);
21986 + return 0;
21987 + }
21988 + }
21989 +
21990 + kdba_set_current_task(p);
21991 + }
21992 +
21993 + kdb_printf("KDB current process is %s(pid=%d)\n", kdb_current_task->comm,
21994 + kdb_current_task->pid);
21995 +
21996 + return 0;
21997 +}
21998 +
21999 +/*
22000 + * kdb_ll
22001 + *
22002 + * This function implements the 'll' command which follows a linked
22003 + * list and executes an arbitrary command for each element.
22004 + *
22005 + * Inputs:
22006 + * argc argument count
22007 + * argv argument vector
22008 + * Outputs:
22009 + * None.
22010 + * Returns:
22011 + * zero for success, a kdb diagnostic if error
22012 + * Locking:
22013 + * none.
22014 + * Remarks:
22015 + */
22016 +
22017 +static int
22018 +kdb_ll(int argc, const char **argv)
22019 +{
22020 + int diag;
22021 + kdb_machreg_t addr;
22022 + long offset = 0;
22023 + kdb_machreg_t va;
22024 + unsigned long linkoffset;
22025 + int nextarg;
22026 + const char *command;
22027 +
22028 + if (argc != 3) {
22029 + return KDB_ARGCOUNT;
22030 + }
22031 +
22032 + nextarg = 1;
22033 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
22034 + if (diag)
22035 + return diag;
22036 +
22037 + diag = kdbgetularg(argv[2], &linkoffset);
22038 + if (diag)
22039 + return diag;
22040 +
22041 + /*
22042 + * Using the starting address as
22043 + * the first element in the list, and assuming that
22044 + * the list ends with a null pointer.
22045 + */
22046 +
22047 + va = addr;
22048 + if (!(command = kdb_strdup(argv[3], GFP_KDB))) {
22049 + kdb_printf("%s: cannot duplicate command\n", __FUNCTION__);
22050 + return 0;
22051 + }
22052 + /* Recursive use of kdb_parse, do not use argv after this point */
22053 + argv = NULL;
22054 +
22055 + while (va) {
22056 + char buf[80];
22057 +
22058 + sprintf(buf, "%s " kdb_machreg_fmt "\n", command, va);
22059 + diag = kdb_parse(buf);
22060 + if (diag)
22061 + return diag;
22062 +
22063 + addr = va + linkoffset;
22064 + if (kdb_getword(&va, addr, sizeof(va)))
22065 + return 0;
22066 + }
22067 + kfree(command);
22068 +
22069 + return 0;
22070 +}
22071 +
22072 +/*
22073 + * kdb_help
22074 + *
22075 + * This function implements the 'help' and '?' commands.
22076 + *
22077 + * Inputs:
22078 + * argc argument count
22079 + * argv argument vector
22080 + * Outputs:
22081 + * None.
22082 + * Returns:
22083 + * zero for success, a kdb diagnostic if error
22084 + * Locking:
22085 + * none.
22086 + * Remarks:
22087 + */
22088 +
22089 +static int
22090 +kdb_help(int argc, const char **argv)
22091 +{
22092 + kdbtab_t *kt;
22093 + int i;
22094 +
22095 + kdb_printf("%-15.15s %-20.20s %s\n", "Command", "Usage", "Description");
22096 + kdb_printf("----------------------------------------------------------\n");
22097 + for(i=0, kt=kdb_commands; i<kdb_max_commands; i++, kt++) {
22098 + if (kt->cmd_name)
22099 + kdb_printf("%-15.15s %-20.20s %s\n", kt->cmd_name,
22100 + kt->cmd_usage, kt->cmd_help);
22101 + }
22102 + return 0;
22103 +}
22104 +
22105 +extern int kdb_wake_up_process(struct task_struct * p);
22106 +
22107 +/*
22108 + * kdb_kill
22109 + *
22110 + * This function implements the 'kill' commands.
22111 + *
22112 + * Inputs:
22113 + * argc argument count
22114 + * argv argument vector
22115 + * Outputs:
22116 + * None.
22117 + * Returns:
22118 + * zero for success, a kdb diagnostic if error
22119 + * Locking:
22120 + * none.
22121 + * Remarks:
22122 + */
22123 +
22124 +static int
22125 +kdb_kill(int argc, const char **argv)
22126 +{
22127 + long sig, pid;
22128 + char *endp;
22129 + struct task_struct *p;
22130 + struct siginfo info;
22131 +
22132 + if (argc!=2)
22133 + return KDB_ARGCOUNT;
22134 +
22135 + sig = simple_strtol(argv[1], &endp, 0);
22136 + if (*endp)
22137 + return KDB_BADINT;
22138 + if (sig >= 0 ) {
22139 + kdb_printf("Invalid signal parameter.<-signal>\n");
22140 + return 0;
22141 + }
22142 + sig=-sig;
22143 +
22144 + pid = simple_strtol(argv[2], &endp, 0);
22145 + if (*endp)
22146 + return KDB_BADINT;
22147 + if (pid <=0 ) {
22148 + kdb_printf("Process ID must be large than 0.\n");
22149 + return 0;
22150 + }
22151 +
22152 + /* Find the process. */
22153 + if (!(p = find_task_by_pid_type_ns(PIDTYPE_PID, pid, &init_pid_ns))) {
22154 + kdb_printf("The specified process isn't found.\n");
22155 + return 0;
22156 + }
22157 + p = p->group_leader;
22158 + info.si_signo = sig;
22159 + info.si_errno = 0;
22160 + info.si_code = SI_USER;
22161 + info.si_pid = pid; /* use same capabilities as process being signalled */
22162 + info.si_uid = 0; /* kdb has root authority */
22163 + kdb_send_sig_info(p, &info, kdb_seqno);
22164 + return 0;
22165 +}
22166 +
22167 +struct kdb_tm {
22168 + int tm_sec; /* seconds */
22169 + int tm_min; /* minutes */
22170 + int tm_hour; /* hours */
22171 + int tm_mday; /* day of the month */
22172 + int tm_mon; /* month */
22173 + int tm_year; /* year */
22174 +};
22175 +
22176 +static void
22177 +kdb_gmtime(struct timespec *tv, struct kdb_tm *tm)
22178 +{
22179 + /* This will work from 1970-2099, 2100 is not a leap year */
22180 + static int mon_day[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
22181 + memset(tm, 0, sizeof(*tm));
22182 + tm->tm_sec = tv->tv_sec % (24 * 60 * 60);
22183 + tm->tm_mday = tv->tv_sec / (24 * 60 * 60) + (2 * 365 + 1); /* shift base from 1970 to 1968 */
22184 + tm->tm_min = tm->tm_sec / 60 % 60;
22185 + tm->tm_hour = tm->tm_sec / 60 / 60;
22186 + tm->tm_sec = tm->tm_sec % 60;
22187 + tm->tm_year = 68 + 4*(tm->tm_mday / (4*365+1));
22188 + tm->tm_mday %= (4*365+1);
22189 + mon_day[1] = 29;
22190 + while (tm->tm_mday >= mon_day[tm->tm_mon]) {
22191 + tm->tm_mday -= mon_day[tm->tm_mon];
22192 + if (++tm->tm_mon == 12) {
22193 + tm->tm_mon = 0;
22194 + ++tm->tm_year;
22195 + mon_day[1] = 28;
22196 + }
22197 + }
22198 + ++tm->tm_mday;
22199 +}
22200 +
22201 +/*
22202 + * Most of this code has been lifted from kernel/timer.c::sys_sysinfo().
22203 + * I cannot call that code directly from kdb, it has an unconditional
22204 + * cli()/sti() and calls routines that take locks which can stop the debugger.
22205 + */
22206 +
22207 +static void
22208 +kdb_sysinfo(struct sysinfo *val)
22209 +{
22210 + struct timespec uptime;
22211 + do_posix_clock_monotonic_gettime(&uptime);
22212 + memset(val, 0, sizeof(*val));
22213 + val->uptime = uptime.tv_sec;
22214 + val->loads[0] = avenrun[0];
22215 + val->loads[1] = avenrun[1];
22216 + val->loads[2] = avenrun[2];
22217 + val->procs = nr_threads-1;
22218 + si_meminfo(val);
22219 + kdb_si_swapinfo(val);
22220 +
22221 + return;
22222 +}
22223 +
22224 +/*
22225 + * kdb_summary
22226 + *
22227 + * This function implements the 'summary' command.
22228 + *
22229 + * Inputs:
22230 + * argc argument count
22231 + * argv argument vector
22232 + * Outputs:
22233 + * None.
22234 + * Returns:
22235 + * zero for success, a kdb diagnostic if error
22236 + * Locking:
22237 + * none.
22238 + * Remarks:
22239 + */
22240 +
22241 +static int
22242 +kdb_summary(int argc, const char **argv)
22243 +{
22244 + extern struct timespec xtime;
22245 + extern struct timezone sys_tz;
22246 + struct kdb_tm tm;
22247 + struct sysinfo val;
22248 +
22249 + if (argc)
22250 + return KDB_ARGCOUNT;
22251 +
22252 + kdb_printf("sysname %s\n", init_uts_ns.name.sysname);
22253 + kdb_printf("release %s\n", init_uts_ns.name.release);
22254 + kdb_printf("version %s\n", init_uts_ns.name.version);
22255 + kdb_printf("machine %s\n", init_uts_ns.name.machine);
22256 + kdb_printf("nodename %s\n", init_uts_ns.name.nodename);
22257 + kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
22258 + kdb_printf("ccversion %s\n", __stringify(CCVERSION));
22259 +
22260 + kdb_gmtime(&xtime, &tm);
22261 + kdb_printf("date %04d-%02d-%02d %02d:%02d:%02d tz_minuteswest %d\n",
22262 + 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
22263 + tm.tm_hour, tm.tm_min, tm.tm_sec,
22264 + sys_tz.tz_minuteswest);
22265 +
22266 + kdb_sysinfo(&val);
22267 + kdb_printf("uptime ");
22268 + if (val.uptime > (24*60*60)) {
22269 + int days = val.uptime / (24*60*60);
22270 + val.uptime %= (24*60*60);
22271 + kdb_printf("%d day%s ", days, days == 1 ? "" : "s");
22272 + }
22273 + kdb_printf("%02ld:%02ld\n", val.uptime/(60*60), (val.uptime/60)%60);
22274 +
22275 + /* lifted from fs/proc/proc_misc.c::loadavg_read_proc() */
22276 +
22277 +#define LOAD_INT(x) ((x) >> FSHIFT)
22278 +#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
22279 + kdb_printf("load avg %ld.%02ld %ld.%02ld %ld.%02ld\n",
22280 + LOAD_INT(val.loads[0]), LOAD_FRAC(val.loads[0]),
22281 + LOAD_INT(val.loads[1]), LOAD_FRAC(val.loads[1]),
22282 + LOAD_INT(val.loads[2]), LOAD_FRAC(val.loads[2]));
22283 + kdb_printf("\n");
22284 +#undef LOAD_INT
22285 +#undef LOAD_FRAC
22286 +
22287 + kdb_meminfo_read_proc(); /* in fs/proc/proc_misc.c */
22288 +
22289 + return 0;
22290 +}
22291 +
22292 +/*
22293 + * kdb_per_cpu
22294 + *
22295 + * This function implements the 'per_cpu' command.
22296 + *
22297 + * Inputs:
22298 + * argc argument count
22299 + * argv argument vector
22300 + * Outputs:
22301 + * None.
22302 + * Returns:
22303 + * zero for success, a kdb diagnostic if error
22304 + * Locking:
22305 + * none.
22306 + * Remarks:
22307 + */
22308 +
22309 +static int
22310 +kdb_per_cpu(int argc, const char **argv)
22311 +{
22312 + char buf[256], fmtstr[64];
22313 + kdb_symtab_t symtab;
22314 + cpumask_t suppress = CPU_MASK_NONE;
22315 + int cpu, diag;
22316 + unsigned long addr, val, bytesperword = 0, whichcpu = ~0UL;
22317 +
22318 + if (argc < 1 || argc > 3)
22319 + return KDB_ARGCOUNT;
22320 +
22321 + snprintf(buf, sizeof(buf), "per_cpu__%s", argv[1]);
22322 + if (!kdbgetsymval(buf, &symtab)) {
22323 + kdb_printf("%s is not a per_cpu variable\n", argv[1]);
22324 + return KDB_BADADDR;
22325 + }
22326 + if (argc >=2 && (diag = kdbgetularg(argv[2], &bytesperword)))
22327 + return diag;
22328 + if (!bytesperword)
22329 + bytesperword = KDB_WORD_SIZE;
22330 + else if (bytesperword > KDB_WORD_SIZE)
22331 + return KDB_BADWIDTH;
22332 + sprintf(fmtstr, "%%0%dlx ", (int)(2*bytesperword));
22333 + if (argc >= 3) {
22334 + if ((diag = kdbgetularg(argv[3], &whichcpu)))
22335 + return diag;
22336 + if (!cpu_online(whichcpu)) {
22337 + kdb_printf("cpu %ld is not online\n", whichcpu);
22338 + return KDB_BADCPUNUM;
22339 + }
22340 + }
22341 +
22342 + /* Most architectures use __per_cpu_offset[cpu], some use
22343 + * __per_cpu_offset(cpu), smp has no __per_cpu_offset.
22344 + */
22345 +#ifdef __per_cpu_offset
22346 +#define KDB_PCU(cpu) __per_cpu_offset(cpu)
22347 +#else
22348 +#ifdef CONFIG_SMP
22349 +#define KDB_PCU(cpu) __per_cpu_offset[cpu]
22350 +#else
22351 +#define KDB_PCU(cpu) 0
22352 +#endif
22353 +#endif
22354 +
22355 + for_each_online_cpu(cpu) {
22356 + if (whichcpu != ~0UL && whichcpu != cpu)
22357 + continue;
22358 + addr = symtab.sym_start + KDB_PCU(cpu);
22359 + if ((diag = kdb_getword(&val, addr, bytesperword))) {
22360 + kdb_printf("%5d " kdb_bfd_vma_fmt0 " - unable to read, diag=%d\n",
22361 + cpu, addr, diag);
22362 + continue;
22363 + }
22364 +#ifdef CONFIG_SMP
22365 + if (!val) {
22366 + cpu_set(cpu, suppress);
22367 + continue;
22368 + }
22369 +#endif /* CONFIG_SMP */
22370 + kdb_printf("%5d ", cpu);
22371 + kdb_md_line(fmtstr, addr,
22372 + bytesperword == KDB_WORD_SIZE,
22373 + 1, bytesperword, 1, 1, 0);
22374 + }
22375 + if (cpus_weight(suppress) == 0)
22376 + return 0;
22377 + kdb_printf("Zero suppressed cpu(s):");
22378 + for (cpu = first_cpu(suppress); cpu < NR_CPUS; cpu = next_cpu(cpu, suppress)) {
22379 + kdb_printf(" %d", cpu);
22380 + if (cpu == NR_CPUS-1 || next_cpu(cpu, suppress) != cpu + 1)
22381 + continue;
22382 + while (cpu < NR_CPUS && next_cpu(cpu, suppress) == cpu + 1)
22383 + ++cpu;
22384 + kdb_printf("-%d", cpu);
22385 + }
22386 + kdb_printf("\n");
22387 +
22388 +#undef KDB_PCU
22389 +
22390 + return 0;
22391 +}
22392 +
22393 +/*
22394 + * display help for the use of cmd | grep pattern
22395 + */
22396 +static int
22397 +kdb_grep_help(int argc, const char **argv)
22398 +{
22399 + kdb_printf ("Usage of cmd args | grep pattern:\n");
22400 + kdb_printf (" Any command's output may be filtered through an ");
22401 + kdb_printf ("emulated 'pipe'.\n");
22402 + kdb_printf (" 'grep' is just a key word.\n");
22403 + kdb_printf
22404 + (" The pattern may include a very limited set of metacharacters:\n");
22405 + kdb_printf (" pattern or ^pattern or pattern$ or ^pattern$\n");
22406 + kdb_printf
22407 + (" And if there are spaces in the pattern, you may quote it:\n");
22408 + kdb_printf
22409 + (" \"pat tern\" or \"^pat tern\" or \"pat tern$\" or \"^pat tern$\"\n");
22410 + return 0;
22411 +}
22412 +
22413 +/*
22414 + * kdb_register_repeat
22415 + *
22416 + * This function is used to register a kernel debugger command.
22417 + *
22418 + * Inputs:
22419 + * cmd Command name
22420 + * func Function to execute the command
22421 + * usage A simple usage string showing arguments
22422 + * help A simple help string describing command
22423 + * repeat Does the command auto repeat on enter?
22424 + * Outputs:
22425 + * None.
22426 + * Returns:
22427 + * zero for success, one if a duplicate command.
22428 + * Locking:
22429 + * none.
22430 + * Remarks:
22431 + *
22432 + */
22433 +
22434 +#define kdb_command_extend 50 /* arbitrary */
22435 +int
22436 +kdb_register_repeat(char *cmd,
22437 + kdb_func_t func,
22438 + char *usage,
22439 + char *help,
22440 + short minlen,
22441 + kdb_repeat_t repeat)
22442 +{
22443 + int i;
22444 + kdbtab_t *kp;
22445 +
22446 + /*
22447 + * Brute force method to determine duplicates
22448 + */
22449 + for (i=0, kp=kdb_commands; i<kdb_max_commands; i++, kp++) {
22450 + if (kp->cmd_name && (strcmp(kp->cmd_name, cmd)==0)) {
22451 + kdb_printf("Duplicate kdb command registered: "
22452 + "%s, func %p help %s\n", cmd, func, help);
22453 + return 1;
22454 + }
22455 + }
22456 +
22457 + /*
22458 + * Insert command into first available location in table
22459 + */
22460 + for (i=0, kp=kdb_commands; i<kdb_max_commands; i++, kp++) {
22461 + if (kp->cmd_name == NULL) {
22462 + break;
22463 + }
22464 + }
22465 +
22466 + if (i >= kdb_max_commands) {
22467 + kdbtab_t *new = kmalloc((kdb_max_commands + kdb_command_extend) * sizeof(*new), GFP_KDB);
22468 + if (!new) {
22469 + kdb_printf("Could not allocate new kdb_command table\n");
22470 + return 1;
22471 + }
22472 + if (kdb_commands) {
22473 + memcpy(new, kdb_commands, kdb_max_commands * sizeof(*new));
22474 + kfree(kdb_commands);
22475 + }
22476 + memset(new + kdb_max_commands, 0, kdb_command_extend * sizeof(*new));
22477 + kdb_commands = new;
22478 + kp = kdb_commands + kdb_max_commands;
22479 + kdb_max_commands += kdb_command_extend;
22480 + }
22481 +
22482 + kp->cmd_name = cmd;
22483 + kp->cmd_func = func;
22484 + kp->cmd_usage = usage;
22485 + kp->cmd_help = help;
22486 + kp->cmd_flags = 0;
22487 + kp->cmd_minlen = minlen;
22488 + kp->cmd_repeat = repeat;
22489 +
22490 + return 0;
22491 +}
22492 +
22493 +/*
22494 + * kdb_register
22495 + *
22496 + * Compatibility register function for commands that do not need to
22497 + * specify a repeat state. Equivalent to kdb_register_repeat with
22498 + * KDB_REPEAT_NONE.
22499 + *
22500 + * Inputs:
22501 + * cmd Command name
22502 + * func Function to execute the command
22503 + * usage A simple usage string showing arguments
22504 + * help A simple help string describing command
22505 + * Outputs:
22506 + * None.
22507 + * Returns:
22508 + * zero for success, one if a duplicate command.
22509 + * Locking:
22510 + * none.
22511 + * Remarks:
22512 + *
22513 + */
22514 +
22515 +int
22516 +kdb_register(char *cmd,
22517 + kdb_func_t func,
22518 + char *usage,
22519 + char *help,
22520 + short minlen)
22521 +{
22522 + return kdb_register_repeat(cmd, func, usage, help, minlen, KDB_REPEAT_NONE);
22523 +}
22524 +
22525 +/*
22526 + * kdb_unregister
22527 + *
22528 + * This function is used to unregister a kernel debugger command.
22529 + * It is generally called when a module which implements kdb
22530 + * commands is unloaded.
22531 + *
22532 + * Inputs:
22533 + * cmd Command name
22534 + * Outputs:
22535 + * None.
22536 + * Returns:
22537 + * zero for success, one command not registered.
22538 + * Locking:
22539 + * none.
22540 + * Remarks:
22541 + *
22542 + */
22543 +
22544 +int
22545 +kdb_unregister(char *cmd)
22546 +{
22547 + int i;
22548 + kdbtab_t *kp;
22549 +
22550 + /*
22551 + * find the command.
22552 + */
22553 + for (i=0, kp=kdb_commands; i<kdb_max_commands; i++, kp++) {
22554 + if (kp->cmd_name && (strcmp(kp->cmd_name, cmd)==0)) {
22555 + kp->cmd_name = NULL;
22556 + return 0;
22557 + }
22558 + }
22559 +
22560 + /*
22561 + * Couldn't find it.
22562 + */
22563 + return 1;
22564 +}
22565 +
22566 +/*
22567 + * kdb_inittab
22568 + *
22569 + * This function is called by the kdb_init function to initialize
22570 + * the kdb command table. It must be called prior to any other
22571 + * call to kdb_register_repeat.
22572 + *
22573 + * Inputs:
22574 + * None.
22575 + * Outputs:
22576 + * None.
22577 + * Returns:
22578 + * None.
22579 + * Locking:
22580 + * None.
22581 + * Remarks:
22582 + *
22583 + */
22584 +
22585 +static void __init
22586 +kdb_inittab(void)
22587 +{
22588 + int i;
22589 + kdbtab_t *kp;
22590 +
22591 + for(i=0, kp=kdb_commands; i < kdb_max_commands; i++,kp++) {
22592 + kp->cmd_name = NULL;
22593 + }
22594 +
22595 + kdb_register_repeat("md", kdb_md, "<vaddr>", "Display Memory Contents, also mdWcN, e.g. md8c1", 1, KDB_REPEAT_NO_ARGS);
22596 + kdb_register_repeat("mdr", kdb_md, "<vaddr> <bytes>", "Display Raw Memory", 0, KDB_REPEAT_NO_ARGS);
22597 + kdb_register_repeat("mdp", kdb_md, "<paddr> <bytes>", "Display Physical Memory", 0, KDB_REPEAT_NO_ARGS);
22598 + kdb_register_repeat("mds", kdb_md, "<vaddr>", "Display Memory Symbolically", 0, KDB_REPEAT_NO_ARGS);
22599 + kdb_register_repeat("mm", kdb_mm, "<vaddr> <contents>", "Modify Memory Contents", 0, KDB_REPEAT_NO_ARGS);
22600 + kdb_register_repeat("id", kdb_id, "<vaddr>", "Display Instructions", 1, KDB_REPEAT_NO_ARGS);
22601 + kdb_register_repeat("go", kdb_go, "[<vaddr>]", "Continue Execution", 1, KDB_REPEAT_NONE);
22602 + kdb_register_repeat("rd", kdb_rd, "", "Display Registers", 1, KDB_REPEAT_NONE);
22603 + kdb_register_repeat("rm", kdb_rm, "<reg> <contents>", "Modify Registers", 0, KDB_REPEAT_NONE);
22604 + kdb_register_repeat("ef", kdb_ef, "<vaddr>", "Display exception frame", 0, KDB_REPEAT_NONE);
22605 + kdb_register_repeat("bt", kdb_bt, "[<vaddr>]", "Stack traceback", 1, KDB_REPEAT_NONE);
22606 + kdb_register_repeat("btp", kdb_bt, "<pid>", "Display stack for process <pid>", 0, KDB_REPEAT_NONE);
22607 + kdb_register_repeat("bta", kdb_bt, "[DRSTCZEUIMA]", "Display stack all processes", 0, KDB_REPEAT_NONE);
22608 + kdb_register_repeat("btc", kdb_bt, "", "Backtrace current process on each cpu", 0, KDB_REPEAT_NONE);
22609 + kdb_register_repeat("btt", kdb_bt, "<vaddr>", "Backtrace process given its struct task address", 0, KDB_REPEAT_NONE);
22610 + kdb_register_repeat("ll", kdb_ll, "<first-element> <linkoffset> <cmd>", "Execute cmd for each element in linked list", 0, KDB_REPEAT_NONE);
22611 + kdb_register_repeat("env", kdb_env, "", "Show environment variables", 0, KDB_REPEAT_NONE);
22612 + kdb_register_repeat("set", kdb_set, "", "Set environment variables", 0, KDB_REPEAT_NONE);
22613 + kdb_register_repeat("help", kdb_help, "", "Display Help Message", 1, KDB_REPEAT_NONE);
22614 + kdb_register_repeat("?", kdb_help, "", "Display Help Message", 0, KDB_REPEAT_NONE);
22615 + kdb_register_repeat("cpu", kdb_cpu, "<cpunum>","Switch to new cpu", 0, KDB_REPEAT_NONE);
22616 + kdb_register_repeat("ps", kdb_ps, "[<flags>|A]", "Display active task list", 0, KDB_REPEAT_NONE);
22617 + kdb_register_repeat("pid", kdb_pid, "<pidnum>", "Switch to another task", 0, KDB_REPEAT_NONE);
22618 + kdb_register_repeat("reboot", kdb_reboot, "", "Reboot the machine immediately", 0, KDB_REPEAT_NONE);
22619 +#if defined(CONFIG_KDB_KDUMP)
22620 + kdb_register_repeat("kdump", kdb_kdump, "", "Calls kdump mode", 0, KDB_REPEAT_NONE);
22621 +#endif
22622 +#if defined(CONFIG_MODULES)
22623 + kdb_register_repeat("lsmod", kdb_lsmod, "", "List loaded kernel modules", 0, KDB_REPEAT_NONE);
22624 +#endif
22625 +#if defined(CONFIG_MAGIC_SYSRQ)
22626 + kdb_register_repeat("sr", kdb_sr, "<key>", "Magic SysRq key", 0, KDB_REPEAT_NONE);
22627 +#endif
22628 + kdb_register_repeat("dmesg", kdb_dmesg, "[lines]", "Display syslog buffer", 0, KDB_REPEAT_NONE);
22629 + kdb_register_repeat("defcmd", kdb_defcmd, "name \"usage\" \"help\"", "Define a set of commands, down to endefcmd", 0, KDB_REPEAT_NONE);
22630 + kdb_register_repeat("kill", kdb_kill, "<-signal> <pid>", "Send a signal to a process", 0, KDB_REPEAT_NONE);
22631 + kdb_register_repeat("summary", kdb_summary, "", "Summarize the system", 4, KDB_REPEAT_NONE);
22632 + kdb_register_repeat("per_cpu", kdb_per_cpu, "", "Display per_cpu variables", 3, KDB_REPEAT_NONE);
22633 + kdb_register_repeat("grephelp", kdb_grep_help, "",
22634 + "Display help on | grep", 0, KDB_REPEAT_NONE);
22635 + kdb_register_repeat("print", kdb_debuginfo_print, "<expression>",
22636 + "Type casting, as in lcrash", 0, KDB_REPEAT_NONE);
22637 + kdb_register_repeat("px", kdb_debuginfo_print, "<expression>",
22638 + "Print in hex (type casting) (see 'pxhelp')", 0, KDB_REPEAT_NONE);
22639 + kdb_register_repeat("pxhelp", kdb_pxhelp, "",
22640 + "Display help for the px command", 0, KDB_REPEAT_NONE);
22641 + kdb_register_repeat("pd", kdb_debuginfo_print, "<expression>",
22642 + "Print in decimal (type casting)", 0, KDB_REPEAT_NONE);
22643 + kdb_register_repeat("whatis", kdb_debuginfo_print,"<type or symbol>",
22644 + "Display the type, or the address for a symbol", 0, KDB_REPEAT_NONE);
22645 + kdb_register_repeat("sizeof", kdb_debuginfo_print, "<type>",
22646 + "Display the size of a structure, typedef, etc.", 0, KDB_REPEAT_NONE);
22647 + kdb_register_repeat("walk", kdb_walk, "",
22648 + "Walk a linked list (see 'walkhelp')", 0, KDB_REPEAT_NONE);
22649 + kdb_register_repeat("walkhelp", kdb_walkhelp, "",
22650 + "Display help for the walk command", 0, KDB_REPEAT_NONE);
22651 +}
22652 +
22653 +/*
22654 + * The user has written to our "file"
22655 + * file: the /proc file
22656 + * buffer: user address of the data he is writing
22657 + * count: number of bytes in the user's buffer
22658 + */
22659 +static int
22660 +kdb_write_proc_filename(struct file *file, const char __user *buffer,
22661 + unsigned long count, void *data)
22662 +{
22663 + int ret_count;
22664 +
22665 + /* our buffer is kdb_debug_info_filename[256] */
22666 + if (count > 256) {
22667 + return 0;
22668 + }
22669 + if (copy_from_user(kdb_debug_info_filename, buffer, count)) {
22670 + return 0;
22671 + }
22672 + ret_count = count; /* actual count */
22673 + /* remove any newline from the end of the file name */
22674 + if (kdb_debug_info_filename[count-1] == '\n') count--;
22675 + kdb_debug_info_filename[count] = '\0';
22676 +
22677 + return ret_count;
22678 +}
22679 +
22680 +/*
22681 + * The user is reading from our "file"
22682 + * page: the beginning of the user's buffer
22683 + * start: pointer to the user's pointer (tells him where we put the data)
22684 + * off: offset into the resource to be read
22685 + * count: length of the read
22686 + */
22687 +static int
22688 +kdb_read_proc_filename(char *page, char **start, off_t off,
22689 + int count, int *eof, void *data)
22690 +{
22691 + /* give him kdb_debug_info_filename[]; */
22692 + return snprintf(page, count, "%s\n", kdb_debug_info_filename);
22693 +}
22694 +
22695 +/*
22696 + * kdb_proc_filename
22697 + *
22698 + * create /proc/kdb/debug_info_name
22699 + */
22700 +static void
22701 +kdb_proc_filename(void)
22702 +{
22703 + struct proc_dir_entry *kdb_dir_entry, *kdb_file_entry;
22704 +
22705 + /* create /proc/kdb */
22706 + kdb_dir_entry = proc_mkdir("kdb", NULL);
22707 + if (!kdb_dir_entry) {
22708 + printk ("kdb could not create /proc/kdb\n");
22709 + return;
22710 + }
22711 +
22712 + /* read/write by owner (root) only */
22713 + kdb_file_entry = create_proc_entry("debug_info_name",
22714 + S_IRUSR | S_IWUSR, kdb_dir_entry);
22715 + if (!kdb_file_entry) {
22716 + printk ("kdb could not create /proc/kdb/kdb_dir_entry\n");
22717 + return;
22718 + }
22719 + kdb_file_entry->nlink = 1;
22720 + kdb_file_entry->data = (void *)NULL;
22721 + kdb_file_entry->read_proc = kdb_read_proc_filename;
22722 + kdb_file_entry->write_proc = kdb_write_proc_filename;
22723 + return;
22724 +}
22725 +
22726 +/*
22727 + * kdb_cmd_init
22728 + *
22729 + * This function is called by the kdb_init function to execute any
22730 + * commands defined in kdb_cmds.
22731 + *
22732 + * Inputs:
22733 + * Commands in *kdb_cmds[];
22734 + * Outputs:
22735 + * None.
22736 + * Returns:
22737 + * None.
22738 + * Locking:
22739 + * None.
22740 + * Remarks:
22741 + *
22742 + */
22743 +
22744 +static void __init
22745 +kdb_cmd_init(void)
22746 +{
22747 + int i, diag;
22748 + for (i = 0; kdb_cmds[i]; ++i) {
22749 + if (!defcmd_in_progress)
22750 + if (console_loglevel >= 6 /* KERN_INFO */)
22751 + kdb_printf("kdb_cmd[%d]: %s", i, kdb_cmds[i]);
22752 + diag = kdb_parse(kdb_cmds[i]);
22753 + if (diag)
22754 + kdb_printf("kdb command %s failed, kdb diag %d\n",
22755 + kdb_cmds[i], diag);
22756 + }
22757 + if (defcmd_in_progress) {
22758 + kdb_printf("Incomplete 'defcmd' set, forcing endefcmd\n");
22759 + kdb_parse("endefcmd");
22760 + }
22761 +}
22762 +
22763 +/*
22764 + * kdb_panic
22765 + *
22766 + * Invoked via the panic_notifier_list.
22767 + *
22768 + * Inputs:
22769 + * None.
22770 + * Outputs:
22771 + * None.
22772 + * Returns:
22773 + * Zero.
22774 + * Locking:
22775 + * None.
22776 + * Remarks:
22777 + * When this function is called from panic(), the other cpus have already
22778 + * been stopped.
22779 + *
22780 + */
22781 +
22782 +static int
22783 +kdb_panic(struct notifier_block *self, unsigned long command, void *ptr)
22784 +{
22785 + KDB_FLAG_SET(CATASTROPHIC); /* kernel state is dubious now */
22786 + KDB_ENTER();
22787 + return 0;
22788 +}
22789 +
22790 +static struct notifier_block kdb_block = { kdb_panic, NULL, 0 };
22791 +
22792 +#ifdef CONFIG_SYSCTL
22793 +static int proc_do_kdb(ctl_table *table, int write, struct file *filp,
22794 + void __user *buffer, size_t *lenp, loff_t *ppos)
22795 +{
22796 + if (KDB_FLAG(NO_CONSOLE) && write) {
22797 + printk(KERN_ERR "kdb has no working console and has switched itself off\n");
22798 + return -EINVAL;
22799 + }
22800 + return proc_dointvec(table, write, filp, buffer, lenp, ppos);
22801 +}
22802 +
22803 +static ctl_table kdb_kern_table[] = {
22804 + {
22805 + .ctl_name = KERN_KDB,
22806 + .procname = "kdb",
22807 + .data = &kdb_on,
22808 + .maxlen = sizeof(int),
22809 + .mode = 0644,
22810 + .proc_handler = &proc_do_kdb,
22811 + .strategy = &sysctl_intvec,
22812 + },
22813 + {}
22814 +};
22815 +
22816 +static ctl_table kdb_root_table[] = {
22817 + {
22818 + .ctl_name = CTL_KERN,
22819 + .procname = "kernel",
22820 + .mode = 0555,
22821 + .child = kdb_kern_table,
22822 + },
22823 + {}
22824 +};
22825 +#endif /* CONFIG_SYSCTL */
22826 +
22827 +static int
22828 +kdb_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
22829 +{
22830 + if (action == CPU_ONLINE) {
22831 + int cpu =(unsigned long)hcpu;
22832 + cpumask_t save_cpus_allowed = current->cpus_allowed;
22833 + cpumask_t new_cpus_allowed = cpumask_of_cpu(cpu);
22834 + set_cpus_allowed(current, new_cpus_allowed);
22835 + kdb(KDB_REASON_CPU_UP, 0, NULL); /* do kdb setup on this cpu */
22836 + set_cpus_allowed(current, save_cpus_allowed);
22837 + }
22838 + return NOTIFY_OK;
22839 +}
22840 +
22841 +static struct notifier_block kdb_cpu_nfb = {
22842 + .notifier_call = kdb_cpu_callback
22843 +};
22844 +
22845 +/*
22846 + * kdb_init
22847 + *
22848 + * Initialize the kernel debugger environment.
22849 + *
22850 + * Parameters:
22851 + * None.
22852 + * Returns:
22853 + * None.
22854 + * Locking:
22855 + * None.
22856 + * Remarks:
22857 + * None.
22858 + */
22859 +
22860 +void __init
22861 +kdb_init(void)
22862 +{
22863 + kdb_initial_cpu = smp_processor_id();
22864 + /*
22865 + * This must be called before any calls to kdb_printf.
22866 + */
22867 + kdb_io_init();
22868 +
22869 + kdb_inittab(); /* Initialize Command Table */
22870 + kdb_initbptab(); /* Initialize Breakpoint Table */
22871 + kdb_id_init(); /* Initialize Disassembler */
22872 + kdba_init(); /* Architecture Dependent Initialization */
22873 +
22874 + /*
22875 + * Use printk() to get message in log_buf[];
22876 + */
22877 + printk("kdb version %d.%d%s by Keith Owens, Scott Lurndal. "\
22878 + "Copyright SGI, All Rights Reserved\n",
22879 + KDB_MAJOR_VERSION, KDB_MINOR_VERSION, KDB_TEST_VERSION);
22880 +
22881 + kdb_cmd_init(); /* Preset commands from kdb_cmds */
22882 + kdb_initial_cpu = -1; /* Avoid recursion problems */
22883 + kdb(KDB_REASON_CPU_UP, 0, NULL); /* do kdb setup on boot cpu */
22884 + kdb_initial_cpu = smp_processor_id();
22885 + atomic_notifier_chain_register(&panic_notifier_list, &kdb_block);
22886 + register_cpu_notifier(&kdb_cpu_nfb);
22887 +
22888 +#ifdef kdba_setjmp
22889 + kdbjmpbuf = vmalloc(NR_CPUS * sizeof(*kdbjmpbuf));
22890 + if (!kdbjmpbuf)
22891 + printk(KERN_ERR "Cannot allocate kdbjmpbuf, no kdb recovery will be possible\n");
22892 +#endif /* kdba_setjmp */
22893 +
22894 + kdb_initial_cpu = -1;
22895 + kdb_wait_for_cpus_secs = max(10, 2*num_online_cpus());
22896 +}
22897 +
22898 +#ifdef CONFIG_SYSCTL
22899 +static int __init
22900 +kdb_late_init(void)
22901 +{
22902 + register_sysctl_table(kdb_root_table);
22903 + /* seems that we cannot allocate with kmalloc until now */
22904 + kdb_proc_filename();
22905 + return 0;
22906 +}
22907 +
22908 +__initcall(kdb_late_init);
22909 +#endif
22910 +
22911 +EXPORT_SYMBOL(kdb_register);
22912 +EXPORT_SYMBOL(kdb_register_repeat);
22913 +EXPORT_SYMBOL(kdb_unregister);
22914 +EXPORT_SYMBOL(kdb_getarea_size);
22915 +EXPORT_SYMBOL(kdb_putarea_size);
22916 +EXPORT_SYMBOL(kdb_getuserarea_size);
22917 +EXPORT_SYMBOL(kdb_putuserarea_size);
22918 +EXPORT_SYMBOL(kdbgetularg);
22919 +EXPORT_SYMBOL(kdbgetenv);
22920 +EXPORT_SYMBOL(kdbgetintenv);
22921 +EXPORT_SYMBOL(kdbgetaddrarg);
22922 +EXPORT_SYMBOL(kdb);
22923 +EXPORT_SYMBOL(kdb_on);
22924 +EXPORT_SYMBOL(kdb_seqno);
22925 +EXPORT_SYMBOL(kdb_initial_cpu);
22926 +EXPORT_SYMBOL(kdbnearsym);
22927 +EXPORT_SYMBOL(kdb_printf);
22928 +EXPORT_SYMBOL(kdb_symbol_print);
22929 +EXPORT_SYMBOL(kdb_running_process);
22930 --- /dev/null
22931 +++ b/kdb/kdbsupport.c
22932 @@ -0,0 +1,1154 @@
22933 +/*
22934 + * Kernel Debugger Architecture Independent Support Functions
22935 + *
22936 + * This file is subject to the terms and conditions of the GNU General Public
22937 + * License. See the file "COPYING" in the main directory of this archive
22938 + * for more details.
22939 + *
22940 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
22941 + * 03/02/13 added new 2.5 kallsyms <xavier.bru@bull.net>
22942 + */
22943 +
22944 +#include <stdarg.h>
22945 +#include <linux/types.h>
22946 +#include <linux/sched.h>
22947 +#include <linux/mm.h>
22948 +#include <linux/kallsyms.h>
22949 +#include <linux/stddef.h>
22950 +#include <linux/vmalloc.h>
22951 +#include <linux/ptrace.h>
22952 +#include <linux/module.h>
22953 +#include <linux/highmem.h>
22954 +#include <linux/hardirq.h>
22955 +#include <linux/delay.h>
22956 +
22957 +#include <asm/uaccess.h>
22958 +
22959 +#include <linux/kdb.h>
22960 +#include <linux/kdbprivate.h>
22961 +
22962 +/*
22963 + * Symbol table functions.
22964 + */
22965 +
22966 +/*
22967 + * kdbgetsymval
22968 + *
22969 + * Return the address of the given symbol.
22970 + *
22971 + * Parameters:
22972 + * symname Character string containing symbol name
22973 + * symtab Structure to receive results
22974 + * Outputs:
22975 + * Returns:
22976 + * 0 Symbol not found, symtab zero filled
22977 + * 1 Symbol mapped to module/symbol/section, data in symtab
22978 + * Locking:
22979 + * None.
22980 + * Remarks:
22981 + */
22982 +
22983 +int
22984 +kdbgetsymval(const char *symname, kdb_symtab_t *symtab)
22985 +{
22986 + if (KDB_DEBUG(AR))
22987 + kdb_printf("kdbgetsymval: symname=%s, symtab=%p\n", symname, symtab);
22988 + memset(symtab, 0, sizeof(*symtab));
22989 +
22990 + if ((symtab->sym_start = kallsyms_lookup_name(symname))) {
22991 + if (KDB_DEBUG(AR))
22992 + kdb_printf("kdbgetsymval: returns 1, symtab->sym_start=0x%lx\n", symtab->sym_start);
22993 + return 1;
22994 + }
22995 + if (KDB_DEBUG(AR))
22996 + kdb_printf("kdbgetsymval: returns 0\n");
22997 + return 0;
22998 +}
22999 +EXPORT_SYMBOL(kdbgetsymval);
23000 +
23001 +/*
23002 + * kdbnearsym
23003 + *
23004 + * Return the name of the symbol with the nearest address
23005 + * less than 'addr'.
23006 + *
23007 + * Parameters:
23008 + * addr Address to check for symbol near
23009 + * symtab Structure to receive results
23010 + * Outputs:
23011 + * Returns:
23012 + * 0 No sections contain this address, symtab zero filled
23013 + * 1 Address mapped to module/symbol/section, data in symtab
23014 + * Locking:
23015 + * None.
23016 + * Remarks:
23017 + * 2.6 kallsyms has a "feature" where it unpacks the name into a string.
23018 + * If that string is reused before the caller expects it then the caller
23019 + * sees its string change without warning. To avoid cluttering up the
23020 + * main kdb code with lots of kdb_strdup, tests and kfree calls, kdbnearsym
23021 + * maintains an LRU list of the last few unique strings. The list is sized
23022 + * large enough to hold active strings, no kdb caller of kdbnearsym makes
23023 + * more than ~20 later calls before using a saved value.
23024 + */
23025 +
23026 +static char *kdb_name_table[100]; /* arbitrary size */
23027 +
23028 +int
23029 +kdbnearsym(unsigned long addr, kdb_symtab_t *symtab)
23030 +{
23031 + int ret = 0;
23032 + unsigned long symbolsize;
23033 + unsigned long offset;
23034 +#define knt1_size 128 /* must be >= kallsyms table size */
23035 + char *knt1 = NULL;
23036 +
23037 + if (KDB_DEBUG(AR))
23038 + kdb_printf("kdbnearsym: addr=0x%lx, symtab=%p\n", addr, symtab);
23039 + memset(symtab, 0, sizeof(*symtab));
23040 +
23041 + if (addr < 4096)
23042 + goto out;
23043 + knt1 = debug_kmalloc(knt1_size, GFP_ATOMIC);
23044 + if (!knt1) {
23045 + kdb_printf("kdbnearsym: addr=0x%lx cannot kmalloc knt1\n", addr);
23046 + goto out;
23047 + }
23048 + symtab->sym_name = kallsyms_lookup(addr, &symbolsize , &offset, (char **)(&symtab->mod_name), knt1);
23049 + if (offset > 8*1024*1024) {
23050 + symtab->sym_name = NULL;
23051 + addr = offset = symbolsize = 0;
23052 + }
23053 + symtab->sym_start = addr - offset;
23054 + symtab->sym_end = symtab->sym_start + symbolsize;
23055 + ret = symtab->sym_name != NULL && *(symtab->sym_name) != '\0';
23056 +
23057 + if (ret) {
23058 + int i;
23059 + /* Another 2.6 kallsyms "feature". Sometimes the sym_name is
23060 + * set but the buffer passed into kallsyms_lookup is not used,
23061 + * so it contains garbage. The caller has to work out which
23062 + * buffer needs to be saved.
23063 + *
23064 + * What was Rusty smoking when he wrote that code?
23065 + */
23066 + if (symtab->sym_name != knt1) {
23067 + strncpy(knt1, symtab->sym_name, knt1_size);
23068 + knt1[knt1_size-1] = '\0';
23069 + }
23070 + for (i = 0; i < ARRAY_SIZE(kdb_name_table); ++i) {
23071 + if (kdb_name_table[i] && strcmp(kdb_name_table[i], knt1) == 0)
23072 + break;
23073 + }
23074 + if (i >= ARRAY_SIZE(kdb_name_table)) {
23075 + debug_kfree(kdb_name_table[0]);
23076 + memcpy(kdb_name_table, kdb_name_table+1,
23077 + sizeof(kdb_name_table[0])*(ARRAY_SIZE(kdb_name_table)-1));
23078 + } else {
23079 + debug_kfree(knt1);
23080 + knt1 = kdb_name_table[i];
23081 + memcpy(kdb_name_table+i, kdb_name_table+i+1,
23082 + sizeof(kdb_name_table[0])*(ARRAY_SIZE(kdb_name_table)-i-1));
23083 + }
23084 + i = ARRAY_SIZE(kdb_name_table) - 1;
23085 + kdb_name_table[i] = knt1;
23086 + symtab->sym_name = kdb_name_table[i];
23087 + knt1 = NULL;
23088 + }
23089 +
23090 + if (symtab->mod_name == NULL)
23091 + symtab->mod_name = "kernel";
23092 + if (KDB_DEBUG(AR))
23093 + kdb_printf("kdbnearsym: returns %d symtab->sym_start=0x%lx, symtab->mod_name=%p, symtab->sym_name=%p (%s)\n", ret, symtab->sym_start, symtab->mod_name, symtab->sym_name, symtab->sym_name);
23094 +
23095 +out:
23096 + debug_kfree(knt1);
23097 + return ret;
23098 +}
23099 +
23100 +void
23101 +kdbnearsym_cleanup(void)
23102 +{
23103 + int i;
23104 + for (i = 0; i < ARRAY_SIZE(kdb_name_table); ++i) {
23105 + if (kdb_name_table[i]) {
23106 + debug_kfree(kdb_name_table[i]);
23107 + kdb_name_table[i] = NULL;
23108 + }
23109 + }
23110 +}
23111 +
23112 +/*
23113 + * kallsyms_symbol_complete
23114 + *
23115 + * Parameters:
23116 + * prefix_name prefix of a symbol name to lookup
23117 + * max_len maximum length that can be returned
23118 + * Returns:
23119 + * Number of symbols which match the given prefix.
23120 + * Notes:
23121 + * prefix_name is changed to contain the longest unique prefix that
23122 + * starts with this prefix (tab completion).
23123 + */
23124 +
23125 +static char ks_namebuf[KSYM_NAME_LEN+1], ks_namebuf_prev[KSYM_NAME_LEN+1];
23126 +
23127 +int kallsyms_symbol_complete(char *prefix_name, int max_len)
23128 +{
23129 + loff_t pos = 0;
23130 + int prefix_len = strlen(prefix_name), prev_len = 0;
23131 + int i, number = 0;
23132 + const char *name;
23133 +
23134 + while ((name = kdb_walk_kallsyms(&pos))) {
23135 + if (strncmp(name, prefix_name, prefix_len) == 0) {
23136 + strcpy(ks_namebuf, name);
23137 + /* Work out the longest name that matches the prefix */
23138 + if (++number == 1) {
23139 + prev_len = min_t(int, max_len-1, strlen(ks_namebuf));
23140 + memcpy(ks_namebuf_prev, ks_namebuf, prev_len);
23141 + ks_namebuf_prev[prev_len] = '\0';
23142 + } else for (i = 0; i < prev_len; ++i) {
23143 + if (ks_namebuf[i] != ks_namebuf_prev[i]) {
23144 + prev_len = i;
23145 + ks_namebuf_prev[i] = '\0';
23146 + break;
23147 + }
23148 + }
23149 + }
23150 + }
23151 + if (prev_len > prefix_len)
23152 + memcpy(prefix_name, ks_namebuf_prev, prev_len+1);
23153 + return number;
23154 +}
23155 +
23156 +/*
23157 + * kallsyms_symbol_next
23158 + *
23159 + * Parameters:
23160 + * prefix_name prefix of a symbol name to lookup
23161 + * flag 0 means search from the head, 1 means continue search.
23162 + * Returns:
23163 + * 1 if a symbol matches the given prefix.
23164 + * 0 if no string found
23165 + */
23166 +
23167 +int kallsyms_symbol_next(char *prefix_name, int flag)
23168 +{
23169 + int prefix_len = strlen(prefix_name);
23170 + static loff_t pos;
23171 + const char *name;
23172 +
23173 + if (!flag)
23174 + pos = 0;
23175 +
23176 + while ((name = kdb_walk_kallsyms(&pos))) {
23177 + if (strncmp(name, prefix_name, prefix_len) == 0) {
23178 + strncpy(prefix_name, name, strlen(name)+1);
23179 + return 1;
23180 + }
23181 + }
23182 + return 0;
23183 +}
23184 +
23185 +#if defined(CONFIG_SMP)
23186 +/*
23187 + * kdb_ipi
23188 + *
23189 + * This function is called from the non-maskable interrupt
23190 + * handler to handle a kdb IPI instruction.
23191 + *
23192 + * Inputs:
23193 + * regs = Exception frame pointer
23194 + * Outputs:
23195 + * None.
23196 + * Returns:
23197 + * 0 - Did not handle NMI
23198 + * 1 - Handled NMI
23199 + * Locking:
23200 + * None.
23201 + * Remarks:
23202 + * Initially one processor is invoked in the kdb() code. That
23203 + * processor sends an ipi which drives this routine on the other
23204 + * processors. All this does is call kdb() with reason SWITCH.
23205 + * This puts all processors into the kdb() routine and all the
23206 + * code for breakpoints etc. is in one place.
23207 + * One problem with the way the kdb NMI is sent, the NMI has no
23208 + * identification that says it came from kdb. If the cpu's kdb state is
23209 + * marked as "waiting for kdb_ipi" then the NMI is treated as coming from
23210 + * kdb, otherwise it is assumed to be for another reason and is ignored.
23211 + */
23212 +
23213 +int
23214 +kdb_ipi(struct pt_regs *regs, void (*ack_interrupt)(void))
23215 +{
23216 + /* Do not print before checking and clearing WAIT_IPI, IPIs are
23217 + * going all the time.
23218 + */
23219 + if (KDB_STATE(WAIT_IPI)) {
23220 + /*
23221 + * Stopping other processors via smp_kdb_stop().
23222 + */
23223 + if (ack_interrupt)
23224 + (*ack_interrupt)(); /* Acknowledge the interrupt */
23225 + KDB_STATE_CLEAR(WAIT_IPI);
23226 + KDB_DEBUG_STATE("kdb_ipi 1", 0);
23227 + kdb(KDB_REASON_SWITCH, 0, regs); /* Spin in kdb() */
23228 + KDB_DEBUG_STATE("kdb_ipi 2", 0);
23229 + return 1;
23230 + }
23231 + return 0;
23232 +}
23233 +#endif /* CONFIG_SMP */
23234 +
23235 +/*
23236 + * kdb_symbol_print
23237 + *
23238 + * Standard method for printing a symbol name and offset.
23239 + * Inputs:
23240 + * addr Address to be printed.
23241 + * symtab Address of symbol data, if NULL this routine does its
23242 + * own lookup.
23243 + * punc Punctuation for string, bit field.
23244 + * Outputs:
23245 + * None.
23246 + * Returns:
23247 + * Always 0.
23248 + * Locking:
23249 + * none.
23250 + * Remarks:
23251 + * The string and its punctuation is only printed if the address
23252 + * is inside the kernel, except that the value is always printed
23253 + * when requested.
23254 + */
23255 +
23256 +void
23257 +kdb_symbol_print(kdb_machreg_t addr, const kdb_symtab_t *symtab_p, unsigned int punc)
23258 +{
23259 + kdb_symtab_t symtab, *symtab_p2;
23260 + if (symtab_p) {
23261 + symtab_p2 = (kdb_symtab_t *)symtab_p;
23262 + }
23263 + else {
23264 + symtab_p2 = &symtab;
23265 + kdbnearsym(addr, symtab_p2);
23266 + }
23267 + if (symtab_p2->sym_name || (punc & KDB_SP_VALUE)) {
23268 + ; /* drop through */
23269 + }
23270 + else {
23271 + return;
23272 + }
23273 + if (punc & KDB_SP_SPACEB) {
23274 + kdb_printf(" ");
23275 + }
23276 + if (punc & KDB_SP_VALUE) {
23277 + kdb_printf(kdb_machreg_fmt0, addr);
23278 + }
23279 + if (symtab_p2->sym_name) {
23280 + if (punc & KDB_SP_VALUE) {
23281 + kdb_printf(" ");
23282 + }
23283 + if (punc & KDB_SP_PAREN) {
23284 + kdb_printf("(");
23285 + }
23286 + if (strcmp(symtab_p2->mod_name, "kernel")) {
23287 + kdb_printf("[%s]", symtab_p2->mod_name);
23288 + }
23289 + kdb_printf("%s", symtab_p2->sym_name);
23290 + if (addr != symtab_p2->sym_start) {
23291 + kdb_printf("+0x%lx", addr - symtab_p2->sym_start);
23292 + }
23293 + if (punc & KDB_SP_SYMSIZE) {
23294 + kdb_printf("/0x%lx", symtab_p2->sym_end - symtab_p2->sym_start);
23295 + }
23296 + if (punc & KDB_SP_PAREN) {
23297 + kdb_printf(")");
23298 + }
23299 + }
23300 + if (punc & KDB_SP_SPACEA) {
23301 + kdb_printf(" ");
23302 + }
23303 + if (punc & KDB_SP_NEWLINE) {
23304 + kdb_printf("\n");
23305 + }
23306 +}
23307 +
23308 +/*
23309 + * kdb_strdup
23310 + *
23311 + * kdb equivalent of strdup, for disasm code.
23312 + * Inputs:
23313 + * str The string to duplicate.
23314 + * type Flags to kmalloc for the new string.
23315 + * Outputs:
23316 + * None.
23317 + * Returns:
23318 + * Address of the new string, NULL if storage could not be allocated.
23319 + * Locking:
23320 + * none.
23321 + * Remarks:
23322 + * This is not in lib/string.c because it uses kmalloc which is not
23323 + * available when string.o is used in boot loaders.
23324 + */
23325 +
23326 +char *kdb_strdup(const char *str, gfp_t type)
23327 +{
23328 + int n = strlen(str)+1;
23329 + char *s = kmalloc(n, type);
23330 + if (!s) return NULL;
23331 + return strcpy(s, str);
23332 +}
23333 +
23334 +/*
23335 + * kdb_getarea_size
23336 + *
23337 + * Read an area of data. The kdb equivalent of copy_from_user, with
23338 + * kdb messages for invalid addresses.
23339 + * Inputs:
23340 + * res Pointer to the area to receive the result.
23341 + * addr Address of the area to copy.
23342 + * size Size of the area.
23343 + * Outputs:
23344 + * none.
23345 + * Returns:
23346 + * 0 for success, < 0 for error.
23347 + * Locking:
23348 + * none.
23349 + */
23350 +
23351 +int kdb_getarea_size(void *res, unsigned long addr, size_t size)
23352 +{
23353 + int ret = kdba_getarea_size(res, addr, size);
23354 + if (ret) {
23355 + if (!KDB_STATE(SUPPRESS)) {
23356 + kdb_printf("kdb_getarea: Bad address 0x%lx\n", addr);
23357 + KDB_STATE_SET(SUPPRESS);
23358 + }
23359 + ret = KDB_BADADDR;
23360 + }
23361 + else {
23362 + KDB_STATE_CLEAR(SUPPRESS);
23363 + }
23364 + return(ret);
23365 +}
23366 +
23367 +/*
23368 + * kdb_putarea_size
23369 + *
23370 + * Write an area of data. The kdb equivalent of copy_to_user, with
23371 + * kdb messages for invalid addresses.
23372 + * Inputs:
23373 + * addr Address of the area to write to.
23374 + * res Pointer to the area holding the data.
23375 + * size Size of the area.
23376 + * Outputs:
23377 + * none.
23378 + * Returns:
23379 + * 0 for success, < 0 for error.
23380 + * Locking:
23381 + * none.
23382 + */
23383 +
23384 +int kdb_putarea_size(unsigned long addr, void *res, size_t size)
23385 +{
23386 + int ret = kdba_putarea_size(addr, res, size);
23387 + if (ret) {
23388 + if (!KDB_STATE(SUPPRESS)) {
23389 + kdb_printf("kdb_putarea: Bad address 0x%lx\n", addr);
23390 + KDB_STATE_SET(SUPPRESS);
23391 + }
23392 + ret = KDB_BADADDR;
23393 + }
23394 + else {
23395 + KDB_STATE_CLEAR(SUPPRESS);
23396 + }
23397 + return(ret);
23398 +}
23399 +
23400 +/*
23401 + * kdb_getphys
23402 + *
23403 + * Read data from a physical address. Validate the address is in range,
23404 + * use kmap_atomic() to get data
23405 + *
23406 + * Similar to kdb_getarea() - but for phys addresses
23407 + *
23408 + * Inputs:
23409 + * res Pointer to the word to receive the result
23410 + * addr Physical address of the area to copy
23411 + * size Size of the area
23412 + * Outputs:
23413 + * none.
23414 + * Returns:
23415 + * 0 for success, < 0 for error.
23416 + * Locking:
23417 + * none.
23418 + */
23419 +static int kdb_getphys(void *res, unsigned long addr, size_t size)
23420 +{
23421 + unsigned long pfn;
23422 + void *vaddr;
23423 + struct page *page;
23424 +
23425 + pfn = (addr >> PAGE_SHIFT);
23426 + if (!pfn_valid(pfn))
23427 + return 1;
23428 + page = pfn_to_page(pfn);
23429 + vaddr = kmap_atomic(page, KM_KDB);
23430 + memcpy(res, vaddr + (addr & (PAGE_SIZE -1)), size);
23431 + kunmap_atomic(vaddr, KM_KDB);
23432 +
23433 + return 0;
23434 +}
23435 +
23436 +/*
23437 + * kdb_getphysword
23438 + *
23439 + * Inputs:
23440 + * word Pointer to the word to receive the result.
23441 + * addr Address of the area to copy.
23442 + * size Size of the area.
23443 + * Outputs:
23444 + * none.
23445 + * Returns:
23446 + * 0 for success, < 0 for error.
23447 + * Locking:
23448 + * none.
23449 + */
23450 +int kdb_getphysword(unsigned long *word, unsigned long addr, size_t size)
23451 +{
23452 + int diag;
23453 + __u8 w1;
23454 + __u16 w2;
23455 + __u32 w4;
23456 + __u64 w8;
23457 + *word = 0; /* Default value if addr or size is invalid */
23458 +
23459 + switch (size) {
23460 + case 1:
23461 + if (!(diag = kdb_getphys(&w1, addr, sizeof(w1))))
23462 + *word = w1;
23463 + break;
23464 + case 2:
23465 + if (!(diag = kdb_getphys(&w2, addr, sizeof(w2))))
23466 + *word = w2;
23467 + break;
23468 + case 4:
23469 + if (!(diag = kdb_getphys(&w4, addr, sizeof(w4))))
23470 + *word = w4;
23471 + break;
23472 + case 8:
23473 + if (size <= sizeof(*word)) {
23474 + if (!(diag = kdb_getphys(&w8, addr, sizeof(w8))))
23475 + *word = w8;
23476 + break;
23477 + }
23478 + /* drop through */
23479 + default:
23480 + diag = KDB_BADWIDTH;
23481 + kdb_printf("kdb_getphysword: bad width %ld\n", (long) size);
23482 + }
23483 + return(diag);
23484 +}
23485 +
23486 +/*
23487 + * kdb_getword
23488 + *
23489 + * Read a binary value. Unlike kdb_getarea, this treats data as numbers.
23490 + * Inputs:
23491 + * word Pointer to the word to receive the result.
23492 + * addr Address of the area to copy.
23493 + * size Size of the area.
23494 + * Outputs:
23495 + * none.
23496 + * Returns:
23497 + * 0 for success, < 0 for error.
23498 + * Locking:
23499 + * none.
23500 + */
23501 +
23502 +int kdb_getword(unsigned long *word, unsigned long addr, size_t size)
23503 +{
23504 + int diag;
23505 + __u8 w1;
23506 + __u16 w2;
23507 + __u32 w4;
23508 + __u64 w8;
23509 + *word = 0; /* Default value if addr or size is invalid */
23510 + switch (size) {
23511 + case 1:
23512 + if (!(diag = kdb_getarea(w1, addr)))
23513 + *word = w1;
23514 + break;
23515 + case 2:
23516 + if (!(diag = kdb_getarea(w2, addr)))
23517 + *word = w2;
23518 + break;
23519 + case 4:
23520 + if (!(diag = kdb_getarea(w4, addr)))
23521 + *word = w4;
23522 + break;
23523 + case 8:
23524 + if (size <= sizeof(*word)) {
23525 + if (!(diag = kdb_getarea(w8, addr)))
23526 + *word = w8;
23527 + break;
23528 + }
23529 + /* drop through */
23530 + default:
23531 + diag = KDB_BADWIDTH;
23532 + kdb_printf("kdb_getword: bad width %ld\n", (long) size);
23533 + }
23534 + return(diag);
23535 +}
23536 +
23537 +/*
23538 + * kdb_putword
23539 + *
23540 + * Write a binary value. Unlike kdb_putarea, this treats data as numbers.
23541 + * Inputs:
23542 + * addr Address of the area to write to..
23543 + * word The value to set.
23544 + * size Size of the area.
23545 + * Outputs:
23546 + * none.
23547 + * Returns:
23548 + * 0 for success, < 0 for error.
23549 + * Locking:
23550 + * none.
23551 + */
23552 +
23553 +int kdb_putword(unsigned long addr, unsigned long word, size_t size)
23554 +{
23555 + int diag;
23556 + __u8 w1;
23557 + __u16 w2;
23558 + __u32 w4;
23559 + __u64 w8;
23560 + switch (size) {
23561 + case 1:
23562 + w1 = word;
23563 + diag = kdb_putarea(addr, w1);
23564 + break;
23565 + case 2:
23566 + w2 = word;
23567 + diag = kdb_putarea(addr, w2);
23568 + break;
23569 + case 4:
23570 + w4 = word;
23571 + diag = kdb_putarea(addr, w4);
23572 + break;
23573 + case 8:
23574 + if (size <= sizeof(word)) {
23575 + w8 = word;
23576 + diag = kdb_putarea(addr, w8);
23577 + break;
23578 + }
23579 + /* drop through */
23580 + default:
23581 + diag = KDB_BADWIDTH;
23582 + kdb_printf("kdb_putword: bad width %ld\n", (long) size);
23583 + }
23584 + return(diag);
23585 +}
23586 +
23587 +/*
23588 + * kdb_task_state_string
23589 + *
23590 + * Convert a string containing any of the letters DRSTCZEUIMA to a mask
23591 + * for the process state field and return the value. If no argument is
23592 + * supplied, return the mask that corresponds to environment variable PS,
23593 + * DRSTCZEU by default.
23594 + * Inputs:
23595 + * s String to convert
23596 + * Outputs:
23597 + * none.
23598 + * Returns:
23599 + * Mask for process state.
23600 + * Locking:
23601 + * none.
23602 + * Notes:
23603 + * The mask folds data from several sources into a single long value, so
23604 + * be carefull not to overlap the bits. TASK_* bits are in the LSB,
23605 + * special cases like UNRUNNABLE are in the MSB. As of 2.6.10-rc1 there
23606 + * is no overlap between TASK_* and EXIT_* but that may not always be
23607 + * true, so EXIT_* bits are shifted left 16 bits before being stored in
23608 + * the mask.
23609 + */
23610 +
23611 +#define UNRUNNABLE (1UL << (8*sizeof(unsigned long) - 1)) /* unrunnable is < 0 */
23612 +#define RUNNING (1UL << (8*sizeof(unsigned long) - 2))
23613 +#define IDLE (1UL << (8*sizeof(unsigned long) - 3))
23614 +#define DAEMON (1UL << (8*sizeof(unsigned long) - 4))
23615 +
23616 +unsigned long
23617 +kdb_task_state_string(const char *s)
23618 +{
23619 + long res = 0;
23620 + if (!s && !(s = kdbgetenv("PS"))) {
23621 + s = "DRSTCZEU"; /* default value for ps */
23622 + }
23623 + while (*s) {
23624 + switch (*s) {
23625 + case 'D': res |= TASK_UNINTERRUPTIBLE; break;
23626 + case 'R': res |= RUNNING; break;
23627 + case 'S': res |= TASK_INTERRUPTIBLE; break;
23628 + case 'T': res |= TASK_STOPPED; break;
23629 + case 'C': res |= TASK_TRACED; break;
23630 + case 'Z': res |= EXIT_ZOMBIE << 16; break;
23631 + case 'E': res |= EXIT_DEAD << 16; break;
23632 + case 'U': res |= UNRUNNABLE; break;
23633 + case 'I': res |= IDLE; break;
23634 + case 'M': res |= DAEMON; break;
23635 + case 'A': res = ~0UL; break;
23636 + default:
23637 + kdb_printf("%s: unknown flag '%c' ignored\n", __FUNCTION__, *s);
23638 + break;
23639 + }
23640 + ++s;
23641 + }
23642 + return res;
23643 +}
23644 +
23645 +/*
23646 + * kdb_task_state_char
23647 + *
23648 + * Return the character that represents the task state.
23649 + * Inputs:
23650 + * p struct task for the process
23651 + * Outputs:
23652 + * none.
23653 + * Returns:
23654 + * One character to represent the task state.
23655 + * Locking:
23656 + * none.
23657 + */
23658 +
23659 +char
23660 +kdb_task_state_char (const struct task_struct *p)
23661 +{
23662 + int cpu = kdb_process_cpu(p);
23663 + struct kdb_running_process *krp = kdb_running_process + cpu;
23664 + char state = (p->state == 0) ? 'R' :
23665 + (p->state < 0) ? 'U' :
23666 + (p->state & TASK_UNINTERRUPTIBLE) ? 'D' :
23667 + (p->state & TASK_STOPPED) ? 'T' :
23668 + (p->state & TASK_TRACED) ? 'C' :
23669 + (p->exit_state & EXIT_ZOMBIE) ? 'Z' :
23670 + (p->exit_state & EXIT_DEAD) ? 'E' :
23671 + (p->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
23672 + if (p->pid == 0) {
23673 + /* Idle task. Is it really idle, apart from the kdb interrupt? */
23674 + if (!kdb_task_has_cpu(p) || krp->irq_depth == 1) {
23675 + /* There is a corner case when the idle task takes an
23676 + * interrupt and dies in the interrupt code. It has an
23677 + * interrupt count of 1 but that did not come from kdb.
23678 + * This corner case can only occur on the initial cpu,
23679 + * all the others were entered via the kdb IPI.
23680 + */
23681 + if (cpu != kdb_initial_cpu || KDB_STATE_CPU(KEYBOARD, cpu))
23682 + state = 'I'; /* idle task */
23683 + }
23684 + }
23685 + else if (!p->mm && state == 'S') {
23686 + state = 'M'; /* sleeping system daemon */
23687 + }
23688 + return state;
23689 +}
23690 +
23691 +/*
23692 + * kdb_task_state
23693 + *
23694 + * Return true if a process has the desired state given by the mask.
23695 + * Inputs:
23696 + * p struct task for the process
23697 + * mask mask from kdb_task_state_string to select processes
23698 + * Outputs:
23699 + * none.
23700 + * Returns:
23701 + * True if the process matches at least one criteria defined by the mask.
23702 + * Locking:
23703 + * none.
23704 + */
23705 +
23706 +unsigned long
23707 +kdb_task_state(const struct task_struct *p, unsigned long mask)
23708 +{
23709 + char state[] = { kdb_task_state_char(p), '\0' };
23710 + return (mask & kdb_task_state_string(state)) != 0;
23711 +}
23712 +
23713 +struct kdb_running_process kdb_running_process[NR_CPUS];
23714 +
23715 +/* Save the state of a running process and invoke kdb_main_loop. This is
23716 + * invoked on the current process on each cpu (assuming the cpu is responding).
23717 + */
23718 +
23719 +int
23720 +kdb_save_running(struct pt_regs *regs, kdb_reason_t reason,
23721 + kdb_reason_t reason2, int error, kdb_dbtrap_t db_result)
23722 +{
23723 + struct kdb_running_process *krp = kdb_running_process + smp_processor_id();
23724 + krp->p = current;
23725 + krp->regs = regs;
23726 + krp->seqno = kdb_seqno;
23727 + krp->irq_depth = hardirq_count() >> HARDIRQ_SHIFT;
23728 + kdba_save_running(&(krp->arch), regs);
23729 + return kdb_main_loop(reason, reason2, error, db_result, regs);
23730 +}
23731 +
23732 +/*
23733 + * kdb_unsave_running
23734 + *
23735 + * Reverse the effect of kdb_save_running.
23736 + * Inputs:
23737 + * regs struct pt_regs for the process
23738 + * Outputs:
23739 + * Updates kdb_running_process[] for this cpu.
23740 + * Returns:
23741 + * none.
23742 + * Locking:
23743 + * none.
23744 + */
23745 +
23746 +void
23747 +kdb_unsave_running(struct pt_regs *regs)
23748 +{
23749 + struct kdb_running_process *krp = kdb_running_process + smp_processor_id();
23750 + kdba_unsave_running(&(krp->arch), regs);
23751 + krp->seqno = 0;
23752 +}
23753 +
23754 +
23755 +/*
23756 + * kdb_print_nameval
23757 + *
23758 + * Print a name and its value, converting the value to a symbol lookup
23759 + * if possible.
23760 + * Inputs:
23761 + * name field name to print
23762 + * val value of field
23763 + * Outputs:
23764 + * none.
23765 + * Returns:
23766 + * none.
23767 + * Locking:
23768 + * none.
23769 + */
23770 +
23771 +void
23772 +kdb_print_nameval(const char *name, unsigned long val)
23773 +{
23774 + kdb_symtab_t symtab;
23775 + kdb_printf(" %-11.11s ", name);
23776 + if (kdbnearsym(val, &symtab))
23777 + kdb_symbol_print(val, &symtab, KDB_SP_VALUE|KDB_SP_SYMSIZE|KDB_SP_NEWLINE);
23778 + else
23779 + kdb_printf("0x%lx\n", val);
23780 +}
23781 +
23782 +static struct page * kdb_get_one_user_page(const struct task_struct *tsk, unsigned long start,
23783 + int len, int write)
23784 +{
23785 + struct mm_struct *mm = tsk->mm;
23786 + unsigned int flags;
23787 + struct vm_area_struct * vma;
23788 +
23789 + /* shouldn't cross a page boundary. */
23790 + if ((start & PAGE_MASK) != ((start+len) & PAGE_MASK))
23791 + return NULL;
23792 +
23793 + /* we need to align start address to the current page boundy, PAGE_ALIGN
23794 + * aligns to next page boundry.
23795 + * FIXME: What about hugetlb?
23796 + */
23797 + start = start & PAGE_MASK;
23798 + flags = write ? (VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
23799 +
23800 + vma = find_extend_vma(mm, start);
23801 +
23802 + /* may be we can allow access to VM_IO pages inside KDB? */
23803 + if (!vma || (vma->vm_flags & VM_IO) || !(flags & vma->vm_flags))
23804 + return NULL;
23805 +
23806 + return follow_page(vma, start, write ? FOLL_WRITE : 0);
23807 +}
23808 +
23809 +int kdb_getuserarea_size(void *to, unsigned long from, size_t size)
23810 +{
23811 + struct page *page;
23812 + void *vaddr;
23813 +
23814 + page = kdb_get_one_user_page(kdb_current_task, from, size, 0);
23815 + if (!page)
23816 + return size;
23817 +
23818 + vaddr = kmap_atomic(page, KM_KDB);
23819 + memcpy(to, vaddr+ (from & (PAGE_SIZE - 1)), size);
23820 + kunmap_atomic(vaddr, KM_KDB);
23821 +
23822 + return 0;
23823 +}
23824 +
23825 +int kdb_putuserarea_size(unsigned long to, void *from, size_t size)
23826 +{
23827 + struct page *page;
23828 + void *vaddr;
23829 +
23830 + page = kdb_get_one_user_page(kdb_current_task, to, size, 1);
23831 + if (!page)
23832 + return size;
23833 +
23834 + vaddr = kmap_atomic(page, KM_KDB);
23835 + memcpy(vaddr+ (to & (PAGE_SIZE - 1)), from, size);
23836 + kunmap_atomic(vaddr, KM_KDB);
23837 +
23838 + return 0;
23839 +}
23840 +
23841 +/* Last ditch allocator for debugging, so we can still debug even when the
23842 + * GFP_ATOMIC pool has been exhausted. The algorithms are tuned for space
23843 + * usage, not for speed. One smallish memory pool, the free chain is always in
23844 + * ascending address order to allow coalescing, allocations are done in brute
23845 + * force best fit.
23846 + */
23847 +
23848 +struct debug_alloc_header {
23849 + u32 next; /* offset of next header from start of pool */
23850 + u32 size;
23851 + void *caller;
23852 +};
23853 +
23854 +/* The memory returned by this allocator must be aligned, which means so must
23855 + * the header size. Do not assume that sizeof(struct debug_alloc_header) is a
23856 + * multiple of the alignment, explicitly calculate the overhead of this header,
23857 + * including the alignment. The rest of this code must not use sizeof() on any
23858 + * header or pointer to a header.
23859 + */
23860 +#define dah_align 8
23861 +#define dah_overhead ALIGN(sizeof(struct debug_alloc_header), dah_align)
23862 +
23863 +static u64 debug_alloc_pool_aligned[256*1024/dah_align]; /* 256K pool */
23864 +static char *debug_alloc_pool = (char *)debug_alloc_pool_aligned;
23865 +static u32 dah_first, dah_first_call = 1, dah_used = 0, dah_used_max = 0;
23866 +
23867 +/* Locking is awkward. The debug code is called from all contexts, including
23868 + * non maskable interrupts. A normal spinlock is not safe in NMI context. Try
23869 + * to get the debug allocator lock, if it cannot be obtained after a second
23870 + * then give up. If the lock could not be previously obtained on this cpu then
23871 + * only try once.
23872 + *
23873 + * sparse has no annotation for "this function _sometimes_ acquires a lock", so
23874 + * fudge the acquire/release notation.
23875 + */
23876 +static DEFINE_SPINLOCK(dap_lock);
23877 +static int
23878 +get_dap_lock(void)
23879 + __acquires(dap_lock)
23880 +{
23881 + static int dap_locked = -1;
23882 + int count;
23883 + if (dap_locked == smp_processor_id())
23884 + count = 1;
23885 + else
23886 + count = 1000;
23887 + while (1) {
23888 + if (spin_trylock(&dap_lock)) {
23889 + dap_locked = -1;
23890 + return 1;
23891 + }
23892 + if (!count--)
23893 + break;
23894 + udelay(1000);
23895 + }
23896 + dap_locked = smp_processor_id();
23897 + __acquire(dap_lock);
23898 + return 0;
23899 +}
23900 +
23901 +void
23902 +*debug_kmalloc(size_t size, gfp_t flags)
23903 +{
23904 + unsigned int rem, h_offset;
23905 + struct debug_alloc_header *best, *bestprev, *prev, *h;
23906 + void *p = NULL;
23907 + if (!get_dap_lock()) {
23908 + __release(dap_lock); /* we never actually got it */
23909 + return NULL;
23910 + }
23911 + h = (struct debug_alloc_header *)(debug_alloc_pool + dah_first);
23912 + if (dah_first_call) {
23913 + h->size = sizeof(debug_alloc_pool_aligned) - dah_overhead;
23914 + dah_first_call = 0;
23915 + }
23916 + size = ALIGN(size, dah_align);
23917 + prev = best = bestprev = NULL;
23918 + while (1) {
23919 + if (h->size >= size && (!best || h->size < best->size)) {
23920 + best = h;
23921 + bestprev = prev;
23922 + if (h->size == size)
23923 + break;
23924 + }
23925 + if (!h->next)
23926 + break;
23927 + prev = h;
23928 + h = (struct debug_alloc_header *)(debug_alloc_pool + h->next);
23929 + }
23930 + if (!best)
23931 + goto out;
23932 + rem = best->size - size;
23933 + /* The pool must always contain at least one header */
23934 + if (best->next == 0 && bestprev == NULL && rem < dah_overhead)
23935 + goto out;
23936 + if (rem >= dah_overhead) {
23937 + best->size = size;
23938 + h_offset = ((char *)best - debug_alloc_pool) +
23939 + dah_overhead + best->size;
23940 + h = (struct debug_alloc_header *)(debug_alloc_pool + h_offset);
23941 + h->size = rem - dah_overhead;
23942 + h->next = best->next;
23943 + } else
23944 + h_offset = best->next;
23945 + best->caller = __builtin_return_address(0);
23946 + dah_used += best->size;
23947 + dah_used_max = max(dah_used, dah_used_max);
23948 + if (bestprev)
23949 + bestprev->next = h_offset;
23950 + else
23951 + dah_first = h_offset;
23952 + p = (char *)best + dah_overhead;
23953 + memset(p, POISON_INUSE, best->size - 1);
23954 + *((char *)p + best->size - 1) = POISON_END;
23955 +out:
23956 + spin_unlock(&dap_lock);
23957 + return p;
23958 +}
23959 +
23960 +void
23961 +debug_kfree(void *p)
23962 +{
23963 + struct debug_alloc_header *h;
23964 + unsigned int h_offset;
23965 + if (!p)
23966 + return;
23967 + if ((char *)p < debug_alloc_pool ||
23968 + (char *)p >= debug_alloc_pool + sizeof(debug_alloc_pool_aligned)) {
23969 + kfree(p);
23970 + return;
23971 + }
23972 + if (!get_dap_lock()) {
23973 + __release(dap_lock); /* we never actually got it */
23974 + return; /* memory leak, cannot be helped */
23975 + }
23976 + h = (struct debug_alloc_header *)((char *)p - dah_overhead);
23977 + memset(p, POISON_FREE, h->size - 1);
23978 + *((char *)p + h->size - 1) = POISON_END;
23979 + h->caller = NULL;
23980 + dah_used -= h->size;
23981 + h_offset = (char *)h - debug_alloc_pool;
23982 + if (h_offset < dah_first) {
23983 + h->next = dah_first;
23984 + dah_first = h_offset;
23985 + } else {
23986 + struct debug_alloc_header *prev;
23987 + unsigned int prev_offset;
23988 + prev = (struct debug_alloc_header *)(debug_alloc_pool + dah_first);
23989 + while (1) {
23990 + if (!prev->next || prev->next > h_offset)
23991 + break;
23992 + prev = (struct debug_alloc_header *)
23993 + (debug_alloc_pool + prev->next);
23994 + }
23995 + prev_offset = (char *)prev - debug_alloc_pool;
23996 + if (prev_offset + dah_overhead + prev->size == h_offset) {
23997 + prev->size += dah_overhead + h->size;
23998 + memset(h, POISON_FREE, dah_overhead - 1);
23999 + *((char *)h + dah_overhead - 1) = POISON_END;
24000 + h = prev;
24001 + h_offset = prev_offset;
24002 + } else {
24003 + h->next = prev->next;
24004 + prev->next = h_offset;
24005 + }
24006 + }
24007 + if (h_offset + dah_overhead + h->size == h->next) {
24008 + struct debug_alloc_header *next;
24009 + next = (struct debug_alloc_header *)
24010 + (debug_alloc_pool + h->next);
24011 + h->size += dah_overhead + next->size;
24012 + h->next = next->next;
24013 + memset(next, POISON_FREE, dah_overhead - 1);
24014 + *((char *)next + dah_overhead - 1) = POISON_END;
24015 + }
24016 + spin_unlock(&dap_lock);
24017 +}
24018 +
24019 +void
24020 +debug_kusage(void)
24021 +{
24022 + struct debug_alloc_header *h_free, *h_used;
24023 +#ifdef CONFIG_IA64
24024 + /* FIXME: using dah for ia64 unwind always results in a memory leak.
24025 + * Fix that memory leak first, then set debug_kusage_one_time = 1 for
24026 + * all architectures.
24027 + */
24028 + static int debug_kusage_one_time = 0;
24029 +#else
24030 + static int debug_kusage_one_time = 1;
24031 +#endif
24032 + if (!get_dap_lock()) {
24033 + __release(dap_lock); /* we never actually got it */
24034 + return;
24035 + }
24036 + h_free = (struct debug_alloc_header *)(debug_alloc_pool + dah_first);
24037 + if (dah_first == 0 &&
24038 + (h_free->size == sizeof(debug_alloc_pool_aligned) - dah_overhead ||
24039 + dah_first_call))
24040 + goto out;
24041 + if (!debug_kusage_one_time)
24042 + goto out;
24043 + debug_kusage_one_time = 0;
24044 + kdb_printf("%s: debug_kmalloc memory leak dah_first %d\n",
24045 + __FUNCTION__, dah_first);
24046 + if (dah_first) {
24047 + h_used = (struct debug_alloc_header *)debug_alloc_pool;
24048 + kdb_printf("%s: h_used %p size %d\n", __FUNCTION__, h_used, h_used->size);
24049 + }
24050 + do {
24051 + h_used = (struct debug_alloc_header *)
24052 + ((char *)h_free + dah_overhead + h_free->size);
24053 + kdb_printf("%s: h_used %p size %d caller %p\n",
24054 + __FUNCTION__, h_used, h_used->size, h_used->caller);
24055 + h_free = (struct debug_alloc_header *)
24056 + (debug_alloc_pool + h_free->next);
24057 + } while (h_free->next);
24058 + h_used = (struct debug_alloc_header *)
24059 + ((char *)h_free + dah_overhead + h_free->size);
24060 + if ((char *)h_used - debug_alloc_pool !=
24061 + sizeof(debug_alloc_pool_aligned))
24062 + kdb_printf("%s: h_used %p size %d caller %p\n",
24063 + __FUNCTION__, h_used, h_used->size, h_used->caller);
24064 +out:
24065 + spin_unlock(&dap_lock);
24066 +}
24067 +
24068 +/* Maintain a small stack of kdb_flags to allow recursion without disturbing
24069 + * the global kdb state.
24070 + */
24071 +
24072 +static int kdb_flags_stack[4], kdb_flags_index;
24073 +
24074 +void
24075 +kdb_save_flags(void)
24076 +{
24077 + BUG_ON(kdb_flags_index >= ARRAY_SIZE(kdb_flags_stack));
24078 + kdb_flags_stack[kdb_flags_index++] = kdb_flags;
24079 +}
24080 +
24081 +void
24082 +kdb_restore_flags(void)
24083 +{
24084 + BUG_ON(kdb_flags_index <= 0);
24085 + kdb_flags = kdb_flags_stack[--kdb_flags_index];
24086 +}
24087 --- /dev/null
24088 +++ b/kdb/modules/Makefile
24089 @@ -0,0 +1,14 @@
24090 +#
24091 +# This file is subject to the terms and conditions of the GNU General Public
24092 +# License. See the file "COPYING" in the main directory of this archive
24093 +# for more details.
24094 +#
24095 +# Copyright (c) 1999-2006 Silicon Graphics, Inc. All Rights Reserved.
24096 +#
24097 +
24098 +obj-$(CONFIG_KDB_MODULES) += kdbm_pg.o kdbm_task.o kdbm_vm.o kdbm_sched.o
24099 +obj-m += kdbm_debugtypes.o
24100 +ifdef CONFIG_X86
24101 +obj-$(CONFIG_KDB_MODULES) += kdbm_x86.o
24102 +endif
24103 +CFLAGS_kdbm_vm.o += -I $(srctree)/drivers/scsi
24104 --- /dev/null
24105 +++ b/kdb/modules/kdbm_debugtypes.c
24106 @@ -0,0 +1,388 @@
24107 +/* this one has some additional address validation - untested */
24108 +/*
24109 + * This file is subject to the terms and conditions of the GNU General Public
24110 + * License. See the file "COPYING" in the main directory of this archive
24111 + * for more details.
24112 + *
24113 + * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
24114 + */
24115 +
24116 +/*
24117 + *
24118 + * Most of this code is borrowed and adapted from the lkcd command "lcrash"
24119 + * and its supporting libarary.
24120 + *
24121 + * This module provides kdb commands for casting memory structures.
24122 + * It loads symbolic debugging info (provided from lcrash -o), and provides
24123 + * "print" "px", "pd"
24124 + * (this information originally comes from the lcrash "kerntypes" file)
24125 + *
24126 + * A key here is tacking a file of debug info onto this module, for
24127 + * load with it at insmod time.
24128 + *
24129 + * Careful of porting the klib KL_XXX functions (they call thru a jump table
24130 + * that we don't use here)
24131 + *
24132 + * Usage:
24133 + * in order for the insmod kdbm_debugtypes.ko to succeed in loading types
24134 + * you must first use lcrash -t kerntypes.xxxx -o debug_info
24135 + * and echo debug_info > /proc/kdb/debug_info_name
24136 + */
24137 +
24138 +#define VMALLOC_START_IA64 0xa000000200000000
24139 +#include <linux/kernel.h>
24140 +#include <linux/module.h>
24141 +#include <linux/kdb.h>
24142 +#include <linux/kdbprivate.h>
24143 +#include <linux/fs.h>
24144 +#include <asm/processor.h>
24145 +#include <asm/uaccess.h>
24146 +#include <asm/fcntl.h>
24147 +#include <linux/vmalloc.h>
24148 +#include <linux/ctype.h>
24149 +#include <linux/file.h>
24150 +#include <linux/err.h>
24151 +#include "lcrash/klib.h"
24152 +#include "lcrash/kl_stringtab.h"
24153 +#include "lcrash/kl_btnode.h"
24154 +#include "lcrash/lc_eval.h"
24155 +
24156 +MODULE_AUTHOR("SGI");
24157 +MODULE_DESCRIPTION("Load symbolic debugging information");
24158 +MODULE_LICENSE("GPL");
24159 +
24160 +#undef next_node /* collision with nodemask.h */
24161 +static char *stringstorage, **stringp_array;
24162 +static void *filestorage;
24163 +static long num_strings, num_kltypes, num_dsyms, stringstorage_size;
24164 +extern int have_debug_file;
24165 +extern dbg_sym_t *types_tree_head;
24166 +extern dbg_sym_t *typedefs_tree_head;
24167 +extern kltype_t *kltype_array;
24168 +extern dbg_sym_t *dsym_types_array;
24169 +extern dbg_sym_t *type_tree;
24170 +extern dbg_sym_t *typedef_tree;
24171 +
24172 +/*
24173 + * use a pointer's value as an index in the stringp_array (num_strings) and
24174 + * translate it to string address
24175 + *
24176 + * Return 0 for success, 1 for failure
24177 + */
24178 +static int
24179 +index_to_char_ptr(char **ptrp)
24180 +{
24181 + long i;
24182 +
24183 + i = (long)*ptrp;
24184 + /* we use a value of -1 to mean this was a null pointer */
24185 + if (i == -1) {
24186 + *ptrp = NULL;
24187 + return 0;
24188 + }
24189 + if (i > num_strings-1) {
24190 + printk("Could not translate character string index %#lx\n", i);
24191 + return 1;
24192 + }
24193 + *ptrp = *(stringp_array+i);
24194 + return 0;
24195 +}
24196 +
24197 +/*
24198 + * use a pointer's value as an index in the kltype_array (num_kltypes) and
24199 + * translate it to the kltype_t address
24200 + *
24201 + * return 0 for success, 1 for failure
24202 + */
24203 +static int
24204 +index_to_kltype_ptr(kltype_t **ptrp)
24205 +{
24206 + long i;
24207 +
24208 + i = (long)*ptrp;
24209 + /* we use a value of -1 to mean this was a null pointer */
24210 + if (i == -1) {
24211 + *ptrp = NULL;
24212 + return 0;
24213 + }
24214 + if (i > num_kltypes-1) {
24215 + printk("Could not translate kl_type string index %#lx\n", i);
24216 + return 1;
24217 + }
24218 + *ptrp = kltype_array+i;
24219 + return 0;
24220 +}
24221 +
24222 +/*
24223 + * look up a pointer in the dsym_types_array (num_dsyms) and
24224 + * translate it to the index in the array
24225 + *
24226 + * return 0 for success, 1 for failure
24227 + */
24228 +static int
24229 +index_to_dbg_ptr(dbg_sym_t **ptrp)
24230 +{
24231 + long i;
24232 +
24233 + i = (long)*ptrp;
24234 + /* we use a value of -1 to mean this was a null pointer */
24235 + if (i == -1) {
24236 + *ptrp = NULL;
24237 + return 0;
24238 + }
24239 + if (i > num_dsyms-1) {
24240 + printk("Could not translate dbg_sym_t index %#lx\n", i);
24241 + return 1;
24242 + }
24243 + *ptrp = dsym_types_array+i;
24244 + return 0;
24245 +}
24246 +
24247 +
24248 +/*
24249 + * Work on the image of the file built by lcrash.
24250 + * Unpack the strings, and resolve the pointers in the arrays of kltype_t's
24251 + * and dbg_sym_t's to pointers.
24252 + *
24253 + * see lcrash's lib/libklib/kl_debug.c, which generates this file
24254 + *
24255 + * Return the pointers to the heads of the two binary trees by means of
24256 + * pointer arguments.
24257 + *
24258 + * Return 0 for sucess, 1 for any error.
24259 + */
24260 +static int
24261 +trans_file_image(void *file_storage, long file_size, dbg_sym_t **type_treepp,
24262 + dbg_sym_t **typedef_treepp)
24263 +{
24264 + int len;
24265 + long i, section_size, *lp, element_size;
24266 + long head_types_tree, head_typedefs_tree;
24267 + char *ptr, *stringsection, *kltypesection, *dbgsection;
24268 + void *kltypestorage, *dbgstorage;
24269 + kltype_t *klp;
24270 + dbg_sym_t *dbgp;
24271 +
24272 + /* 1) the strings */
24273 + lp = (long *)file_storage;
24274 + stringsection = (char *)lp;
24275 + section_size = *lp++;
24276 + num_strings = *lp++;
24277 + lp++; /* element size does not apply the strings section */
24278 +
24279 + stringstorage_size = section_size - (3*sizeof(long));
24280 + stringstorage = (char *)lp;
24281 +
24282 + stringp_array = (char **)vmalloc(num_strings * sizeof(char *));
24283 + if (! stringp_array) {
24284 + printk("vmalloc of %ld string pointers failed\n", num_strings);
24285 + return 1;
24286 + }
24287 + ptr = stringstorage;
24288 + for (i=0; i<num_strings; i++) {
24289 + *(stringp_array+i) = ptr;
24290 + len = strlen(ptr) + 1;
24291 + ptr += len;
24292 + }
24293 +
24294 + /* 2) the kltypes */
24295 + kltypesection = (char *)(stringsection + section_size);
24296 + lp = (long *)kltypesection;
24297 + section_size = *lp++;
24298 + num_kltypes = *lp++;
24299 + element_size = *lp++;
24300 + /* sanity check: */
24301 + if (element_size != sizeof(kltype_t)) {
24302 + printk("size of kltype_t:%ld does not match\n", element_size);
24303 + goto bad;
24304 + }
24305 + kltypestorage = (void *)lp;
24306 + kltype_array = (kltype_t *)kltypestorage;
24307 +
24308 + /* 3) the dbg_sym_t's */
24309 + dbgsection = (char *)kltypesection + section_size;
24310 + lp = (long *)dbgsection;
24311 + section_size = *lp++;
24312 + /* sanity check: */
24313 + if ((dbgsection + section_size) != ((char *)file_storage+file_size)) {
24314 + printk("dbg_sym_ts do not end at end of file\n");
24315 + goto bad;
24316 + }
24317 + num_dsyms = *lp++;
24318 + element_size = *lp++;
24319 + /* sanity check: */
24320 + if (element_size != sizeof(dbg_sym_t)) {
24321 + printk("kdb: size of dbg_sym_t does not match lkcd\'s\n");
24322 + goto bad;
24323 + }
24324 +
24325 + /* two special words ahead of the structures themselves */
24326 + head_types_tree = *lp++;
24327 + head_typedefs_tree = *lp++;
24328 +
24329 + dbgstorage = (void *)lp;
24330 + dsym_types_array = (dbg_sym_t *)dbgstorage;
24331 +
24332 + /* return the heads of the two binary trees */
24333 + *type_treepp = dsym_types_array+head_types_tree;
24334 + *typedef_treepp = dsym_types_array+head_typedefs_tree;
24335 +
24336 + /* translate the indices in our our array of kltype_t's to pointers */
24337 + /* (see write_kltype() for the fields that can be translated) */
24338 + klp = kltype_array;
24339 + for (i=0; i<num_kltypes; i++, klp++) {
24340 + if (index_to_char_ptr(&klp->kl_name))
24341 + goto bad;
24342 + if (index_to_char_ptr(&klp->kl_typestr))
24343 + goto bad;
24344 + if (index_to_kltype_ptr(&klp->kl_member))
24345 + goto bad;
24346 + if (index_to_kltype_ptr(&klp->kl_next))
24347 + goto bad;
24348 + if (index_to_kltype_ptr(&klp->kl_realtype))
24349 + goto bad;
24350 + if (index_to_kltype_ptr(&klp->kl_indextype))
24351 + goto bad;
24352 + if (index_to_kltype_ptr(&klp->kl_elementtype))
24353 + goto bad;
24354 + if (index_to_dbg_ptr((dbg_sym_t **)&klp->kl_ptr))
24355 + goto bad;
24356 + }
24357 +
24358 + /* translate the indices in our our array of dbg_sym_t's to pointers */
24359 + /* (see write_dbgtype() for the fields that can be translated) */
24360 + dbgp = dsym_types_array;
24361 + for (i=0; i<num_dsyms; i++, dbgp++) {
24362 + if (index_to_char_ptr(&dbgp->sym_bt.bt_key))
24363 + goto bad;
24364 + if (index_to_dbg_ptr((dbg_sym_t **)&dbgp->sym_bt.bt_left))
24365 + goto bad;
24366 + if (index_to_dbg_ptr((dbg_sym_t **)&dbgp->sym_bt.bt_right))
24367 + goto bad;
24368 + if (index_to_dbg_ptr((dbg_sym_t **)&dbgp->sym_bt.bt_parent))
24369 + goto bad;
24370 + if (index_to_dbg_ptr((dbg_sym_t **)&dbgp->sym_next))
24371 + goto bad;
24372 + if (index_to_dbg_ptr((dbg_sym_t **)&dbgp->sym_link))
24373 + goto bad;
24374 + if (index_to_kltype_ptr(&dbgp->sym_kltype))
24375 + goto bad;
24376 + }
24377 +
24378 + vfree(stringp_array);
24379 + return 0;
24380 +bad:
24381 + printk("trans_file_image() returning an error\n");
24382 + vfree(stringp_array);
24383 + return 1;
24384 +}
24385 +
24386 +/* there is /proc interface to this string */
24387 +extern char kdb_debug_info_filename[];
24388 +/*
24389 + * This is the module initialization function.
24390 + */
24391 +static int __init
24392 +kdbm_debuginfo_init(void)
24393 +{
24394 + int len;
24395 + long ret, file_size;
24396 + ssize_t sizeread;
24397 + mm_segment_t fs;
24398 + struct file *file;
24399 + loff_t inode_size, pos;
24400 +
24401 + len = strlen(kdb_debug_info_filename);
24402 + if (!len) {
24403 + printk("kdb: no file name in /proc/kdb/debug_info_name\n");
24404 + return -ENODEV;
24405 + }
24406 +
24407 + fs = get_fs(); /* save previous value of address limits */
24408 + set_fs (get_ds()); /* use kernel limit */
24409 +
24410 + file = filp_open(kdb_debug_info_filename, O_RDONLY, 0);
24411 + if (IS_ERR(file)) {
24412 + set_fs(fs);
24413 + printk (
24414 + "kdb: open of %s (from /proc/kdb/debug_info_name) failed\n",
24415 + kdb_debug_info_filename);
24416 + return -ENODEV;
24417 + }
24418 + if (!file->f_op || (!file->f_op->read && !file->f_op->llseek)) {
24419 + printk ("file has no operation for read or seek\n");
24420 + set_fs(fs);
24421 + return -ENODEV;
24422 + }
24423 + inode_size = file->f_dentry->d_inode->i_size;
24424 +
24425 + /*
24426 + * File has a header word on it that contains the size of the
24427 + * file. We don't need it, but can use it as a sanity check.
24428 + */
24429 + pos = 0;
24430 + sizeread = file->f_op->read(file, (char *)&file_size,
24431 + sizeof(file_size), &pos);
24432 + if (sizeread != sizeof(file_size)) {
24433 + printk("could not read %d bytes from %s\n",
24434 + (int)sizeof(file_size), kdb_debug_info_filename);
24435 + ret = filp_close(file, NULL);
24436 + set_fs(fs);
24437 + return -ENODEV;
24438 + }
24439 + if (inode_size != file_size) {
24440 + printk("file says %ld, inode says %lld\n",
24441 + file_size, inode_size);
24442 + ret = filp_close(file, NULL);
24443 + set_fs(fs);
24444 + return -ENODEV;
24445 + }
24446 +
24447 + /* space for the rest of the file: */
24448 + file_size -= sizeof(long);
24449 + filestorage = (void *)vmalloc(file_size);
24450 +
24451 + pos = sizeof(file_size); /* position after the header word */
24452 + sizeread = file->f_op->read(file, (char *)filestorage,
24453 + file_size, &pos);
24454 + if (sizeread != file_size) {
24455 + printk("could not read %ld bytes from %s\n",
24456 + file_size, kdb_debug_info_filename);
24457 + ret = filp_close(file, NULL);
24458 + set_fs(fs);
24459 + vfree (filestorage);
24460 + return -ENODEV;
24461 + }
24462 +
24463 + ret = filp_close(file, NULL);
24464 + set_fs(fs); /* restore address limits before returning to user space */
24465 +
24466 + if (trans_file_image(filestorage, file_size, &types_tree_head,
24467 + &typedefs_tree_head)){
24468 + vfree (filestorage);
24469 + return -ENODEV;
24470 + }
24471 + printk("kdbm_debuginfo loaded %s\n", kdb_debug_info_filename);
24472 + /* set the lcrash code's binary tree head nodes */
24473 + type_tree = types_tree_head;
24474 + typedef_tree = typedefs_tree_head;
24475 +
24476 + have_debug_file = 1;
24477 +
24478 + return 0;
24479 +}
24480 +
24481 +/*
24482 + * This is the module exit function.
24483 + */
24484 +static void __exit
24485 +kdbm_debuginfo_exit(void)
24486 +{
24487 + printk("kdbm_debuginfo unloaded %s\n", kdb_debug_info_filename);
24488 + vfree (filestorage);
24489 + have_debug_file = 0;
24490 + return;
24491 +}
24492 +
24493 +module_init(kdbm_debuginfo_init);
24494 +module_exit(kdbm_debuginfo_exit);
24495 --- /dev/null
24496 +++ b/kdb/modules/kdbm_pg.c
24497 @@ -0,0 +1,688 @@
24498 +/*
24499 + * This file is subject to the terms and conditions of the GNU General Public
24500 + * License. See the file "COPYING" in the main directory of this archive
24501 + * for more details.
24502 + *
24503 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.
24504 + */
24505 +
24506 +#include <linux/module.h>
24507 +#include <linux/init.h>
24508 +#include <linux/mm.h>
24509 +#include <linux/pagemap.h>
24510 +#include <linux/fs.h>
24511 +#include <linux/bio.h>
24512 +#include <linux/buffer_head.h>
24513 +#include <linux/kdb.h>
24514 +#include <linux/kdbprivate.h>
24515 +#include <linux/blkdev.h>
24516 +#include <linux/ctype.h>
24517 +
24518 +MODULE_AUTHOR("SGI");
24519 +MODULE_DESCRIPTION("Debug page information");
24520 +MODULE_LICENSE("GPL");
24521 +
24522 +/* Standard Linux page stuff */
24523 +
24524 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
24525 +/* From include/linux/page-flags.h */
24526 +static char *pg_flag_vals[] = {
24527 + "PG_locked", "PG_error", "PG_referenced", "PG_uptodate",
24528 + "PG_dirty", "PG_lru", "PG_active", "PG_slab",
24529 + "PG_owner_priv_1", "PG_arch_1", "PG_reserved", "PG_private",
24530 + "PG_writeback",
24531 +#ifdef CONFIG_PAGEFLAGS_EXTENDED
24532 + "PG_head", "PG_tail",
24533 +#else
24534 + "PG_compound",
24535 +#endif
24536 + "PG_swapcache", "PG_mappedtodisk", "PG_reclaim", "PG_buddy",
24537 +#ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
24538 + "PG_uncached",
24539 +#endif
24540 + NULL };
24541 +#endif
24542 +
24543 +/* From include/linux/buffer_head.h */
24544 +static char *bh_state_vals[] = {
24545 + "Uptodate", "Dirty", "Lock", "Req",
24546 + "Uptodate_Lock", "Mapped", "New", "Async_read",
24547 + "Async_write", "Delay", "Boundary", "Write_EIO",
24548 + "Ordered", "Eopnotsupp", "Unwritten", "PriavateStart",
24549 + NULL };
24550 +
24551 +/* From include/linux/bio.h */
24552 +static char *bio_flag_vals[] = {
24553 + "Uptodate", "RW_block", "EOF", "Seg_valid",
24554 + "Cloned", "Bounced", "User_mapped", "Eopnotsupp",
24555 + NULL };
24556 +
24557 +/* From include/linux/fs.h */
24558 +static char *inode_flag_vals[] = {
24559 + "I_DIRTY_SYNC", "I_DIRTY_DATASYNC", "I_DIRTY_PAGES", "I_NEW",
24560 + "I_WILL_FREE", "I_FREEING", "I_CLEAR", "I_LOCK",
24561 + "I_SYNC", NULL };
24562 +
24563 +static char *map_flags(unsigned long flags, char *mapping[])
24564 +{
24565 + static char buffer[256];
24566 + int index;
24567 + int offset = 12;
24568 +
24569 + buffer[0] = '\0';
24570 +
24571 + for (index = 0; flags && mapping[index]; flags >>= 1, index++) {
24572 + if (flags & 1) {
24573 + if ((offset + strlen(mapping[index]) + 1) >= 80) {
24574 + strcat(buffer, "\n ");
24575 + offset = 12;
24576 + } else if (offset > 12) {
24577 + strcat(buffer, " ");
24578 + offset++;
24579 + }
24580 + strcat(buffer, mapping[index]);
24581 + offset += strlen(mapping[index]);
24582 + }
24583 + }
24584 +
24585 + return (buffer);
24586 +}
24587 +
24588 +static int
24589 +kdbm_buffers(int argc, const char **argv)
24590 +{
24591 + struct buffer_head bh;
24592 + unsigned long addr;
24593 + long offset = 0;
24594 + int nextarg;
24595 + int diag;
24596 +
24597 + if (argc != 1)
24598 + return KDB_ARGCOUNT;
24599 +
24600 + nextarg = 1;
24601 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
24602 + (diag = kdb_getarea(bh, addr)))
24603 + return(diag);
24604 +
24605 + kdb_printf("buffer_head at 0x%lx\n", addr);
24606 + kdb_printf(" bno %llu size %llu dev 0x%x\n",
24607 + (unsigned long long)bh.b_blocknr,
24608 + (unsigned long long)bh.b_size,
24609 + bh.b_bdev ? bh.b_bdev->bd_dev : 0);
24610 + kdb_printf(" count %d state 0x%lx [%s]\n",
24611 + bh.b_count.counter, bh.b_state,
24612 + map_flags(bh.b_state, bh_state_vals));
24613 + kdb_printf(" b_data 0x%p\n",
24614 + bh.b_data);
24615 + kdb_printf(" b_page 0x%p b_this_page 0x%p b_private 0x%p\n",
24616 + bh.b_page, bh.b_this_page, bh.b_private);
24617 + kdb_printf(" b_end_io ");
24618 + if (bh.b_end_io)
24619 + kdb_symbol_print(kdba_funcptr_value(bh.b_end_io), NULL, KDB_SP_VALUE);
24620 + else
24621 + kdb_printf("(NULL)");
24622 + kdb_printf("\n");
24623 +
24624 + return 0;
24625 +}
24626 +
24627 +static int
24628 +print_biovec(struct bio_vec *vec, int vcount)
24629 +{
24630 + struct bio_vec bvec;
24631 + unsigned long addr;
24632 + int diag;
24633 + int i;
24634 +
24635 + if (vcount < 1 || vcount > BIO_MAX_PAGES) {
24636 + kdb_printf(" [skipped iovecs, vcnt is %d]\n", vcount);
24637 + return 0;
24638 + }
24639 +
24640 + addr = (unsigned long)vec;
24641 + for (i = 0; i < vcount; i++) {
24642 + if ((diag = kdb_getarea(bvec, addr)))
24643 + return(diag);
24644 + addr += sizeof(bvec);
24645 + kdb_printf(" [%d] page 0x%p length=%u offset=%u\n",
24646 + i, bvec.bv_page, bvec.bv_len, bvec.bv_offset);
24647 + }
24648 + return 0;
24649 +}
24650 +
24651 +static int
24652 +kdbm_bio(int argc, const char **argv)
24653 +{
24654 + struct bio bio;
24655 + unsigned long addr;
24656 + long offset = 0;
24657 + int nextarg;
24658 + int diag;
24659 +
24660 + if (argc != 1)
24661 + return KDB_ARGCOUNT;
24662 +
24663 + nextarg = 1;
24664 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
24665 + (diag = kdb_getarea(bio, addr)))
24666 + return(diag);
24667 +
24668 + kdb_printf("bio at 0x%lx\n", addr);
24669 + kdb_printf(" bno %llu next 0x%p dev 0x%x\n",
24670 + (unsigned long long)bio.bi_sector,
24671 + bio.bi_next, bio.bi_bdev ? bio.bi_bdev->bd_dev : 0);
24672 + kdb_printf(" vcnt %u vec 0x%p rw 0x%lx flags 0x%lx [%s]\n",
24673 + bio.bi_vcnt, bio.bi_io_vec, bio.bi_rw, bio.bi_flags,
24674 + map_flags(bio.bi_flags, bio_flag_vals));
24675 + print_biovec(bio.bi_io_vec, bio.bi_vcnt);
24676 + kdb_printf(" count %d private 0x%p\n",
24677 + atomic_read(&bio.bi_cnt), bio.bi_private);
24678 + kdb_printf(" bi_end_io ");
24679 + if (bio.bi_end_io)
24680 + kdb_symbol_print(kdba_funcptr_value(bio.bi_end_io), NULL, KDB_SP_VALUE);
24681 + else
24682 + kdb_printf("(NULL)");
24683 + kdb_printf("\n");
24684 +
24685 + return 0;
24686 +}
24687 +
24688 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
24689 +static char *page_flags(unsigned long flags)
24690 +{
24691 + return(map_flags(flags, pg_flag_vals));
24692 +}
24693 +
24694 +static int
24695 +kdbm_page(int argc, const char **argv)
24696 +{
24697 + struct page page;
24698 + unsigned long addr;
24699 + long offset = 0;
24700 + int nextarg;
24701 + int diag;
24702 +
24703 + if (argc != 1)
24704 + return KDB_ARGCOUNT;
24705 +
24706 + nextarg = 1;
24707 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
24708 + if (diag)
24709 + return diag;
24710 +
24711 +#ifdef __ia64__
24712 + if (rgn_index(addr) == 0)
24713 + addr = (unsigned long) &mem_map[addr]; /* assume region 0 is a page index, not an address */
24714 +#else
24715 + if (addr < PAGE_OFFSET)
24716 + addr = (unsigned long) &mem_map[addr];
24717 +#endif
24718 +
24719 + if ((diag = kdb_getarea(page, addr)))
24720 + return(diag);
24721 +
24722 + kdb_printf("struct page at 0x%lx\n", addr);
24723 + kdb_printf(" addr space 0x%p index %lu (offset 0x%llx)\n",
24724 + page.mapping, page.index,
24725 + (unsigned long long)page.index << PAGE_CACHE_SHIFT);
24726 + kdb_printf(" count %d flags %s\n",
24727 + page._count.counter, page_flags(page.flags));
24728 + kdb_printf(" virtual 0x%p\n", page_address((struct page *)addr));
24729 + if (page_has_buffers(&page))
24730 + kdb_printf(" buffers 0x%p\n", page_buffers(&page));
24731 + else
24732 + kdb_printf(" private 0x%lx\n", page_private(&page));
24733 +
24734 + return 0;
24735 +}
24736 +#endif /* !CONFIG_DISCONTIGMEM && !NUMA */
24737 +
24738 +static unsigned long
24739 +print_request(unsigned long addr)
24740 +{
24741 + struct request rq;
24742 +
24743 + if (kdb_getarea(rq, addr))
24744 + return(0);
24745 +
24746 + kdb_printf("struct request at 0x%lx\n", addr);
24747 + kdb_printf(" errors %d sector %llu nr_sectors %lu\n",
24748 + rq.errors,
24749 + (unsigned long long)rq.sector, rq.nr_sectors);
24750 +
24751 + kdb_printf(" hsect %llu hnrsect %lu nrseg %u currnrsect %u\n",
24752 + (unsigned long long)rq.hard_sector, rq.hard_nr_sectors,
24753 + rq.nr_phys_segments, rq.current_nr_sectors);
24754 +
24755 + return (unsigned long) rq.queuelist.next;
24756 +}
24757 +
24758 +static int
24759 +kdbm_request(int argc, const char **argv)
24760 +{
24761 + long offset = 0;
24762 + unsigned long addr;
24763 + int nextarg;
24764 + int diag;
24765 +
24766 + if (argc != 1)
24767 + return KDB_ARGCOUNT;
24768 +
24769 + nextarg = 1;
24770 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
24771 + if (diag)
24772 + return diag;
24773 +
24774 + print_request(addr);
24775 + return 0;
24776 +}
24777 +
24778 +
24779 +static int
24780 +kdbm_rqueue(int argc, const char **argv)
24781 +{
24782 + struct request_queue rq;
24783 + unsigned long addr, head_addr, next;
24784 + long offset = 0;
24785 + int nextarg;
24786 + int i, diag;
24787 +
24788 + if (argc != 1)
24789 + return KDB_ARGCOUNT;
24790 +
24791 + nextarg = 1;
24792 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
24793 + (diag = kdb_getarea(rq, addr)))
24794 + return(diag);
24795 +
24796 + kdb_printf("struct request_queue at 0x%lx\n", addr);
24797 + i = 0;
24798 + next = (unsigned long)rq.queue_head.next;
24799 + head_addr = addr + offsetof(struct request_queue, queue_head);
24800 + kdb_printf(" request queue: %s\n", next == head_addr ?
24801 + "empty" : "");
24802 + while (next != head_addr) {
24803 + i++;
24804 + next = print_request(next);
24805 + }
24806 +
24807 + if (i)
24808 + kdb_printf("%d requests found\n", i);
24809 +
24810 + return 0;
24811 +}
24812 +
24813 +
24814 +static void
24815 +do_buffer(unsigned long addr)
24816 +{
24817 + struct buffer_head bh;
24818 +
24819 + if (kdb_getarea(bh, addr))
24820 + return;
24821 +
24822 + kdb_printf("\tbh 0x%lx bno %8llu [%s]\n", addr,
24823 + (unsigned long long)bh.b_blocknr,
24824 + map_flags(bh.b_state, bh_state_vals));
24825 +}
24826 +
24827 +static void
24828 +kdbm_show_page(struct page *page, int first)
24829 +{
24830 + if (first)
24831 + kdb_printf("page_struct index cnt zone nid flags\n");
24832 + kdb_printf("%p%s %6lu %5d %3d %3d 0x%lx",
24833 + page_address(page), sizeof(void *) == 4 ? " " : "",
24834 + page->index, atomic_read(&(page->_count)),
24835 + page_zonenum(page), page_to_nid(page),
24836 + page->flags & (~0UL >> ZONES_SHIFT));
24837 +#define kdb_page_flags(page, type) if (Page ## type(page)) kdb_printf(" " #type);
24838 + kdb_page_flags(page, Locked);
24839 + kdb_page_flags(page, Error);
24840 + kdb_page_flags(page, Referenced);
24841 + kdb_page_flags(page, Uptodate);
24842 + kdb_page_flags(page, Dirty);
24843 + kdb_page_flags(page, LRU);
24844 + kdb_page_flags(page, Active);
24845 + kdb_page_flags(page, Slab);
24846 + kdb_page_flags(page, Checked);
24847 + if (page->flags & (1UL << PG_arch_1))
24848 + kdb_printf(" arch_1");
24849 + kdb_page_flags(page, Reserved);
24850 + kdb_page_flags(page, Private);
24851 + kdb_page_flags(page, Writeback);
24852 + kdb_page_flags(page, Compound);
24853 + kdb_page_flags(page, SwapCache);
24854 + kdb_page_flags(page, MappedToDisk);
24855 + kdb_page_flags(page, Reclaim);
24856 + kdb_page_flags(page, Buddy);
24857 +
24858 + /* PageHighMem is not a flag any more, but treat it as one */
24859 + kdb_page_flags(page, HighMem);
24860 +
24861 + if (page_has_buffers(page)) {
24862 + struct buffer_head *head, *bh;
24863 + kdb_printf("\n");
24864 + head = bh = page_buffers(page);
24865 + do {
24866 + do_buffer((unsigned long) bh);
24867 + } while ((bh = bh->b_this_page) != head);
24868 + } else if (page_private(page)) {
24869 + kdb_printf(" private= 0x%lx", page_private(page));
24870 + }
24871 + /* Cannot use page_mapping(page) here, it needs swapper_space which is
24872 + * not exported.
24873 + */
24874 + if (page->mapping)
24875 + kdb_printf(" mapping= %p", page->mapping);
24876 + kdb_printf("\n");
24877 +#undef kdb_page_flags
24878 +}
24879 +
24880 +static int
24881 +kdbm_inode_pages(int argc, const char **argv)
24882 +{
24883 + struct inode *inode = NULL;
24884 + struct address_space *ap = NULL;
24885 + unsigned long addr, addr1 = 0;
24886 + long offset = 0;
24887 + int nextarg;
24888 + int diag;
24889 + pgoff_t next = 0;
24890 + struct page *page;
24891 + int first;
24892 +
24893 + nextarg = 1;
24894 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
24895 + if (diag)
24896 + goto out;
24897 +
24898 + if (argc == 2) {
24899 + nextarg = 2;
24900 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr1,
24901 + &offset, NULL);
24902 + if (diag)
24903 + goto out;
24904 + kdb_printf("Looking for page index 0x%lx ... \n", addr1);
24905 + next = addr1;
24906 + }
24907 +
24908 + if (!(inode = kmalloc(sizeof(*inode), GFP_ATOMIC))) {
24909 + kdb_printf("kdbm_inode_pages: cannot kmalloc inode\n");
24910 + goto out;
24911 + }
24912 + if (!(ap = kmalloc(sizeof(*ap), GFP_ATOMIC))) {
24913 + kdb_printf("kdbm_inode_pages: cannot kmalloc ap\n");
24914 + goto out;
24915 + }
24916 + if ((diag = kdb_getarea(*inode, addr)))
24917 + goto out;
24918 + if (!inode->i_mapping) {
24919 + kdb_printf("inode has no mapping\n");
24920 + goto out;
24921 + }
24922 + if ((diag = kdb_getarea(*ap, (unsigned long) inode->i_mapping)))
24923 + goto out;
24924 +
24925 + /* Run the pages in the radix tree, printing the state of each page */
24926 + first = 1;
24927 + while (radix_tree_gang_lookup(&ap->page_tree, (void **)&page, next, 1)) {
24928 + kdbm_show_page(page, first);
24929 + if (addr1)
24930 + break;
24931 + first = 0;
24932 + next = page->index + 1;
24933 + }
24934 +
24935 +out:
24936 + if (inode)
24937 + kfree(inode);
24938 + if (ap)
24939 + kfree(ap);
24940 + return diag;
24941 +}
24942 +
24943 +static int
24944 +kdbm_inode(int argc, const char **argv)
24945 +{
24946 + struct inode *inode = NULL;
24947 + unsigned long addr;
24948 + unsigned char *iaddr;
24949 + long offset = 0;
24950 + int nextarg;
24951 + int diag;
24952 +
24953 + if (argc != 1)
24954 + return KDB_ARGCOUNT;
24955 +
24956 + nextarg = 1;
24957 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
24958 + goto out;
24959 + if (!(inode = kmalloc(sizeof(*inode), GFP_ATOMIC))) {
24960 + kdb_printf("kdbm_inode: cannot kmalloc inode\n");
24961 + goto out;
24962 + }
24963 + if ((diag = kdb_getarea(*inode, addr)))
24964 + goto out;
24965 +
24966 + kdb_printf("struct inode at 0x%lx\n", addr);
24967 +
24968 + kdb_printf(" i_ino = %lu i_count = %u i_size %Ld\n",
24969 + inode->i_ino, atomic_read(&inode->i_count),
24970 + inode->i_size);
24971 +
24972 + kdb_printf(" i_mode = 0%o i_nlink = %d i_rdev = 0x%x\n",
24973 + inode->i_mode, inode->i_nlink,
24974 + inode->i_rdev);
24975 +
24976 + kdb_printf(" i_hash.nxt = 0x%p i_hash.pprev = 0x%p\n",
24977 + inode->i_hash.next,
24978 + inode->i_hash.pprev);
24979 +
24980 + kdb_printf(" i_list.nxt = 0x%p i_list.prv = 0x%p\n",
24981 + list_entry(inode->i_list.next, struct inode, i_list),
24982 + list_entry(inode->i_list.prev, struct inode, i_list));
24983 +
24984 + kdb_printf(" i_dentry.nxt = 0x%p i_dentry.prv = 0x%p\n",
24985 + list_entry(inode->i_dentry.next, struct dentry, d_alias),
24986 + list_entry(inode->i_dentry.prev, struct dentry, d_alias));
24987 +
24988 + kdb_printf(" i_sb = 0x%p i_op = 0x%p i_data = 0x%lx nrpages = %lu\n",
24989 + inode->i_sb, inode->i_op,
24990 + addr + offsetof(struct inode, i_data),
24991 + inode->i_data.nrpages);
24992 + kdb_printf(" i_fop= 0x%p i_flock = 0x%p i_mapping = 0x%p\n",
24993 + inode->i_fop, inode->i_flock, inode->i_mapping);
24994 +
24995 + kdb_printf(" i_flags 0x%x i_state 0x%lx [%s]",
24996 + inode->i_flags, inode->i_state,
24997 + map_flags(inode->i_state, inode_flag_vals));
24998 +
24999 + iaddr = (char *)addr;
25000 + iaddr += offsetof(struct inode, i_private);
25001 +
25002 + kdb_printf(" fs specific info @ 0x%p\n", iaddr);
25003 +out:
25004 + if (inode)
25005 + kfree(inode);
25006 + return diag;
25007 +}
25008 +
25009 +static int
25010 +kdbm_sb(int argc, const char **argv)
25011 +{
25012 + struct super_block *sb = NULL;
25013 + unsigned long addr;
25014 + long offset = 0;
25015 + int nextarg;
25016 + int diag;
25017 +
25018 + if (argc != 1)
25019 + return KDB_ARGCOUNT;
25020 +
25021 + nextarg = 1;
25022 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
25023 + goto out;
25024 + if (!(sb = kmalloc(sizeof(*sb), GFP_ATOMIC))) {
25025 + kdb_printf("kdbm_sb: cannot kmalloc sb\n");
25026 + goto out;
25027 + }
25028 + if ((diag = kdb_getarea(*sb, addr)))
25029 + goto out;
25030 +
25031 + kdb_printf("struct super_block at 0x%lx\n", addr);
25032 + kdb_printf(" s_dev 0x%x blocksize 0x%lx\n", sb->s_dev, sb->s_blocksize);
25033 + kdb_printf(" s_flags 0x%lx s_root 0x%p\n", sb->s_flags, sb->s_root);
25034 + kdb_printf(" s_dirt %d s_dirty.next 0x%p s_dirty.prev 0x%p\n",
25035 + sb->s_dirt, sb->s_dirty.next, sb->s_dirty.prev);
25036 + kdb_printf(" s_frozen %d s_id [%s]\n", sb->s_frozen, sb->s_id);
25037 +out:
25038 + if (sb)
25039 + kfree(sb);
25040 + return diag;
25041 +}
25042 +
25043 +
25044 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
25045 +/* According to Steve Lord, this code is ix86 specific. Patches to extend it to
25046 + * other architectures will be greatefully accepted.
25047 + */
25048 +static int
25049 +kdbm_memmap(int argc, const char **argv)
25050 +{
25051 + struct page page;
25052 + int i, page_count;
25053 + int slab_count = 0;
25054 + int dirty_count = 0;
25055 + int locked_count = 0;
25056 + int page_counts[10]; /* [8] = large counts, [9] = -1 counts */
25057 + int buffered_count = 0;
25058 +#ifdef buffer_delay
25059 + int delay_count = 0;
25060 +#endif
25061 + int diag;
25062 + unsigned long addr;
25063 +#ifdef CONFIG_DISCONTIGMEM
25064 + int node_id = -1, found_node = 0;
25065 + int tot_page_count = 0;
25066 + unsigned long unode_id;
25067 + pg_data_t *pgdat;
25068 +
25069 + if (argc == 1) { /* node_id was specified */
25070 + diag = kdbgetularg(argv[argc], &unode_id);
25071 + if (diag)
25072 + return diag;
25073 + node_id = (int)unode_id;
25074 + }
25075 + else if (argc)
25076 + return KDB_ARGCOUNT;
25077 +
25078 + tot_page_count = 0;
25079 + memset(page_counts, 0, sizeof(page_counts));
25080 +
25081 + for_each_online_pgdat(pgdat) {
25082 + if ((node_id != -1) && (pgdat->node_id != node_id))
25083 + continue;
25084 + found_node = 1;
25085 + addr = (unsigned long)pgdat->node_mem_map;
25086 + page_count = pgdat->node_spanned_pages;
25087 + tot_page_count += page_count;
25088 +#else
25089 + addr = (unsigned long)mem_map;
25090 + page_count = max_mapnr;
25091 + memset(page_counts, 0, sizeof(page_counts));
25092 +#endif
25093 + for (i = 0; i < page_count; i++) {
25094 + if ((diag = kdb_getarea(page, addr)))
25095 + return(diag);
25096 + addr += sizeof(page);
25097 +
25098 + if (PageSlab(&page))
25099 + slab_count++;
25100 + if (PageDirty(&page))
25101 + dirty_count++;
25102 + if (PageLocked(&page))
25103 + locked_count++;
25104 + if (page._count.counter == -1)
25105 + page_counts[9]++;
25106 + else if (page._count.counter < 8)
25107 + page_counts[page._count.counter]++;
25108 + else
25109 + page_counts[8]++;
25110 + if (page_has_buffers(&page)) {
25111 + buffered_count++;
25112 +#ifdef buffer_delay
25113 + if (buffer_delay(page.buffers))
25114 + delay_count++;
25115 +#endif
25116 + }
25117 + }
25118 +#ifdef CONFIG_DISCONTIGMEM
25119 + }
25120 + page_count = tot_page_count;
25121 + if (node_id != -1) {
25122 + if (!found_node) {
25123 + kdb_printf("Node %d does not exist.\n", node_id);
25124 + return 0;
25125 + }
25126 + kdb_printf("Node %d pages:\n", node_id);
25127 + }
25128 +#endif
25129 + kdb_printf(" Total pages: %6d\n", page_count);
25130 + kdb_printf(" Slab pages: %6d\n", slab_count);
25131 + kdb_printf(" Dirty pages: %6d\n", dirty_count);
25132 + kdb_printf(" Locked pages: %6d\n", locked_count);
25133 + kdb_printf(" Buffer pages: %6d\n", buffered_count);
25134 +#ifdef buffer_delay
25135 + kdb_printf(" Delalloc pages: %6d\n", delay_count);
25136 +#endif
25137 + kdb_printf(" -1 page count: %6d\n", page_counts[9]);
25138 + for (i = 0; i < 8; i++) {
25139 + kdb_printf(" %d page count: %6d\n",
25140 + i, page_counts[i]);
25141 + }
25142 + kdb_printf(" high page count: %6d\n", page_counts[8]);
25143 + return 0;
25144 +}
25145 +#endif /* !CONFIG_DISCONTIGMEM && !NUMA */
25146 +
25147 +static int __init kdbm_pg_init(void)
25148 +{
25149 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
25150 + kdb_register("page", kdbm_page, "<vaddr>", "Display page", 0);
25151 +#endif
25152 + kdb_register("inode", kdbm_inode, "<vaddr>", "Display inode", 0);
25153 + kdb_register("sb", kdbm_sb, "<vaddr>", "Display super_block", 0);
25154 + kdb_register("bh", kdbm_buffers, "<buffer head address>", "Display buffer", 0);
25155 + kdb_register("bio", kdbm_bio, "<bio address>", "Display bio", 0);
25156 + kdb_register("inode_pages", kdbm_inode_pages, "<inode *>", "Display pages in an inode", 0);
25157 + kdb_register("req", kdbm_request, "<vaddr>", "dump request struct", 0);
25158 + kdb_register("rqueue", kdbm_rqueue, "<vaddr>", "dump request queue", 0);
25159 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
25160 + kdb_register("memmap", kdbm_memmap, "", "page table summary", 0);
25161 +#endif
25162 +
25163 + return 0;
25164 +}
25165 +
25166 +
25167 +static void __exit kdbm_pg_exit(void)
25168 +{
25169 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
25170 + kdb_unregister("page");
25171 +#endif
25172 + kdb_unregister("inode");
25173 + kdb_unregister("sb");
25174 + kdb_unregister("bh");
25175 + kdb_unregister("bio");
25176 + kdb_unregister("inode_pages");
25177 + kdb_unregister("req");
25178 + kdb_unregister("rqueue");
25179 +#if !defined(CONFIG_DISCONTIGMEM) && !defined(CONFIG_NUMA)
25180 + kdb_unregister("memmap");
25181 +#endif
25182 +}
25183 +
25184 +module_init(kdbm_pg_init)
25185 +module_exit(kdbm_pg_exit)
25186 --- /dev/null
25187 +++ b/kdb/modules/kdbm_sched.c
25188 @@ -0,0 +1,57 @@
25189 +/*
25190 + * This file is subject to the terms and conditions of the GNU General Public
25191 + * License. See the file "COPYING" in the main directory of this archive
25192 + * for more details.
25193 + *
25194 + * Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved.
25195 + */
25196 +
25197 +#include <linux/kdb.h>
25198 +#include <linux/kdbprivate.h>
25199 +#include <linux/module.h>
25200 +#include <linux/init.h>
25201 +#include <linux/sched.h>
25202 +
25203 +MODULE_AUTHOR("SGI");
25204 +MODULE_DESCRIPTION("Debug scheduler information");
25205 +MODULE_LICENSE("GPL");
25206 +
25207 +static int
25208 +kdbm_runqueues(int argc, const char **argv)
25209 +{
25210 + unsigned long cpu;
25211 + int ret = 0;
25212 +
25213 + if (argc == 1) {
25214 + ret = kdbgetularg((char *)argv[1], &cpu);
25215 + if (!ret) {
25216 + if (!cpu_online(cpu)) {
25217 + kdb_printf("Invalid cpu number\n");
25218 + } else
25219 + kdb_runqueue(cpu, kdb_printf);
25220 + }
25221 + } else if (argc == 0) {
25222 + for_each_online_cpu(cpu)
25223 + kdb_runqueue(cpu, kdb_printf);
25224 + } else {
25225 + /* More than one arg */
25226 + kdb_printf("Specify one cpu number\n");
25227 + }
25228 + return ret;
25229 +}
25230 +
25231 +static int __init kdbm_sched_init(void)
25232 +{
25233 + kdb_register("rq", kdbm_runqueues, "<cpunum>", "Display runqueue for <cpunum>", 0);
25234 + kdb_register("rqa", kdbm_runqueues, "", "Display all runqueues", 0);
25235 + return 0;
25236 +}
25237 +
25238 +static void __exit kdbm_sched_exit(void)
25239 +{
25240 + kdb_unregister("rq");
25241 + kdb_unregister("rqa");
25242 +}
25243 +
25244 +module_init(kdbm_sched_init)
25245 +module_exit(kdbm_sched_exit)
25246 --- /dev/null
25247 +++ b/kdb/modules/kdbm_task.c
25248 @@ -0,0 +1,205 @@
25249 +/*
25250 + * This file is subject to the terms and conditions of the GNU General Public
25251 + * License. See the file "COPYING" in the main directory of this archive
25252 + * for more details.
25253 + *
25254 + * Copyright (c) 1999-2006 Silicon Graphics, Inc. All Rights Reserved.
25255 + */
25256 +
25257 +#include <linux/blkdev.h>
25258 +#include <linux/types.h>
25259 +#include <linux/kdb.h>
25260 +#include <linux/kdbprivate.h>
25261 +#include <linux/module.h>
25262 +#include <linux/init.h>
25263 +#include <linux/mm.h>
25264 +#include <linux/sched.h>
25265 +#include <asm/signal.h>
25266 +
25267 +MODULE_AUTHOR("SGI");
25268 +MODULE_DESCRIPTION("Debug struct task and sigset information");
25269 +MODULE_LICENSE("GPL");
25270 +
25271 +static char *
25272 +kdb_cpus_allowed_string(struct task_struct *tp)
25273 +{
25274 + static char maskbuf[NR_CPUS * 8];
25275 + if (cpus_equal(tp->cpus_allowed, cpu_online_map))
25276 + strcpy(maskbuf, "ALL");
25277 + else if (cpus_full(tp->cpus_allowed))
25278 + strcpy(maskbuf, "ALL(NR_CPUS)");
25279 + else if (cpus_empty(tp->cpus_allowed))
25280 + strcpy(maskbuf, "NONE");
25281 + else if (cpus_weight(tp->cpus_allowed) == 1)
25282 + snprintf(maskbuf, sizeof(maskbuf), "ONLY(%d)", first_cpu(tp->cpus_allowed));
25283 + else
25284 + cpulist_scnprintf(maskbuf, sizeof(maskbuf), tp->cpus_allowed);
25285 + return maskbuf;
25286 +}
25287 +
25288 +static int
25289 +kdbm_task(int argc, const char **argv)
25290 +{
25291 + unsigned long addr;
25292 + long offset=0;
25293 + int nextarg;
25294 + int e = 0;
25295 + struct task_struct *tp = NULL, *tp1;
25296 +
25297 + if (argc != 1)
25298 + return KDB_ARGCOUNT;
25299 +
25300 + nextarg = 1;
25301 + if ((e = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) != 0)
25302 + return(e);
25303 +
25304 + if (!(tp = kmalloc(sizeof(*tp), GFP_ATOMIC))) {
25305 + kdb_printf("%s: cannot kmalloc tp\n", __FUNCTION__);
25306 + goto out;
25307 + }
25308 + if ((e = kdb_getarea(*tp, addr))) {
25309 + kdb_printf("%s: invalid task address\n", __FUNCTION__);
25310 + goto out;
25311 + }
25312 +
25313 + tp1 = (struct task_struct *)addr;
25314 + kdb_printf(
25315 + "struct task at 0x%lx, pid=%d flags=0x%x state=%ld comm=\"%s\"\n",
25316 + addr, tp->pid, tp->flags, tp->state, tp->comm);
25317 +
25318 + kdb_printf(" cpu=%d policy=%u ", kdb_process_cpu(tp), tp->policy);
25319 + kdb_printf(
25320 + "prio=%d static_prio=%d cpus_allowed=",
25321 + tp->prio, tp->static_prio);
25322 + {
25323 + /* The cpus allowed string may be longer than kdb_printf() can
25324 + * handle. Print it in chunks.
25325 + */
25326 + char c, *p;
25327 + p = kdb_cpus_allowed_string(tp);
25328 + while (1) {
25329 + if (strlen(p) < 100) {
25330 + kdb_printf("%s", p);
25331 + break;
25332 + }
25333 + c = p[100];
25334 + p[100] = '\0';
25335 + kdb_printf("%s", p);
25336 + p[100] = c;
25337 + p += 100;
25338 + }
25339 + }
25340 + kdb_printf(" &thread=0x%p\n", &tp1->thread);
25341 +
25342 + kdb_printf(" need_resched=%d ",
25343 + test_tsk_thread_flag(tp, TIF_NEED_RESCHED));
25344 + kdb_printf(
25345 + "time_slice=%u",
25346 + tp->rt.time_slice);
25347 + kdb_printf(" lock_depth=%d\n", tp->lock_depth);
25348 +
25349 + kdb_printf(
25350 + " fs=0x%p files=0x%p mm=0x%p\n",
25351 + tp->fs, tp->files, tp->mm);
25352 +
25353 + kdb_printf(
25354 + " uid=%d euid=%d suid=%d fsuid=%d gid=%d egid=%d sgid=%d fsgid=%d\n",
25355 + tp->uid, tp->euid, tp->suid, tp->fsuid, tp->gid, tp->egid, tp->sgid, tp->fsgid);
25356 +
25357 + kdb_printf(
25358 + " user=0x%p\n",
25359 + tp->user);
25360 +
25361 + if (tp->sysvsem.undo_list)
25362 + kdb_printf(
25363 + " sysvsem.sem_undo refcnt %d list_proc=0x%p\n",
25364 + atomic_read(&tp->sysvsem.undo_list->refcnt),
25365 + &tp->sysvsem.undo_list->list_proc);
25366 +
25367 + kdb_printf(
25368 + " signal=0x%p &blocked=0x%p &pending=0x%p\n",
25369 + tp->signal, &tp1->blocked, &tp1->pending);
25370 +
25371 + kdb_printf(
25372 + " utime=%ld stime=%ld cutime=%ld cstime=%ld\n",
25373 + tp->utime, tp->stime,
25374 + tp->signal ? tp->signal->cutime : 0L,
25375 + tp->signal ? tp->signal->cstime : 0L);
25376 +
25377 + kdb_printf(" thread_info=0x%p\n", task_thread_info(tp));
25378 + kdb_printf(" ti flags=0x%lx\n", (unsigned long)task_thread_info(tp)->flags);
25379 +
25380 +#ifdef CONFIG_NUMA
25381 + kdb_printf(
25382 + " mempolicy=0x%p il_next=%d\n",
25383 + tp->mempolicy, tp->il_next);
25384 +#endif
25385 +
25386 +out:
25387 + if (tp)
25388 + kfree(tp);
25389 + return e;
25390 +}
25391 +
25392 +static int
25393 +kdbm_sigset(int argc, const char **argv)
25394 +{
25395 + sigset_t *sp = NULL;
25396 + unsigned long addr;
25397 + long offset=0;
25398 + int nextarg;
25399 + int e = 0;
25400 + int i;
25401 + char fmt[32];
25402 +
25403 + if (argc != 1)
25404 + return KDB_ARGCOUNT;
25405 +
25406 +#ifndef _NSIG_WORDS
25407 + kdb_printf("unavailable on this platform, _NSIG_WORDS not defined.\n");
25408 +#else
25409 + nextarg = 1;
25410 + if ((e = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) != 0)
25411 + return(e);
25412 +
25413 + if (!(sp = kmalloc(sizeof(*sp), GFP_ATOMIC))) {
25414 + kdb_printf("%s: cannot kmalloc sp\n", __FUNCTION__);
25415 + goto out;
25416 + }
25417 + if ((e = kdb_getarea(*sp, addr))) {
25418 + kdb_printf("%s: invalid sigset address\n", __FUNCTION__);
25419 + goto out;
25420 + }
25421 +
25422 + sprintf(fmt, "[%%d]=0x%%0%dlx ", (int)sizeof(sp->sig[0])*2);
25423 + kdb_printf("sigset at 0x%p : ", sp);
25424 + for (i=_NSIG_WORDS-1; i >= 0; i--) {
25425 + if (i == 0 || sp->sig[i]) {
25426 + kdb_printf(fmt, i, sp->sig[i]);
25427 + }
25428 + }
25429 + kdb_printf("\n");
25430 +#endif /* _NSIG_WORDS */
25431 +
25432 +out:
25433 + if (sp)
25434 + kfree(sp);
25435 + return e;
25436 +}
25437 +
25438 +static int __init kdbm_task_init(void)
25439 +{
25440 + kdb_register("task", kdbm_task, "<vaddr>", "Display task_struct", 0);
25441 + kdb_register("sigset", kdbm_sigset, "<vaddr>", "Display sigset_t", 0);
25442 +
25443 + return 0;
25444 +}
25445 +
25446 +static void __exit kdbm_task_exit(void)
25447 +{
25448 + kdb_unregister("task");
25449 + kdb_unregister("sigset");
25450 +}
25451 +
25452 +module_init(kdbm_task_init)
25453 +module_exit(kdbm_task_exit)
25454 --- /dev/null
25455 +++ b/kdb/modules/kdbm_vm.c
25456 @@ -0,0 +1,1036 @@
25457 +/*
25458 + * This file is subject to the terms and conditions of the GNU General Public
25459 + * License. See the file "COPYING" in the main directory of this archive
25460 + * for more details.
25461 + *
25462 + * Copyright (c) 1999-2006 Silicon Graphics, Inc. All Rights Reserved.
25463 + */
25464 +
25465 +#include <linux/blkdev.h>
25466 +#include <linux/types.h>
25467 +#include <linux/kdb.h>
25468 +#include <linux/kdbprivate.h>
25469 +#include <linux/module.h>
25470 +#include <linux/init.h>
25471 +#include <linux/mm.h>
25472 +#include <linux/swap.h>
25473 +#include <linux/swapops.h>
25474 +
25475 +#include <scsi.h>
25476 +#include <scsi/scsi_host.h>
25477 +#include <asm/pgtable.h>
25478 +
25479 +MODULE_AUTHOR("SGI");
25480 +MODULE_DESCRIPTION("Debug VM information");
25481 +MODULE_LICENSE("GPL");
25482 +
25483 +struct __vmflags {
25484 + unsigned long mask;
25485 + char *name;
25486 +};
25487 +
25488 +static struct __vmflags vmflags[] = {
25489 + { VM_READ, "VM_READ " },
25490 + { VM_WRITE, "VM_WRITE " },
25491 + { VM_EXEC, "VM_EXEC " },
25492 + { VM_SHARED, "VM_SHARED " },
25493 + { VM_MAYREAD, "VM_MAYREAD " },
25494 + { VM_MAYWRITE, "VM_MAYWRITE " },
25495 + { VM_MAYEXEC, "VM_MAYEXEC " },
25496 + { VM_MAYSHARE, "VM_MAYSHARE " },
25497 + { VM_GROWSDOWN, "VM_GROWSDOWN " },
25498 + { VM_GROWSUP, "VM_GROWSUP " },
25499 + { VM_PFNMAP, "VM_PFNMAP " },
25500 + { VM_DENYWRITE, "VM_DENYWRITE " },
25501 + { VM_EXECUTABLE, "VM_EXECUTABLE " },
25502 + { VM_LOCKED, "VM_LOCKED " },
25503 + { VM_IO, "VM_IO " },
25504 + { VM_SEQ_READ, "VM_SEQ_READ " },
25505 + { VM_RAND_READ, "VM_RAND_READ " },
25506 + { VM_DONTCOPY, "VM_DONTCOPY " },
25507 + { VM_DONTEXPAND, "VM_DONTEXPAND " },
25508 + { VM_RESERVED, "VM_RESERVED " },
25509 + { VM_ACCOUNT, "VM_ACCOUNT " },
25510 + { VM_HUGETLB, "VM_HUGETLB " },
25511 + { VM_NONLINEAR, "VM_NONLINEAR " },
25512 + { VM_MAPPED_COPY, "VM_MAPPED_COPY " },
25513 + { VM_INSERTPAGE, "VM_INSERTPAGE " },
25514 + { 0, "" }
25515 +};
25516 +
25517 +static int
25518 +kdbm_print_vm(struct vm_area_struct *vp, unsigned long addr, int verbose_flg)
25519 +{
25520 + struct __vmflags *tp;
25521 +
25522 + kdb_printf("struct vm_area_struct at 0x%lx for %d bytes\n",
25523 + addr, (int) sizeof (struct vm_area_struct));
25524 +
25525 + kdb_printf("vm_start = 0x%p vm_end = 0x%p\n", (void *) vp->vm_start,
25526 + (void *) vp->vm_end);
25527 + kdb_printf("vm_page_prot = 0x%llx\n",
25528 + (unsigned long long)pgprot_val(vp->vm_page_prot));
25529 +
25530 + kdb_printf("vm_flags: ");
25531 + for (tp = vmflags; tp->mask; tp++) {
25532 + if (vp->vm_flags & tp->mask) {
25533 + kdb_printf(" %s", tp->name);
25534 + }
25535 + }
25536 + kdb_printf("\n");
25537 +
25538 + if (!verbose_flg)
25539 + return 0;
25540 +
25541 + kdb_printf("vm_mm = 0x%p\n", (void *) vp->vm_mm);
25542 + kdb_printf("vm_next = 0x%p\n", (void *) vp->vm_next);
25543 + kdb_printf("shared.vm_set.list.next = 0x%p\n", (void *) vp->shared.vm_set.list.next);
25544 + kdb_printf("shared.vm_set.list.prev = 0x%p\n", (void *) vp->shared.vm_set.list.prev);
25545 + kdb_printf("shared.vm_set.parent = 0x%p\n", (void *) vp->shared.vm_set.parent);
25546 + kdb_printf("shared.vm_set.head = 0x%p\n", (void *) vp->shared.vm_set.head);
25547 + kdb_printf("anon_vma_node.next = 0x%p\n", (void *) vp->anon_vma_node.next);
25548 + kdb_printf("anon_vma_node.prev = 0x%p\n", (void *) vp->anon_vma_node.prev);
25549 + kdb_printf("vm_ops = 0x%p\n", (void *) vp->vm_ops);
25550 + if (vp->vm_ops != NULL) {
25551 + kdb_printf("vm_ops->open = 0x%p\n", vp->vm_ops->open);
25552 + kdb_printf("vm_ops->close = 0x%p\n", vp->vm_ops->close);
25553 + kdb_printf("vm_ops->fault = 0x%p\n", vp->vm_ops->fault);
25554 +#ifdef HAVE_VMOP_MPROTECT
25555 + kdb_printf("vm_ops->mprotect = 0x%p\n", vp->vm_ops->mprotect);
25556 +#endif
25557 +#ifdef CONFIG_NUMA
25558 + kdb_printf("vm_ops->set_policy = 0x%p\n", vp->vm_ops->set_policy);
25559 + kdb_printf("vm_ops->get_policy = 0x%p\n", vp->vm_ops->get_policy);
25560 +#endif
25561 + }
25562 + kdb_printf("vm_pgoff = 0x%lx\n", vp->vm_pgoff);
25563 + kdb_printf("vm_file = 0x%p\n", (void *) vp->vm_file);
25564 + kdb_printf("vm_private_data = 0x%p\n", vp->vm_private_data);
25565 +#ifdef CONFIG_NUMA
25566 + kdb_printf("vm_policy = 0x%p\n", vp->vm_policy);
25567 +#endif
25568 +
25569 + return 0;
25570 +}
25571 +
25572 +static int
25573 +kdbm_print_vmp(struct vm_area_struct *vp, int verbose_flg)
25574 +{
25575 + struct __vmflags *tp;
25576 +
25577 + if (verbose_flg) {
25578 + kdb_printf("0x%lx: ", (unsigned long) vp);
25579 + }
25580 +
25581 + kdb_printf("0x%p 0x%p ", (void *) vp->vm_start, (void *) vp->vm_end);
25582 +
25583 + for (tp = vmflags; tp->mask; tp++) {
25584 + if (vp->vm_flags & tp->mask) {
25585 + kdb_printf(" %s", tp->name);
25586 + }
25587 + }
25588 + kdb_printf("\n");
25589 +
25590 + return 0;
25591 +}
25592 +
25593 +
25594 +#ifdef CONFIG_NUMA
25595 +#include <linux/mempolicy.h>
25596 +
25597 +/*
25598 + * kdbm_mpol
25599 + *
25600 + * This function implements the 'mempolicy' command.
25601 + * Print a struct mempolicy.
25602 + *
25603 + * mempolicy <address> Print struct mempolicy at <address>
25604 + */
25605 +static int
25606 +kdbm_mpol(int argc, const char **argv)
25607 +{
25608 + unsigned long addr;
25609 + long offset = 0;
25610 + int nextarg;
25611 + int err = 0;
25612 + struct mempolicy *mp = NULL;
25613 +
25614 + if (argc != 1)
25615 + return KDB_ARGCOUNT;
25616 +
25617 + nextarg = 1;
25618 + if ((err = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset,
25619 + NULL)) != 0)
25620 + return(err);
25621 +
25622 + if (!(mp = kmalloc(sizeof(*mp), GFP_ATOMIC))) {
25623 + kdb_printf("%s: cannot kmalloc mp\n", __FUNCTION__);
25624 + goto out;
25625 + }
25626 +
25627 + if ((err = kdb_getarea(*mp, addr))) {
25628 + kdb_printf("%s: invalid mempolicy address\n", __FUNCTION__);
25629 + goto out;
25630 + }
25631 +
25632 + kdb_printf("struct mempolicy at 0x%p\n", (struct mempolicy *)addr);
25633 + kdb_printf(" refcnt %d\n", atomic_read(&mp->refcnt));
25634 +
25635 + switch (mp->mode) {
25636 + case MPOL_DEFAULT:
25637 + kdb_printf(" mode %d (MPOL_DEFAULT)\n", mp->mode);
25638 + break;
25639 +
25640 + case MPOL_PREFERRED:
25641 + kdb_printf(" mode %d (MPOL_PREFERRED)\n", mp->mode);
25642 + kdb_printf(" preferred_node %d\n", mp->v.preferred_node);
25643 + break;
25644 +
25645 + case MPOL_BIND:
25646 + case MPOL_INTERLEAVE:
25647 + {
25648 + int i, nlongs;
25649 + unsigned long *longp;
25650 +
25651 + kdb_printf(" mode %d (%s)\n", mp->mode,
25652 + mp->mode == MPOL_INTERLEAVE
25653 + ? "MPOL_INTERLEAVE"
25654 + : "MPOL_BIND");
25655 + nlongs = (int)BITS_TO_LONGS(MAX_NUMNODES);
25656 + kdb_printf(" nodes:");
25657 + longp = mp->v.nodes.bits;
25658 + for (i = 0; i < nlongs; i++, longp++)
25659 + kdb_printf(" 0x%lx ", *longp);
25660 + kdb_printf("\n");
25661 + break;
25662 + }
25663 +
25664 + default:
25665 + kdb_printf(" mode %d (unknown)\n", mp->mode);
25666 + break;
25667 + }
25668 +out:
25669 + if (mp)
25670 + kfree(mp);
25671 + return err;
25672 +}
25673 +
25674 +#endif /* CONFIG_NUMA */
25675 +
25676 +/*
25677 + * kdbm_pgdat
25678 + *
25679 + * This function implements the 'pgdat' command.
25680 + * Print a struct pglist_data (pg_dat_t).
25681 + *
25682 + * pgdat <node_id> Print struct pglist_data for node <node_id>.
25683 + *
25684 + * Print pglist_data for node 0 if node_id not specified,
25685 + * or print the one pglist_data structure if !CONFIG_NUMA.
25686 + */
25687 +static int
25688 +kdbm_pgdat(int argc, const char **argv)
25689 +{
25690 + int err = 0, node_id = 0, i;
25691 + pg_data_t *pgdatp = NULL;
25692 +
25693 +#ifdef CONFIG_NUMA
25694 + if (argc > 1)
25695 + return KDB_ARGCOUNT;
25696 + if (argc == 1) {
25697 + int nextarg;
25698 + long offset = 0;
25699 + unsigned long node_id_ul;
25700 +
25701 + nextarg = 1;
25702 + if ((err = kdbgetaddrarg(argc, argv, &nextarg, &node_id_ul,
25703 + &offset, NULL)) != 0) {
25704 + return(err);
25705 + }
25706 + node_id = (int)node_id_ul;
25707 + }
25708 +#endif
25709 + for_each_online_pgdat(pgdatp) {
25710 + if (pgdatp->node_id == node_id)
25711 + break;
25712 + }
25713 + if (!pgdatp) {
25714 + kdb_printf("%s: specified node not found\n", __FUNCTION__);
25715 + return 0;
25716 + }
25717 + kdb_printf("struct pglist_data at 0x%p node_id = %d\n",
25718 + pgdatp, pgdatp->node_id);
25719 +
25720 + for (i = 0; i < MAX_ZONELISTS; i++) {
25721 + int zr;
25722 + struct zoneref *zonerefp;
25723 + struct zone *zonep;
25724 +
25725 + zonerefp = pgdatp->node_zonelists[i]._zonerefs;
25726 + kdb_printf(" _zonerefs[%d] at 0x%p\n", i, zonerefp);
25727 +
25728 + for (zr = 0; zr <= MAX_ZONES_PER_ZONELIST; zr++, zonerefp++) {
25729 + int z;
25730 + pg_data_t *tmp_pgdatp;
25731 +
25732 + zonep = zonelist_zone(zonerefp);
25733 + if (!zonep)
25734 + break;
25735 +
25736 + kdb_printf(" 0x%p", zonep);
25737 +
25738 + for_each_online_pgdat(tmp_pgdatp) {
25739 + for (z = 0; z < MAX_NR_ZONES; z++) {
25740 + if (zonep == &tmp_pgdatp->node_zones[z]) {
25741 + kdb_printf (" (node %d node_zones[%d])",
25742 + tmp_pgdatp->node_id, z);
25743 + break;
25744 + }
25745 + }
25746 + if (z != MAX_NR_ZONES)
25747 + break; /* found it */
25748 + }
25749 + kdb_printf("\n");
25750 + }
25751 + }
25752 +
25753 + kdb_printf(" nr_zones = %d", pgdatp->nr_zones);
25754 +#ifdef CONFIG_FLAT_NODE_MEM_MAP
25755 + kdb_printf(" node_mem_map = 0x%p\n", pgdatp->node_mem_map);
25756 +#endif
25757 + kdb_printf(" bdata = 0x%p", pgdatp->bdata);
25758 + kdb_printf(" node_start_pfn = 0x%lx\n", pgdatp->node_start_pfn);
25759 + kdb_printf(" node_present_pages = %ld (0x%lx)\n",
25760 + pgdatp->node_present_pages, pgdatp->node_present_pages);
25761 + kdb_printf(" node_spanned_pages = %ld (0x%lx)\n",
25762 + pgdatp->node_spanned_pages, pgdatp->node_spanned_pages);
25763 + kdb_printf(" kswapd = 0x%p\n", pgdatp->kswapd);
25764 +
25765 + return err;
25766 +}
25767 +
25768 +/*
25769 + * kdbm_vm
25770 + *
25771 + * This function implements the 'vm' command. Print a vm_area_struct.
25772 + *
25773 + * vm [-v] <address> Print vm_area_struct at <address>
25774 + * vmp [-v] <pid> Print all vm_area_structs for <pid>
25775 + */
25776 +
25777 +static int
25778 +kdbm_vm(int argc, const char **argv)
25779 +{
25780 + unsigned long addr;
25781 + long offset = 0;
25782 + int nextarg;
25783 + int diag;
25784 + int verbose_flg = 0;
25785 +
25786 + if (argc == 2) {
25787 + if (strcmp(argv[1], "-v") != 0) {
25788 + return KDB_ARGCOUNT;
25789 + }
25790 + verbose_flg = 1;
25791 + } else if (argc != 1) {
25792 + return KDB_ARGCOUNT;
25793 + }
25794 +
25795 + if (strcmp(argv[0], "vmp") == 0) {
25796 + struct task_struct *g, *tp;
25797 + struct vm_area_struct *vp;
25798 + pid_t pid;
25799 +
25800 + if ((diag = kdbgetularg(argv[argc], (unsigned long *) &pid)))
25801 + return diag;
25802 +
25803 + kdb_do_each_thread(g, tp) {
25804 + if (tp->pid == pid) {
25805 + if (tp->mm != NULL) {
25806 + if (verbose_flg)
25807 + kdb_printf
25808 + ("vm_area_struct ");
25809 + kdb_printf
25810 + ("vm_start vm_end vm_flags\n");
25811 + vp = tp->mm->mmap;
25812 + while (vp != NULL) {
25813 + kdbm_print_vmp(vp, verbose_flg);
25814 + vp = vp->vm_next;
25815 + }
25816 + }
25817 + return 0;
25818 + }
25819 + } kdb_while_each_thread(g, tp);
25820 +
25821 + kdb_printf("No process with pid == %d found\n", pid);
25822 +
25823 + } else {
25824 + struct vm_area_struct v;
25825 +
25826 + nextarg = argc;
25827 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset,
25828 + NULL))
25829 + || (diag = kdb_getarea(v, addr)))
25830 + return (diag);
25831 +
25832 + kdbm_print_vm(&v, addr, verbose_flg);
25833 + }
25834 +
25835 + return 0;
25836 +}
25837 +
25838 +static int
25839 +kdbm_print_pte(pte_t * pte)
25840 +{
25841 + kdb_printf("0x%lx (", (unsigned long) pte_val(*pte));
25842 +
25843 + if (pte_present(*pte)) {
25844 +#ifdef pte_exec
25845 + if (pte_exec(*pte))
25846 + kdb_printf("X");
25847 +#endif
25848 + if (pte_write(*pte))
25849 + kdb_printf("W");
25850 +#ifdef pte_read
25851 + if (pte_read(*pte))
25852 + kdb_printf("R");
25853 +#endif
25854 + if (pte_young(*pte))
25855 + kdb_printf("A");
25856 + if (pte_dirty(*pte))
25857 + kdb_printf("D");
25858 +
25859 + } else {
25860 + kdb_printf("OFFSET=0x%lx ", swp_offset(pte_to_swp_entry(*pte)));
25861 + kdb_printf("TYPE=0x%ulx", swp_type(pte_to_swp_entry(*pte)));
25862 + }
25863 +
25864 + kdb_printf(")");
25865 +
25866 + /* final newline is output by caller of kdbm_print_pte() */
25867 +
25868 + return 0;
25869 +}
25870 +
25871 +/*
25872 + * kdbm_pte
25873 + *
25874 + * This function implements the 'pte' command. Print all pte_t structures
25875 + * that map to the given virtual address range (<address> through <address>
25876 + * plus <nbytes>) for the given process. The default value for nbytes is
25877 + * one.
25878 + *
25879 + * pte -m <mm> <address> [<nbytes>] Print all pte_t structures for
25880 + * virtual <address> in address space
25881 + * of <mm> which is a pointer to a
25882 + * mm_struct
25883 + * pte -p <pid> <address> [<nbytes>] Print all pte_t structures for
25884 + * virtual <address> in address space
25885 + * of <pid>
25886 + */
25887 +
25888 +static int
25889 +kdbm_pte(int argc, const char **argv)
25890 +{
25891 + unsigned long addr;
25892 + long offset = 0;
25893 + int nextarg;
25894 + unsigned long nbytes = 1;
25895 + long npgs;
25896 + int diag;
25897 + int found;
25898 + pid_t pid;
25899 + struct task_struct *tp;
25900 + struct mm_struct *mm, copy_of_mm;
25901 + pgd_t *pgd;
25902 + pud_t *pud;
25903 + pmd_t *pmd;
25904 + pte_t *pte;
25905 +
25906 + if (argc < 3 || argc > 4) {
25907 + return KDB_ARGCOUNT;
25908 + }
25909 +
25910 + if (strcmp(argv[1], "-p") == 0) {
25911 + if ((diag = kdbgetularg(argv[2], (unsigned long *) &pid))) {
25912 + return diag;
25913 + }
25914 +
25915 + found = 0;
25916 + for_each_process(tp) {
25917 + if (tp->pid == pid) {
25918 + if (tp->mm != NULL) {
25919 + found = 1;
25920 + break;
25921 + }
25922 + kdb_printf("task structure's mm field is NULL\n");
25923 + return 0;
25924 + }
25925 + }
25926 +
25927 + if (!found) {
25928 + kdb_printf("No process with pid == %d found\n", pid);
25929 + return 0;
25930 + }
25931 + mm = tp->mm;
25932 + } else if (strcmp(argv[1], "-m") == 0) {
25933 +
25934 +
25935 + nextarg = 2;
25936 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset,
25937 + NULL))
25938 + || (diag = kdb_getarea(copy_of_mm, addr)))
25939 + return (diag);
25940 + mm = &copy_of_mm;
25941 + } else {
25942 + return KDB_ARGCOUNT;
25943 + }
25944 +
25945 + if ((diag = kdbgetularg(argv[3], &addr))) {
25946 + return diag;
25947 + }
25948 +
25949 + if (argc == 4) {
25950 + if ((diag = kdbgetularg(argv[4], &nbytes))) {
25951 + return diag;
25952 + }
25953 + }
25954 +
25955 + kdb_printf("vaddr pte\n");
25956 +
25957 + npgs = ((((addr & ~PAGE_MASK) + nbytes) + ~PAGE_MASK) >> PAGE_SHIFT);
25958 + while (npgs-- > 0) {
25959 +
25960 + kdb_printf("0x%p ", (void *) (addr & PAGE_MASK));
25961 +
25962 + pgd = pgd_offset(mm, addr);
25963 + if (pgd_present(*pgd)) {
25964 + pud = pud_offset(pgd, addr);
25965 + if (pud_present(*pud)) {
25966 + pmd = pmd_offset(pud, addr);
25967 + if (pmd_present(*pmd)) {
25968 + pte = pte_offset_map(pmd, addr);
25969 + if (pte_present(*pte)) {
25970 + kdbm_print_pte(pte);
25971 + }
25972 + }
25973 + }
25974 + }
25975 +
25976 + kdb_printf("\n");
25977 + addr += PAGE_SIZE;
25978 + }
25979 +
25980 + return 0;
25981 +}
25982 +
25983 +/*
25984 + * kdbm_rpte
25985 + *
25986 + * This function implements the 'rpte' command. Print all pte_t structures
25987 + * that contain the given physical page range (<pfn> through <pfn>
25988 + * plus <npages>) for the given process. The default value for npages is
25989 + * one.
25990 + *
25991 + * rpte -m <mm> <pfn> [<npages>] Print all pte_t structures for
25992 + * physical page <pfn> in address space
25993 + * of <mm> which is a pointer to a
25994 + * mm_struct
25995 + * rpte -p <pid> <pfn> [<npages>] Print all pte_t structures for
25996 + * physical page <pfn> in address space
25997 + * of <pid>
25998 + */
25999 +
26000 +static int
26001 +kdbm_rpte(int argc, const char **argv)
26002 +{
26003 + unsigned long addr;
26004 + unsigned long pfn;
26005 + long offset = 0;
26006 + int nextarg;
26007 + unsigned long npages = 1;
26008 + int diag;
26009 + int found;
26010 + pid_t pid;
26011 + struct task_struct *tp;
26012 + struct mm_struct *mm, copy_of_mm;
26013 + pgd_t *pgd;
26014 + pud_t *pud;
26015 + pmd_t *pmd;
26016 + pte_t *pte;
26017 + unsigned long g, u, m, t;
26018 +
26019 + if (argc < 3 || argc > 4) {
26020 + return KDB_ARGCOUNT;
26021 + }
26022 +
26023 + if (strcmp(argv[1], "-p") == 0) {
26024 + if ((diag = kdbgetularg(argv[2], (unsigned long *) &pid))) {
26025 + return diag;
26026 + }
26027 +
26028 + found = 0;
26029 + for_each_process(tp) {
26030 + if (tp->pid == pid) {
26031 + if (tp->mm != NULL) {
26032 + found = 1;
26033 + break;
26034 + }
26035 + kdb_printf("task structure's mm field is NULL\n");
26036 + return 0;
26037 + }
26038 + }
26039 +
26040 + if (!found) {
26041 + kdb_printf("No process with pid == %d found\n", pid);
26042 + return 0;
26043 + }
26044 + mm = tp->mm;
26045 + } else if (strcmp(argv[1], "-m") == 0) {
26046 +
26047 +
26048 + nextarg = 2;
26049 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset,
26050 + NULL))
26051 + || (diag = kdb_getarea(copy_of_mm, addr)))
26052 + return (diag);
26053 + mm = &copy_of_mm;
26054 + } else {
26055 + return KDB_ARGCOUNT;
26056 + }
26057 +
26058 + if ((diag = kdbgetularg(argv[3], &pfn))) {
26059 + return diag;
26060 + }
26061 +
26062 + if (argc == 4) {
26063 + if ((diag = kdbgetularg(argv[4], &npages))) {
26064 + return diag;
26065 + }
26066 + }
26067 +
26068 + /* spaces after vaddr depends on sizeof(unsigned long) */
26069 + kdb_printf("pfn vaddr%*s pte\n",
26070 + (int)(2*sizeof(unsigned long) + 2 - 5), " ");
26071 +
26072 + for (g = 0, pgd = pgd_offset(mm, 0UL); g < PTRS_PER_PGD; ++g, ++pgd) {
26073 + if (pgd_none(*pgd) || pgd_bad(*pgd))
26074 + continue;
26075 + for (u = 0, pud = pud_offset(pgd, 0UL); u < PTRS_PER_PUD; ++u, ++pud) {
26076 + if (pud_none(*pud) || pud_bad(*pud))
26077 + continue;
26078 + for (m = 0, pmd = pmd_offset(pud, 0UL); m < PTRS_PER_PMD; ++m, ++pmd) {
26079 + if (pmd_none(*pmd) || pmd_bad(*pmd))
26080 + continue;
26081 + for (t = 0, pte = pte_offset_map(pmd, 0UL); t < PTRS_PER_PTE; ++t, ++pte) {
26082 + if (pte_none(*pte))
26083 + continue;
26084 + if (pte_pfn(*pte) < pfn || pte_pfn(*pte) >= (pfn + npages))
26085 + continue;
26086 + addr = g << PGDIR_SHIFT;
26087 +#ifdef __ia64__
26088 + /* IA64 plays tricks with the pgd mapping to save space.
26089 + * This reverses pgd_index().
26090 + */
26091 + {
26092 + unsigned long region = g >> (PAGE_SHIFT - 6);
26093 + unsigned long l1index = g - (region << (PAGE_SHIFT - 6));
26094 + addr = (region << 61) + (l1index << PGDIR_SHIFT);
26095 + }
26096 +#endif
26097 + addr += (m << PMD_SHIFT) + (t << PAGE_SHIFT);
26098 + kdb_printf("0x%-14lx " kdb_bfd_vma_fmt0 " ",
26099 + pte_pfn(*pte), addr);
26100 + kdbm_print_pte(pte);
26101 + kdb_printf("\n");
26102 + }
26103 + }
26104 + }
26105 + }
26106 +
26107 + return 0;
26108 +}
26109 +
26110 +static int
26111 +kdbm_print_dentry(unsigned long daddr)
26112 +{
26113 + struct dentry d;
26114 + int diag;
26115 + char buf[256];
26116 +
26117 + kdb_printf("Dentry at 0x%lx\n", daddr);
26118 + if ((diag = kdb_getarea(d, (unsigned long)daddr)))
26119 + return diag;
26120 +
26121 + if ((d.d_name.len > sizeof(buf)) || (diag = kdb_getarea_size(buf, (unsigned long)(d.d_name.name), d.d_name.len)))
26122 + kdb_printf(" d_name.len = %d d_name.name = 0x%p\n",
26123 + d.d_name.len, d.d_name.name);
26124 + else
26125 + kdb_printf(" d_name.len = %d d_name.name = 0x%p <%.*s>\n",
26126 + d.d_name.len, d.d_name.name,
26127 + (int)(d.d_name.len), d.d_name.name);
26128 +
26129 + kdb_printf(" d_count = %d d_flags = 0x%x d_inode = 0x%p\n",
26130 + atomic_read(&d.d_count), d.d_flags, d.d_inode);
26131 +
26132 + kdb_printf(" d_parent = 0x%p\n", d.d_parent);
26133 +
26134 + kdb_printf(" d_hash.nxt = 0x%p d_hash.prv = 0x%p\n",
26135 + d.d_hash.next, d.d_hash.pprev);
26136 +
26137 + kdb_printf(" d_lru.nxt = 0x%p d_lru.prv = 0x%p\n",
26138 + d.d_lru.next, d.d_lru.prev);
26139 +
26140 + kdb_printf(" d_child.nxt = 0x%p d_child.prv = 0x%p\n",
26141 + d.d_u.d_child.next, d.d_u.d_child.prev);
26142 +
26143 + kdb_printf(" d_subdirs.nxt = 0x%p d_subdirs.prv = 0x%p\n",
26144 + d.d_subdirs.next, d.d_subdirs.prev);
26145 +
26146 + kdb_printf(" d_alias.nxt = 0x%p d_alias.prv = 0x%p\n",
26147 + d.d_alias.next, d.d_alias.prev);
26148 +
26149 + kdb_printf(" d_op = 0x%p d_sb = 0x%p d_fsdata = 0x%p\n",
26150 + d.d_op, d.d_sb, d.d_fsdata);
26151 +
26152 + kdb_printf(" d_iname = %s\n",
26153 + d.d_iname);
26154 +
26155 + if (d.d_inode) {
26156 + struct inode i;
26157 + kdb_printf("\nInode Entry at 0x%p\n", d.d_inode);
26158 + if ((diag = kdb_getarea(i, (unsigned long)d.d_inode)))
26159 + return diag;
26160 + kdb_printf(" i_mode = 0%o i_nlink = %d i_rdev = 0x%x\n",
26161 + i.i_mode, i.i_nlink, i.i_rdev);
26162 +
26163 + kdb_printf(" i_ino = %ld i_count = %d\n",
26164 + i.i_ino, atomic_read(&i.i_count));
26165 +
26166 + kdb_printf(" i_hash.nxt = 0x%p i_hash.prv = 0x%p\n",
26167 + i.i_hash.next, i.i_hash.pprev);
26168 +
26169 + kdb_printf(" i_list.nxt = 0x%p i_list.prv = 0x%p\n",
26170 + i.i_list.next, i.i_list.prev);
26171 +
26172 + kdb_printf(" i_dentry.nxt = 0x%p i_dentry.prv = 0x%p\n",
26173 + i.i_dentry.next, i.i_dentry.prev);
26174 +
26175 + }
26176 + kdb_printf("\n");
26177 + return 0;
26178 +}
26179 +
26180 +static int
26181 +kdbm_filp(int argc, const char **argv)
26182 +{
26183 + struct file f;
26184 + int nextarg;
26185 + unsigned long addr;
26186 + long offset;
26187 + int diag;
26188 +
26189 + if (argc != 1)
26190 + return KDB_ARGCOUNT;
26191 +
26192 + nextarg = 1;
26193 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
26194 + (diag = kdb_getarea(f, addr)))
26195 + return diag;
26196 +
26197 + kdb_printf("File Pointer at 0x%lx\n", addr);
26198 +
26199 + kdb_printf(" fu_list.nxt = 0x%p fu_list.prv = 0x%p\n",
26200 + f.f_u.fu_list.next, f.f_u.fu_list.prev);
26201 +
26202 + kdb_printf(" f_dentry = 0x%p f_vfsmnt = 0x%p f_op = 0x%p\n",
26203 + f.f_dentry, f.f_vfsmnt, f.f_op);
26204 +
26205 + kdb_printf(" f_count = %lld f_flags = 0x%x f_mode = 0x%x\n",
26206 + atomic_read(&f.f_count), f.f_flags, f.f_mode);
26207 +
26208 + kdb_printf(" f_pos = %Ld\n", f.f_pos);
26209 +#ifdef CONFIG_SECURITY
26210 + kdb_printf(" security = 0x%p\n", f.f_security);
26211 +#endif
26212 +
26213 + kdb_printf(" private_data = 0x%p f_mapping = 0x%p\n\n",
26214 + f.private_data, f.f_mapping);
26215 +
26216 + return kdbm_print_dentry((unsigned long)f.f_dentry);
26217 +}
26218 +
26219 +static int
26220 +kdbm_fl(int argc, const char **argv)
26221 +{
26222 + struct file_lock fl;
26223 + int nextarg;
26224 + unsigned long addr;
26225 + long offset;
26226 + int diag;
26227 +
26228 +
26229 + if (argc != 1)
26230 + return KDB_ARGCOUNT;
26231 +
26232 + nextarg = 1;
26233 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
26234 + (diag = kdb_getarea(fl, addr)))
26235 + return diag;
26236 +
26237 + kdb_printf("File_lock at 0x%lx\n", addr);
26238 +
26239 + kdb_printf(" fl_next = 0x%p fl_link.nxt = 0x%p fl_link.prv = 0x%p\n",
26240 + fl.fl_next, fl.fl_link.next, fl.fl_link.prev);
26241 + kdb_printf(" fl_block.nxt = 0x%p fl_block.prv = 0x%p\n",
26242 + fl.fl_block.next, fl.fl_block.prev);
26243 + kdb_printf(" fl_owner = 0x%p fl_pid = %d fl_wait = 0x%p\n",
26244 + fl.fl_owner, fl.fl_pid, &fl.fl_wait);
26245 + kdb_printf(" fl_file = 0x%p fl_flags = 0x%x\n",
26246 + fl.fl_file, fl.fl_flags);
26247 + kdb_printf(" fl_type = %d fl_start = 0x%llx fl_end = 0x%llx\n",
26248 + fl.fl_type, fl.fl_start, fl.fl_end);
26249 +
26250 + kdb_printf(" file_lock_operations");
26251 + if (fl.fl_ops)
26252 + kdb_printf("\n fl_copy_lock = 0x%p fl_release_private = 0x%p\n",
26253 + fl.fl_ops->fl_copy_lock, fl.fl_ops->fl_release_private);
26254 + else
26255 + kdb_printf(" empty\n");
26256 +
26257 + kdb_printf(" lock_manager_operations");
26258 + if (fl.fl_lmops)
26259 + kdb_printf("\n fl_compare_owner = 0x%p fl_notify = 0x%p\n",
26260 + fl.fl_lmops->fl_compare_owner, fl.fl_lmops->fl_notify);
26261 + else
26262 + kdb_printf(" empty\n");
26263 +
26264 + kdb_printf(" fl_fasync = 0x%p fl_break 0x%lx\n",
26265 + fl.fl_fasync, fl.fl_break_time);
26266 +
26267 + return 0;
26268 +}
26269 +
26270 +
26271 +static int
26272 +kdbm_dentry(int argc, const char **argv)
26273 +{
26274 + int nextarg;
26275 + unsigned long addr;
26276 + long offset;
26277 + int diag;
26278 +
26279 + if (argc != 1)
26280 + return KDB_ARGCOUNT;
26281 +
26282 + nextarg = 1;
26283 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
26284 + return diag;
26285 +
26286 + return kdbm_print_dentry(addr);
26287 +}
26288 +
26289 +static int
26290 +kdbm_kobject(int argc, const char **argv)
26291 +{
26292 + struct kobject k;
26293 + int nextarg;
26294 + unsigned long addr;
26295 + long offset;
26296 + int diag;
26297 +
26298 + if (argc != 1)
26299 + return KDB_ARGCOUNT;
26300 +
26301 + nextarg = 1;
26302 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
26303 + (diag = kdb_getarea(k, addr)))
26304 + return diag;
26305 +
26306 +
26307 + kdb_printf("kobject at 0x%lx\n", addr);
26308 +
26309 + if (k.name) {
26310 + char c;
26311 + kdb_printf(" name 0x%p", k.name);
26312 + if (kdb_getarea(c, (unsigned long)k.name) == 0)
26313 + kdb_printf(" '%s'", k.name);
26314 + kdb_printf("\n");
26315 + }
26316 +
26317 + if (k.name != kobject_name((struct kobject *)addr))
26318 + kdb_printf(" name '%.20s'\n", k.name);
26319 +
26320 + kdb_printf(" kref.refcount %d'\n", atomic_read(&k.kref.refcount));
26321 +
26322 + kdb_printf(" entry.next = 0x%p entry.prev = 0x%p\n",
26323 + k.entry.next, k.entry.prev);
26324 +
26325 + kdb_printf(" parent = 0x%p kset = 0x%p ktype = 0x%p sd = 0x%p\n",
26326 + k.parent, k.kset, k.ktype, k.sd);
26327 +
26328 + return 0;
26329 +}
26330 +
26331 +static int
26332 +kdbm_sh(int argc, const char **argv)
26333 +{
26334 + int diag;
26335 + int nextarg;
26336 + unsigned long addr;
26337 + long offset = 0L;
26338 + struct Scsi_Host sh;
26339 +
26340 + if (argc != 1)
26341 + return KDB_ARGCOUNT;
26342 +
26343 + nextarg = 1;
26344 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)) ||
26345 + (diag = kdb_getarea(sh, addr)))
26346 + return diag;
26347 +
26348 + kdb_printf("Scsi_Host at 0x%lx\n", addr);
26349 + kdb_printf("host_queue = 0x%p\n", sh.__devices.next);
26350 + kdb_printf("ehandler = 0x%p eh_action = 0x%p\n",
26351 + sh.ehandler, sh.eh_action);
26352 + kdb_printf("host_wait = 0x%p hostt = 0x%p\n",
26353 + &sh.host_wait, sh.hostt);
26354 + kdb_printf("host_failed = %d host_no = %d resetting = %d\n",
26355 + sh.host_failed, sh.host_no, sh.resetting);
26356 + kdb_printf("max id/lun/channel = [%d/%d/%d] this_id = %d\n",
26357 + sh.max_id, sh.max_lun, sh.max_channel, sh.this_id);
26358 + kdb_printf("can_queue = %d cmd_per_lun = %d sg_tablesize = %d u_isa_dma = %d\n",
26359 + sh.can_queue, sh.cmd_per_lun, sh.sg_tablesize, sh.unchecked_isa_dma);
26360 + kdb_printf("host_blocked = %d reverse_ordering = %d \n",
26361 + sh.host_blocked, sh.reverse_ordering);
26362 +
26363 + return 0;
26364 +}
26365 +
26366 +static int
26367 +kdbm_sd(int argc, const char **argv)
26368 +{
26369 + int diag;
26370 + int nextarg;
26371 + unsigned long addr;
26372 + long offset = 0L;
26373 + struct scsi_device *sd = NULL;
26374 +
26375 + if (argc != 1)
26376 + return KDB_ARGCOUNT;
26377 +
26378 + nextarg = 1;
26379 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
26380 + goto out;
26381 + if (!(sd = kmalloc(sizeof(*sd), GFP_ATOMIC))) {
26382 + kdb_printf("kdbm_sd: cannot kmalloc sd\n");
26383 + goto out;
26384 + }
26385 + if ((diag = kdb_getarea(*sd, addr)))
26386 + goto out;
26387 +
26388 + kdb_printf("scsi_device at 0x%lx\n", addr);
26389 + kdb_printf("next = 0x%p prev = 0x%p host = 0x%p\n",
26390 + sd->siblings.next, sd->siblings.prev, sd->host);
26391 + kdb_printf("device_busy = %d current_cmnd 0x%p\n",
26392 + sd->device_busy, sd->current_cmnd);
26393 + kdb_printf("id/lun/chan = [%d/%d/%d] single_lun = %d device_blocked = %d\n",
26394 + sd->id, sd->lun, sd->channel, sd->sdev_target->single_lun, sd->device_blocked);
26395 + kdb_printf("queue_depth = %d current_tag = %d scsi_level = %d\n",
26396 + sd->queue_depth, sd->current_tag, sd->scsi_level);
26397 + kdb_printf("%8.8s %16.16s %4.4s\n", sd->vendor, sd->model, sd->rev);
26398 +out:
26399 + if (sd)
26400 + kfree(sd);
26401 + return diag;
26402 +}
26403 +
26404 +static int
26405 +kdbm_sc(int argc, const char **argv)
26406 +{
26407 + int diag;
26408 + int nextarg;
26409 + unsigned long addr;
26410 + long offset = 0L;
26411 + struct scsi_cmnd *sc = NULL;
26412 +
26413 + if (argc != 1)
26414 + return KDB_ARGCOUNT;
26415 +
26416 + nextarg = 1;
26417 + if ((diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL)))
26418 + goto out;
26419 + if (!(sc = kmalloc(sizeof(*sc), GFP_ATOMIC))) {
26420 + kdb_printf("kdbm_sc: cannot kmalloc sc\n");
26421 + goto out;
26422 + }
26423 + if ((diag = kdb_getarea(*sc, addr)))
26424 + goto out;
26425 +
26426 + kdb_printf("scsi_cmnd at 0x%lx\n", addr);
26427 + kdb_printf("device = 0x%p next = 0x%p\n",
26428 + sc->device, sc->list.next);
26429 + kdb_printf("serial_number = %ld retries = %d\n",
26430 + sc->serial_number, sc->retries);
26431 + kdb_printf("cmd_len = %d\n", sc->cmd_len);
26432 + kdb_printf("cmnd = [%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x/%2.2x]\n",
26433 + sc->cmnd[0], sc->cmnd[1], sc->cmnd[2], sc->cmnd[3], sc->cmnd[4],
26434 + sc->cmnd[5], sc->cmnd[6], sc->cmnd[7], sc->cmnd[8], sc->cmnd[9],
26435 + sc->cmnd[10], sc->cmnd[11]);
26436 + kdb_printf("request_buffer = 0x%p request_bufflen = %d\n",
26437 + scsi_sglist(sc), scsi_bufflen(sc));
26438 + kdb_printf("use_sg = %d\n", scsi_sg_count(sc));
26439 + kdb_printf("underflow = %d transfersize = %d\n",
26440 + sc->underflow, sc->transfersize);
26441 + kdb_printf("tag = %d\n", sc->tag);
26442 +
26443 +out:
26444 + if (sc)
26445 + kfree(sc);
26446 + return diag;
26447 +}
26448 +
26449 +static int __init kdbm_vm_init(void)
26450 +{
26451 + kdb_register("vm", kdbm_vm, "[-v] <vaddr>", "Display vm_area_struct", 0);
26452 + kdb_register("vmp", kdbm_vm, "[-v] <pid>", "Display all vm_area_struct for <pid>", 0);
26453 +#ifdef CONFIG_NUMA
26454 + kdb_register("mempolicy", kdbm_mpol, "<vaddr>", "Display mempolicy structure", 0);
26455 + kdb_register("pgdat", kdbm_pgdat, "<node_id>", "Display pglist_data node structure", 0);
26456 +#else
26457 + kdb_register("pgdat", kdbm_pgdat, "", "Display pglist_data node structure", 0);
26458 +#endif
26459 + kdb_register("pte", kdbm_pte, "( -m <mm> | -p <pid> ) <vaddr> [<nbytes>]", "Display pte_t for mm_struct or pid", 0);
26460 + kdb_register("rpte", kdbm_rpte, "( -m <mm> | -p <pid> ) <pfn> [<npages>]", "Find pte_t containing pfn for mm_struct or pid", 0);
26461 + kdb_register("dentry", kdbm_dentry, "<dentry>", "Display interesting dentry stuff", 0);
26462 + kdb_register("kobject", kdbm_kobject, "<kobject>", "Display interesting kobject stuff", 0);
26463 + kdb_register("filp", kdbm_filp, "<filp>", "Display interesting filp stuff", 0);
26464 + kdb_register("fl", kdbm_fl, "<fl>", "Display interesting file_lock stuff", 0);
26465 + kdb_register("sh", kdbm_sh, "<vaddr>", "Show scsi_host", 0);
26466 + kdb_register("sd", kdbm_sd, "<vaddr>", "Show scsi_device", 0);
26467 + kdb_register("sc", kdbm_sc, "<vaddr>", "Show scsi_cmnd", 0);
26468 +
26469 + return 0;
26470 +}
26471 +
26472 +static void __exit kdbm_vm_exit(void)
26473 +{
26474 + kdb_unregister("vm");
26475 + kdb_unregister("vmp");
26476 +#ifdef CONFIG_NUMA
26477 + kdb_unregister("mempolicy");
26478 +#endif
26479 + kdb_unregister("pgdat");
26480 + kdb_unregister("pte");
26481 + kdb_unregister("rpte");
26482 + kdb_unregister("dentry");
26483 + kdb_unregister("kobject");
26484 + kdb_unregister("filp");
26485 + kdb_unregister("fl");
26486 + kdb_unregister("sh");
26487 + kdb_unregister("sd");
26488 + kdb_unregister("sc");
26489 +}
26490 +
26491 +module_init(kdbm_vm_init)
26492 +module_exit(kdbm_vm_exit)
26493 --- /dev/null
26494 +++ b/kdb/modules/kdbm_x86.c
26495 @@ -0,0 +1,1093 @@
26496 +/*
26497 + * This file is subject to the terms and conditions of the GNU General Public
26498 + * License. See the file "COPYING" in the main directory of this archive
26499 + * for more details.
26500 + *
26501 + * Author: Vamsi Krishna S. <vamsi_krishna@in.ibm.com>
26502 + * (C) 2003 IBM Corporation.
26503 + * 2006-10-10 Keith Owens
26504 + * Reworked to include x86_64 support
26505 + * Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
26506 + */
26507 +
26508 +#include <linux/interrupt.h>
26509 +#include <linux/types.h>
26510 +#include <linux/kdb.h>
26511 +#include <linux/kdbprivate.h>
26512 +#include <linux/module.h>
26513 +#include <linux/init.h>
26514 +#include <linux/mm.h>
26515 +
26516 +#include <asm/processor.h>
26517 +#include <asm/uaccess.h>
26518 +#include <asm/desc.h>
26519 +#include <asm/debugreg.h>
26520 +#if 0
26521 +#include <asm/pgtable.h>
26522 +#endif
26523 +
26524 +MODULE_AUTHOR("Vamsi Krishna S./IBM");
26525 +MODULE_DESCRIPTION("x86 specific information (gdt/idt/ldt/page tables)");
26526 +MODULE_LICENSE("GPL");
26527 +
26528 +/* Isolate as many of the i386/x86_64 differences as possible in one spot */
26529 +
26530 +#ifdef CONFIG_X86_64
26531 +
26532 +#define KDB_X86_64 1
26533 +#define MOVLQ "movq"
26534 +
26535 +typedef struct desc_struct kdb_desc_t;
26536 +typedef struct gate_struct64 kdb_gate_desc_t;
26537 +
26538 +#define KDB_SYS_DESC_OFFSET(d) ((unsigned long)d->offset_high << 32 | d->offset_middle << 16 | d->offset_low)
26539 +#define KDB_SYS_DESC_CALLG_COUNT(d) 0
26540 +
26541 +#else /* !CONFIG_X86_64 */
26542 +
26543 +#define KDB_X86_64 0
26544 +#define MOVLQ "movl"
26545 +
26546 +/* i386 has no detailed mapping for the 8 byte segment descriptor, copy the
26547 + * x86_64 one and merge the l and avl bits.
26548 + */
26549 +struct kdb_desc {
26550 + u16 limit0;
26551 + u16 base0;
26552 + unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1;
26553 + unsigned limit : 4, avl : 2, d : 1, g : 1, base2 : 8;
26554 +} __attribute__((packed));
26555 +typedef struct kdb_desc kdb_desc_t;
26556 +
26557 +/* i386 has no detailed mapping for the 8 byte gate descriptor, base it on the
26558 + * x86_64 one.
26559 + */
26560 +struct kdb_gate_desc {
26561 + u16 offset_low;
26562 + u16 segment;
26563 + unsigned res : 8, type : 4, s : 1, dpl : 2, p : 1;
26564 + u16 offset_middle;
26565 +} __attribute__((packed));
26566 +typedef struct kdb_gate_desc kdb_gate_desc_t;
26567 +
26568 +#define KDB_SYS_DESC_OFFSET(d) ((unsigned long)(d->offset_middle << 16 | d->offset_low))
26569 +#define KDB_SYS_DESC_CALLG_COUNT(d) ((unsigned int)(d->res & 0x0F))
26570 +
26571 +#endif /* CONFIG_X86_64 */
26572 +
26573 +#define KDB_SEL_MAX 0x2000
26574 +#define KDB_IDT_MAX 0x100
26575 +#define KDB_SYS_DESC_TYPE_TSS16 0x01
26576 +#define KDB_SYS_DESC_TYPE_LDT 0x02
26577 +#define KDB_SYS_DESC_TYPE_TSSB16 0x03
26578 +#define KDB_SYS_DESC_TYPE_CALLG16 0x04
26579 +#define KDB_SYS_DESC_TYPE_TASKG 0x05
26580 +#define KDB_SYS_DESC_TYPE_INTG16 0x06
26581 +#define KDB_SYS_DESC_TYPE_TRAP16 0x07
26582 +
26583 +#define KDB_SYS_DESC_TYPE_TSS 0x09
26584 +#define KDB_SYS_DESC_TYPE_TSSB 0x0b
26585 +#define KDB_SYS_DESC_TYPE_CALLG 0x0c
26586 +#define KDB_SYS_DESC_TYPE_INTG 0x0e
26587 +#define KDB_SYS_DESC_TYPE_TRAPG 0x0f
26588 +
26589 +#define KDB_SEG_DESC_TYPE_CODE 0x08
26590 +#define KDB_SEG_DESC_TYPE_CODE_R 0x02
26591 +#define KDB_SEG_DESC_TYPE_DATA_W 0x02
26592 +#define KDB_SEG_DESC_TYPE_CODE_C 0x02 /* conforming */
26593 +#define KDB_SEG_DESC_TYPE_DATA_D 0x02 /* expand-down */
26594 +#define KDB_SEG_DESC_TYPE_A 0x01 /* accessed */
26595 +
26596 +#define _LIMIT(d) ((unsigned long)((d)->limit << 16 | (d)->limit0))
26597 +#define KDB_SEG_DESC_LIMIT(d) ((d)->g ? ((_LIMIT(d)+1) << 12) -1 : _LIMIT(d))
26598 +
26599 +static unsigned long kdb_seg_desc_base(kdb_desc_t *d)
26600 +{
26601 + unsigned long base = d->base2 << 24 | d->base1 << 16 | d->base0;
26602 +#ifdef CONFIG_X86_64
26603 + switch (d->type) {
26604 + case KDB_SYS_DESC_TYPE_TSS:
26605 + case KDB_SYS_DESC_TYPE_TSSB:
26606 + case KDB_SYS_DESC_TYPE_LDT:
26607 + base += (unsigned long)(((struct ldttss_desc64 *)d)->base3) << 32;
26608 + break;
26609 + }
26610 +#endif
26611 + return base;
26612 +}
26613 +
26614 +/* helper functions to display system registers in verbose mode */
26615 +static void display_gdtr(void)
26616 +{
26617 + struct desc_ptr gdtr;
26618 +
26619 + __asm__ __volatile__ ("sgdt %0\n\t" : "=m"(gdtr));
26620 + kdb_printf("gdtr.address = " kdb_machreg_fmt0 ", gdtr.size = 0x%x\n",
26621 + gdtr.address, gdtr.size);
26622 +
26623 + return;
26624 +}
26625 +
26626 +static void display_ldtr(void)
26627 +{
26628 + struct desc_ptr gdtr;
26629 + unsigned long ldtr;
26630 +
26631 + __asm__ __volatile__ ("sgdt %0\n\t" : "=m"(gdtr));
26632 + __asm__ __volatile__ ("sldt %0\n\t" : "=m"(ldtr));
26633 + ldtr &= 0xfff8; /* extract the index */
26634 +
26635 + kdb_printf("ldtr = " kdb_machreg_fmt0 " ", ldtr);
26636 +
26637 + if (ldtr < gdtr.size) {
26638 + kdb_desc_t *ldt_desc =
26639 + (kdb_desc_t *)(gdtr.address + ldtr);
26640 + kdb_printf("base=" kdb_machreg_fmt0
26641 + ", limit=" kdb_machreg_fmt "\n",
26642 + kdb_seg_desc_base(ldt_desc),
26643 + KDB_SEG_DESC_LIMIT(ldt_desc));
26644 + } else {
26645 + kdb_printf("invalid\n");
26646 + }
26647 +
26648 + return;
26649 +}
26650 +
26651 +static void display_idtr(void)
26652 +{
26653 + struct desc_ptr idtr;
26654 + __asm__ __volatile__ ("sidt %0\n\t" : "=m"(idtr));
26655 + kdb_printf("idtr.address = " kdb_machreg_fmt0 ", idtr.size = 0x%x\n",
26656 + idtr.address, idtr.size);
26657 + return;
26658 +}
26659 +
26660 +static const char *cr0_flags[] = {
26661 + "pe", "mp", "em", "ts", "et", "ne", NULL, NULL,
26662 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
26663 + "wp", NULL, "am", NULL, NULL, NULL, NULL, NULL,
26664 + NULL, NULL, NULL, NULL, NULL, "nw", "cd", "pg"};
26665 +
26666 +static void display_cr0(void)
26667 +{
26668 + kdb_machreg_t cr0;
26669 + int i;
26670 + __asm__ (MOVLQ " %%cr0,%0\n\t":"=r"(cr0));
26671 + kdb_printf("cr0 = " kdb_machreg_fmt0, cr0);
26672 + for (i = 0; i < ARRAY_SIZE(cr0_flags); i++) {
26673 + if (test_bit(i, &cr0) && cr0_flags[i])
26674 + kdb_printf(" %s", cr0_flags[i]);
26675 + }
26676 + kdb_printf("\n");
26677 + return;
26678 +}
26679 +
26680 +static void display_cr3(void)
26681 +{
26682 + kdb_machreg_t cr3;
26683 + __asm__ (MOVLQ " %%cr3,%0\n\t":"=r"(cr3));
26684 + kdb_printf("cr3 = " kdb_machreg_fmt0 " ", cr3);
26685 + if (cr3 & 0x08)
26686 + kdb_printf("pwt ");
26687 + if (cr3 & 0x10)
26688 + kdb_printf("pcd ");
26689 + kdb_printf("%s=" kdb_machreg_fmt0 "\n",
26690 + KDB_X86_64 ? "pml4" : "pgdir", cr3 & PAGE_MASK);
26691 + return;
26692 +}
26693 +
26694 +static const char *cr4_flags[] = {
26695 + "vme", "pvi", "tsd", "de",
26696 + "pse", "pae", "mce", "pge",
26697 + "pce", "osfxsr" "osxmmexcpt"};
26698 +
26699 +static void display_cr4(void)
26700 +{
26701 + kdb_machreg_t cr4;
26702 + int i;
26703 + __asm__ (MOVLQ " %%cr4,%0\n\t":"=r"(cr4));
26704 + kdb_printf("cr4 = " kdb_machreg_fmt0, cr4);
26705 + for (i = 0; i < ARRAY_SIZE(cr4_flags); i++) {
26706 + if (test_bit(i, &cr4))
26707 + kdb_printf(" %s", cr4_flags[i]);
26708 + }
26709 + kdb_printf("\n");
26710 + return;
26711 +}
26712 +
26713 +static void display_cr8(void)
26714 +{
26715 +#ifdef CONFIG_X86_64
26716 + kdb_machreg_t cr8;
26717 + __asm__ (MOVLQ " %%cr8,%0\n\t":"=r"(cr8));
26718 + kdb_printf("cr8 = " kdb_machreg_fmt0 "\n", cr8);
26719 + return;
26720 +#endif /* CONFIG_X86_64 */
26721 +}
26722 +
26723 +static char *dr_type_name[] = { "exec", "write", "io", "rw" };
26724 +
26725 +static void display_dr_status(int nr, int enabled, int local, int len, int type)
26726 +{
26727 + if (!enabled) {
26728 + kdb_printf("\tdebug register %d: not enabled\n", nr);
26729 + return;
26730 + }
26731 +
26732 + kdb_printf(" debug register %d: %s, len = %d, type = %s\n",
26733 + nr,
26734 + local? " local":"global",
26735 + len,
26736 + dr_type_name[type]);
26737 +}
26738 +
26739 +static void display_dr(void)
26740 +{
26741 + kdb_machreg_t dr0, dr1, dr2, dr3, dr6, dr7;
26742 + int dbnr, set;
26743 +
26744 + __asm__ (MOVLQ " %%db0,%0\n\t":"=r"(dr0));
26745 + __asm__ (MOVLQ " %%db1,%0\n\t":"=r"(dr1));
26746 + __asm__ (MOVLQ " %%db2,%0\n\t":"=r"(dr2));
26747 + __asm__ (MOVLQ " %%db3,%0\n\t":"=r"(dr3));
26748 + __asm__ (MOVLQ " %%db6,%0\n\t":"=r"(dr6));
26749 + __asm__ (MOVLQ " %%db7,%0\n\t":"=r"(dr7));
26750 +
26751 + kdb_printf("dr0 = " kdb_machreg_fmt0 " dr1 = " kdb_machreg_fmt0
26752 + " dr2 = " kdb_machreg_fmt0 " dr3 = " kdb_machreg_fmt0 "\n",
26753 + dr0, dr1, dr2, dr3);
26754 + kdb_printf("dr6 = " kdb_machreg_fmt0 " ", dr6);
26755 + dbnr = dr6 & DR6_DR_MASK;
26756 + if (dbnr) {
26757 + int nr;
26758 + switch(dbnr) {
26759 + case 1:
26760 + nr = 0; break;
26761 + case 2:
26762 + nr = 1; break;
26763 + case 4:
26764 + nr = 2; break;
26765 + default:
26766 + nr = 3; break;
26767 + }
26768 + kdb_printf("debug register hit = %d", nr);
26769 + } else if (dr6 & DR_STEP) {
26770 + kdb_printf("single step");
26771 + } else if (dr6 & DR_SWITCH) {
26772 + kdb_printf("task switch");
26773 + }
26774 + kdb_printf("\n");
26775 +
26776 + kdb_printf("dr7 = " kdb_machreg_fmt0 "\n", dr7);
26777 + set = DR7_L0(dr7) || DR7_G0(dr7);
26778 + display_dr_status(0, set, DR7_L0(dr7), DR7_LEN0(dr7), DR7_RW0(dr7));
26779 + set = DR7_L1(dr7) || DR7_G1(dr7);
26780 + display_dr_status(1, set, DR7_L1(dr7), DR7_LEN1(dr7), DR7_RW1(dr7));
26781 + set = DR7_L2(dr7) || DR7_G2(dr7);
26782 + display_dr_status(2, set, DR7_L2(dr7), DR7_LEN2(dr7), DR7_RW2(dr7));
26783 + set = DR7_L3(dr7) || DR7_G3(dr7);
26784 + display_dr_status(3, set, DR7_L3(dr7), DR7_LEN3(dr7), DR7_RW3(dr7));
26785 +}
26786 +
26787 +static char *set_eflags[] = {
26788 + "carry", NULL, "parity", NULL, "adjust", NULL, "zero", "sign",
26789 + "trace", "intr-on", "dir", "overflow", NULL, NULL, "nestedtask", NULL,
26790 + "resume", "vm", "align", "vif", "vip", "id"};
26791 +
26792 +static void display_eflags(unsigned long ef)
26793 +{
26794 + int i, iopl;
26795 + kdb_printf("eflags = " kdb_machreg_fmt0 " ", ef);
26796 + for (i = 0; i < ARRAY_SIZE(set_eflags); i++) {
26797 + if (test_bit(i, &ef) && set_eflags[i])
26798 + kdb_printf("%s ", set_eflags[i]);
26799 + }
26800 +
26801 + iopl = (ef & 0x00003000) >> 12;
26802 + kdb_printf("iopl=%d\n", iopl);
26803 + return;
26804 +}
26805 +
26806 +static void display_tss(struct tss_struct *t)
26807 +{
26808 +#ifdef CONFIG_X86_64
26809 + int i;
26810 + kdb_printf(" sp0 = 0x%016Lx, sp1 = 0x%016Lx\n",
26811 + t->x86_tss.sp0, t->x86_tss.sp1);
26812 + kdb_printf(" sp2 = 0x%016Lx\n", t->x86_tss.sp2);
26813 + for (i = 0; i < ARRAY_SIZE(t->x86_tss.ist); ++i)
26814 + kdb_printf(" ist[%d] = 0x%016Lx\n",
26815 + i, t->x86_tss.ist[i]);
26816 + kdb_printf(" iomap = 0x%04x\n", t->x86_tss.io_bitmap_base);
26817 +#else /* !CONFIG_X86_64 */
26818 + kdb_printf(" cs = %04x, ip = " kdb_machreg_fmt0 "\n",
26819 + t->x86_tss.es, t->x86_tss.ip);
26820 + kdb_printf(" ss = %04x, sp = " kdb_machreg_fmt0 "\n",
26821 + t->x86_tss.ss, t->x86_tss.sp);
26822 + kdb_printf(" ss0 = %04x, sp0 = " kdb_machreg_fmt0 "\n",
26823 + t->x86_tss.ss0, t->x86_tss.sp0);
26824 + kdb_printf(" ss1 = %04x, sp1 = " kdb_machreg_fmt0 "\n",
26825 + t->x86_tss.ss1, t->x86_tss.sp1);
26826 + kdb_printf(" ss2 = %04x, sp2 = " kdb_machreg_fmt0 "\n",
26827 + t->x86_tss.ss2, t->x86_tss.sp2);
26828 + kdb_printf(" ldt = %04x, cr3 = " kdb_machreg_fmt0 "\n",
26829 + t->x86_tss.ldt, t->x86_tss.__cr3);
26830 + kdb_printf(" ds = %04x, es = %04x fs = %04x gs = %04x\n",
26831 + t->x86_tss.ds, t->x86_tss.es, t->x86_tss.fs, t->x86_tss.gs);
26832 + kdb_printf(" ax = " kdb_machreg_fmt0 ", bx = " kdb_machreg_fmt0
26833 + " cx = " kdb_machreg_fmt0 " dx = " kdb_machreg_fmt0 "\n",
26834 + t->x86_tss.ax, t->x86_tss.bx, t->x86_tss.cx, t->x86_tss.dx);
26835 + kdb_printf(" si = " kdb_machreg_fmt0 ", di = " kdb_machreg_fmt0
26836 + " bp = " kdb_machreg_fmt0 "\n",
26837 + t->x86_tss.si, t->x86_tss.di, t->x86_tss.bp);
26838 + kdb_printf(" trace = %d, iomap = 0x%04x\n", t->x86_tss.trace, t->x86_tss.io_bitmap_base);
26839 +#endif /* CONFIG_X86_64 */
26840 +}
26841 +
26842 +static char *gate_desc_types[] = {
26843 +#ifdef CONFIG_X86_64
26844 + "reserved-0", "reserved-1", "ldt", "reserved-3",
26845 + "reserved-4", "reserved-5", "reserved-6", "reserved-7",
26846 + "reserved-8", "tss-avlb", "reserved-10", "tss-busy",
26847 + "callgate", "reserved-13", "intgate", "trapgate",
26848 +#else /* CONFIG_X86_64 */
26849 + "reserved-0", "tss16-avlb", "ldt", "tss16-busy",
26850 + "callgate16", "taskgate", "intgate16", "trapgate16",
26851 + "reserved-8", "tss-avlb", "reserved-10", "tss-busy",
26852 + "callgate", "reserved-13", "intgate", "trapgate",
26853 +#endif /* CONFIG_X86_64 */
26854 +};
26855 +
26856 +static void
26857 +display_gate_desc(kdb_gate_desc_t *d)
26858 +{
26859 + kdb_printf("%-11s ", gate_desc_types[d->type]);
26860 +
26861 + switch(d->type) {
26862 + case KDB_SYS_DESC_TYPE_LDT:
26863 + kdb_printf("base=");
26864 + kdb_symbol_print(kdb_seg_desc_base((kdb_desc_t *)d), NULL,
26865 + KDB_SP_DEFAULT);
26866 + kdb_printf(" limit=" kdb_machreg_fmt " dpl=%d\n",
26867 + KDB_SEG_DESC_LIMIT((kdb_desc_t *)d), d->dpl);
26868 + break;
26869 + case KDB_SYS_DESC_TYPE_TSS:
26870 + case KDB_SYS_DESC_TYPE_TSS16:
26871 + case KDB_SYS_DESC_TYPE_TSSB:
26872 + case KDB_SYS_DESC_TYPE_TSSB16:
26873 + {
26874 + struct tss_struct *tss =
26875 + (struct tss_struct *)
26876 + kdb_seg_desc_base((kdb_desc_t *)d);
26877 + kdb_printf("base=");
26878 + kdb_symbol_print((unsigned long)tss, NULL, KDB_SP_DEFAULT);
26879 + kdb_printf(" limit=" kdb_machreg_fmt " dpl=%d\n",
26880 + KDB_SEG_DESC_LIMIT((kdb_desc_t *)d), d->dpl);
26881 + display_tss(tss);
26882 + break;
26883 + }
26884 + case KDB_SYS_DESC_TYPE_CALLG16:
26885 + kdb_printf("segment=0x%4.4x off=", d->segment);
26886 + kdb_symbol_print(KDB_SYS_DESC_OFFSET(d), NULL, KDB_SP_DEFAULT);
26887 + kdb_printf(" dpl=%d wc=%d\n",
26888 + d->dpl, KDB_SYS_DESC_CALLG_COUNT(d));
26889 + break;
26890 + case KDB_SYS_DESC_TYPE_CALLG:
26891 + kdb_printf("segment=0x%4.4x off=", d->segment);
26892 + kdb_symbol_print(KDB_SYS_DESC_OFFSET(d), NULL, KDB_SP_DEFAULT);
26893 + kdb_printf(" dpl=%d\n", d->dpl);
26894 + break;
26895 + default:
26896 + kdb_printf("segment=0x%4.4x off=", d->segment);
26897 + if (KDB_SYS_DESC_OFFSET(d))
26898 + kdb_symbol_print(KDB_SYS_DESC_OFFSET(d), NULL,
26899 + KDB_SP_DEFAULT);
26900 + else
26901 + kdb_printf(kdb_machreg_fmt0, KDB_SYS_DESC_OFFSET(d));
26902 + kdb_printf(" dpl=%d", d->dpl);
26903 +#ifdef CONFIG_X86_64
26904 + if (d->ist)
26905 + kdb_printf(" ist=%d", d->ist);
26906 +#endif /* CONFIG_X86_64 */
26907 + kdb_printf("\n");
26908 + break;
26909 + }
26910 +}
26911 +
26912 +static void
26913 +display_seg_desc(kdb_desc_t *d)
26914 +{
26915 + unsigned char type = d->type;
26916 +
26917 + if (type & KDB_SEG_DESC_TYPE_CODE) {
26918 + kdb_printf("%-11s base=" kdb_machreg_fmt0 " limit="
26919 + kdb_machreg_fmt " dpl=%d %c%c%c %s %s %s \n",
26920 + "code",
26921 + kdb_seg_desc_base(d), KDB_SEG_DESC_LIMIT(d),
26922 + d->dpl,
26923 + (type & KDB_SEG_DESC_TYPE_CODE_R)?'r':'-',
26924 + '-', 'x',
26925 +#ifdef CONFIG_X86_64
26926 + d->l ? "64b" : d->d ? "32b" : "16b",
26927 +#else /* !CONFIG_X86_64 */
26928 + d->d ? "32b" : "16b",
26929 +#endif /* CONFIG_X86_64 */
26930 + (type & KDB_SEG_DESC_TYPE_A)?"ac":"",
26931 + (type & KDB_SEG_DESC_TYPE_CODE_C)?"conf":"");
26932 + } else {
26933 + kdb_printf("%-11s base=" kdb_machreg_fmt0 " limit="
26934 + kdb_machreg_fmt " dpl=%d %c%c%c %s %s %s \n",
26935 + "data",
26936 + kdb_seg_desc_base(d), KDB_SEG_DESC_LIMIT(d),
26937 + d->dpl,
26938 + 'r',
26939 + (type & KDB_SEG_DESC_TYPE_DATA_W)?'w':'-',
26940 + '-',
26941 + d->d ? "32b" : "16b",
26942 + (type & KDB_SEG_DESC_TYPE_A)?"ac":"",
26943 + (type & KDB_SEG_DESC_TYPE_DATA_D)?"down":"");
26944 + }
26945 +}
26946 +
26947 +static int
26948 +kdb_parse_two_numbers(int argc, const char **argv, int *sel, int *count,
26949 + int *last_sel, int *last_count)
26950 +{
26951 + int diag;
26952 +
26953 + if (argc > 2)
26954 + return KDB_ARGCOUNT;
26955 +
26956 + kdbgetintenv("MDCOUNT", count);
26957 +
26958 + if (argc == 0) {
26959 + *sel = *last_sel;
26960 + if (*last_count)
26961 + *count = *last_count;
26962 + } else {
26963 + unsigned long val;
26964 +
26965 + if (argc >= 1) {
26966 + diag = kdbgetularg(argv[1], &val);
26967 + if (diag)
26968 + return diag;
26969 + *sel = val;
26970 + }
26971 + if (argc >= 2) {
26972 + diag = kdbgetularg(argv[2], &val);
26973 + if (diag)
26974 + return diag;
26975 + *count = (int) val;
26976 + *last_count = (int) val;
26977 + } else if (*last_count) {
26978 + *count = *last_count;
26979 + }
26980 + }
26981 + return 0;
26982 +}
26983 +
26984 +/*
26985 + * kdb_gdt
26986 + *
26987 + * This function implements the 'gdt' command.
26988 + *
26989 + * gdt [<selector> [<line count>]]
26990 + *
26991 + * Inputs:
26992 + * argc argument count
26993 + * argv argument vector
26994 + * Outputs:
26995 + * None.
26996 + * Returns:
26997 + * zero for success, a kdb diagnostic if error
26998 + * Locking:
26999 + * none.
27000 + * Remarks:
27001 + */
27002 +static int
27003 +kdb_gdt(int argc, const char **argv)
27004 +{
27005 + int sel = 0;
27006 + struct desc_ptr gdtr;
27007 + int diag, count = 8;
27008 + kdb_desc_t *gdt;
27009 + unsigned int max_sel;
27010 + static int last_sel = 0, last_count = 0;
27011 +
27012 + diag = kdb_parse_two_numbers(argc, argv, &sel, &count,
27013 + &last_sel, &last_count);
27014 + if (diag)
27015 + return diag;
27016 +
27017 + __asm__ __volatile__ ("sgdt %0\n\t" : "=m"(gdtr));
27018 + gdt = (kdb_desc_t *) gdtr.address;
27019 +
27020 + max_sel = (gdtr.size + 1) / sizeof(kdb_desc_t);
27021 + if (sel >= max_sel) {
27022 + kdb_printf("Maximum selector (%d) reached\n", max_sel);
27023 + return 0;
27024 + }
27025 +
27026 + if (sel + count > max_sel)
27027 + count = max_sel - sel;
27028 +
27029 + while (count--) {
27030 + kdb_desc_t *d = &gdt[sel];
27031 + kdb_printf("0x%4.4x ", sel++);
27032 +
27033 + if (!d->p) {
27034 + kdb_printf("not present\n");
27035 + continue;
27036 + }
27037 + if (d->s) {
27038 + display_seg_desc(d);
27039 + } else {
27040 + display_gate_desc((kdb_gate_desc_t *)d);
27041 + if (KDB_X86_64 && count) {
27042 + ++sel; /* this descriptor occupies two slots */
27043 + --count;
27044 + }
27045 + }
27046 + }
27047 +
27048 + last_sel = sel;
27049 + return 0;
27050 +}
27051 +
27052 +/*
27053 + * kdb_ldt
27054 + *
27055 + * This function implements the 'ldt' command.
27056 + *
27057 + * ldt [<selector> [<line count>]]
27058 + *
27059 + * Inputs:
27060 + * argc argument count
27061 + * argv argument vector
27062 + * Outputs:
27063 + * None.
27064 + * Returns:
27065 + * zero for success, a kdb diagnostic if error
27066 + * Locking:
27067 + * none.
27068 + * Remarks:
27069 + */
27070 +static int
27071 +kdb_ldt(int argc, const char **argv)
27072 +{
27073 + int sel = 0;
27074 + struct desc_ptr gdtr;
27075 + unsigned long ldtr = 0;
27076 + int diag, count = 8;
27077 + kdb_desc_t *ldt, *ldt_desc;
27078 + unsigned int max_sel;
27079 + static int last_sel = 0, last_count = 0;
27080 +
27081 + diag = kdb_parse_two_numbers(argc, argv, &sel, &count,
27082 + &last_sel, &last_count);
27083 + if (diag)
27084 + return diag;
27085 +
27086 + if (strcmp(argv[0], "ldtp") == 0) {
27087 + kdb_printf("pid=%d, process=%s\n",
27088 + kdb_current_task->pid, kdb_current_task->comm);
27089 + if (!kdb_current_task->mm ||
27090 + !kdb_current_task->mm->context.ldt) {
27091 + kdb_printf("no special LDT for this process\n");
27092 + return 0;
27093 + }
27094 + ldt = kdb_current_task->mm->context.ldt;
27095 + max_sel = kdb_current_task->mm->context.size;
27096 + } else {
27097 +
27098 + /* sldt gives the GDT selector for the segment containing LDT */
27099 + __asm__ __volatile__ ("sgdt %0\n\t" : "=m"(gdtr));
27100 + __asm__ __volatile__ ("sldt %0\n\t" : "=m"(ldtr));
27101 + ldtr &= 0xfff8; /* extract the index */
27102 +
27103 + if (ldtr > gdtr.size+1) {
27104 + kdb_printf("invalid ldtr\n");
27105 + return 0;
27106 + }
27107 +
27108 + ldt_desc = (kdb_desc_t *)(gdtr.address + ldtr);
27109 + ldt = (kdb_desc_t *)kdb_seg_desc_base(ldt_desc);
27110 + max_sel = (KDB_SEG_DESC_LIMIT(ldt_desc)+1) / sizeof(kdb_desc_t);
27111 + }
27112 +
27113 + if (sel >= max_sel) {
27114 + kdb_printf("Maximum selector (%d) reached\n", max_sel);
27115 + return 0;
27116 + }
27117 +
27118 + if (sel + count > max_sel)
27119 + count = max_sel - sel;
27120 +
27121 + while (count--) {
27122 + kdb_desc_t *d = &ldt[sel];
27123 + kdb_printf("0x%4.4x ", sel++);
27124 +
27125 + if (!d->p) {
27126 + kdb_printf("not present\n");
27127 + continue;
27128 + }
27129 + if (d->s) {
27130 + display_seg_desc(d);
27131 + } else {
27132 + display_gate_desc((kdb_gate_desc_t *)d);
27133 + if (KDB_X86_64 && count) {
27134 + ++sel; /* this descriptor occupies two slots */
27135 + --count;
27136 + }
27137 + }
27138 + }
27139 +
27140 + last_sel = sel;
27141 + return 0;
27142 +}
27143 +
27144 +/*
27145 + * kdb_idt
27146 + *
27147 + * This function implements the 'idt' command.
27148 + *
27149 + * idt [<vector> [<line count>]]
27150 + *
27151 + * Inputs:
27152 + * argc argument count
27153 + * argv argument vector
27154 + * Outputs:
27155 + * None.
27156 + * Returns:
27157 + * zero for success, a kdb diagnostic if error
27158 + * Locking:
27159 + * none.
27160 + * Remarks:
27161 + */
27162 +static int
27163 +kdb_idt(int argc, const char **argv)
27164 +{
27165 + int vec = 0;
27166 + struct desc_ptr idtr;
27167 + int diag, count = 8;
27168 + kdb_gate_desc_t *idt;
27169 + unsigned int max_entries;
27170 + static int last_vec = 0, last_count = 0;
27171 +
27172 + diag = kdb_parse_two_numbers(argc, argv, &vec, &count,
27173 + &last_vec, &last_count);
27174 + if (diag)
27175 + return diag;
27176 +
27177 + __asm__ __volatile__ ("sidt %0\n\t" : "=m"(idtr));
27178 + idt = (kdb_gate_desc_t *)idtr.address;
27179 +
27180 + max_entries = (idtr.size+1) / sizeof(kdb_gate_desc_t);
27181 + if (vec >= max_entries) {
27182 + kdb_printf("Maximum vector (%d) reached\n", max_entries);
27183 + return 0;
27184 + }
27185 +
27186 + if (vec + count > max_entries)
27187 + count = max_entries - vec;
27188 +
27189 + while (count--) {
27190 + kdb_gate_desc_t *d = &idt[vec];
27191 + kdb_printf("0x%4.4x ", vec++);
27192 + if (!d->p) {
27193 + kdb_printf("not present\n");
27194 + continue;
27195 + }
27196 +#ifndef CONFIG_X86_64
27197 + if (d->s) {
27198 + kdb_printf("invalid\n");
27199 + continue;
27200 + }
27201 +#endif /* CONFIG_X86_64 */
27202 + display_gate_desc(d);
27203 + }
27204 +
27205 + last_vec = vec;
27206 +
27207 + return 0;
27208 +}
27209 +
27210 +#if 0
27211 +static int
27212 +get_pagetables(unsigned long addr, pgd_t **pgdir, pmd_t **pgmiddle, pte_t **pte)
27213 +{
27214 + pgd_t *d;
27215 + pmd_t *m;
27216 + pte_t *t;
27217 +
27218 + if (addr > PAGE_OFFSET) {
27219 + d = pgd_offset_k(addr);
27220 + } else {
27221 + kdb_printf("pid=%d, process=%s\n", kdb_current_task->pid, kdb_current_task->comm);
27222 + d = pgd_offset(kdb_current_task->mm, addr);
27223 + }
27224 +
27225 + if (pgd_none(*d) || pgd_bad(*d)) {
27226 + *pgdir = NULL;
27227 + *pgmiddle = NULL;
27228 + *pte = NULL;
27229 + return 0;
27230 + } else {
27231 + *pgdir = d;
27232 + }
27233 +
27234 + /* if _PAGE_PSE is set, pgdir points directly to the page. */
27235 + if (pgd_val(*d) & _PAGE_PSE) {
27236 + *pgmiddle = NULL;
27237 + *pte = NULL;
27238 + return 0;
27239 + }
27240 +
27241 + m = pmd_offset(d, addr);
27242 + if (pmd_none(*m) || pmd_bad(*m)) {
27243 + *pgmiddle = NULL;
27244 + *pte = NULL;
27245 + return 0;
27246 + } else {
27247 + *pgmiddle = m;
27248 + }
27249 +
27250 + t = pte_offset(m, addr);
27251 + if (pte_none(*t)) {
27252 + *pte = NULL;
27253 + return 0;
27254 + } else {
27255 + *pte = t;
27256 + }
27257 + kdb_printf("\naddr=%08lx, pgd=%08lx, pmd=%08lx, pte=%08lx\n",
27258 + addr,
27259 + (unsigned long) pgd_val(*d),
27260 + (unsigned long) pmd_val(*m),
27261 + (unsigned long) pte_val(*t));
27262 + return 0;
27263 +}
27264 +#endif
27265 +
27266 +#define FORMAT_PGDIR(entry) \
27267 + kdb_printf("frame=%05lx %c %s %c %c %c %s %c %s %s \n",\
27268 + (entry >> PAGE_SHIFT), \
27269 + (entry & _PAGE_PRESENT)?'p':'n', \
27270 + (entry & _PAGE_RW)?"rw":"ro", \
27271 + (entry & _PAGE_USER)?'u':'s', \
27272 + (entry & _PAGE_ACCESSED)?'a':' ', \
27273 + ' ', \
27274 + (entry & _PAGE_PSE)?"4M":"4K", \
27275 + (entry & _PAGE_GLOBAL)?'g':' ', \
27276 + (entry & _PAGE_PWT)?"wt":"wb", \
27277 + (entry & _PAGE_PCD)?"cd":" ");
27278 +
27279 +#define FORMAT_PTE(p, entry) \
27280 + kdb_printf("frame=%05lx %c%c%c %c %c %c %s %c %s %s\n", \
27281 + (entry >> PAGE_SHIFT), \
27282 + (pte_read(p))? 'r':'-', \
27283 + (pte_write(p))? 'w':'-', \
27284 + (pte_exec(p))? 'x':'-', \
27285 + (pte_dirty(p))? 'd':' ', \
27286 + (pte_young(p))? 'a':' ', \
27287 + (entry & _PAGE_USER)? 'u':'s', \
27288 + " ", \
27289 + (entry & _PAGE_GLOBAL)? 'g':' ', \
27290 + (entry & _PAGE_PWT)? "wt":"wb", \
27291 + (entry & _PAGE_PCD)? "cd":" ");
27292 +#if 0
27293 +static int
27294 +display_pgdir(unsigned long addr, pgd_t *pgdir, int count)
27295 +{
27296 + unsigned long entry;
27297 + int i;
27298 + int index = pgdir - ((pgd_t *)(((unsigned long)pgdir) & PAGE_MASK));
27299 +
27300 + count = min(count, PTRS_PER_PGD - index);
27301 + addr &= ~(PGDIR_SIZE-1);
27302 +
27303 + for (i = 0; i < count; i++, pgdir++) {
27304 + entry = pgd_val(*pgdir);
27305 + kdb_printf("pgd: addr=%08lx ", addr);
27306 + if (pgd_none(*pgdir)) {
27307 + kdb_printf("pgdir not present\n");
27308 + } else {
27309 + FORMAT_PGDIR(entry);
27310 + }
27311 + addr += PGDIR_SIZE;
27312 + }
27313 + return i;
27314 +}
27315 +#endif
27316 +
27317 +#if 0 /* for now, let's not print pgmiddle. */
27318 +static int
27319 +display_pgmiddle(unsigned long addr, pmd_t *pgmiddle, int count)
27320 +{
27321 + unsigned long entry;
27322 + int i;
27323 + int index = pgmiddle - ((pmd_t *)(((unsigned long)pgmiddle) & PAGE_MASK));
27324 +
27325 + count = min(count, PTRS_PER_PMD - index);
27326 + addr &= ~(PMD_SIZE-1);
27327 +
27328 + for (i = 0; i < count; i++, pgmiddle++) {
27329 + entry = pmd_val(*pgmiddle);
27330 + kdb_printf("pmd: addr=%08lx ", addr);
27331 + if (pmd_none(*pgmiddle)) {
27332 + kdb_printf("pgmiddle not present\n");
27333 + } else {
27334 + FORMAT_PGDIR(entry);
27335 + }
27336 + addr += PMD_SIZE;
27337 + }
27338 + return i;
27339 +}
27340 +#endif
27341 +
27342 +#if 0
27343 +static int
27344 +display_pte(unsigned long addr, pte_t *pte, int count)
27345 +{
27346 + unsigned long entry;
27347 + int i;
27348 + int index = pte - ((pte_t *)(((unsigned long)pte) & PAGE_MASK));
27349 +
27350 + count = min(count, PTRS_PER_PTE - index);
27351 + addr &= PAGE_MASK;
27352 +
27353 + for (i = 0; i < count; i++, pte++) {
27354 + entry = pte_val(*pte);
27355 + kdb_printf("pte: addr=%08lx ", addr);
27356 + if (pte_none(*pte)) {
27357 + kdb_printf("pte not present\n");
27358 + } else if (!pte_present(*pte)) {
27359 + kdb_printf("page swapped out. swp_offset=%08lx ", SWP_OFFSET(pte_to_swp_entry(*pte)));
27360 + kdb_printf("swp_type=%8lx", SWP_TYPE(pte_to_swp_entry(*pte)));
27361 + } else {
27362 + FORMAT_PTE(*pte, entry);
27363 + }
27364 + addr += PAGE_SIZE;
27365 + }
27366 + return i;
27367 +}
27368 +
27369 +
27370 +/*
27371 + * kdb_pte
27372 + *
27373 + * This function implements the 'pte' command.
27374 + *
27375 + * pte <addr arg> [<line count>]
27376 + *
27377 + * Inputs:
27378 + * argc argument count
27379 + * argv argument vector
27380 + * Outputs:
27381 + * None.
27382 + * Returns:
27383 + * zero for success, a kdb diagnostic if error
27384 + * Locking:
27385 + * none.
27386 + * Remarks:
27387 + */
27388 +static int
27389 +kdb_pte(int argc, const char **argv)
27390 +{
27391 + static unsigned long last_addr = 0, last_count = 0;
27392 + int count = 8;
27393 + unsigned long addr;
27394 + long offset = 0;
27395 + pgd_t *pgdir;
27396 + pmd_t *pgmiddle;
27397 + pte_t *pte;
27398 +
27399 +#ifdef CONFIG_X86_PAE
27400 + kdb_printf("This kernel is compiled with PAE support.");
27401 + return KDB_NOTIMP;
27402 +#endif
27403 + kdbgetintenv("MDCOUNT", &count);
27404 +
27405 + if (argc == 0) {
27406 + if (last_addr == 0)
27407 + return KDB_ARGCOUNT;
27408 + addr = last_addr;
27409 + if (last_count)
27410 + count = last_count;
27411 + } else {
27412 + kdb_machreg_t val;
27413 + int diag, nextarg = 1;
27414 + diag = kdbgetaddrarg(argc, argv, &nextarg, &addr, &offset, NULL);
27415 + if (diag)
27416 + return diag;
27417 + if (argc > nextarg+1)
27418 + return KDB_ARGCOUNT;
27419 +
27420 + if (argc >= nextarg) {
27421 + diag = kdbgetularg(argv[nextarg], &val);
27422 + if (!diag) {
27423 + count = (int) val;
27424 + last_count = count;
27425 + } else if (last_count) {
27426 + count = last_count;
27427 + }
27428 + }
27429 + }
27430 +
27431 + /*
27432 + * round off the addr to a page boundary.
27433 + */
27434 + addr &= PAGE_MASK;
27435 +
27436 + get_pagetables(addr, &pgdir, &pgmiddle, &pte);
27437 +
27438 + if (pgdir)
27439 + display_pgdir(addr, pgdir, 1);
27440 +#if 0 /* for now, let's not print pgmiddle. */
27441 + if (pgmiddle)
27442 + display_pgmiddle(addr, pgmiddle, 1);
27443 +#endif
27444 + if (pte) {
27445 + int displayed;
27446 + displayed = display_pte(addr, pte, count);
27447 + addr += (displayed << PAGE_SHIFT);
27448 + }
27449 + last_addr = addr;
27450 + return 0;
27451 +}
27452 +#else
27453 +/*
27454 + * Todo - In 2.5 the pte_offset macro in asm/pgtable.h seems to be
27455 + * renamed to pte_offset_kernel.
27456 + */
27457 +static int
27458 +kdb_pte(int argc, const char **argv)
27459 +{
27460 + kdb_printf("not supported.");
27461 + return KDB_NOTIMP;
27462 +}
27463 +#endif
27464 +
27465 +/*
27466 + * kdb_rdv
27467 + *
27468 + * This function implements the 'rdv' command.
27469 + * It displays all registers of the current processor
27470 + * included control registers in verbose mode.
27471 + *
27472 + * Inputs:
27473 + * argc argument count
27474 + * argv argument vector
27475 + * Outputs:
27476 + * None.
27477 + * Returns:
27478 + * zero for success, a kdb diagnostic if error
27479 + * Locking:
27480 + * none.
27481 + * Remarks:
27482 + * This should have been an option to rd command say "rd v",
27483 + * but it is here as it is a non-essential x86-only command,
27484 + * that need not clutter arch/i386/kdb/kdbasupport.c.
27485 + */
27486 +static int
27487 +kdb_rdv(int argc, const char **argv)
27488 +{
27489 + struct pt_regs *regs = get_irq_regs();
27490 + kdba_dumpregs(regs, NULL, NULL);
27491 + kdb_printf("\n");
27492 + display_eflags(regs->flags);
27493 + kdb_printf("\n");
27494 + display_gdtr();
27495 + display_idtr();
27496 + display_ldtr();
27497 + kdb_printf("\n");
27498 + display_cr0();
27499 + display_cr3();
27500 + display_cr4();
27501 + display_cr8();
27502 + kdb_printf("\n");
27503 + display_dr();
27504 + return 0;
27505 +}
27506 +
27507 +static int
27508 +kdb_rdmsr(int argc, const char **argv)
27509 +{
27510 + unsigned long addr;
27511 + uint32_t l, h;
27512 + int diag;
27513 + struct cpuinfo_x86 *c = &cpu_data(smp_processor_id());
27514 +
27515 + if (argc != 1)
27516 + return KDB_ARGCOUNT;
27517 +
27518 + if ((diag = kdbgetularg(argv[1], &addr)))
27519 + return diag;
27520 +
27521 + if (!cpu_has(c, X86_FEATURE_MSR))
27522 + return KDB_NOTIMP;
27523 +
27524 + kdb_printf("msr(0x%lx) = ", addr);
27525 + if ((diag = rdmsr_safe(addr, &l, &h))) {
27526 + kdb_printf("error %d\n", diag);
27527 + return KDB_BADINT;
27528 + } else {
27529 + kdb_printf("0x%08x_%08x\n", h, l);
27530 + }
27531 +
27532 + return 0;
27533 +}
27534 +
27535 +static int
27536 +kdb_wrmsr(int argc, const char **argv)
27537 +{
27538 + unsigned long addr;
27539 + unsigned long l, h;
27540 + int diag;
27541 + struct cpuinfo_x86 *c = &cpu_data(smp_processor_id());
27542 +
27543 + if (argc != 3)
27544 + return KDB_ARGCOUNT;
27545 +
27546 + if ((diag = kdbgetularg(argv[1], &addr))
27547 + || (diag = kdbgetularg(argv[2], &h))
27548 + || (diag = kdbgetularg(argv[3], &l)))
27549 + return diag;
27550 +
27551 + if (!cpu_has(c, X86_FEATURE_MSR))
27552 + return KDB_NOTIMP;
27553 +
27554 + if ((diag = wrmsr_safe(addr, l, h))) {
27555 + kdb_printf("error %d\n", diag);
27556 + return KDB_BADINT;
27557 + }
27558 +
27559 + return 0;
27560 +}
27561 +
27562 +static int __init kdbm_x86_init(void)
27563 +{
27564 + kdb_register("rdv", kdb_rdv, NULL, "Display registers in verbose mode", 0);
27565 + kdb_register_repeat("gdt", kdb_gdt, "<sel> [<count>]", "Display GDT", 0, KDB_REPEAT_NO_ARGS);
27566 + kdb_register_repeat("idt", kdb_idt, "<int> [<count>]", "Display IDT", 0, KDB_REPEAT_NO_ARGS);
27567 + kdb_register_repeat("ldt", kdb_ldt, "<sel> [<count>]", "Display LDT", 0, KDB_REPEAT_NO_ARGS);
27568 + kdb_register_repeat("ptex", kdb_pte, "<addr> [<count>]", "Display pagetables", 0, KDB_REPEAT_NO_ARGS);
27569 + kdb_register_repeat("ldtp", kdb_ldt, "<sel> [<count>]", "Display Process LDT", 0, KDB_REPEAT_NO_ARGS);
27570 + kdb_register("rdmsr", kdb_rdmsr, "<maddr>", "Display Model Specific Register", 0);
27571 + kdb_register("wrmsr", kdb_wrmsr, "<maddr> <h> <l>", "Modify Model Specific Register", 0);
27572 + return 0;
27573 +}
27574 +
27575 +static void __exit kdbm_x86_exit(void)
27576 +{
27577 + kdb_unregister("rdv");
27578 + kdb_unregister("gdt");
27579 + kdb_unregister("ldt");
27580 + kdb_unregister("idt");
27581 + kdb_unregister("ptex");
27582 + kdb_unregister("ldtp");
27583 + kdb_unregister("rdmsr");
27584 + kdb_unregister("wrmsr");
27585 +}
27586 +
27587 +module_init(kdbm_x86_init)
27588 +module_exit(kdbm_x86_exit)
27589 --- /dev/null
27590 +++ b/kdb/modules/lcrash/README
27591 @@ -0,0 +1,3 @@
27592 +
27593 + These files are copied from lcrash.
27594 + The only changes are flagged with "cpw".
27595 --- /dev/null
27596 +++ b/kdb/modules/lcrash/asm/README
27597 @@ -0,0 +1 @@
27598 +This kl_types.h is asm-ia64 version.
27599 --- /dev/null
27600 +++ b/kdb/modules/lcrash/asm/kl_dump_ia64.h
27601 @@ -0,0 +1,199 @@
27602 +/*
27603 + * $Id: kl_dump_ia64.h 1151 2005-02-23 01:09:12Z tjm $
27604 + *
27605 + * This file is part of libklib.
27606 + * A library which provides access to Linux system kernel dumps.
27607 + *
27608 + * Created by Silicon Graphics, Inc.
27609 + * Contributions by IBM, NEC, and others
27610 + *
27611 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
27612 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
27613 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
27614 + *
27615 + * This code is free software; you can redistribute it and/or modify
27616 + * it under the terms of the GNU Lesser Public License as published by
27617 + * the Free Software Foundation; either version 2.1 of the License, or
27618 + * (at your option) any later version. See the file COPYING for more
27619 + * information.
27620 + */
27621 +
27622 +/* This header file holds the architecture specific crash dump header */
27623 +#ifndef __KL_DUMP_IA64_H
27624 +#define __KL_DUMP_IA64_H
27625 +
27626 +/* definitions */
27627 +#ifndef KL_NR_CPUS
27628 +# define KL_NR_CPUS 128 /* max number CPUs */
27629 +#endif
27630 +
27631 +#define KL_DUMP_MAGIC_NUMBER_IA64 0xdeaddeadULL /* magic number */
27632 +#define KL_DUMP_VERSION_NUMBER_IA64 0x4 /* version number */
27633 +
27634 +
27635 +/*
27636 + * mkswap.c calls getpagesize() to get the system page size,
27637 + * which is not necessarily the same as the hardware page size.
27638 + *
27639 + * For ia64 the kernel PAGE_SIZE can be configured from 4KB ... 16KB.
27640 + *
27641 + * The physical memory is layed out out in the hardware/minimal pages.
27642 + * This is the size we need to use for dumping physical pages.
27643 + *
27644 + * Note ths hardware/minimal page size being use in;
27645 + * arch/ia64/kernel/efi.c`efi_memmap_walk():
27646 + * curr.end = curr.start + (md->num_pages << 12);
27647 + *
27648 + * Since the system page size could change between the kernel we boot
27649 + * on the the kernel that cause the core dume we may want to have something
27650 + * more constant like the maximum system page size (See include/asm-ia64/page.h).
27651 + */
27652 +#define DUMP_MIN_PAGE_SHIFT 12
27653 +#define DUMP_MIN_PAGE_SIZE (1UL << DUMP_MIN_PAGE_SHIFT)
27654 +#define DUMP_MIN_PAGE_MASK (~(DUMP_MIN_PAGE_SIZE - 1))
27655 +#define DUMP_MIN_PAGE_ALIGN(addr) (((addr) + DUMP_MIN_PAGE_SIZE - 1) & DUMP_MIN_PAGE_MASK)
27656 +
27657 +#define DUMP_MAX_PAGE_SHIFT 16
27658 +#define DUMP_MAX_PAGE_SIZE (1UL << DUMP_MAX_PAGE_SHIFT)
27659 +#define DUMP_MAX_PAGE_MASK (~(DUMP_MAX_PAGE_SIZE - 1))
27660 +#define DUMP_MAX_PAGE_ALIGN(addr) (((addr) + DUMP_MAX_PAGE_SIZE - 1) & DUMP_MAX_PAGE_MASK)
27661 +
27662 +#define DUMP_HEADER_OFFSET DUMP_MAX_PAGE_SIZE
27663 +
27664 +#define DUMP_EF_PAGE_SHIFT DUMP_MIN_PAGE_SHIFT
27665 +
27666 +#define DUMP_PAGE_SHIFT DUMP_MIN_PAGE_SHIFT
27667 +#define DUMP_PAGE_SIZE DUMP_MIN_PAGE_SIZE
27668 +#define DUMP_PAGE_MASK DUMP_MIN_PAGE_MASK
27669 +#define DUMP_PAGE_ALIGN(addr) DUMP_MIN_PAGE_ALIGN(addr)
27670 +
27671 +struct kl_ia64_fpreg {
27672 + union {
27673 + unsigned long bits[2];
27674 + long double __dummy; /* force 16-byte alignment */
27675 + } u;
27676 +};
27677 +
27678 +struct kl_pt_regs_ia64 {
27679 + /* for 2.6 kernels only. This structure was totally different in 2.4 kernels */
27680 + unsigned long b6; /* scratch */
27681 + unsigned long b7; /* scratch */
27682 +
27683 + unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */
27684 + unsigned long ar_ssd; /* reserved for future use (scratch) */
27685 +
27686 + unsigned long r8; /* scratch (return value register 0) */
27687 + unsigned long r9; /* scratch (return value register 1) */
27688 + unsigned long r10; /* scratch (return value register 2) */
27689 + unsigned long r11; /* scratch (return value register 3) */
27690 +
27691 + unsigned long cr_ipsr; /* interrupted task's psr */
27692 + unsigned long cr_iip; /* interrupted task's instruction pointer */
27693 + unsigned long cr_ifs; /* interrupted task's function state */
27694 +
27695 + unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
27696 + unsigned long ar_pfs; /* prev function state */
27697 + unsigned long ar_rsc; /* RSE configuration */
27698 + /* The following two are valid only if cr_ipsr.cpl > 0: */
27699 + unsigned long ar_rnat; /* RSE NaT */
27700 + unsigned long ar_bspstore; /* RSE bspstore */
27701 +
27702 + unsigned long pr; /* 64 predicate registers (1 bit each) */
27703 + unsigned long b0; /* return pointer (bp) */
27704 + unsigned long loadrs; /* size of dirty partition << 16 */
27705 +
27706 + unsigned long r1; /* the gp pointer */
27707 + unsigned long r12; /* interrupted task's memory stack pointer */
27708 + unsigned long r13; /* thread pointer */
27709 +
27710 + unsigned long ar_fpsr; /* floating point status (preserved) */
27711 + unsigned long r15; /* scratch */
27712 +
27713 + /* The remaining registers are NOT saved for system calls. */
27714 +
27715 + unsigned long r14; /* scratch */
27716 + unsigned long r2; /* scratch */
27717 + unsigned long r3; /* scratch */
27718 +
27719 + /* The following registers are saved by SAVE_REST: */
27720 + unsigned long r16; /* scratch */
27721 + unsigned long r17; /* scratch */
27722 + unsigned long r18; /* scratch */
27723 + unsigned long r19; /* scratch */
27724 + unsigned long r20; /* scratch */
27725 + unsigned long r21; /* scratch */
27726 + unsigned long r22; /* scratch */
27727 + unsigned long r23; /* scratch */
27728 + unsigned long r24; /* scratch */
27729 + unsigned long r25; /* scratch */
27730 + unsigned long r26; /* scratch */
27731 + unsigned long r27; /* scratch */
27732 + unsigned long r28; /* scratch */
27733 + unsigned long r29; /* scratch */
27734 + unsigned long r30; /* scratch */
27735 + unsigned long r31; /* scratch */
27736 +
27737 + unsigned long ar_ccv; /* compare/exchange value (scratch) */
27738 +
27739 + /*
27740 + * * Floating point registers that the kernel considers scratch:
27741 + * */
27742 + struct kl_ia64_fpreg f6; /* scratch */
27743 + struct kl_ia64_fpreg f7; /* scratch */
27744 + struct kl_ia64_fpreg f8; /* scratch */
27745 + struct kl_ia64_fpreg f9; /* scratch */
27746 + struct kl_ia64_fpreg f10; /* scratch */
27747 + struct kl_ia64_fpreg f11; /* scratch */
27748 +} __attribute__((packed));
27749 +
27750 +/*
27751 + * Structure: dump_header_asm_t
27752 + * Function: This is the header for architecture-specific stuff. It
27753 + * follows right after the dump header.
27754 + */
27755 +typedef struct kl_dump_header_ia64_s {
27756 + /* the dump magic number -- unique to verify dump is valid */
27757 + uint64_t magic_number;
27758 + /* the version number of this dump */
27759 + uint32_t version;
27760 + /* the size of this header (in case we can't read it) */
27761 + uint32_t header_size;
27762 + /* pointer to pt_regs */
27763 + uint64_t pt_regs;
27764 + /* the dump registers */
27765 + struct kl_pt_regs_ia64 regs;
27766 + /* the rnat register saved after flushrs */
27767 + uint64_t rnat;
27768 + /* the pfs register saved after flushrs */
27769 + uint64_t pfs;
27770 + /* the bspstore register saved after flushrs */
27771 + uint64_t bspstore;
27772 +
27773 + /* smp specific */
27774 + uint32_t smp_num_cpus;
27775 + uint32_t dumping_cpu;
27776 + struct kl_pt_regs_ia64 smp_regs[KL_NR_CPUS];
27777 + uint64_t smp_current_task[KL_NR_CPUS];
27778 + uint64_t stack[KL_NR_CPUS];
27779 +} __attribute__((packed)) kl_dump_header_ia64_t;
27780 +
27781 +/* The following struct is used just to calculate the size needed
27782 + * to store per CPU info. (Make sure it is sync with the above struct)
27783 + */
27784 +struct kl_dump_CPU_info_ia64 {
27785 + struct kl_pt_regs_ia64 smp_regs;
27786 + uint64_t smp_current_task;
27787 + uint64_t stack;
27788 +} __attribute__((packed));
27789 +
27790 +/* function declarations
27791 + */
27792 +int kl_set_dumparch_ia64(void);
27793 +uint32_t dha_num_cpus_ia64(void);
27794 +kaddr_t dha_current_task_ia64(int cpuid);
27795 +int dha_cpuid_ia64(kaddr_t);
27796 +kaddr_t dha_stack_ia64(int);
27797 +kaddr_t dha_stack_ptr_ia64(int);
27798 +int kl_read_dump_header_ia64(void);
27799 +
27800 +#endif /* __KL_DUMP_IA64_H */
27801 --- /dev/null
27802 +++ b/kdb/modules/lcrash/asm/kl_types.h
27803 @@ -0,0 +1,48 @@
27804 +/*
27805 + * $Id: kl_types.h 1122 2004-12-21 23:26:23Z tjm $
27806 + *
27807 + * This file is part of libklib.
27808 + * A library which provides access to Linux system kernel dumps.
27809 + *
27810 + * Created by Silicon Graphics, Inc.
27811 + * Contributions by IBM, NEC, and others
27812 + *
27813 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
27814 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
27815 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
27816 + *
27817 + * This code is free software; you can redistribute it and/or modify
27818 + * it under the terms of the GNU Lesser Public License as published by
27819 + * the Free Software Foundation; either version 2.1 of the License, or
27820 + * (at your option) any later version. See the file COPYING for more
27821 + * information.
27822 + */
27823 +
27824 +#ifndef __ASMIA64_KL_TYPES_H
27825 +#define __ASMIA64_KL_TYPES_H
27826 +
27827 +/* cpw */
27828 +/* was #include <kl_dump_ia64.h> */
27829 +#include "kl_dump_ia64.h"
27830 +
27831 +#define HOST_ARCH_IA64
27832 +/* cpw: add this, as otherwise comes from makefile */
27833 +#define DUMP_ARCH_IA64
27834 +
27835 +/* Format string that allows a single fprintf() call to work for both
27836 + * 32-bit and 64-bit pointer values (architecture specific).
27837 + */
27838 +#ifdef CONFIG_X86_32
27839 +#define FMT64 "ll"
27840 +#else
27841 +#define FMT64 "l"
27842 +#endif
27843 +#define FMTPTR "l"
27844 +
27845 +/* for usage in common code where host architecture
27846 + * specific type/macro is needed
27847 + */
27848 +typedef kl_dump_header_ia64_t kl_dump_header_asm_t;
27849 +#define KL_DUMP_ASM_MAGIC_NUMBER KL_DUMP_MAGIC_NUMBER_IA64
27850 +
27851 +#endif /* __ASMIA64_KL_TYPES_H */
27852 --- /dev/null
27853 +++ b/kdb/modules/lcrash/kl_alloc.h
27854 @@ -0,0 +1,124 @@
27855 +/*
27856 + * $Id: kl_alloc.h 1122 2004-12-21 23:26:23Z tjm $
27857 + *
27858 + * This file is part of libutil.
27859 + * A library which provides auxiliary functions.
27860 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
27861 + *
27862 + * Created by Silicon Graphics, Inc.
27863 + * Contributions by IBM, NEC, and others
27864 + *
27865 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
27866 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
27867 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
27868 + *
27869 + * This code is free software; you can redistribute it and/or modify
27870 + * it under the terms of the GNU Lesser Public License as published by
27871 + * the Free Software Foundation; either version 2.1 of the License, or
27872 + * (at your option) any later version. See the file COPYING for more
27873 + * information.
27874 + */
27875 +
27876 +#ifndef __KL_ALLOC_H
27877 +#define __KL_ALLOC_H
27878 +
27879 +/**
27880 + ** Header file for kl_alloc.c module
27881 + **
27882 + **/
27883 +
27884 +#define K_TEMP 1
27885 +#define K_PERM 2
27886 +
27887 +/** function prototypes for register functions
27888 + **/
27889 +
27890 +/* Memory block allocator. Returns a pointer to an allocated block
27891 + * of size bytes. In case of error, a NULL pointer will be returned
27892 + * and errno will be set to indicate exactly what error occurred.
27893 + * Note that the flag value will determine if the block allocated is
27894 + * temporary (can be freed via a call to kl_free_temp_blks()) or
27895 + * permenant (must be freed with a call to kl_free_block())..
27896 + */
27897 +typedef void * (*klib_block_alloc_func) (
27898 + int /* size of block required */,
27899 + int /* flag value */,
27900 + void * /* return address */);
27901 +
27902 +/* Memory block reallocator. Returns a pointer to a block of new_size
27903 + * bytes. In case of error, a NULL pointer will be returned and
27904 + * errno will be set to indicate exactly what error occurred.
27905 + * Note that the flag value will determine if the block allocated is
27906 + * temporary (can be free via a call to kl_free_temp_blks()) or
27907 + * permenant.
27908 + */
27909 +typedef void * (*klib_block_realloc_func) (
27910 + void * /* pointer to block to realloc */,
27911 + int /* size of new block required */,
27912 + int /* flag value */,
27913 + void * /* return address */);
27914 +
27915 +/* Memory block duplicator. Returns a pointer to a block that is
27916 + * a copy of the block passed in via pointer. In case of error, a
27917 + * NULL pointer will be returned and errno will be set to indicate
27918 + * exactly what error occurred. Note that the flag value will
27919 + * determine if the block allocated is temporary (will be freed
27920 + * via a call to kl_free_temp_blks()) or permenant. Note that this
27921 + * function is only supported when liballoc is used (there is no
27922 + * way to tell the size of a malloced block.
27923 + */
27924 +typedef void * (*klib_block_dup_func) (
27925 + void * /* pointer to block to dup */,
27926 + int /* flag value */,
27927 + void * /* return address */);
27928 +
27929 +/* Allocates a block large enough to hold a string (plus the terminating
27930 + * NULL character).
27931 + */
27932 +typedef void * (*klib_str_to_block_func) (
27933 + char * /* pointer to character string */,
27934 + int /* flag value */,
27935 + void * /* return address */);
27936 +
27937 +/* Frees blocks that were previously allocated.
27938 + */
27939 +typedef void (*klib_block_free_func) (
27940 + void * /* pointer to block */);
27941 +
27942 +/* alloc block wrapper function table structure
27943 + */
27944 +typedef struct alloc_functions_s {
27945 + int flag; /* Functions initialized? */
27946 + klib_block_alloc_func block_alloc; /* Returns ptr to block */
27947 + klib_block_realloc_func block_realloc; /* Returns ptr to new blk */
27948 + klib_block_dup_func block_dup; /* Returns ptr to new blk */
27949 + klib_str_to_block_func str_to_block; /* Returns ptr to new blk */
27950 + klib_block_free_func block_free; /* Frees memory block */
27951 +} alloc_functions_t;
27952 +
27953 +extern alloc_functions_t alloc_functions;
27954 +
27955 +/* Macros for accessing functions in alloc_functions table
27956 + */
27957 +#define KL_BLOCK_ALLOC() (alloc_functions.block_alloc)
27958 +#define KL_BLOCK_REALLOC() (alloc_functions.block_realloc)
27959 +#define KL_BLOCK_DUP() (alloc_functions.block_dup)
27960 +#define KL_STR_TO_BLOCK() (alloc_functions.str_to_block)
27961 +#define KL_BLOCK_FREE() (alloc_functions.block_free)
27962 +
27963 +void *_kl_alloc_block(int, int, void *);
27964 +void *_kl_realloc_block(void *, int, int, void *);
27965 +void *_kl_dup_block(void *, int, void *);
27966 +void *_kl_str_to_block(char *, int, void *);
27967 +#if 0
27968 +cpw: we create a new wrappers for these:
27969 +void kl_free_block(void *);
27970 +
27971 +#define kl_alloc_block(size, flags) _kl_alloc_block(size, flags, kl_get_ra())
27972 +#endif
27973 +#define kl_realloc_block(b, new_size, flags) \
27974 + _kl_realloc_block(b, new_size, flags, kl_get_ra())
27975 +#define kl_dup_block(b, flags) _kl_dup_block(b, flags, kl_get_ra())
27976 +#define kl_str_to_block(s, flags) _kl_str_to_block(s, flags, kl_get_ra())
27977 +
27978 +#endif /* __KL_ALLOC_H */
27979 --- /dev/null
27980 +++ b/kdb/modules/lcrash/kl_bfd.h
27981 @@ -0,0 +1,31 @@
27982 +/*
27983 + * $Id: kl_bfd.h 1122 2004-12-21 23:26:23Z tjm $
27984 + *
27985 + * This file is part of libklib.
27986 + * A library which provides access to Linux system kernel dumps.
27987 + *
27988 + * Created by Silicon Graphics, Inc.
27989 + * Contributions by IBM, NEC, and others
27990 + *
27991 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
27992 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
27993 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
27994 + *
27995 + * This code is free software; you can redistribute it and/or modify
27996 + * it under the terms of the GNU Lesser Public License as published by
27997 + * the Free Software Foundation; either version 2.1 of the License, or
27998 + * (at your option) any later version. See the file COPYING for more
27999 + * information.
28000 + */
28001 +
28002 +#ifndef __KL_BFD_H
28003 +#define __KL_BFD_H
28004 +
28005 +/* cpw: " " form: */
28006 +#include "klib.h"
28007 +
28008 +int kl_check_bfd_error(bfd_error_type);
28009 +int kl_open_elf(char*, bfd**, bfd**);
28010 +int kl_read_bfd_syminfo(maplist_t*);
28011 +
28012 +#endif /* __KL_BFD_H */
28013 --- /dev/null
28014 +++ b/kdb/modules/lcrash/kl_btnode.h
28015 @@ -0,0 +1,95 @@
28016 +/*
28017 + * $Id: kl_btnode.h 1122 2004-12-21 23:26:23Z tjm $
28018 + *
28019 + * This file is part of libutil.
28020 + * A library which provides auxiliary functions.
28021 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
28022 + *
28023 + * Created by Silicon Graphics, Inc.
28024 + * Contributions by IBM, NEC, and others
28025 + *
28026 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
28027 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
28028 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
28029 + *
28030 + * This code is free software; you can redistribute it and/or modify
28031 + * it under the terms of the GNU Lesser Public License as published by
28032 + * the Free Software Foundation; either version 2.1 of the License, or
28033 + * (at your option) any later version. See the file COPYING for more
28034 + * information.
28035 + */
28036 +
28037 +#ifndef __KL_BTNODE_H
28038 +#define __KL_BTNODE_H
28039 +
28040 +/*
28041 + * Node header struct for use in binary search tree routines
28042 + */
28043 +typedef struct btnode_s {
28044 + struct btnode_s *bt_left;
28045 + struct btnode_s *bt_right;
28046 + struct btnode_s *bt_parent;
28047 + char *bt_key;
28048 + int bt_height;
28049 +} btnode_t;
28050 +
28051 +#define DUPLICATES_OK 1
28052 +
28053 +/**
28054 + ** btnode operation function prototypes
28055 + **/
28056 +
28057 +/* Return the hight of a given btnode_s struct in a tree. In the
28058 + * event of an error (a NULL btnode_s pointer was passed in), a
28059 + * value of -1 will be returned.
28060 + */
28061 +int kl_btnode_height(
28062 + btnode_t* /* pointer to btnode_s struct */);
28063 +
28064 +/* Insert a btnode_s struct into a tree. After the insertion, the
28065 + * tree will be left in a reasonibly ballanced state. Note that, if
28066 + * the DUPLICATES_OK flag is set, duplicate keys will be inserted
28067 + * into the tree (otherwise return an error). In the event of an
28068 + * error, a value of -1 will be returned.
28069 + */
28070 +int kl_insert_btnode(
28071 + btnode_t** /* pointer to root of tree */,
28072 + btnode_t* /* pointer to btnode_s struct to insert */,
28073 + int /* flags (DUPLICATES_OK) */);
28074 +
28075 +/* Finds a btnode in a tree and removes it, making sure to keep
28076 + * the tree in a reasonably balanced state. As part of the
28077 + * delete_btnode() operation, a call will be made to the free
28078 + * function (passed in as a parameter) to free any application
28079 + * specific data.
28080 + */
28081 +int kl_delete_btnode(
28082 + btnode_t** /* pointer to the root of the btree */,
28083 + btnode_t* /* pointer to btnode_s struct to delete */,
28084 + void(*)(void*) /* pointer to function to actually free the node */,
28085 + int /* flags */);
28086 +
28087 +/* Traverse a tree looking for a particular key. In the event that
28088 + * duplicate keys are allowed in the tree, returns the first occurance
28089 + * of the search key found. A pointer to an int should be passed in
28090 + * to hold the maximum depth reached in the search. Upon success,
28091 + * returns a pointer to a btnode_s struct. Otherwise, a NULL pointer
28092 + * will be returned.
28093 + */
28094 +btnode_t *_kl_find_btnode(
28095 + btnode_t* /* pointer to btnode_s struct to start search with */,
28096 + char* /* key we are looking for */,
28097 + int* /* pointer to where max depth vlaue will be placed */,
28098 + size_t /* if nonzero compare only first n chars of key */);
28099 +#define kl_find_btnode(A, B, C) _kl_find_btnode(A, B, C, 0)
28100 +
28101 +btnode_t *kl_first_btnode(
28102 + btnode_t * /* pointer to any btnode in a btree */);
28103 +
28104 +btnode_t *kl_next_btnode(
28105 + btnode_t * /* pointer to current btnode */);
28106 +
28107 +btnode_t *kl_prev_btnode(
28108 + btnode_t * /* Pointer to current btnode */);
28109 +
28110 +#endif /* __KL_BTNODE_H */
28111 --- /dev/null
28112 +++ b/kdb/modules/lcrash/kl_cmp.h
28113 @@ -0,0 +1,102 @@
28114 +/*
28115 + * $Id: kl_cmp.h 1216 2005-07-06 10:03:13Z holzheu $
28116 + *
28117 + * This file is part of libklib.
28118 + * A library which provides access to Linux system kernel dumps.
28119 + *
28120 + * Created by Silicon Graphics, Inc.
28121 + * Contributions by IBM, NEC, and others
28122 + *
28123 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
28124 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
28125 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
28126 + *
28127 + * This code is free software; you can redistribute it and/or modify
28128 + * it under the terms of the GNU Lesser Public License as published by
28129 + * the Free Software Foundation; either version 2.1 of the License, or
28130 + * (at your option) any later version. See the file COPYING for more
28131 + * information.
28132 + */
28133 +
28134 +#ifndef __KL_CMP_H
28135 +#define __KL_CMP_H
28136 +
28137 +#define DUMP_INDEX_MAGIC 0xdeadbeef
28138 +#define DUMP_INDEX_VERSION 31900
28139 +#define NUM_BUCKETS 65535
28140 +
28141 +/*
28142 + * Definitions for compressed cached reads. I've recently lowered
28143 + * these ... If they need to be increased later, I'll do so.
28144 + */
28145 +#define CMP_HIGH_WATER_MARK 25
28146 +#define CMP_LOW_WATER_MARK 10
28147 +
28148 +#define CMP_VM_CACHED 0x01
28149 +#define CMP_VM_UNCACHED 0x02
28150 +
28151 +
28152 +/*
28153 + * This structure defines a page table entry, what each value will
28154 + * contain. Since these can be cached or uncached, we have a flags
28155 + * variable to specify this.
28156 + */
28157 +typedef struct _ptableentry {
28158 + int flags; /* flags for page in cache */
28159 + int length; /* length of page */
28160 + int cached; /* cached (1 = yes, cached) */
28161 + kaddr_t addr; /* addr of page */
28162 + char *data; /* data in page */
28163 + struct _ptableentry *next; /* ptr to next dump page */
28164 + struct _ptableentry *prev; /* ptr to prev dump page */
28165 + struct _ptableentry *nextcache; /* ptr to next cached page */
28166 + struct _ptableentry *prevcache; /* ptr to prev cached page */
28167 +} ptableentry;
28168 +
28169 +/*
28170 + * This is for the page table index from the compressed core dump.
28171 + * This is separate from the page table entries because these are
28172 + * simply addresses off of the compressed core dump, and not the
28173 + * actual data from the core dump. If we hash these values, we gain
28174 + * a lot of performance because we only have 1 to search for the
28175 + * page data, 1 to search for the index, and return if both searches
28176 + * failed.
28177 + */
28178 +typedef struct _ptableindex {
28179 + kl_dump_page_t dir; /* directory entry of page */
28180 + kaddr_t addr; /* address of page offset */
28181 + kaddr_t coreaddr; /* address of page in core */
28182 + unsigned int hash; /* hash value for this index item */
28183 + struct _ptableindex *next; /* next pointer */
28184 +} ptableindex;
28185 +
28186 +typedef struct dump_index_s {
28187 + unsigned int magic_number; /* dump index magic number */
28188 + unsigned int version_number; /* dump index version number */
28189 + /* struct timeval depends on machine, use two long values here */
28190 + struct {uint64_t tv_sec;
28191 + uint64_t tv_usec;
28192 + } timebuf; /* the time of the dump */
28193 +} __attribute__((packed)) dump_index_t;
28194 +
28195 +/* Compression function */
28196 +typedef int (*kl_compress_fn_t)(const unsigned char *old, uint32_t old_size, unsigned char *new, uint32_t size);
28197 +
28198 +/* function declarations
28199 + */
28200 +int kl_cmpreadmem(int, kaddr_t, char*, unsigned int, unsigned int);
28201 +int kl_cmpinit(
28202 + int /* fd */,
28203 + char * /* indexname */,
28204 + int /* flags */);
28205 +
28206 +/* Compression routine: No compression */
28207 +int kl_compress_none(const char *old, uint32_t old_size, char *new, uint32_t new_size);
28208 +
28209 +/* Compression routine: Run length encoding */
28210 +int kl_compress_rle(const char *old, uint32_t old_size, char *new, uint32_t new_size);
28211 +
28212 +/* Compression routine: GZIP */
28213 +int kl_compress_gzip(const unsigned char *old, uint32_t old_size, unsigned char *new, uint32_t new_size);
28214 +
28215 +#endif /* __KL_CMP_H */
28216 --- /dev/null
28217 +++ b/kdb/modules/lcrash/kl_copt.h
28218 @@ -0,0 +1,29 @@
28219 +/*
28220 + * $Id: kl_copt.h 1122 2004-12-21 23:26:23Z tjm $
28221 + *
28222 + * This file is part of libutil.
28223 + * A library which provides auxiliary functions.
28224 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
28225 + *
28226 + * Created by Silicon Graphics, Inc.
28227 + *
28228 + * Copyright (C) 2003, 2004 Silicon Graphics, Inc. All rights reserved.
28229 + *
28230 + * This code is free software; you can redistribute it and/or modify
28231 + * it under the terms of the GNU Lesser Public License as published by
28232 + * the Free Software Foundation; either version 2.1 of the License, or
28233 + * (at your option) any later version. See the file COPYING for more
28234 + * information.
28235 + */
28236 +#ifndef __KL_COPT_H
28237 +#define __KL_COPT_H
28238 +
28239 +extern int copt_ind;
28240 +extern char *copt_arg;
28241 +extern int copt_error;
28242 +
28243 +void reset_copt(void);
28244 +int is_copt(char *);
28245 +int get_copt(int, char **, const char *, char **);
28246 +
28247 +#endif /* __KL_COPT_H */
28248 --- /dev/null
28249 +++ b/kdb/modules/lcrash/kl_debug.h
28250 @@ -0,0 +1,168 @@
28251 +/*
28252 + * $Id: kl_debug.h 1196 2005-05-17 18:34:12Z tjm $
28253 + *
28254 + * This file is part of libklib.
28255 + * A library which provides access to Linux system kernel dumps.
28256 + *
28257 + * Created by Silicon Graphics, Inc.
28258 + * Contributions by IBM, NEC, and others
28259 + *
28260 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
28261 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
28262 + *
28263 + * This code is free software; you can redistribute it and/or modify
28264 + * it under the terms of the GNU Lesser Public License as published by
28265 + * the Free Software Foundation; either version 2.1 of the License, or
28266 + * (at your option) any later version. See the file COPYING for more
28267 + * information.
28268 + */
28269 +
28270 +#ifndef __KL_DEBUG_H
28271 +#define __KL_DEBUG_H
28272 +
28273 +/* generic functions for reading kerntypes in stabs and dwarf2 formats */
28274 +
28275 +#define DBG_NONE 0
28276 +#define DBG_STABS 1
28277 +#define DBG_DWARF2 2
28278 +
28279 +extern int debug_format;
28280 +
28281 +#define TYPE_NUM(X) ((uint64_t)(X) & 0xffffffff)
28282 +#define SRC_FILE(X) (((uint64_t)(X) >> 48) & 0xfff)
28283 +#define TYPE_NUM_SLOTS (255)
28284 +#define TYPE_NUM_HASH(X) \
28285 + (((SRC_FILE(X)<<1)+TYPE_NUM(X)) % (TYPE_NUM_SLOTS - 1))
28286 +
28287 +typedef struct dbg_type_s {
28288 + kltype_t st_klt; /* must be first */
28289 +
28290 + int st_bit_offset; /* from start of struct/union */
28291 + uint64_t st_type_num; /* DBG type_num */
28292 + uint64_t st_real_type; /* real type type_num */
28293 + uint64_t st_index_type; /* type_num of array index */
28294 + uint64_t st_element_type; /* type_num of array element */
28295 +} dbg_type_t;
28296 +
28297 +#define st_name st_klt.kl_name
28298 +#define st_type st_klt.kl_type
28299 +#define st_ptr st_klt.kl_ptr
28300 +#define st_flags st_klt.kl_flags
28301 +#define st_typestr st_klt.kl_typestr
28302 +#define st_size st_klt.kl_size
28303 +#define st_offset st_klt.kl_offset
28304 +#define st_low_bounds st_klt.kl_low_bounds
28305 +#define st_high_bounds st_klt.kl_high_bounds
28306 +#define st_value st_klt.kl_value
28307 +#define st_bit_size st_klt.kl_bit_size
28308 +#define st_next st_klt.kl_next
28309 +#define st_member st_klt.kl_member
28310 +#define st_realtype st_klt.kl_realtype
28311 +#define st_indextype st_klt.kl_indextype
28312 +#define st_elementtype st_klt.kl_elementtype
28313 +#define st_encoding st_klt.kl_encoding
28314 +
28315 +/* Structure containing information about a symbol entry
28316 + */
28317 +/* this must match the definition in lkcd's libklib/include/kl_debug.h */
28318 +typedef struct dbg_sym_s {
28319 + btnode_t sym_bt; /* must be first */
28320 + short sym_dbgtyp; /* STABS, DWARF2, ... */
28321 + short sym_state; /* current state */
28322 + short sym_flag; /* current flag value */
28323 + short sym_type; /* symbol type */
28324 + short sym_pvttype; /* private type */
28325 + short sym_nmlist; /* namelist index */
28326 + short sym_srcfile; /* source file index */
28327 + short sym_incfile; /* include file index */
28328 + int sym_num; /* symbol number */
28329 + int sym_off; /* symbol table offset */
28330 + int sym_stroff; /* symbol offset in string table */
28331 + uint64_t sym_typenum; /* arbitrary type number */
28332 + kltype_t *sym_kltype; /* Full type information */
28333 + struct dbg_sym_s *sym_next; /* next pointer for chaining */
28334 + struct dbg_sym_s *sym_link; /* another pointer for chaining */
28335 + int sym_dup; /* duplicate symbol */
28336 +} dbg_sym_t;
28337 +#define sym_name sym_bt.bt_key
28338 +
28339 +extern dbg_sym_t *type_tree;
28340 +extern dbg_sym_t *typedef_tree;
28341 +extern dbg_sym_t *func_tree;
28342 +extern dbg_sym_t *srcfile_tree;
28343 +extern dbg_sym_t *var_tree;
28344 +extern dbg_sym_t *xtype_tree;
28345 +extern dbg_sym_t *symlist;
28346 +extern dbg_sym_t *symlist_end;
28347 +
28348 +/* State flags
28349 + */
28350 +#define DBG_SETUP 0x1
28351 +#define DBG_SETUP_DONE 0x2
28352 +#define DBG_SETUP_FAILED 0x4
28353 +
28354 +/* Flags for identifying individual symbol types
28355 + */
28356 +#define DBG_SRCFILE 0x0001
28357 +#define DBG_TYPE 0x0002
28358 +#define DBG_TYPEDEF 0x0004
28359 +#define DBG_FUNC 0x0008
28360 +#define DBG_PARAM 0x0010
28361 +#define DBG_LINE 0x0020
28362 +#define DBG_VAR 0x0040
28363 +#define DBG_XTYPE 0x0100
28364 +#define DBG_ALL 0xffff
28365 +
28366 +/* Structure for cross referencing one type number to another
28367 + */
28368 +typedef struct dbg_hashrec_s {
28369 + uint64_t h_typenum; /* type number */
28370 + dbg_sym_t *h_ptr; /* pointer to actual type */
28371 + struct dbg_hashrec_s *h_next; /* next pointer (for hashing) */
28372 +} dbg_hashrec_t;
28373 +
28374 +extern dbg_hashrec_t *dbg_hash[];
28375 +
28376 +#define HASH_SYM 1
28377 +#define HASH_XREF 2
28378 +
28379 +/* DBG function prototypes
28380 + */
28381 +dbg_sym_t *dbg_alloc_sym(
28382 + int /* format */);
28383 +
28384 +void dbg_free_sym(
28385 + dbg_sym_t * /* dbg_sym_s pointer */);
28386 +
28387 +int dbg_setup_typeinfo(
28388 + dbg_sym_t * /* dbg_sym_s pointer */);
28389 +
28390 +int dbg_insert_sym(
28391 + dbg_sym_t * /* dbg_sym_s pointer */);
28392 +
28393 +void dbg_hash_sym(
28394 + uint64_t /* typenum */,
28395 + dbg_sym_t * /* dbg_sym_s pointer */);
28396 +
28397 +dbg_type_t *dbg_walk_hash(
28398 + int * /* pointer to hash index */,
28399 + void ** /* pointer to hash record pointer */);
28400 +
28401 +dbg_sym_t *dbg_find_sym(
28402 + char * /* name */,
28403 + int /* type number */,
28404 + uint64_t /* typenum */);
28405 +
28406 +dbg_sym_t *dbg_first_sym(
28407 + int /* type number */);
28408 +
28409 +dbg_sym_t *dbg_next_sym(
28410 + dbg_sym_t * /* dbg_sym_s pointer */);
28411 +
28412 +dbg_sym_t *dbg_prev_sym(
28413 + dbg_sym_t * /* dbg_sym_s pointer */);
28414 +
28415 +dbg_type_t *dbg_find_typenum(
28416 + uint64_t /* typenum */);
28417 +
28418 +#endif /* __KL_DEBUG_H */
28419 --- /dev/null
28420 +++ b/kdb/modules/lcrash/kl_dump.h
28421 @@ -0,0 +1,511 @@
28422 +/*
28423 + * $Id: kl_dump.h 1336 2006-10-23 23:27:06Z tjm $
28424 + *
28425 + * This file is part of libklib.
28426 + * A library which provides access to Linux system kernel dumps.
28427 + *
28428 + * Created by Silicon Graphics, Inc.
28429 + * Contributions by IBM, NEC, and others
28430 + *
28431 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
28432 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
28433 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
28434 + *
28435 + * This code is free software; you can redistribute it and/or modify
28436 + * it under the terms of the GNU Lesser Public License as published by
28437 + * the Free Software Foundation; either version 2.1 of the License, or
28438 + * (at your option) any later version. See the file COPYING for more
28439 + * information.
28440 + */
28441 +
28442 +#ifndef __KL_DUMP_H
28443 +#define __KL_DUMP_H
28444 +
28445 +#if 0
28446 +cpw: dont need:
28447 +#include <klib.h>
28448 +#include <asm/ioctl.h>
28449 +#endif
28450 +
28451 +/*
28452 + * DUMP_DEBUG: a debug level for the kernel dump code and
28453 + * the supporting lkcd libraries in user space.
28454 + *
28455 + * 0: FALSE: No Debug Added
28456 + * 1: TRUE: Break Points
28457 + * .
28458 + * .
28459 + * .
28460 + * 6: Add Debug Data to Structures
28461 + * .
28462 + * .
28463 + * 9: Max
28464 + */
28465 +#define DUMP_DEBUG FALSE
28466 +
28467 +#if DUMP_DEBUG
28468 +void dump_bp(void); /* Called when something exceptional occures */
28469 +# define DUMP_BP() dump_bp() /* BreakPoint */
28470 +#else
28471 +# define DUMP_BP()
28472 +#endif
28473 +
28474 +
28475 +#define KL_UTS_LEN 65 /* do not change ... */
28476 +
28477 +extern int SN2_24X;
28478 +
28479 +/*
28480 + * Size of the buffer that's used to hold:
28481 + *
28482 + * 1. the dump header (paded to fill the complete buffer)
28483 + * 2. the possibly compressed page headers and data
28484 + */
28485 +extern uint64_t KL_DUMP_BUFFER_SIZE;
28486 +extern uint64_t KL_DUMP_HEADER_SIZE;
28487 +
28488 +#if 0
28489 +/* Variables that contain page size, mask etc. used in dump format
28490 + * (this is not the system page size stored in the dump header)
28491 + */
28492 +uint64_t KL_DUMP_PAGE_SIZE;
28493 +uint64_t KL_DUMP_PAGE_MASK;
28494 +uint64_t KL_DUMP_PAGE_SHIFT;
28495 +#endif
28496 +
28497 +/* Dump header offset changed from 4k to 64k to support multiple page sizes */
28498 +#define KL_DUMP_HEADER_OFFSET (1ULL << 16)
28499 +
28500 +
28501 +/* header definitions for dumps from s390 standalone dump tools */
28502 +#define KL_DUMP_MAGIC_S390SA 0xa8190173618f23fdULL /* s390sa magic number */
28503 +#define KL_DUMP_HEADER_SZ_S390SA 4096
28504 +
28505 +/* standard header definitions */
28506 +#define KL_DUMP_MAGIC_NUMBER 0xa8190173618f23edULL /* dump magic number */
28507 +#define KL_DUMP_MAGIC_LIVE 0xa8190173618f23cdULL /* live magic number */
28508 +#define KL_DUMP_MAGIC_ASM 0xdeaddeadULL /* generic arch magic number */
28509 +#define KL_DUMP_VERSION_NUMBER 0x8 /* dump version number */
28510 +#define KL_DUMP_PANIC_LEN 0x100 /* dump panic string length */
28511 +
28512 +/* dump levels - type specific stuff added later -- add as necessary */
28513 +#define KL_DUMP_LEVEL_NONE 0x0 /* no dumping at all -- just bail */
28514 +#define KL_DUMP_LEVEL_HEADER 0x1 /* kernel dump header only */
28515 +#define KL_DUMP_LEVEL_KERN 0x2 /* dump header and kernel pages */
28516 +#define KL_DUMP_LEVEL_USED 0x4 /* dump header, kernel/user pages */
28517 +#define KL_DUMP_LEVEL_ALL_RAM 0x8 /* dump header, all RAM pages */
28518 +#define KL_DUMP_LEVEL_ALL 0x10 /* dump all memory RAM and firmware */
28519 +
28520 +/* dump compression options -- add as necessary */
28521 +#define KL_DUMP_COMPRESS_NONE 0x0 /* don't compress this dump */
28522 +#define KL_DUMP_COMPRESS_RLE 0x1 /* use RLE compression */
28523 +#define KL_DUMP_COMPRESS_GZIP 0x2 /* use GZIP compression */
28524 +
28525 +/* dump flags - any dump-type specific flags -- add as necessary */
28526 +#define KL_DUMP_FLAGS_NONE 0x0 /* no flags are set for this dump */
28527 +#define KL_DUMP_FLAGS_NONDISRUPT 0x1 /* try to keep running after dump */
28528 +#define KL_DUMP_FLAGS_DISKDUMP 0x80000000 /* dump to local disk */
28529 +#define KL_DUMP_FLAGS_NETDUMP 0x40000000 /* dump to network device */
28530 +
28531 +/* dump header flags -- add as necessary */
28532 +#define KL_DUMP_DH_FLAGS_NONE 0x0 /* no flags set (error condition!) */
28533 +#define KL_DUMP_DH_RAW 0x1 /* raw page (no compression) */
28534 +#define KL_DUMP_DH_COMPRESSED 0x2 /* page is compressed */
28535 +#define KL_DUMP_DH_END 0x4 /* end marker on a full dump */
28536 +#define KL_DUMP_DH_TRUNCATED 0x8 /* dump is incomplete */
28537 +#define KL_DUMP_DH_TEST_PATTERN 0x10 /* dump page is a test pattern */
28538 +#define KL_DUMP_DH_NOT_USED 0x20 /* 1st bit not used in flags */
28539 +
28540 +/* dump ioctl() control options */
28541 +#ifdef IOCTL26
28542 +#define DIOSDUMPDEV _IOW('p', 0xA0, unsigned int) /* set the dump device */
28543 +#define DIOGDUMPDEV _IOR('p', 0xA1, unsigned int) /* get the dump device */
28544 +#define DIOSDUMPLEVEL _IOW('p', 0xA2, unsigned int) /* set the dump level */
28545 +#define DIOGDUMPLEVEL _IOR('p', 0xA3, unsigned int) /* get the dump level */
28546 +#define DIOSDUMPFLAGS _IOW('p', 0xA4, unsigned int) /* set the dump flag parameters */
28547 +#define DIOGDUMPFLAGS _IOR('p', 0xA5, unsigned int) /* get the dump flag parameters */
28548 +#define DIOSDUMPCOMPRESS _IOW('p', 0xA6, unsigned int) /* set the dump compress level */
28549 +#define DIOGDUMPCOMPRESS _IOR('p', 0xA7, unsigned int) /* get the dump compress level */
28550 +
28551 +/* these ioctls are used only by netdump module */
28552 +#define DIOSTARGETIP _IOW('p', 0xA8, unsigned int) /* set the target m/c's ip */
28553 +#define DIOGTARGETIP _IOR('p', 0xA9, unsigned int) /* get the target m/c's ip */
28554 +#define DIOSTARGETPORT _IOW('p', 0xAA, unsigned int) /* set the target m/c's port */
28555 +#define DIOGTARGETPORT _IOR('p', 0xAB, unsigned int) /* get the target m/c's port */
28556 +#define DIOSSOURCEPORT _IOW('p', 0xAC, unsigned int) /* set the source m/c's port */
28557 +#define DIOGSOURCEPORT _IOR('p', 0xAD, unsigned int) /* get the source m/c's port */
28558 +#define DIOSETHADDR _IOW('p', 0xAE, unsigned int) /* set ethernet address */
28559 +#define DIOGETHADDR _IOR('p', 0xAF, unsigned int) /* get ethernet address */
28560 +#define DIOGDUMPOKAY _IOR('p', 0xB0, unsigned int) /* check if dump is configured */
28561 +#define DIOSDUMPTAKE _IOW('p', 0xB1, unsigned int) /* take a manual dump */
28562 +#else
28563 +#define DIOSDUMPDEV 1 /* set the dump device */
28564 +#define DIOGDUMPDEV 2 /* get the dump device */
28565 +#define DIOSDUMPLEVEL 3 /* set the dump level */
28566 +#define DIOGDUMPLEVEL 4 /* get the dump level */
28567 +#define DIOSDUMPFLAGS 5 /* set the dump flag parameters */
28568 +#define DIOGDUMPFLAGS 6 /* get the dump flag parameters */
28569 +#define DIOSDUMPCOMPRESS 7 /* set the dump compress level */
28570 +#define DIOGDUMPCOMPRESS 8 /* get the dump compress level */
28571 +#define DIOSTARGETIP 9 /* set the target m/c's ip */
28572 +#define DIOGTARGETIP 10 /* get the target m/c's ip */
28573 +#define DIOSTARGETPORT 11 /* set the target m/c's port */
28574 +#define DIOGTARGETPORT 12 /* get the target m/c's port */
28575 +#define DIOSSOURCEPORT 13 /* set the source m/c's port */
28576 +#define DIOGSOURCEPORT 14 /* get the source m/c's port */
28577 +#define DIOSETHADDR 15 /* set ethernet address */
28578 +#define DIOGETHADDR 16 /* get ethernet address */
28579 +#define DIOGDUMPOKAY 17 /* check if dump is configured */
28580 +#define DIOSDUMPTAKE 18 /* take a manual dump */
28581 +#endif
28582 +
28583 +/*
28584 + * structures
28585 + */
28586 +
28587 +/* This is the header dumped at the top of every valid crash dump.
28588 + */
28589 +typedef struct kl_dump_header_s {
28590 + uint64_t magic_number; /* dump magic number, unique to verify dump */
28591 + uint32_t version; /* version number of this dump */
28592 + uint32_t header_size; /* size of this header */
28593 + uint32_t dump_level; /* level of this dump */
28594 + /* FIXME: rename page_size to dump_page_size
28595 + * The size of a hardware/physical memory page (DUMP_PAGE_SIZE).
28596 + * NB: Not the configurable system page (PAGE_SIZE) (4K, 8K, 16K, etc.)
28597 + */
28598 +/* uint32_t dh_dump_page_size; */
28599 + uint32_t page_size; /* page size (e.g. 4K, 8K, 16K, etc.) */
28600 + uint64_t memory_size; /* size of entire physical memory */
28601 + uint64_t memory_start; /* start of physical memory */
28602 + uint64_t memory_end; /* end of physical memory */
28603 +#if DUMP_DEBUG >= 6
28604 + uint64_t num_bytes; /* number of bytes in this dump */
28605 +#endif
28606 + /* the number of dump pages in this dump specifically */
28607 + uint32_t num_dump_pages;
28608 + char panic_string[KL_DUMP_PANIC_LEN]; /* panic string, if available*/
28609 +
28610 + /* timeval depends on machine, two long values */
28611 + struct {uint64_t tv_sec;
28612 + uint64_t tv_usec;
28613 + } time; /* the time of the system crash */
28614 +
28615 + /* the NEW utsname (uname) information -- in character form */
28616 + /* we do this so we don't have to include utsname.h */
28617 + /* plus it helps us be more architecture independent */
28618 + char utsname_sysname[KL_UTS_LEN];
28619 + char utsname_nodename[KL_UTS_LEN];
28620 + char utsname_release[KL_UTS_LEN];
28621 + char utsname_version[KL_UTS_LEN];
28622 + char utsname_machine[KL_UTS_LEN];
28623 + char utsname_domainname[KL_UTS_LEN];
28624 +
28625 + uint64_t current_task; /* fixme: better use uint64_t here */
28626 + uint32_t dump_compress; /* compression type used in this dump */
28627 + uint32_t dump_flags; /* any additional flags */
28628 + uint32_t dump_device; /* any additional flags */
28629 + uint64_t dump_buffer_size; /* version >= 9 */
28630 +} __attribute__((packed)) kl_dump_header_t;
28631 +
28632 +/* This is the header used by the s390 standalone dump tools
28633 + */
28634 +typedef struct kl_dump_header_s390sa_s {
28635 + uint64_t magic_number; /* magic number for this dump (unique)*/
28636 + uint32_t version; /* version number of this dump */
28637 + uint32_t header_size; /* size of this header */
28638 + uint32_t dump_level; /* the level of this dump (just a header?) */
28639 + uint32_t page_size; /* page size of dumped Linux (4K,8K,16K etc.) */
28640 + uint64_t memory_size; /* the size of all physical memory */
28641 + uint64_t memory_start; /* the start of physical memory */
28642 + uint64_t memory_end; /* the end of physical memory */
28643 + uint32_t num_pages; /* number of pages in this dump */
28644 + uint32_t pad; /* ensure 8 byte alignment for tod and cpu_id */
28645 + uint64_t tod; /* the time of the dump generation */
28646 + uint64_t cpu_id; /* cpu id */
28647 + uint32_t arch_id;
28648 + uint32_t build_arch_id;
28649 +#define KL_DH_ARCH_ID_S390X 2
28650 +#define KL_DH_ARCH_ID_S390 1
28651 +} __attribute__((packed)) kl_dump_header_s390sa_t;
28652 +
28653 +/* Header associated to each physical page of memory saved in the system
28654 + * crash dump.
28655 + */
28656 +typedef struct kl_dump_page_s {
28657 +#if DUMP_DEBUG >= 6
28658 + uint64_t byte_offset; /* byte offset */
28659 + uint64_t page_index; /* page index */
28660 +#endif
28661 + uint64_t address; /* the address of this dump page */
28662 + uint32_t size; /* the size of this dump page */
28663 + uint32_t flags; /* flags (DUMP_COMPRESSED, DUMP_RAW or DUMP_END) */
28664 +} __attribute__((packed)) kl_dump_page_t;
28665 +
28666 +/* CORE_TYPE indicating type of dump
28667 + */
28668 +typedef enum {
28669 + dev_kmem, /* image of /dev/kmem, a running kernel */
28670 + reg_core, /* Regular (uncompressed) core file */
28671 + s390_core, /* s390 core file */
28672 + cmp_core, /* compressed core file */
28673 + unk_core /* unknown core type */
28674 +} CORE_TYPE;
28675 +
28676 +/* function to determine kernel stack for task */
28677 +typedef kaddr_t(*kl_kernelstack_t) (kaddr_t);
28678 +/* map virtual address to physical one */
28679 +typedef int(*kl_virtop_t)(kaddr_t, void*, kaddr_t*);
28680 +/* function to perform page-table traversal */
28681 +typedef kaddr_t(*kl_mmap_virtop_t)(kaddr_t, void*);
28682 +/* XXX description */
28683 +typedef int(*kl_valid_physmem_t)(kaddr_t, int);
28684 +/* XXX description */
28685 +typedef kaddr_t(*kl_next_valid_physaddr_t)(kaddr_t);
28686 +/* write a dump-header-asm, if analyzing a live system */
28687 +typedef int(*kl_write_dump_header_asm_t)(void*);
28688 +/* redirect addresses pointing into task_union areas for running tasks */
28689 +typedef kaddr_t(*kl_fix_vaddr_t)(kaddr_t, size_t);
28690 +/* initialize mapping of virtual to physical addresses */
28691 +typedef int (*kl_init_virtop_t)(void);
28692 +
28693 +/* struct storing dump architecture specific values
28694 + */
28695 +typedef struct kl_dumparch_s {
28696 + int arch; /* KL_ARCH_ */
28697 + int ptrsz; /* 32 or 64 bit */
28698 + int byteorder; /* KL_LITTLE_ENDIAN or KL_BIG_ENDIAN */
28699 + uint64_t pageoffset; /* PAGE_OFFSET */
28700 + uint64_t kstacksize; /* size of kernel stack */
28701 + uint64_t pgdshift; /* PGDIR_SHIFT */
28702 + uint64_t pgdsize; /* PGDIR_SIZE */
28703 + uint64_t pgdmask; /* PGDIR_MASK */
28704 + uint64_t pmdshift; /* PMD_SHIFT */
28705 + uint64_t pmdsize; /* PMD_SIZE */
28706 + uint64_t pmdmask; /* PMD_MASK */
28707 + uint64_t pageshift; /* PAGE_SHIFT */
28708 + uint64_t pagesize; /* PAGE_SIZE */
28709 + uint64_t pagemask; /* PAGE_MASK */
28710 + uint32_t ptrsperpgd; /* PTRS_PER_PGD */
28711 + uint32_t ptrsperpmd; /* PTRS_PER_PMD */
28712 + uint32_t ptrsperpte; /* PTRS_PER_PTE */
28713 + kl_kernelstack_t kernelstack; /* determine kernel stack for task */
28714 + kl_virtop_t virtop; /* map virtual address to physical */
28715 + kl_mmap_virtop_t mmap_virtop; /* traverse page table */
28716 + kl_valid_physmem_t valid_physmem; /* XXX description */
28717 + kl_next_valid_physaddr_t next_valid_physaddr; /* XXX description */
28718 + kl_fix_vaddr_t fix_vaddr; /* XXX description */
28719 + uint32_t dha_size; /* size of kl_dump_header_xxx_t */
28720 + kl_write_dump_header_asm_t write_dha; /* XXX description */
28721 + kl_init_virtop_t init_virtop; /* init address translation */
28722 +} kl_dumparch_t;
28723 +
28724 +/* function types for dumpaccess */
28725 +typedef kaddr_t (*kl_get_ptr_t) (void*);
28726 +typedef uint8_t (*kl_get_uint8_t) (void*);
28727 +typedef uint16_t(*kl_get_uint16_t)(void*);
28728 +typedef uint32_t(*kl_get_uint32_t)(void*);
28729 +typedef uint64_t(*kl_get_uint64_t)(void*);
28730 +/* function types for dumpaccess */
28731 +typedef kaddr_t (*kl_read_ptr_t) (kaddr_t);
28732 +typedef uint8_t (*kl_read_uint8_t) (kaddr_t);
28733 +typedef uint16_t (*kl_read_uint16_t)(kaddr_t);
28734 +typedef uint32_t (*kl_read_uint32_t)(kaddr_t);
28735 +typedef uint64_t (*kl_read_uint64_t)(kaddr_t);
28736 +
28737 +/* struct to store dump architecture specific functions
28738 + */
28739 +typedef struct kl_dumpaccess_s {
28740 + /* get integer value from memory, previously read from dump */
28741 + kl_get_ptr_t get_ptr;
28742 + kl_get_uint8_t get_uint8;
28743 + kl_get_uint16_t get_uint16;
28744 + kl_get_uint32_t get_uint32;
28745 + kl_get_uint64_t get_uint64;
28746 + /* read integer value from dump (from physical address) */
28747 + kl_read_ptr_t read_ptr;
28748 + kl_read_uint8_t read_uint8;
28749 + kl_read_uint16_t read_uint16;
28750 + kl_read_uint32_t read_uint32;
28751 + kl_read_uint64_t read_uint64;
28752 + /* read integer value from dump (from virtual address) */
28753 + kl_read_ptr_t vread_ptr;
28754 + kl_read_uint8_t vread_uint8;
28755 + kl_read_uint16_t vread_uint16;
28756 + kl_read_uint32_t vread_uint32;
28757 + kl_read_uint64_t vread_uint64;
28758 +} kl_dumpaccess_t;
28759 +
28760 +/* Struct containing sizes of frequently used kernel structures.
28761 + */
28762 +typedef struct struct_sizes_s {
28763 + int task_struct_sz;
28764 + int mm_struct_sz;
28765 + int page_sz;
28766 + int module_sz;
28767 + int new_utsname_sz;
28768 + int switch_stack_sz;
28769 + int pt_regs_sz;
28770 + int pglist_data_sz;
28771 + int runqueue_sz;
28772 +} struct_sizes_t;
28773 +
28774 +/* struct storing memory specifc values of the dumped Linux system
28775 + */
28776 +typedef struct kl_kerninfo_s{
28777 + kaddr_t num_physpages; /* number of physical pages */
28778 + kaddr_t mem_map; /* XXX description */
28779 + kaddr_t high_memory; /* physical memory size */
28780 + kaddr_t init_mm; /* address of mm_struct init_mm */
28781 + uint64_t kernel_flags; /* to indicate kernel features
28782 + * e.g. KL_IS_PAE_I386 on i386 */
28783 + int num_cpus; /* number of cpus */
28784 + kaddr_t pgdat_list; /* pgdat_list value. used as MEM_MAP */
28785 + /* not defined for DISCONTIG memory */
28786 + int linux_release; /* kernel release of dump */
28787 + struct_sizes_t struct_sizes; /* frequently needed struct sizes */
28788 +} kl_kerninfo_t;
28789 +
28790 +/* various flags to indicate Linux kernel compile switches */
28791 +#define KL_IS_PAE_I386 0x0020 /* i386 kernel with PAE support */
28792 +
28793 +/* struct where to keep whole information about the dump
28794 + */
28795 +typedef struct kl_dumpinfo_s {
28796 + CORE_TYPE core_type; /* type of core file */
28797 + char *dump; /* pathname for dump */
28798 + char *map; /* pathname for map file */
28799 + int core_fd; /* file descriptor for dump file */
28800 + int rw_flag; /* O_RDONLY/O_RDWR (/dev/kmem only) */
28801 + kl_dumparch_t arch; /* dump arch info */
28802 + kl_dumpaccess_t func; /* dump access functions */
28803 + kl_kerninfo_t mem; /* mem info for dump */
28804 +} kl_dumpinfo_t;
28805 +
28806 +/* External declarations
28807 + */
28808 +extern char *dh_typename;
28809 +extern char *dha_typename;
28810 +extern void *G_dump_header;
28811 +extern void *G_dump_header_asm;
28812 +extern kl_dump_header_t *KL_DUMP_HEADER;
28813 +extern void *KL_DUMP_HEADER_ASM;
28814 +
28815 +/* function declarations
28816 + */
28817 +
28818 +/* open dump */
28819 +int kl_open_dump(void);
28820 +
28821 +/* init sizes for some structures */
28822 +void kl_init_struct_sizes(void);
28823 +
28824 +/* init host architecture information */
28825 +int kl_setup_hostinfo(void);
28826 +
28827 +/* init dumpinfo structure */
28828 +int kl_setup_dumpinfo(char * /* map file */,
28829 + char * /* dump */,
28830 + int /* rwflag */);
28831 +
28832 +
28833 +/* init dumpinfo structure */
28834 +int kl_set_dumpinfo(char * /* map file */,
28835 + char * /* dump */,
28836 + int /* arch of dump */,
28837 + int /* rwflag */);
28838 +
28839 +/* free dumpinfo structure */
28840 +void kl_free_dumpinfo(kl_dumpinfo_t *);
28841 +
28842 +/* set memory related characteristics of dump */
28843 +int kl_set_kerninfo(void);
28844 +
28845 +/* set function pointers for dump access (depends on host and dump arch) */
28846 +int kl_set_dumpaccess(void);
28847 +
28848 +/* print contents of kl_dumpinfo_t etc. */
28849 +int kl_print_dumpinfo(int);
28850 +#define KL_INFO_ALL 0
28851 +#define KL_INFO_ENDIAN 1
28852 +#define KL_INFO_ARCH 2
28853 +#define KL_INFO_PTRSZ 3
28854 +#define KL_INFO_KRELEASE 4
28855 +#define KL_INFO_MEMSIZE 5
28856 +#define KL_INFO_NUMCPUS 6
28857 +
28858 +/* Functions that read data from generic dump_header */
28859 +int kl_valid_dump_magic(uint64_t);
28860 +int kl_header_swap(void *);
28861 +uint64_t kl_header_magic(void *);
28862 +int kl_valid_header(void *);
28863 +uint32_t kl_header_version(void *);
28864 +int kl_header_size(void *);
28865 +void *kl_read_header(int fd, void *);
28866 +
28867 +/* init common lkcd dump header from dump */
28868 +void kl_init_dump_header(int);
28869 +
28870 +/* try to evalutate arch from lkcd 4.1 (version <= 7) dump header */
28871 +int kl_dump_arch_4_1(void *);
28872 +
28873 +/* swap dump header values if necessary */
28874 +void kl_swap_dump_header_reg(kl_dump_header_t* dh);
28875 +void kl_swap_dump_header_s390sa(kl_dump_header_s390sa_t* dh);
28876 +
28877 +/* Read dump header in from dump */
28878 +int kl_read_dump_header(void);
28879 +int kl_read_dump_header_asm(void);
28880 +
28881 +/* Determine the architecure of dump */
28882 +int kl_set_dumparch(int);
28883 +
28884 +/* Finish setting up for access to dump */
28885 +int kl_setup_dumpaccess(int);
28886 +
28887 +/* get the raw dump header */
28888 +int kl_get_raw_dh(int);
28889 +int kl_get_raw_asm_dh(int);
28890 +
28891 +/* get common lkcd dump header */
28892 +int kl_get_dump_header(kl_dump_header_t*);
28893 +
28894 +/* get older style dump headers */
28895 +kl_dump_header_t *get_dump_header_4_1(void *);
28896 +kl_dump_header_t *get_dump_header_SN2_24X(void *);
28897 +
28898 +/* get task that was running when dump was started */
28899 +kaddr_t kl_dumptask(void);
28900 +
28901 +/* Print dump header */
28902 +int kl_print_dump_header(const char* dump);
28903 +
28904 +/* Print dump regular header */
28905 +void kl_print_dump_header_reg(kl_dump_header_t *);
28906 +
28907 +/* Print s390 dump header */
28908 +void kl_print_dump_header_s390(char*);
28909 +
28910 +/* Convert s390 to reg header */
28911 +void kl_s390sa_to_reg_header(kl_dump_header_s390sa_t*, kl_dump_header_t*);
28912 +
28913 +/* Byte swapping functions needed for Xclrash */
28914 +/* get integer value from buffer and swap bytes */
28915 +kaddr_t kl_get_swap_ptr(void*);
28916 +uint16_t kl_get_swap_uint16(void*);
28917 +uint32_t kl_get_swap_uint32(void*);
28918 +uint64_t kl_get_swap_uint64(void*);
28919 +
28920 +/* read integer value from dump (physical address) and swap bytes */
28921 +kaddr_t kl_read_swap_ptr(kaddr_t);
28922 +uint16_t kl_read_swap_uint16(kaddr_t);
28923 +uint32_t kl_read_swap_uint32(kaddr_t);
28924 +uint64_t kl_read_swap_uint64(kaddr_t);
28925 +
28926 +/* read integer value from dump (virtual address) and swap bytes */
28927 +kaddr_t kl_vread_swap_ptr(kaddr_t);
28928 +uint16_t kl_vread_swap_uint16(kaddr_t);
28929 +uint32_t kl_vread_swap_uint32(kaddr_t);
28930 +uint64_t kl_vread_swap_uint64(kaddr_t);
28931 +
28932 +#endif /* __KL_DUMP_H */
28933 --- /dev/null
28934 +++ b/kdb/modules/lcrash/kl_dump_arch.h
28935 @@ -0,0 +1,124 @@
28936 +/*
28937 + * $Id: kl_dump_arch.h 1122 2004-12-21 23:26:23Z tjm $
28938 + *
28939 + * This file is part of libklib.
28940 + * A library which provides access to Linux system kernel dumps.
28941 + *
28942 + * Created by Silicon Graphics, Inc.
28943 + * Contributions by IBM, NEC, and others
28944 + *
28945 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
28946 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
28947 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
28948 + *
28949 + * This code is free software; you can redistribute it and/or modify
28950 + * it under the terms of the GNU Lesser Public License as published by
28951 + * the Free Software Foundation; either version 2.1 of the License, or
28952 + * (at your option) any later version. See the file COPYING for more
28953 + * information.
28954 + */
28955 +
28956 +#ifndef __KL_DUMP_ARCH_H
28957 +#define __KL_DUMP_ARCH_H
28958 +
28959 +/* check for valid configuration
28960 + */
28961 +#if !(defined(HOST_ARCH_ALPHA) || defined(HOST_ARCH_I386) || \
28962 + defined(HOST_ARCH_IA64) || defined(HOST_ARCH_S390) || \
28963 + defined(HOST_ARCH_S390X) || defined(HOST_ARCH_ARM) || \
28964 + defined(HOST_ARCH_PPC64) || defined(HOST_ARCH_X86_64))
28965 +# error "No valid host architecture defined."
28966 +#endif
28967 +#if ((defined(HOST_ARCH_ALPHA) && \
28968 + (defined(HOST_ARCH_I386) || defined(HOST_ARCH_IA64) || \
28969 + defined(HOST_ARCH_S390) || defined(HOST_ARCH_S390X) || \
28970 + defined(HOST_ARCH_ARM) || defined(HOST_ARCH_PPC64) || \
28971 + defined(HOST_ARCH_X86_64))) || \
28972 + (defined(HOST_ARCH_I386) && \
28973 + (defined(HOST_ARCH_IA64) || defined(HOST_ARCH_S390) || \
28974 + defined(HOST_ARCH_S390X)|| defined(HOST_ARCH_ARM) || \
28975 + defined(HOST_ARCH_PPC64)|| defined(HOST_ARCH_X86_64))) || \
28976 + (defined(HOST_ARCH_IA64) && \
28977 + (defined(HOST_ARCH_S390)|| defined(HOST_ARCH_S390X) || \
28978 + defined(HOST_ARCH_ARM) || defined(HOST_ARCH_PPC64) || \
28979 + defined(HOST_ARCH_X86_64))) || \
28980 + (defined(HOST_ARCH_S390) && \
28981 + (defined(HOST_ARCH_S390X) || defined(HOST_ARCH_ARM) || \
28982 + defined(HOST_ARCH_PPC64) || defined(HOST_ARCH_X86_64))) || \
28983 + (defined(HOST_ARCH_S390X) && \
28984 + (defined(HOST_ARCH_ARM) || defined(HOST_ARCH_PPC64) || \
28985 + defined(HOST_ARCH_X86_64))) || \
28986 + (defined(HOST_ARCH_ARM) && \
28987 + (defined(HOST_ARCH_PPC64) || defined(HOST_ARCH_X86_64))) || \
28988 + (defined(HOST_ARCH_PPC64) && defined(HOST_ARCH_X86_64)))
28989 +# error "More than one valid host architectures defined."
28990 +#endif
28991 +#if !(defined(DUMP_ARCH_ALPHA) || defined(DUMP_ARCH_I386) || \
28992 + defined(DUMP_ARCH_IA64) || defined(DUMP_ARCH_S390) || \
28993 + defined(DUMP_ARCH_S390X) || defined(DUMP_ARCH_ARM) || \
28994 + defined(DUMP_ARCH_PPC64) || defined(DUMP_ARCH_X86_64))
28995 +# error "No valid dump architecture defined."
28996 +#endif
28997 +
28998 +/* optional: check that host arch equals one supported dump arch
28999 + */
29000 +#ifdef SUPPORT_HOST_ARCH
29001 +# if (defined(HOST_ARCH_ALPHA) && !defined(DUMP_ARCH_ALPHA)) || \
29002 + (defined(HOST_ARCH_I386) && !defined(DUMP_ARCH_I386)) || \
29003 + (defined(HOST_ARCH_IA64) && !defined(DUMP_ARCH_IA64)) || \
29004 + (defined(HOST_ARCH_S390) && !defined(DUMP_ARCH_S390)) || \
29005 + (defined(HOST_ARCH_S390X) && !defined(DUMP_ARCH_S390X)) || \
29006 + (defined(HOST_ARCH_ARM) && !defined(DUMP_ARCH_ARM)) || \
29007 + (defined(HOST_ARCH_PPC64) && !defined(DUMP_ARCH_PPC64)) || \
29008 + (defined(HOST_ARCH_X86_64) && !defined(DUMP_ARCH_X86_64))
29009 +# error "Host architecture not supported as dump architecture."
29010 +# endif
29011 +#endif
29012 +
29013 +/* include dump architecture specific stuff
29014 + */
29015 +#ifdef DUMP_ARCH_ALPHA
29016 +# include <kl_mem_alpha.h>
29017 +# include <kl_dump_alpha.h>
29018 +#endif
29019 +/* cpw: use the " " form: */
29020 +#ifdef DUMP_ARCH_IA64
29021 +# include "kl_mem_ia64.h"
29022 +# include "kl_dump_ia64.h"
29023 +#endif
29024 +#ifdef DUMP_ARCH_I386
29025 +# include <kl_mem_i386.h>
29026 +# include <kl_dump_i386.h>
29027 +#endif
29028 +#ifdef DUMP_ARCH_S390
29029 +# include <kl_mem_s390.h>
29030 +# include <kl_dump_s390.h>
29031 +#endif
29032 +#ifdef DUMP_ARCH_S390X
29033 +# include <kl_mem_s390x.h>
29034 +# include <kl_dump_s390.h>
29035 +#endif
29036 +#ifdef DUMP_ARCH_ARM
29037 +# include <kl_mem_arm.h>
29038 +# include <kl_dump_arm.h>
29039 +#endif
29040 +#ifdef DUMP_ARCH_PPC64
29041 +#include <kl_mem_ppc64.h>
29042 +#include <kl_dump_ppc64.h>
29043 +#endif
29044 +#ifdef DUMP_ARCH_X86_64
29045 +#include <kl_mem_x86_64.h>
29046 +#include <kl_dump_x86_64.h>
29047 +#endif
29048 +
29049 +/** Function prototypes
29050 + **/
29051 +int kl_init_kern_info(void);
29052 +
29053 +int kl_get_struct(
29054 + kaddr_t /* address */,
29055 + int /* size of struct */,
29056 + void * /* ptr to buffer */,
29057 + char * /* name of struct */);
29058 +
29059 +#endif /* __KL_DUMP_ARCH_H */
29060 --- /dev/null
29061 +++ b/kdb/modules/lcrash/kl_dump_ia64.h
29062 @@ -0,0 +1,199 @@
29063 +/*
29064 + * $Id: kl_dump_ia64.h 1151 2005-02-23 01:09:12Z tjm $
29065 + *
29066 + * This file is part of libklib.
29067 + * A library which provides access to Linux system kernel dumps.
29068 + *
29069 + * Created by Silicon Graphics, Inc.
29070 + * Contributions by IBM, NEC, and others
29071 + *
29072 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
29073 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29074 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29075 + *
29076 + * This code is free software; you can redistribute it and/or modify
29077 + * it under the terms of the GNU Lesser Public License as published by
29078 + * the Free Software Foundation; either version 2.1 of the License, or
29079 + * (at your option) any later version. See the file COPYING for more
29080 + * information.
29081 + */
29082 +
29083 +/* This header file holds the architecture specific crash dump header */
29084 +#ifndef __KL_DUMP_IA64_H
29085 +#define __KL_DUMP_IA64_H
29086 +
29087 +/* definitions */
29088 +#ifndef KL_NR_CPUS
29089 +# define KL_NR_CPUS 128 /* max number CPUs */
29090 +#endif
29091 +
29092 +#define KL_DUMP_MAGIC_NUMBER_IA64 0xdeaddeadULL /* magic number */
29093 +#define KL_DUMP_VERSION_NUMBER_IA64 0x4 /* version number */
29094 +
29095 +
29096 +/*
29097 + * mkswap.c calls getpagesize() to get the system page size,
29098 + * which is not necessarily the same as the hardware page size.
29099 + *
29100 + * For ia64 the kernel PAGE_SIZE can be configured from 4KB ... 16KB.
29101 + *
29102 + * The physical memory is layed out out in the hardware/minimal pages.
29103 + * This is the size we need to use for dumping physical pages.
29104 + *
29105 + * Note ths hardware/minimal page size being use in;
29106 + * arch/ia64/kernel/efi.c`efi_memmap_walk():
29107 + * curr.end = curr.start + (md->num_pages << 12);
29108 + *
29109 + * Since the system page size could change between the kernel we boot
29110 + * on the the kernel that cause the core dume we may want to have something
29111 + * more constant like the maximum system page size (See include/asm-ia64/page.h).
29112 + */
29113 +#define DUMP_MIN_PAGE_SHIFT 12
29114 +#define DUMP_MIN_PAGE_SIZE (1UL << DUMP_MIN_PAGE_SHIFT)
29115 +#define DUMP_MIN_PAGE_MASK (~(DUMP_MIN_PAGE_SIZE - 1))
29116 +#define DUMP_MIN_PAGE_ALIGN(addr) (((addr) + DUMP_MIN_PAGE_SIZE - 1) & DUMP_MIN_PAGE_MASK)
29117 +
29118 +#define DUMP_MAX_PAGE_SHIFT 16
29119 +#define DUMP_MAX_PAGE_SIZE (1UL << DUMP_MAX_PAGE_SHIFT)
29120 +#define DUMP_MAX_PAGE_MASK (~(DUMP_MAX_PAGE_SIZE - 1))
29121 +#define DUMP_MAX_PAGE_ALIGN(addr) (((addr) + DUMP_MAX_PAGE_SIZE - 1) & DUMP_MAX_PAGE_MASK)
29122 +
29123 +#define DUMP_HEADER_OFFSET DUMP_MAX_PAGE_SIZE
29124 +
29125 +#define DUMP_EF_PAGE_SHIFT DUMP_MIN_PAGE_SHIFT
29126 +
29127 +#define DUMP_PAGE_SHIFT DUMP_MIN_PAGE_SHIFT
29128 +#define DUMP_PAGE_SIZE DUMP_MIN_PAGE_SIZE
29129 +#define DUMP_PAGE_MASK DUMP_MIN_PAGE_MASK
29130 +#define DUMP_PAGE_ALIGN(addr) DUMP_MIN_PAGE_ALIGN(addr)
29131 +
29132 +struct kl_ia64_fpreg {
29133 + union {
29134 + unsigned long bits[2];
29135 + long double __dummy; /* force 16-byte alignment */
29136 + } u;
29137 +};
29138 +
29139 +struct kl_pt_regs_ia64 {
29140 + /* for 2.6 kernels only. This structure was totally different in 2.4 kernels */
29141 + unsigned long b6; /* scratch */
29142 + unsigned long b7; /* scratch */
29143 +
29144 + unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */
29145 + unsigned long ar_ssd; /* reserved for future use (scratch) */
29146 +
29147 + unsigned long r8; /* scratch (return value register 0) */
29148 + unsigned long r9; /* scratch (return value register 1) */
29149 + unsigned long r10; /* scratch (return value register 2) */
29150 + unsigned long r11; /* scratch (return value register 3) */
29151 +
29152 + unsigned long cr_ipsr; /* interrupted task's psr */
29153 + unsigned long cr_iip; /* interrupted task's instruction pointer */
29154 + unsigned long cr_ifs; /* interrupted task's function state */
29155 +
29156 + unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
29157 + unsigned long ar_pfs; /* prev function state */
29158 + unsigned long ar_rsc; /* RSE configuration */
29159 + /* The following two are valid only if cr_ipsr.cpl > 0: */
29160 + unsigned long ar_rnat; /* RSE NaT */
29161 + unsigned long ar_bspstore; /* RSE bspstore */
29162 +
29163 + unsigned long pr; /* 64 predicate registers (1 bit each) */
29164 + unsigned long b0; /* return pointer (bp) */
29165 + unsigned long loadrs; /* size of dirty partition << 16 */
29166 +
29167 + unsigned long r1; /* the gp pointer */
29168 + unsigned long r12; /* interrupted task's memory stack pointer */
29169 + unsigned long r13; /* thread pointer */
29170 +
29171 + unsigned long ar_fpsr; /* floating point status (preserved) */
29172 + unsigned long r15; /* scratch */
29173 +
29174 + /* The remaining registers are NOT saved for system calls. */
29175 +
29176 + unsigned long r14; /* scratch */
29177 + unsigned long r2; /* scratch */
29178 + unsigned long r3; /* scratch */
29179 +
29180 + /* The following registers are saved by SAVE_REST: */
29181 + unsigned long r16; /* scratch */
29182 + unsigned long r17; /* scratch */
29183 + unsigned long r18; /* scratch */
29184 + unsigned long r19; /* scratch */
29185 + unsigned long r20; /* scratch */
29186 + unsigned long r21; /* scratch */
29187 + unsigned long r22; /* scratch */
29188 + unsigned long r23; /* scratch */
29189 + unsigned long r24; /* scratch */
29190 + unsigned long r25; /* scratch */
29191 + unsigned long r26; /* scratch */
29192 + unsigned long r27; /* scratch */
29193 + unsigned long r28; /* scratch */
29194 + unsigned long r29; /* scratch */
29195 + unsigned long r30; /* scratch */
29196 + unsigned long r31; /* scratch */
29197 +
29198 + unsigned long ar_ccv; /* compare/exchange value (scratch) */
29199 +
29200 + /*
29201 + * * Floating point registers that the kernel considers scratch:
29202 + * */
29203 + struct kl_ia64_fpreg f6; /* scratch */
29204 + struct kl_ia64_fpreg f7; /* scratch */
29205 + struct kl_ia64_fpreg f8; /* scratch */
29206 + struct kl_ia64_fpreg f9; /* scratch */
29207 + struct kl_ia64_fpreg f10; /* scratch */
29208 + struct kl_ia64_fpreg f11; /* scratch */
29209 +} __attribute__((packed));
29210 +
29211 +/*
29212 + * Structure: dump_header_asm_t
29213 + * Function: This is the header for architecture-specific stuff. It
29214 + * follows right after the dump header.
29215 + */
29216 +typedef struct kl_dump_header_ia64_s {
29217 + /* the dump magic number -- unique to verify dump is valid */
29218 + uint64_t magic_number;
29219 + /* the version number of this dump */
29220 + uint32_t version;
29221 + /* the size of this header (in case we can't read it) */
29222 + uint32_t header_size;
29223 + /* pointer to pt_regs */
29224 + uint64_t pt_regs;
29225 + /* the dump registers */
29226 + struct kl_pt_regs_ia64 regs;
29227 + /* the rnat register saved after flushrs */
29228 + uint64_t rnat;
29229 + /* the pfs register saved after flushrs */
29230 + uint64_t pfs;
29231 + /* the bspstore register saved after flushrs */
29232 + uint64_t bspstore;
29233 +
29234 + /* smp specific */
29235 + uint32_t smp_num_cpus;
29236 + uint32_t dumping_cpu;
29237 + struct kl_pt_regs_ia64 smp_regs[KL_NR_CPUS];
29238 + uint64_t smp_current_task[KL_NR_CPUS];
29239 + uint64_t stack[KL_NR_CPUS];
29240 +} __attribute__((packed)) kl_dump_header_ia64_t;
29241 +
29242 +/* The following struct is used just to calculate the size needed
29243 + * to store per CPU info. (Make sure it is sync with the above struct)
29244 + */
29245 +struct kl_dump_CPU_info_ia64 {
29246 + struct kl_pt_regs_ia64 smp_regs;
29247 + uint64_t smp_current_task;
29248 + uint64_t stack;
29249 +} __attribute__((packed));
29250 +
29251 +/* function declarations
29252 + */
29253 +int kl_set_dumparch_ia64(void);
29254 +uint32_t dha_num_cpus_ia64(void);
29255 +kaddr_t dha_current_task_ia64(int cpuid);
29256 +int dha_cpuid_ia64(kaddr_t);
29257 +kaddr_t dha_stack_ia64(int);
29258 +kaddr_t dha_stack_ptr_ia64(int);
29259 +int kl_read_dump_header_ia64(void);
29260 +
29261 +#endif /* __KL_DUMP_IA64_H */
29262 --- /dev/null
29263 +++ b/kdb/modules/lcrash/kl_dwarfs.h
29264 @@ -0,0 +1,27 @@
29265 +/*
29266 + * $Id: kl_dwarfs.h 1122 2004-12-21 23:26:23Z tjm $
29267 + *
29268 + * This file is part of libklib.
29269 + * A library which provides access to Linux system kernel dumps.
29270 + *
29271 + * Created by: Prashanth Tamraparni (prasht@in.ibm.com)
29272 + * Contributions by SGI
29273 + *
29274 + * Copyright (C) 2004 International Business Machines Corp.
29275 + * Copyright (C) 2004 Silicon Graphics, Inc. All rights reserved.
29276 + *
29277 + * This code is free software; you can redistribute it and/or modify
29278 + * it under the terms of the GNU Lesser Public License as published by
29279 + * the Free Software Foundation; either version 2.1 of the License, or
29280 + * (at your option) any later version. See the file COPYING for more
29281 + * information.
29282 + */
29283 +#ifndef __KL_DWARFS_H
29284 +#define __KL_DWARFS_H
29285 +
29286 +/* Dwarf function declarations */
29287 +
29288 +int dw_open_namelist(char*, int);
29289 +int dw_setup_typeinfo(void);
29290 +
29291 +#endif /* __KL_DWARFS_H */
29292 --- /dev/null
29293 +++ b/kdb/modules/lcrash/kl_error.h
29294 @@ -0,0 +1,266 @@
29295 +/*
29296 + * $Id: kl_error.h 1169 2005-03-02 21:38:01Z tjm $
29297 + *
29298 + * This file is part of libklib.
29299 + * A library which provides access to Linux system kernel dumps.
29300 + *
29301 + * Created by Silicon Graphics, Inc.
29302 + * Contributions by IBM, NEC, and others
29303 + *
29304 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
29305 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29306 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29307 + *
29308 + * This code is free software; you can redistribute it and/or modify
29309 + * it under the terms of the GNU Lesser Public License as published by
29310 + * the Free Software Foundation; either version 2.1 of the License, or
29311 + * (at your option) any later version. See the file COPYING for more
29312 + * information.
29313 + */
29314 +
29315 +#ifndef __KL_ERROR_H
29316 +#define __KL_ERROR_H
29317 +
29318 +extern uint64_t klib_error;
29319 +extern FILE *kl_stdout;
29320 +extern FILE *kl_stderr;
29321 +
29322 +/* Error Classes
29323 + */
29324 +#define KLEC_APP 0
29325 +#define KLEC_KLIB 1
29326 +#define KLEC_MEM 2
29327 +#define KLEC_SYM 3
29328 +#define KLEC_KERN 4
29329 +
29330 +#define KLEC_CLASS_MASK 0x00000000ff000000ULL
29331 +#define KLEC_CLASS_SHIFT 24
29332 +#define KLEC_ECODE_MASK 0x0000000000ffffffULL
29333 +#define KLEC_TYPE_MASK 0xffffffff00000000ULL
29334 +#define KLEC_TYPE_SHIFT 32
29335 +#define KLEC_CLASS(e) ((e & KLEC_CLASS_MASK) >> KLEC_CLASS_SHIFT)
29336 +#define KLEC_ECODE(e) (e & KLEC_ECODE_MASK)
29337 +#define KLEC_TYPE(e) ((e & KLEC_TYPE_MASK) >> KLEC_TYPE_SHIFT)
29338 +
29339 +void kl_reset_error(void); /* reset klib_error */
29340 +void kl_print_error(void); /* print warning/error messages */
29341 +void kl_check_error(char*); /* check for/handle errors, generate messages */
29342 +
29343 +/* FIXME: not used yet -- for changes in future, improve error handling
29344 + */
29345 +typedef struct klib_error_s{
29346 + uint32_t code; /* error code */
29347 + uint16_t class; /* error class */
29348 + uint16_t severity; /* severity of error: e.g. warning or fatal error */
29349 + uint32_t datadesc; /* description of data which caused the error */
29350 + FILE *fp; /* fp where to place warning and error messages */
29351 +} klib_error_t;
29352 +
29353 +/*
29354 + * Some macros for accessing data in klib_error
29355 + */
29356 +#define KL_ERROR klib_error
29357 +#define KL_ERRORFP kl_stderr
29358 +
29359 +/* Error codes
29360 + *
29361 + * There are basically two types of error codes -- with each type
29362 + * residing in a single word in a two word error code value. The lower
29363 + * 32-bits contains an error class and code that represents exactly
29364 + * WHAT error occurred (e.g., non-numeric text in a numeric value
29365 + * entered by a user, bad virtual address, etc.).
29366 + *
29367 + * The upper 32-bits represents what type of data was being referenced
29368 + * when the error occurred (e.g., bad proc struct). Having two tiers of
29369 + * error codes makes it easier to generate useful and specific error
29370 + * messages. Note that is possible to have situations where one or the
29371 + * other type of error codes is not set. This is OK as long as at least
29372 + * one type s set.
29373 + */
29374 +
29375 +/* General klib error codes
29376 + */
29377 +#define KLE_KLIB (KLEC_KLIB << KLEC_CLASS_SHIFT)
29378 +#define KLE_NO_MEMORY (KLE_KLIB|1)
29379 +#define KLE_OPEN_ERROR (KLE_KLIB|2)
29380 +#define KLE_ZERO_BLOCK (KLE_KLIB|3)
29381 +#define KLE_INVALID_VALUE (KLE_KLIB|4)
29382 +#define KLE_NULL_BUFF (KLE_KLIB|5)
29383 +#define KLE_ZERO_SIZE (KLE_KLIB|6)
29384 +#define KLE_ACTIVE (KLE_KLIB|7)
29385 +#define KLE_NULL_POINTER (KLE_KLIB|8)
29386 +#define KLE_UNSUPPORTED_ARCH (KLE_KLIB|9)
29387 +
29388 +#define KLE_MISC_ERROR (KLE_KLIB|97)
29389 +#define KLE_NOT_SUPPORTED (KLE_KLIB|98)
29390 +#define KLE_UNKNOWN_ERROR (KLE_KLIB|99)
29391 +
29392 +/* memory error codes
29393 + */
29394 +#define KLE_MEM (KLEC_MEM << KLEC_CLASS_SHIFT)
29395 +#define KLE_BAD_MAP_FILE (KLE_MEM|1)
29396 +#define KLE_BAD_DUMP (KLE_MEM|2)
29397 +#define KLE_BAD_DUMPTYPE (KLE_MEM|3)
29398 +#define KLE_INVALID_LSEEK (KLE_MEM|4)
29399 +#define KLE_INVALID_READ (KLE_MEM|5)
29400 +#define KLE_BAD_KERNINFO (KLE_MEM|6)
29401 +#define KLE_INVALID_PADDR (KLE_MEM|7)
29402 +#define KLE_INVALID_VADDR (KLE_MEM|8)
29403 +#define KLE_INVALID_VADDR_ALIGN (KLE_MEM|9)
29404 +#define KLE_INVALID_MAPPING (KLE_MEM|10)
29405 +#define KLE_CMP_ERROR (KLE_MEM|11)
29406 +#define KLE_INVALID_DUMP_MAGIC (KLE_MEM|12)
29407 +#define KLE_KERNEL_MAGIC_MISMATCH (KLE_MEM|13)
29408 +#define KLE_NO_END_SYMBOL (KLE_MEM|14)
29409 +#define KLE_INVALID_DUMP_HEADER (KLE_MEM|15)
29410 +#define KLE_DUMP_INDEX_CREATION (KLE_MEM|16)
29411 +#define KLE_DUMP_HEADER_ONLY (KLE_MEM|17)
29412 +#define KLE_PAGE_NOT_PRESENT (KLE_MEM|18)
29413 +#define KLE_BAD_ELF_FILE (KLE_MEM|19)
29414 +#define KLE_ARCHIVE_FILE (KLE_MEM|20)
29415 +#define KLE_MAP_FILE_PRESENT (KLE_MEM|21)
29416 +#define KLE_BAD_MAP_FILENAME (KLE_MEM|22)
29417 +#define KLE_BAD_DUMP_FILENAME (KLE_MEM|23)
29418 +#define KLE_BAD_NAMELIST_FILE (KLE_MEM|24)
29419 +#define KLE_BAD_NAMELIST_FILENAME (KLE_MEM|25)
29420 +#define KLE_LIVE_SYSTEM (KLE_MEM|26)
29421 +#define KLE_NOT_INITIALIZED (KLE_MEM|27)
29422 +
29423 +/* symbol error codes
29424 + */
29425 +#define KLE_SYM (KLEC_SYM << KLEC_CLASS_SHIFT)
29426 +#define KLE_NO_SYMTAB (KLE_SYM|1)
29427 +#define KLE_NO_SYMBOLS (KLE_SYM|2)
29428 +#define KLE_INVALID_TYPE (KLE_SYM|3)
29429 +#define KLE_NO_MODULE_LIST (KLE_SYM|4)
29430 +
29431 +/* kernel data error codes
29432 + */
29433 +#define KLE_KERN (KLEC_KERN << KLEC_CLASS_SHIFT)
29434 +#define KLE_INVALID_KERNELSTACK (KLE_KERN|1)
29435 +#define KLE_INVALID_STRUCT_SIZE (KLE_KERN|2)
29436 +#define KLE_BEFORE_RAM_OFFSET (KLE_KERN|3)
29437 +#define KLE_AFTER_MAXPFN (KLE_KERN|4)
29438 +#define KLE_AFTER_PHYSMEM (KLE_KERN|5)
29439 +#define KLE_AFTER_MAXMEM (KLE_KERN|6)
29440 +#define KLE_PHYSMEM_NOT_INSTALLED (KLE_KERN|7)
29441 +#define KLE_NO_DEFTASK (KLE_KERN|8)
29442 +#define KLE_PID_NOT_FOUND (KLE_KERN|9)
29443 +#define KLE_DEFTASK_NOT_ON_CPU (KLE_KERN|10)
29444 +#define KLE_NO_CURCPU (KLE_KERN|11)
29445 +#define KLE_NO_CPU (KLE_KERN|12)
29446 +#define KLE_SIG_ERROR (KLE_KERN|13)
29447 +#define KLE_TASK_RUNNING (KLE_KERN|14)
29448 +#define KLE_NO_SWITCH_STACK (KLE_KERN|15)
29449 +
29450 +/* Error codes that indicate what type of data was bad. These are
29451 + * placed in the upper 32-bits of klib_error.
29452 + */
29453 +#define KLE_BAD_TASK_STRUCT (((uint64_t)1)<<32)
29454 +#define KLE_BAD_SYMNAME (((uint64_t)2)<<32)
29455 +#define KLE_BAD_SYMADDR (((uint64_t)3)<<32)
29456 +#define KLE_BAD_FUNCADDR (((uint64_t)4)<<32)
29457 +#define KLE_BAD_STRUCT (((uint64_t)5)<<32)
29458 +#define KLE_BAD_FIELD (((uint64_t)6)<<32)
29459 +#define KLE_BAD_PC (((uint64_t)7)<<32)
29460 +#define KLE_BAD_RA (((uint64_t)8)<<32)
29461 +#define KLE_BAD_SP (((uint64_t)9)<<32)
29462 +#define KLE_BAD_EP (((uint64_t)10)<<32)
29463 +#define KLE_BAD_SADDR (((uint64_t)11)<<32)
29464 +#define KLE_BAD_KERNELSTACK (((uint64_t)12)<<32)
29465 +#define KLE_BAD_LINENO (((uint64_t)13)<<32)
29466 +#define KLE_MAP_FILE (((uint64_t)14)<<32)
29467 +#define KLE_DUMP (((uint64_t)15)<<32)
29468 +#define KLE_BAD_STRING (((uint64_t)16)<<32)
29469 +#define KLE_ELF_FILE (((uint64_t)17)<<32)
29470 +
29471 +/* flags for function kl_msg()
29472 + * First 3 bits define trace levels. Minimum trace threshold is trace level 1.
29473 + * So maximal 7 trace levels are possible. We are using only KLE_TRACELEVEL_MAX.
29474 + * If no trace level bits are set, it is normal output.
29475 + */
29476 +#define _KLE_TRACEBIT1 0x00000001 /* trace bit 1 */
29477 +#define _KLE_TRACEBIT2 0x00000002 /* trace bit 2 */
29478 +#define _KLE_TRACEBIT3 0x00000004 /* trace bit 3 */
29479 +#define _KLE_TRACENUM 8 /* used in _KLE_TRACENUM */
29480 +#define _KLE_TRACEMASK (_KLE_TRACENUM-1) /* mask for trace bits */
29481 +/* further flags */
29482 +#define KLE_F_NOORIGIN 0x00001000 /* do not print origin for this msg */
29483 +#define KLE_F_ERRORMSG 0x00002000 /* treat message as error message */
29484 +/* trace levels := predefined combinations of trace bits */
29485 +#define KLE_F_TRACELEVEL1 (_KLE_TRACEBIT1)
29486 +#define KLE_F_TRACELEVEL2 (_KLE_TRACEBIT2)
29487 +#define KLE_F_TRACELEVEL3 (_KLE_TRACEBIT1|_KLE_TRACEBIT2)
29488 +#define KLE_F_TRACELEVEL4 (_KLE_TRACEBIT3)
29489 +#define KLE_TRACELEVELMAX 4
29490 +#define KLE_TRACELEVEL(flg) (flg & _KLE_TRACEMASK)
29491 +#define KLE_GETTRACELEVEL(flg) \
29492 + ((KLE_TRACELEVEL(flg) > KLE_TRACELEVELMAX) ? KLE_TRACELEVELMAX : \
29493 + KLE_TRACELEVEL(flg))
29494 +
29495 +/* define debug components of libklib (64 components possible)
29496 + * used by kl_msg()
29497 + */
29498 +#define KL_DBGCOMP_ALLOC 0x0000000001 /* liballoc */
29499 +#define KL_DBGCOMP_BFD 0x0000000002 /* general bfd support */
29500 +#define KL_DBGCOMP_BTREE 0x0000000004 /* btree implementation */
29501 +#define KL_DBGCOMP_COMPRESS 0x0000000008 /* gzip/rle (de)compression */
29502 +#define KL_DBGCOMP_INIT 0x0000000010 /* klib initialization */
29503 +#define KL_DBGCOMP_MEMMAP 0x0000000020 /* memory mapping */
29504 +#define KL_DBGCOMP_MODULE 0x0000000040 /* kernel module handling */
29505 +#define KL_DBGCOMP_SIGNAL 0x0000000080 /* signal handling */
29506 +#define KL_DBGCOMP_STABS 0x0000000100 /* stabs format support */
29507 +#define KL_DBGCOMP_SYMBOL 0x0000000200 /* symbol handling */
29508 +#define KL_DBGCOMP_TYPE 0x0000000400 /* type information handling */
29509 +#define KL_DBGCOMP_ALL ((uint64_t) -1) /* all components */
29510 +
29511 +/* central output routine, shouldn't be used directly, but
29512 + * by following macros
29513 + */
29514 +void kl_msg(uint64_t, uint32_t, const char*, const char*, int,
29515 + const char*, ...);
29516 +
29517 +/* vararg macros that should be used instead of kl_msg()
29518 + */
29519 +/* used within libklib to print non-error messages (e.g. progress indication)
29520 + */
29521 +#define KL_MSG(fmt, args...) \
29522 +kl_msg(0, 0, NULL, NULL, 0, fmt, ## args)
29523 +/* Can be used by application to print error messages;
29524 + * not used by libklib itself.
29525 + */
29526 +#define kl_error(fmt, args...) \
29527 +kl_msg(0, KLE_F_ERRORMSG, __FUNCTION__, __FILE__, __LINE__, fmt, ## args)
29528 +/* Generate trace messages. Used for libklib debugging. Might be used
29529 + * by an application, too.
29530 + * A macro _DBG_COMPONENT has to be defined locally in the module where
29531 + * any trace macro is used. See above debug components.
29532 + * Trace messages are only printed iff _DBG_COMPONENT was set before with a
29533 + * call to kl_set_dbg_component().
29534 + */
29535 +#define kl_trace1(flg, fmt, args...) \
29536 +kl_msg(_DBG_COMPONENT, KLE_F_TRACELEVEL1|(flg), \
29537 + __FUNCTION__, __FILE__, __LINE__, fmt, ## args)
29538 +#define kl_trace2(flg, fmt, args...) \
29539 +kl_msg(_DBG_COMPONENT, KLE_F_TRACELEVEL2|(flg), \
29540 + __FUNCTION__, __FILE__, __LINE__, fmt, ## args)
29541 +#define kl_trace3(flg, fmt, args...) \
29542 +kl_msg(_DBG_COMPONENT, KLE_F_TRACELEVEL3|(flg), \
29543 + __FUNCTION__, __FILE__, __LINE__, fmt, ## args)
29544 +#define kl_trace4(flg, fmt, args...) \
29545 +kl_msg(_DBG_COMPONENT, KLE_F_TRACELEVEL4|(flg), \
29546 + __FUNCTION__, __FILE__, __LINE__, fmt, ## args)
29547 +
29548 +/* functions to set some global variables for libklib debugging
29549 + */
29550 +int kl_set_trace_threshold(uint32_t);
29551 +void kl_set_dbg_component(uint64_t);
29552 +void kl_set_stdout(FILE *);
29553 +void kl_set_stderr(FILE *);
29554 +
29555 +/* functions to get contents of global variables for libklib debugging
29556 + */
29557 +uint32_t kl_get_trace_threshold(void);
29558 +uint64_t kl_get_dbg_component(void);
29559 +
29560 +#endif /* __KL_ERROR_H */
29561 --- /dev/null
29562 +++ b/kdb/modules/lcrash/kl_htnode.h
29563 @@ -0,0 +1,71 @@
29564 +/*
29565 + * $Id: kl_htnode.h 1122 2004-12-21 23:26:23Z tjm $
29566 + *
29567 + * This file is part of libutil.
29568 + * A library which provides auxiliary functions.
29569 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
29570 + *
29571 + * Created by Silicon Graphics, Inc.
29572 + * Contributions by IBM, NEC, and others
29573 + *
29574 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
29575 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29576 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29577 + *
29578 + * This code is free software; you can redistribute it and/or modify
29579 + * it under the terms of the GNU Lesser Public License as published by
29580 + * the Free Software Foundation; either version 2.1 of the License, or
29581 + * (at your option) any later version. See the file COPYING for more
29582 + * information.
29583 + */
29584 +
29585 +#ifndef __KL_HTNODE_H
29586 +#define __KL_HTNODE_H
29587 +
29588 +/* Node structure for use in hierarchical trees (htrees).
29589 + */
29590 +typedef struct htnode_s {
29591 + struct htnode_s *next;
29592 + struct htnode_s *prev;
29593 + struct htnode_s *parent;
29594 + struct htnode_s *children;
29595 + int seq;
29596 + int level;
29597 + int key;
29598 +} htnode_t;
29599 +
29600 +/* Flag values
29601 + */
29602 +#define HT_BEFORE 0x1
29603 +#define HT_AFTER 0x2
29604 +#define HT_CHILD 0x4
29605 +#define HT_PEER 0x8
29606 +
29607 +/* Function prototypes
29608 + */
29609 +htnode_t *kl_next_htnode(
29610 + htnode_t * /* htnode pointer */);
29611 +
29612 +htnode_t *kl_prev_htnode(
29613 + htnode_t * /* htnode pointer */);
29614 +
29615 +void ht_insert_peer(
29616 + htnode_t * /* htnode pointer */,
29617 + htnode_t * /* new htnode pointer*/,
29618 + int /* flags */);
29619 +
29620 +void ht_insert_child(
29621 + htnode_t * /* htnode pointer */,
29622 + htnode_t * /* new htnode pointer*/,
29623 + int /* flags */);
29624 +
29625 +int ht_insert(
29626 + htnode_t * /* htnode pointer */,
29627 + htnode_t * /* new htnode pointer*/,
29628 + int /* flags */);
29629 +
29630 +void ht_insert_next_htnode(
29631 + htnode_t * /* htnode pointer */,
29632 + htnode_t * /* new htnode pointer*/);
29633 +
29634 +#endif /* __KL_HTNODE_H */
29635 --- /dev/null
29636 +++ b/kdb/modules/lcrash/kl_lib.h
29637 @@ -0,0 +1,65 @@
29638 +/*
29639 + * $Id: kl_lib.h 1122 2004-12-21 23:26:23Z tjm $
29640 + *
29641 + * This file is part of libutil.
29642 + * A library which provides auxiliary functions.
29643 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
29644 + *
29645 + * Created by Silicon Graphics, Inc.
29646 + * Contributions by IBM, NEC, and others
29647 + *
29648 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
29649 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29650 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29651 + *
29652 + * This code is free software; you can redistribute it and/or modify
29653 + * it under the terms of the GNU Lesser Public License as published by
29654 + * the Free Software Foundation; either version 2.1 of the License, or
29655 + * (at your option) any later version. See the file COPYING for more
29656 + * information.
29657 + */
29658 +
29659 +#ifndef __KL_LIB_H
29660 +#define __KL_LIB_H
29661 +
29662 +/* Include system header files
29663 + */
29664 +
29665 +#if 0
29666 +/* cpw: we don't need this userland stuff: */
29667 +#include <stdio.h>
29668 +#include <stdlib.h>
29669 +#include <stdint.h>
29670 +#include <unistd.h>
29671 +#include <sys/stat.h>
29672 +#include <sys/types.h>
29673 +#include <sys/time.h>
29674 +#include <unistd.h>
29675 +#include <time.h>
29676 +#include <sys/socket.h>
29677 +#include <netinet/in.h>
29678 +#include <netdb.h>
29679 +#include <sys/ioctl.h>
29680 +#include <net/if.h>
29681 +#include <sys/utsname.h>
29682 +#include <fcntl.h>
29683 +#include <string.h>
29684 +#include <setjmp.h>
29685 +#include <strings.h>
29686 +#include <errno.h>
29687 +#include <assert.h>
29688 +#include <ctype.h>
29689 +#endif
29690 +
29691 +/* Include lkcd library header files
29692 + */
29693 +/* cpw: change these from the < > form to the " " form: */
29694 +#include "kl_types.h"
29695 +#include "kl_alloc.h"
29696 +#include "kl_libutil.h"
29697 +#include "kl_btnode.h"
29698 +#include "kl_htnode.h"
29699 +#include "kl_queue.h"
29700 +#include "kl_stringtab.h"
29701 +
29702 +#endif /* __KL_LIB_H */
29703 --- /dev/null
29704 +++ b/kdb/modules/lcrash/kl_libutil.h
29705 @@ -0,0 +1,40 @@
29706 +/*
29707 + * $Id: kl_libutil.h 1122 2004-12-21 23:26:23Z tjm $
29708 + *
29709 + * This file is part of libutil.
29710 + * A library which provides auxiliary functions.
29711 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
29712 + *
29713 + * Created by Silicon Graphics, Inc.
29714 + * Contributions by IBM, NEC, and others
29715 + *
29716 + * Copyright (C) 1999 - 2004 Silicon Graphics, Inc. All rights reserved.
29717 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29718 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29719 + *
29720 + * This code is free software; you can redistribute it and/or modify
29721 + * it under the terms of the GNU Lesser Public License as published by
29722 + * the Free Software Foundation; either version 2.1 of the License, or
29723 + * (at your option) any later version. See the file COPYING for more
29724 + * information.
29725 + */
29726 +
29727 +#ifndef __KL_LIBUTIL_H
29728 +#define __KL_LIBUTIL_H
29729 +
29730 +/* cpw: change all these from the < > form to the " " form: */
29731 +#include "kl_alloc.h"
29732 +#include "kl_btnode.h"
29733 +#include "kl_copt.h"
29734 +#include "kl_htnode.h"
29735 +#include "kl_queue.h"
29736 +#include "kl_stringtab.h"
29737 +
29738 +int kl_shift_value(uint64_t );
29739 +int kl_string_compare(char *, char *);
29740 +int kl_string_match(char *, char *);
29741 +uint64_t kl_strtoull(char *, char **, int);
29742 +time_t kl_str_to_ctime(char *);
29743 +void *kl_get_ra(void);
29744 +
29745 +#endif /* __KL_LIBUTIL_H */
29746 --- /dev/null
29747 +++ b/kdb/modules/lcrash/kl_mem.h
29748 @@ -0,0 +1,104 @@
29749 +/*
29750 + * $Id: kl_mem.h 1157 2005-02-25 22:04:05Z tjm $
29751 + *
29752 + * This file is part of libklib.
29753 + * A library which provides access to Linux system kernel dumps.
29754 + *
29755 + * Created by Silicon Graphics, Inc.
29756 + * Contributions by IBM, NEC, and others
29757 + *
29758 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
29759 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29760 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29761 + *
29762 + * This code is free software; you can redistribute it and/or modify
29763 + * it under the terms of the GNU Lesser Public License as published by
29764 + * the Free Software Foundation; either version 2.1 of the License, or
29765 + * (at your option) any later version. See the file COPYING for more
29766 + * information.
29767 + */
29768 +
29769 +#ifndef __KL_MEM_H
29770 +#define __KL_MEM_H
29771 +
29772 +#if 0
29773 +cpw: skip:
29774 +extern kaddr_t VMALLOC_START;
29775 +extern kaddr_t VMALLOC_END;
29776 +#endif
29777 +
29778 +/*
29779 + * Function prototypes
29780 + */
29781 +
29782 +int kl_linux_release(void);
29783 +
29784 +k_error_t kl_readmem(
29785 + kaddr_t /* physical address to start reading from */,
29786 + unsigned /* number of bytes to read */,
29787 + void * /* pointer to buffer */);
29788 +
29789 +k_error_t kl_readkmem(
29790 + kaddr_t /* virtual address to start reading from */,
29791 + unsigned /* number of bytes to read */,
29792 + void * /* pointer to buffer */);
29793 +
29794 +int kl_virtop(
29795 + kaddr_t /* virtual address to translate */,
29796 + void * /* pointer to mem_map for address translation */,
29797 + kaddr_t * /* pointer to physical address to return */);
29798 +
29799 +k_error_t kl_get_block(
29800 + kaddr_t /* virtual address */,
29801 + unsigned /* size of block to read in */,
29802 + void * /* pointer to buffer */,
29803 + void * /* pointer to mmap */);
29804 +
29805 +/* Wrapper that eliminates the mmap parameter
29806 + */
29807 +#define GET_BLOCK(a, s, b) kl_get_block(a, s, (void *)b, (void *)0)
29808 +
29809 +uint64_t kl_uint(
29810 + void * /* pointer to buffer containing struct */,
29811 + char * /* name of struct */,
29812 + char * /* name of member */,
29813 + unsigned /* offset */);
29814 +
29815 +int64_t kl_int(
29816 + void * /* pointer to buffer containing struct */,
29817 + char * /* name of struct */,
29818 + char * /* name of member */,
29819 + unsigned /* offset */);
29820 +
29821 +kaddr_t kl_kaddr(
29822 + void * /* pointer to buffer containing struct */,
29823 + char * /* name of struct */,
29824 + char * /* name of member */);
29825 +
29826 +/* XXX deprecated use KL_READ_PTR() instead */
29827 +kaddr_t kl_kaddr_to_ptr(
29828 + kaddr_t /* Address to dereference */);
29829 +
29830 +int kl_is_valid_kaddr(
29831 + kaddr_t /* Address to test */,
29832 + void * /* pointer to mmap */,
29833 + int /* flags */);
29834 +
29835 +/* REMIND:
29836 + * Likely not right for ia64
29837 + */
29838 +#define KL_KADDR_IS_PHYSICAL(vaddr) ((vaddr >= KL_PAGE_OFFSET) && \
29839 + (vaddr <= KL_HIGH_MEMORY))
29840 +
29841 +#define PGNO_TO_PADDR(pgno) (pgno << KL_PAGE_SHIFT)
29842 +
29843 +/*
29844 + * declaration of some defaults that are used in kl_set_dumparch()
29845 + */
29846 +int kl_valid_physaddr(kaddr_t);
29847 +int kl_valid_physmem(kaddr_t, int);
29848 +kaddr_t kl_next_valid_physaddr(kaddr_t);
29849 +kaddr_t kl_fix_vaddr(kaddr_t, size_t);
29850 +int kl_init_virtop(void);
29851 +
29852 +#endif /* __KL_MEM_H */
29853 --- /dev/null
29854 +++ b/kdb/modules/lcrash/kl_mem_ia64.h
29855 @@ -0,0 +1,149 @@
29856 +/*
29857 + * $Id: kl_mem_ia64.h 1250 2006-04-18 18:23:44Z cliffpwickman $
29858 + *
29859 + * This file is part of libklib.
29860 + * A library which provides access to Linux system kernel dumps.
29861 + *
29862 + * Created by Silicon Graphics, Inc.
29863 + * Contributions by IBM, NEC, and others
29864 + *
29865 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
29866 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
29867 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
29868 + *
29869 + * This code is free software; you can redistribute it and/or modify
29870 + * it under the terms of the GNU Lesser Public License as published by
29871 + * the Free Software Foundation; either version 2.1 of the License, or
29872 + * (at your option) any later version. See the file COPYING for more
29873 + * information.
29874 + */
29875 +
29876 +#ifndef __KL_MEM_IA64_H
29877 +#define __KL_MEM_IA64_H
29878 +
29879 +/* XXX - the following macros are used by functions in kl_page.c and in */
29880 +/* function kl_virtop, they still have to be defined properly, */
29881 +/* all the following macros have first to be set with correct values. */
29882 +/* I don't have a clue what values to use for ia64 architecture!!! */
29883 +
29884 +/* KSTACK_SIZE depends on page size (see kernel headers ptrace.h and page.h)
29885 + * #define IA64_STK_OFFSET ((1 << IA64_TASK_STRUCT_LOG_NUM_PAGES)*PAGE_SIZE)
29886 + * and
29887 + * #define PAGE_SIZE 1UL<<PAGE_SHIFT
29888 + * and
29889 + * #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
29890 + * # define PAGE_SHIFT 12
29891 + * #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
29892 + * # define PAGE_SHIFT 13
29893 + * #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
29894 + * # define PAGE_SHIFT 14
29895 + * #elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
29896 + * # define PAGE_SHIFT 16
29897 + * #else
29898 + * # error Unsupported page size!
29899 + * #endif
29900 + * and
29901 + * #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
29902 + * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 3
29903 + * #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
29904 + * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 2
29905 + * #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
29906 + * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 1
29907 + * #else
29908 + * # define IA64_TASK_STRUCT_LOG_NUM_PAGES 0
29909 + * #endif
29910 + * Finally we have for page sizes 4KB, 8K, 16K IA64_STK_OFFSET=32K, and
29911 + * for page size 64K IA64_STK_OFFSET=64K.
29912 + * FIXME: !!!Don't know how to handle 64K page size case!!!
29913 + */
29914 +#define KL_KSTACK_SIZE_IA64 0x8000ULL
29915 +/* 64KB page size case:
29916 + * #define KL_KSTACK_SIZE_IA64 0x10000ULL
29917 + */
29918 +
29919 +#define KL_PAGE_OFFSET_IA64 0xe000000000000000
29920 +
29921 +#define KL_PAGE_SHIFT_IA64 KL_PAGE_SHIFT
29922 +#define KL_PAGE_SIZE_IA64 (1ULL << KL_PAGE_SHIFT_IA64)
29923 +#define KL_PAGE_MASK_IA64 (~(KL_PAGE_SIZE_IA64-1))
29924 +
29925 +/* for 3-level page tables: */
29926 +#define KL_PGDIR_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*2)
29927 +#define KL_PGDIR_SIZE_IA64 (1ULL<<KL_PGDIR_SHIFT_IA64)
29928 +#define KL_PGDIR_MASK_IA64 (~(KL_PGDIR_SIZE_IA64-1))
29929 +
29930 +/* for 4-level page tables: */
29931 +#define KL_PGDIR4_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*3)
29932 +#define KL_PGDIR4_SIZE_IA64 (1ULL<<KL_PGDIR4_SHIFT_IA64)
29933 +#define KL_PGDIR4_MASK_IA64 (~(KL_PGDIR_SIZE4_IA64-1))
29934 +#define KL_PUD_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*2)
29935 +#define KL_PUD_SIZE_IA64 (1ULL<<KL_PUD_SHIFT_IA64)
29936 +#define KL_PUD_MASK_IA64 (~(KL_PUD_SIZE_IA64-1))
29937 +
29938 +#define KL_PMD_SHIFT_IA64 (KL_PAGE_SHIFT_IA64+(KL_PAGE_SHIFT_IA64-3)*1)
29939 +#define KL_PMD_SIZE_IA64 (1ULL<<KL_PMD_SHIFT_IA64)
29940 +#define KL_PMD_MASK_IA64 (~(KL_PMD_SIZE_IA64-1))
29941 +
29942 +#define KL_PTRS_PER_PGD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
29943 +#define KL_PTRS_PER_PUD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
29944 +#define KL_PTRS_PER_PMD_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
29945 +#define KL_PTRS_PER_PTE_IA64 (1ULL<<(KL_PAGE_SHIFT_IA64-3))
29946 +
29947 +/* These values describe the bits of pgd/pmd/pte entries that are
29948 + * status bits and therefor have to be masked in order to get valid
29949 + * addresses
29950 + */
29951 +#define KL_PMD_BASE_MASK_IA64 (((1ULL<<50)-1)&(~0xfffULL))
29952 +#define KL_PT_BASE_MASK_IA64 KL_PMD_BASE_MASK_IA64
29953 +#define KL_PAGE_BASE_MASK_IA64 KL_PMD_BASE_MASK_IA64
29954 +
29955 +#define KL_KADDR_IS_HIGHMEM(vaddr) ((KL_HIGH_MEMORY && (vaddr >= KL_HIGH_MEMORY)))
29956 +
29957 +uint32_t dha_num_cpus_ia64(void);
29958 +kaddr_t dha_current_task_ia64(int);
29959 +int dha_cpuid_ia64(kaddr_t);
29960 +kaddr_t dha_stack_ia64(int);
29961 +kaddr_t dha_stack_ptr_ia64(int);
29962 +kaddr_t kl_kernelstack_ia64(kaddr_t);
29963 +kaddr_t kl_mmap_virtop_ia64(kaddr_t, void*);
29964 +int kl_init_virtop_ia64(void);
29965 +int kl_virtop_ia64(kaddr_t, void*, kaddr_t*);
29966 +int kl_vtop_ia64(kaddr_t, kaddr_t*);
29967 +int kl_valid_physmem_ia64(kaddr_t, int);
29968 +kaddr_t kl_next_valid_physaddr_ia64(kaddr_t);
29969 +kaddr_t kl_fix_vaddr_ia64(kaddr_t, size_t);
29970 +
29971 +/* Structure containing key data for ia64 virtual memory mapping.
29972 + * Note that a number of fields are SN system specific.
29973 + */
29974 +typedef struct ia64_vminfo_s {
29975 + int flags;
29976 + kaddr_t vpernode_base;
29977 + kaddr_t vglobal_base;
29978 + kaddr_t to_phys_mask;
29979 + kaddr_t kernphysbase;
29980 + int nasid_shift; /* SN specific */
29981 + int nasid_mask; /* SN specific */
29982 +} ia64_vminfo_t;
29983 +
29984 +extern ia64_vminfo_t ia64_vminfo;
29985 +
29986 +/* Some vminfo flags
29987 + */
29988 +#define MAPPED_KERN_FLAG 0x1
29989 +#define SN2_FLAG 0x2
29990 +
29991 +/* Some vminfo macros
29992 + */
29993 +#define IS_MAPPED_KERN (ia64_vminfo.flags & MAPPED_KERN_FLAG)
29994 +#define IS_SN2 (ia64_vminfo.flags & SN2_FLAG)
29995 +#define KL_VPERNODE_BASE ia64_vminfo.vpernode_base
29996 +#define KL_VGLOBAL_BASE ia64_vminfo.vglobal_base
29997 +#define KL_TO_PHYS_MASK ia64_vminfo.to_phys_mask
29998 +#define KL_KERNPHYSBASE ia64_vminfo.kernphysbase
29999 +#define KL_NASID_SHIFT ia64_vminfo.nasid_shift
30000 +#define KL_NASID_MASK ia64_vminfo.nasid_mask
30001 +
30002 +#define ADDR_TO_NASID(A) (((A) >> (long)(KL_NASID_SHIFT)) & KL_NASID_MASK)
30003 +
30004 +#endif /* __KL_MEM_IA64_H */
30005 --- /dev/null
30006 +++ b/kdb/modules/lcrash/kl_module.h
30007 @@ -0,0 +1,69 @@
30008 +/*
30009 + * $Id: kl_module.h 1122 2004-12-21 23:26:23Z tjm $
30010 + *
30011 + * This file is part of libklib.
30012 + * A library which provides access to Linux system kernel dumps.
30013 + *
30014 + * Created by Silicon Graphics, Inc.
30015 + * Contributions by IBM, NEC, and others
30016 + *
30017 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
30018 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30019 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30020 + *
30021 + * This code is free software; you can redistribute it and/or modify
30022 + * it under the terms of the GNU Lesser Public License as published by
30023 + * the Free Software Foundation; either version 2.1 of the License, or
30024 + * (at your option) any later version. See the file COPYING for more
30025 + * information.
30026 + */
30027 +
30028 +#ifndef __KL_MODULE_H
30029 +#define __KL_MODULE_H
30030 +
30031 +/*
30032 + * insmod generates ksymoops
30033 + *
30034 + */
30035 +
30036 +typedef struct kl_modinfo_s {
30037 + char *modname; /* name of module as loaded in dump */
30038 + /* store ksym info for all modules in a linked list */
30039 + struct kl_modinfo_s *next;
30040 + char *object_file; /* name of file that module was loaded from*/
30041 + /* ? possibly store modtime and version here ? */
30042 + uint64_t header; /* address of module header */
30043 + uint64_t mtime; /* time of last modification of object_file */
30044 + uint32_t version; /* kernel version that module was compiled for */
30045 + uint64_t text_sec; /* address of text section */
30046 + uint64_t text_len; /* length of text section */
30047 + uint64_t data_sec; /* address of data section */
30048 + uint64_t data_len; /* length of data section */
30049 + uint64_t rodata_sec; /* address of rodata section */
30050 + uint64_t rodata_len; /* length of rodata section */
30051 + uint64_t bss_sec; /* address of rodata section */
30052 + uint64_t bss_len; /* length of rodata section */
30053 + char *ksym_object; /* ksym for object */
30054 + char *ksym_text_sec; /* ksym for its text section */
30055 + char *ksym_data_sec; /* ksym for its data section */
30056 + char *ksym_rodata_sec; /* ksym for its rodata section */
30057 + char *ksym_bss_sec; /* ksym for its bss sectio */
30058 +} kl_modinfo_t;
30059 +
30060 +int kl_get_module(char*, kaddr_t*, void**);
30061 +int kl_get_module_2_6(char*, kaddr_t*, void**);
30062 +int kl_get_modname(char**, void*);
30063 +int kl_new_get_modname(char**, void*);
30064 +void kl_free_modinfo(kl_modinfo_t**);
30065 +int kl_new_modinfo(kl_modinfo_t**, void*);
30066 +int kl_set_modinfo(kaddr_t, char*, kl_modinfo_t*);
30067 +int kl_complete_modinfo(kl_modinfo_t*);
30068 +int kl_load_ksyms(int);
30069 +int kl_load_ksyms_2_6(int);
30070 +int kl_unload_ksyms(void);
30071 +int kl_load_module_sym(char*, char*, char*);
30072 +int kl_unload_module_sym(char*);
30073 +int kl_autoload_module_info(char*);
30074 +kl_modinfo_t * kl_lkup_modinfo(char*);
30075 +
30076 +#endif /* __KL_MODULE_H */
30077 --- /dev/null
30078 +++ b/kdb/modules/lcrash/kl_queue.h
30079 @@ -0,0 +1,89 @@
30080 +/*
30081 + * $Id: kl_queue.h 1122 2004-12-21 23:26:23Z tjm $
30082 + *
30083 + * This file is part of libutil.
30084 + * A library which provides auxiliary functions.
30085 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
30086 + *
30087 + * Created by Silicon Graphics, Inc.
30088 + * Contributions by IBM, NEC, and others
30089 + *
30090 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
30091 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30092 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30093 + *
30094 + * This code is free software; you can redistribute it and/or modify
30095 + * it under the terms of the GNU Lesser Public License as published by
30096 + * the Free Software Foundation; either version 2.1 of the License, or
30097 + * (at your option) any later version. See the file COPYING for more
30098 + * information.
30099 + */
30100 +
30101 +#ifndef __KL_QUEUE_H
30102 +#define __KL_QUEUE_H
30103 +
30104 +/* List element header
30105 + */
30106 +typedef struct element_s {
30107 + struct element_s *next;
30108 + struct element_s *prev;
30109 +} element_t;
30110 +
30111 +/* Some useful macros
30112 + */
30113 +#define ENQUEUE(list, elem) \
30114 + kl_enqueue((element_t **)list, (element_t *)elem)
30115 +#define DEQUEUE(list) kl_dequeue((element_t **)list)
30116 +#define FINDQUEUE(list, elem) \
30117 + kl_findqueue((element_t **)list, (element_t *)elem)
30118 +#define REMQUEUE(list, elem) kl_remqueue((element_t **)list, (element_t *)elem)
30119 +
30120 +typedef struct list_of_ptrs {
30121 + element_t elem;
30122 + unsigned long long val64;
30123 +} list_of_ptrs_t;
30124 +
30125 +#define FINDLIST_QUEUE(list, elem, compare) \
30126 + kl_findlist_queue((list_of_ptrs_t **)list, \
30127 + (list_of_ptrs_t *)elem, compare)
30128 +
30129 +/**
30130 + ** Function prototypes
30131 + **/
30132 +
30133 +/* Add a new element to the tail of a doubly linked list.
30134 + */
30135 +void kl_enqueue(
30136 + element_t** /* ptr to head of list */,
30137 + element_t* /* ptr to element to add to the list */);
30138 +
30139 +/* Remove an element from the head of a doubly linked list. A pointer
30140 + * to the element will be returned. In the event that the list is
30141 + * empty, a NULL pointer will be returned.
30142 + */
30143 +element_t *kl_dequeue(
30144 + element_t** /* ptr to list head (first item removed) */);
30145 +
30146 +/* Checks to see if a particular element is in a list. If it is, a
30147 + * value of one (1) will be returned. Otherwise, a value of zero (0)
30148 + * will be returned.
30149 + */
30150 +int kl_findqueue(
30151 + element_t** /* ptr to head of list */,
30152 + element_t* /* ptr to element to find on list */);
30153 +
30154 +/* Walks through a list of pointers to queues and looks for a
30155 + * particular list.
30156 + */
30157 +int kl_findlist_queue(
30158 + list_of_ptrs_t** /* ptr to list of lists */,
30159 + list_of_ptrs_t* /* ptr to list to look for */,
30160 + int(*)(void *, void *) /* ptr to compare function */);
30161 +
30162 +/* Remove specified element from doubly linked list.
30163 + */
30164 +void kl_remqueue(
30165 + element_t** /* ptr to head of list */,
30166 + element_t* /* ptr to element to remove from list */);
30167 +
30168 +#endif /* __KL_QUEUE_H */
30169 --- /dev/null
30170 +++ b/kdb/modules/lcrash/kl_stabs.h
30171 @@ -0,0 +1,122 @@
30172 +/*
30173 + * $Id: kl_stabs.h 1122 2004-12-21 23:26:23Z tjm $
30174 + *
30175 + * This file is part of libklib.
30176 + * A library which provides access to Linux system kernel dumps.
30177 + *
30178 + * Created by Silicon Graphics, Inc.
30179 + * Contributions by IBM, NEC, and others
30180 + *
30181 + * Copyright (C) 1999 - 2004 Silicon Graphics, Inc. All rights reserved.
30182 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30183 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30184 + *
30185 + * This code is free software; you can redistribute it and/or modify
30186 + * it under the terms of the GNU Lesser Public License as published by
30187 + * the Free Software Foundation; either version 2.1 of the License, or
30188 + * (at your option) any later version. See the file COPYING for more
30189 + * information.
30190 + */
30191 +
30192 +#ifndef __KL_STABS_H
30193 +#define __KL_STABS_H
30194 +
30195 +/* STABS specific types
30196 + */
30197 +#define STAB_XSTRUCT 100 /* Cross referense to STAB_STRUCT */
30198 +#define STAB_XUNION 101 /* Cross referense to STAB_UNIONB */
30199 +#define STAB_XENUM 102 /* Cross referense to STAB_ENUM */
30200 +
30201 +/* Structure allocated for every namelist. A namelist can be either an
30202 + * object file (.o or executible), or it can be an archive (.a).
30203 + */
30204 +typedef struct st_nmlist_s {
30205 + char *sts_filename; /* disk file name */
30206 + short sts_type; /* ST_OBJ or ST_AR */
30207 + short sts_nfiles; /* number of source/object files */
30208 +} st_nmlist_t;
30209 +
30210 +/* Values for type field
30211 + */
30212 +#define ST_OBJ 1 /* object file (.o or executible) */
30213 +#define ST_AR 2 /* archive */
30214 +
30215 +/* Stab entry type Flags. For determining which stab entries to
30216 + * capture from the symbol table.
30217 + */
30218 +#define ST_UNDF 0x0001
30219 +#define ST_SO 0x0002
30220 +#define ST_LSYM 0x0004
30221 +#define ST_GSYM 0x0008
30222 +#define ST_PSYM 0x0010
30223 +#define ST_STSYM 0x0020
30224 +#define ST_LCSYM 0x0040
30225 +#define ST_FUN 0x0080
30226 +#define ST_BINCL 0x0100
30227 +#define ST_EINCL 0x0200
30228 +#define ST_EXCL 0x0400
30229 +#define ST_SLINE 0x0800
30230 +#define ST_RSYM 0x2000
30231 +#define ST_ALL 0xffff
30232 +#define ST_DEFAULT (ST_LSYM|ST_GSYM|ST_FUN)
30233 +
30234 +#define N_UNDF 0
30235 +
30236 +/* Structures that allow us to selectively cycle through only those BFD
30237 + * sections containing STAB data.
30238 + */
30239 +typedef struct stab_sect_s {
30240 + char *stabsect_name;
30241 + char *strsect_name;
30242 +} stab_sect_t;
30243 +
30244 +/* Local structure that contains the current type string (which may be
30245 + * just a part of the complete type defenition string) and the character
30246 + * index (current) pointer.
30247 + */
30248 +typedef struct stab_str_s {
30249 + char *str;
30250 + char *ptr;
30251 +} stab_str_t;
30252 +
30253 +/* Local structure containing global values that allow us to cycle
30254 + * through multiple object files without reinitializing.
30255 + */
30256 +typedef struct st_global_s {
30257 + bfd *abfd; /* current bfd pointer */
30258 + int type; /* symbol entry type */
30259 + int flags; /* want flags */
30260 + int flag; /* current ST flag */
30261 + int nmlist; /* current namelist index */
30262 + int srcfile; /* current source file number */
30263 + int incfile; /* current include file */
30264 + int symnum; /* symbol entry number */
30265 + bfd_byte *stabp; /* beg of current string table */
30266 + bfd_byte *stabs_end; /* end of current string table */
30267 + int staboff; /* current stab table offset */
30268 + unsigned int value; /* value (e.g., function addr) */
30269 + int stroffset; /* offset in stab string table */
30270 + short desc; /* desc value (e.g, line number) */
30271 + stab_str_t stab_str; /* current stab string */
30272 +} st_global_t;
30273 +
30274 +/* Macros for accessing the current global values
30275 + */
30276 +#define G_abfd G_values.abfd
30277 +#define G_type G_values.type
30278 +#define G_flags G_values.flags
30279 +#define G_flag G_values.flag
30280 +#define G_nmlist G_values.nmlist
30281 +#define G_srcfile G_values.srcfile
30282 +#define G_incfile G_values.incfile
30283 +#define G_symnum G_values.symnum
30284 +#define G_stabp G_values.stabp
30285 +#define G_stabs_end G_values.stabs_end
30286 +#define G_staboff G_values.staboff
30287 +#define G_value G_values.value
30288 +#define G_stroffset G_values.stroffset
30289 +#define G_desc G_values.desc
30290 +#define G_stab_str G_values.stab_str
30291 +#define CUR_CHAR G_stab_str.ptr
30292 +
30293 +#endif /* __KL_STABS_H */
30294 --- /dev/null
30295 +++ b/kdb/modules/lcrash/kl_stringtab.h
30296 @@ -0,0 +1,68 @@
30297 +/*
30298 + * $Id: kl_stringtab.h 1122 2004-12-21 23:26:23Z tjm $
30299 + *
30300 + * This file is part of libutil.
30301 + * A library which provides auxiliary functions.
30302 + * libutil is part of lkcdutils -- utilities for Linux kernel crash dumps.
30303 + *
30304 + * Created by Silicon Graphics, Inc.
30305 + * Contributions by IBM, NEC, and others
30306 + *
30307 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
30308 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30309 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30310 + *
30311 + * This code is free software; you can redistribute it and/or modify
30312 + * it under the terms of the GNU Lesser Public License as published by
30313 + * the Free Software Foundation; either version 2.1 of the License, or
30314 + * (at your option) any later version. See the file COPYING for more
30315 + * information.
30316 + */
30317 +
30318 +#ifndef __KL_STRINGTAB_H
30319 +#define __KL_STRINGTAB_H
30320 +
30321 +/* The string table structure
30322 + *
30323 + * String space is allocated from 4K blocks which are allocated
30324 + * as needed. The first four bytes of each block are reserved so
30325 + * that the blocks can be chained together (to make it easy to free
30326 + * them when the string table is no longer necessary).
30327 + */
30328 +typedef struct string_table_s {
30329 + int num_strings;
30330 + void *block_list;
30331 +} string_table_t;
30332 +
30333 +#define NO_STRINGTAB 0
30334 +#define USE_STRINGTAB 1
30335 +
30336 +/**
30337 + ** Function prototypes
30338 + **/
30339 +
30340 +/* Initialize a string table. Depending on the value of the flag
30341 + * parameter, either temporary or permenent blocks will be used.
30342 + * Upon success, a pointer to a string table will be returned.
30343 + * Otherwise, a NULL pointer will be returned.
30344 + */
30345 +string_table_t *kl_init_string_table(
30346 + int /* flag (K_TEMP/K_PERM)*/);
30347 +
30348 +/* Free all memory blocks allocated for a particular string table
30349 + * and then free the table itself.
30350 + */
30351 +void kl_free_string_table(
30352 + string_table_t* /* pointer to string table */);
30353 +
30354 +/* Search for a string in a string table. If the string does not
30355 + * exist, allocate space from the string table and add the string.
30356 + * In either event, a pointer to the string (from the table) will
30357 + * be returned.
30358 + */
30359 +char *kl_get_string(
30360 + string_table_t* /* pointer to string table */,
30361 + char* /* string to get/add from/to string table */,
30362 + int /* flag (K_TEMP/K_PERM)*/);
30363 +
30364 +#endif /* __KL_STRINGTAB_H */
30365 --- /dev/null
30366 +++ b/kdb/modules/lcrash/kl_sym.h
30367 @@ -0,0 +1,131 @@
30368 +/*
30369 + * $Id: kl_sym.h 1233 2005-09-10 08:01:11Z tjm $
30370 + *
30371 + * This file is part of libklib.
30372 + * A library which provides access to Linux system kernel dumps.
30373 + *
30374 + * Created by Silicon Graphics, Inc.
30375 + * Contributions by IBM, NEC, and others
30376 + *
30377 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
30378 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30379 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30380 + *
30381 + * This code is free software; you can redistribute it and/or modify
30382 + * it under the terms of the GNU Lesser Public License as published by
30383 + * the Free Software Foundation; either version 2.1 of the License, or
30384 + * (at your option) any later version. See the file COPYING for more
30385 + * information.
30386 + */
30387 +
30388 +#ifndef __KL_SYM_H
30389 +#define __KL_SYM_H
30390 +
30391 +/* The syment struct contains information about kernel symbols (text,
30392 + * data, etc.). The first field in syment_t is a btnode_s sruct. This
30393 + * allows the generic binary search tree routines, insert_tnode() and
30394 + * find_tnode(), to be used.
30395 + */
30396 +typedef struct syment_s {
30397 + btnode_t s_bt; /* Must be first */
30398 + struct syment_s *s_next; /* For linked lists */
30399 + struct syment_s *s_prev; /* For linked lists */
30400 + kaddr_t s_addr; /* vaddr of symbol */
30401 + kaddr_t s_end; /* end address of symbol */
30402 + int s_type; /* text, data */
30403 + struct syment_s *s_forward; /* For linked lists */
30404 +} syment_t;
30405 +
30406 +#define s_name s_bt.bt_key
30407 +
30408 +#define SYM_GLOBAL_TEXT 1
30409 +#define SYM_LOCAL_TEXT 2
30410 +#define SYM_LOCORE_TEXT 3
30411 +#define SYM_GLOBAL_DATA 4
30412 +#define SYM_LOCAL_DATA 5
30413 +#define SYM_ABS 6
30414 +#define SYM_UNK 9
30415 +#define SYM_KSYM 10
30416 +#define SYM_KSYM_TEXT 11
30417 +#define SYM_KALLSYMS 12
30418 +
30419 +#define SYM_MAP_ANY 0
30420 +#define SYM_MAP_FILE 1
30421 +#define SYM_MAP_KSYM 2
30422 +#define SYM_MAP_MODULE 3
30423 +#define SYM_MAP_KALLSYMS 4
30424 +
30425 +#define KL_KERNEL_MODULE "kernel_module"
30426 +#define KL_S_BSS ".bss.start"
30427 +#define KL_E_BSS ".bss.end"
30428 +#define KL_S_DATA ".data.start"
30429 +#define KL_E_DATA ".data.end"
30430 +#define KL_S_RODATA ".rodata.start"
30431 +#define KL_E_RODATA ".rodata.end"
30432 +#define KL_S_TEXT ".text.start"
30433 +#define KL_E_TEXT ".text.end"
30434 +#define KL_SYM_END "__end__"
30435 +
30436 +
30437 +#define KL_SYMBOL_NAME_LEN 256
30438 +
30439 +/*
30440 + * Struct containing symbol table information
30441 + */
30442 +typedef struct symtab_s {
30443 + int symcnt; /* Number of symbols */
30444 + int symaddrcnt; /* Number of symbol addrs to track */
30445 + syment_t **symaddrs; /* Table of symbols by address */
30446 + btnode_t *symnames; /* tree of symbols by name */
30447 + syment_t *text_list; /* Linked list of text symbols */
30448 + syment_t *data_list; /* Linked list of data symbols */
30449 +} symtab_t;
30450 +
30451 +
30452 +/* support of further mapfiles besides System.map */
30453 +typedef struct maplist_s {
30454 + struct maplist_s *next;
30455 + int maplist_type; /* type of maplist */
30456 + char *mapfile; /* name of mapfile */
30457 + char *modname; /* set if map belongs to a module */
30458 + symtab_t *syminfo;
30459 +} maplist_t;
30460 +
30461 +
30462 +/* API Function prototypes
30463 + */
30464 +int kl_read_syminfo(maplist_t*);
30465 +int kl_free_syminfo(char*);
30466 +void kl_free_symtab(symtab_t*);
30467 +void kl_free_syment_list(syment_t*);
30468 +void kl_free_maplist(maplist_t*);
30469 +syment_t *kl_get_similar_name(char*, char*, int*, int*);
30470 +syment_t *kl_lkup_symname(char*);
30471 +syment_t *_kl_lkup_symname(char*, int, size_t len);
30472 +#define KL_LKUP_SYMNAME(NAME, TYPE, LEN) _kl_lkup_symname(NAME, TYPE, LEN)
30473 +syment_t *kl_lkup_funcaddr(kaddr_t);
30474 +syment_t *kl_lkup_symaddr(kaddr_t);
30475 +syment_t *kl_lkup_symaddr_text(kaddr_t);
30476 +syment_t *_kl_lkup_symaddr(kaddr_t, int);
30477 +#define KL_LKUP_SYMADDR(KADDR, TYPE) _kl_lkup_symaddr(KADDR, TYPE)
30478 +kaddr_t kl_symaddr(char * /* symbol name */);
30479 +kaddr_t kl_symptr(char * /* symbol name */);
30480 +kaddr_t kl_funcaddr(kaddr_t /* pc value */);
30481 +char *kl_funcname(kaddr_t /* pc value */);
30482 +int kl_funcsize(kaddr_t /* pc value */);
30483 +int kl_symsize(syment_t*);
30484 +syment_t *kl_alloc_syment(kaddr_t, kaddr_t, int, const char*);
30485 +void kl_insert_symbols(symtab_t*, syment_t*);
30486 +int kl_insert_artificial_symbols(symtab_t*, syment_t**, kl_modinfo_t*);
30487 +int kl_convert_symbol(kaddr_t*, int*, char, kl_modinfo_t*);
30488 +int kl_load_sym(char*);
30489 +int kl_print_symtables(char*, char*, int, int);
30490 +void kl_print_symbol(kaddr_t, syment_t*, int);
30491 +
30492 +/* flag for use by kl_print_symbol() and kl_print_syminfo()
30493 + */
30494 +#define KL_SYMWOFFSET (0x01) /* with offset field */
30495 +#define KL_SYMFULL (0x02) /* print detailed syminfo */
30496 +#define KL_SYMBYNAME (0x04) /* print symbol sorted by name */
30497 +
30498 +#endif /* __KL_SYM_H */
30499 --- /dev/null
30500 +++ b/kdb/modules/lcrash/kl_task.h
30501 @@ -0,0 +1,39 @@
30502 +/*
30503 + * $Id: kl_task.h 1122 2004-12-21 23:26:23Z tjm $
30504 + *
30505 + * This file is part of libklib.
30506 + * A library which provides access to Linux system kernel dumps.
30507 + *
30508 + * Created by Silicon Graphics, Inc.
30509 + * Contributions by IBM, NEC, and others
30510 + *
30511 + * Copyright (C) 1999 - 2002, 2004 Silicon Graphics, Inc. All rights reserved.
30512 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30513 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30514 + *
30515 + * This code is free software; you can redistribute it and/or modify
30516 + * it under the terms of the GNU Lesser Public License as published by
30517 + * the Free Software Foundation; either version 2.1 of the License, or
30518 + * (at your option) any later version. See the file COPYING for more
30519 + * information.
30520 + */
30521 +
30522 +#ifndef __KL_TASK_H
30523 +#define __KL_TASK_H
30524 +
30525 +extern kaddr_t deftask;
30526 +
30527 +/* Function prototypes
30528 + */
30529 +k_error_t kl_set_deftask(kaddr_t);
30530 +int kl_parent_pid(void *);
30531 +kaddr_t kl_pid_to_task(kaddr_t);
30532 +k_error_t kl_get_task_struct(kaddr_t, int, void *);
30533 +kaddr_t kl_kernelstack(kaddr_t);
30534 +kaddr_t kl_first_task(void);
30535 +kaddr_t kl_next_task(void *);
30536 +kaddr_t kl_prev_task(void *);
30537 +kaddr_t kl_pid_to_task(kaddr_t);
30538 +int kl_task_size(kaddr_t);
30539 +
30540 +#endif /* __KL_TASK_H */
30541 --- /dev/null
30542 +++ b/kdb/modules/lcrash/kl_typeinfo.h
30543 @@ -0,0 +1,199 @@
30544 +/*
30545 + * $Id: kl_typeinfo.h 1259 2006-04-25 18:33:20Z tjm $
30546 + *
30547 + * This file is part of libklib.
30548 + * A library which provides access to Linux system kernel dumps.
30549 + *
30550 + * Created by Silicon Graphics, Inc.
30551 + * Contributions by IBM, NEC, and others
30552 + *
30553 + * Copyright (C) 1999 - 2006 Silicon Graphics, Inc. All rights reserved.
30554 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30555 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30556 + *
30557 + * This code is free software; you can redistribute it and/or modify
30558 + * it under the terms of the GNU Lesser Public License as published by
30559 + * the Free Software Foundation; either version 2.1 of the License, or
30560 + * (at your option) any later version. See the file COPYING for more
30561 + * information.
30562 + */
30563 +
30564 +#ifndef __KL_TYPEINFO_H
30565 +#define __KL_TYPEINFO_H
30566 +
30567 +#define KLT_BASE 0x001
30568 +#define KLT_STRUCT 0x002
30569 +#define KLT_UNION 0x004
30570 +#define KLT_ENUMERATION 0x008
30571 +#define KLT_MEMBER 0x010
30572 +#define KLT_ARRAY 0x020
30573 +#define KLT_POINTER 0x040
30574 +#define KLT_TYPEDEF 0x080
30575 +#define KLT_FUNCTION 0x100
30576 +#define KLT_VARIABLE 0x200
30577 +#define KLT_SRCFILE 0x400
30578 +#define KLT_SUBRANGE 0x800
30579 +#define KLT_INCOMPLETE 0x4000
30580 +#define KLT_UNKNOWN 0x8000
30581 +#define KLT_TYPE (KLT_BASE|KLT_STRUCT|KLT_UNION|KLT_ENUMERATION)
30582 +#define KLT_TYPES (KLT_BASE|KLT_STRUCT|KLT_UNION|KLT_ENUMERATION|KLT_TYPEDEF)
30583 +
30584 +#define IS_TYPE(T) ((T) & KLT_TYPE)
30585 +#define IS_STRUCT(T) ((T) & KLT_STRUCT)
30586 +#define IS_UNION(T) ((T) & KLT_UNION)
30587 +#define IS_ENUM(T) ((T) & KLT_ENUM)
30588 +#define IS_MEMBER(T) ((T) & KLT_MEMBER)
30589 +#define IS_POINTER(T) ((T) & KLT_POINTER)
30590 +#define IS_TYPEDEF(T) ((T) & KLT_TYPEDEF)
30591 +
30592 +#define TYP_SETUP_FLG 0x01
30593 +#define TYP_TYPESTRING_FLG 0x02
30594 +#define TYP_INCOMPLETE_FLG 0x04
30595 +#define TYP_XREFERENCE_FLG 0x08
30596 +#define TYP_ANONYMOUS_FLG 0x10 /* Denotes anonymous union or struct */
30597 +
30598 +#define NO_INDENT 0x01000000
30599 +#define SUPPRESS_NAME 0x02000000
30600 +#define SUPPRESS_NL 0x04000000
30601 +#define SUPPRESS_SEMI_COLON 0x08000000
30602 +#define NO_REALTYPE 0x10000000
30603 +
30604 +extern int numnmlist;
30605 +
30606 +#define KL_TYPEINFO() (numnmlist)
30607 +
30608 +typedef struct kltype_s {
30609 + char *kl_name; /* type name */
30610 + char *kl_typestr; /* 'typecast' string */
30611 + void *kl_ptr; /* ptr to arch typeinfo */
30612 + int kl_flags; /* (e.g., STAB_FLG) */
30613 + int kl_type; /* (e.g., KLT_TYPEDEF) */
30614 + int kl_offset; /* offset to 1st byte */
30615 + int kl_size; /* number of bytes */
30616 + int kl_bit_offset; /* offset to 1st data bit */
30617 + int kl_bit_size; /* total num of data bits */
30618 + int kl_encoding; /* for base value types */
30619 + int kl_low_bounds; /* for arrays */
30620 + int kl_high_bounds; /* for arrays */
30621 + unsigned int kl_value; /* enum value, etc. */
30622 + struct kltype_s *kl_member; /* struct/union member list */
30623 + struct kltype_s *kl_next; /* hash lists, etc. */
30624 + struct kltype_s *kl_realtype; /* pointer to real type */
30625 + struct kltype_s *kl_indextype; /* pointer to index_type */
30626 + struct kltype_s *kl_elementtype; /* pointer to element_type */
30627 +} kltype_t;
30628 +
30629 +/* Flag values
30630 + */
30631 +#define K_HEX 0x1
30632 +#define K_OCTAL 0x2
30633 +#define K_BINARY 0x4
30634 +#define K_NO_SWAP 0x8
30635 +
30636 +/* Base type encoding values
30637 + */
30638 +#define ENC_CHAR 0x01
30639 +#define ENC_SIGNED 0x02
30640 +#define ENC_UNSIGNED 0x04
30641 +#define ENC_FLOAT 0x08
30642 +#define ENC_ADDRESS 0x10
30643 +#define ENC_UNDEFINED 0x20
30644 +
30645 +/* Maximum number of open namelists
30646 + */
30647 +#define MAXNMLIST 10
30648 +
30649 +typedef struct nmlist_s {
30650 + int index;
30651 + char *namelist;
30652 + void *private; /* pointer to private control struct */
30653 + string_table_t *stringtab;
30654 +} nmlist_t;
30655 +
30656 +extern nmlist_t nmlist[];
30657 +extern int numnmlist;
30658 +extern int curnmlist;
30659 +
30660 +#define KL_TYPESTR_STRUCT "struct"
30661 +#define KL_TYPESTR_UNION "union"
30662 +#define KL_TYPESTR_ENUM "enum"
30663 +#define KL_TYPESTR_VOID "void"
30664 +
30665 +/* Function prototypes
30666 + */
30667 +kltype_t *kl_find_type(
30668 + char * /* type name */,
30669 + int /* type number */);
30670 +
30671 +kltype_t *kl_find_next_type(
30672 + kltype_t * /* kltype_t pointer */,
30673 + int /* type number */);
30674 +
30675 +kltype_t *kl_first_type(
30676 + int /* type number */);
30677 +
30678 +kltype_t *kl_next_type(
30679 + kltype_t * /* kltype_t pointer */);
30680 +
30681 +kltype_t *kl_prev_type(
30682 + kltype_t * /* kltype_t pointer */);
30683 +
30684 +kltype_t *kl_realtype(
30685 + kltype_t * /* kltype_t pointer */,
30686 + int /* type number */);
30687 +
30688 +kltype_t *kl_find_typenum(
30689 + uint64_t /* private typenumber */);
30690 +
30691 +int kl_get_first_similar_typedef(
30692 + char * /* type name */,
30693 + char * /* fullname */);
30694 +
30695 +int kl_type_size(
30696 + kltype_t * /* kltype_t pointer */);
30697 +
30698 +int kl_struct_len(
30699 + char * /* struct name */);
30700 +
30701 +kltype_t *kl_get_member(
30702 + kltype_t * /* kltype_t pointer */,
30703 + char * /* member name */);
30704 +
30705 +int kl_get_member_offset(
30706 + kltype_t * /* kltype_t pointer */,
30707 + char * /* member name */);
30708 +
30709 +int kl_is_member(
30710 + char * /* struct name */,
30711 + char * /* member name */);
30712 +
30713 +kltype_t *kl_member(
30714 + char * /* struct name */,
30715 + char * /* member name */);
30716 +
30717 +int kl_member_offset(
30718 + char * /* struct name */,
30719 + char * /* member name */);
30720 +
30721 +int kl_member_size(
30722 + char * /* struct name */,
30723 + char * /* member name */);
30724 +
30725 +/* cpw: get rid of last arguent FILE * */
30726 +void kl_print_member(void *, kltype_t *, int, int);
30727 +void kl_print_pointer_type(void *, kltype_t *, int, int);
30728 +void kl_print_function_type(void *, kltype_t *, int, int);
30729 +void kl_print_array_type(void *, kltype_t *, int, int);
30730 +void kl_print_enumeration_type(void *, kltype_t *, int, int);
30731 +void kl_print_base_type(void *, kltype_t *, int, int);
30732 +void kl_print_type(void *, kltype_t *, int, int);
30733 +void kl_print_struct_type(void *, kltype_t *, int, int);
30734 +void kl_print_base_value(void *, kltype_t *, int);
30735 +
30736 +void kl_print_type(
30737 + void * /* pointer to data */,
30738 + kltype_t * /* pointer to type information */,
30739 + int /* indent level */,
30740 + int /* flags */);
30741 +
30742 +#endif /* __KL_TYPEINFO_H */
30743 --- /dev/null
30744 +++ b/kdb/modules/lcrash/kl_types.h
30745 @@ -0,0 +1,54 @@
30746 +/*
30747 + * $Id: kl_types.h 1122 2004-12-21 23:26:23Z tjm $
30748 + *
30749 + * This file is part of libklib.
30750 + * A library which provides access to Linux system kernel dumps.
30751 + *
30752 + * Created by Silicon Graphics, Inc.
30753 + * Contributions by IBM, NEC, and others
30754 + *
30755 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
30756 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30757 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30758 + *
30759 + * This code is free software; you can redistribute it and/or modify
30760 + * it under the terms of the GNU Lesser Public License as published by
30761 + * the Free Software Foundation; either version 2.1 of the License, or
30762 + * (at your option) any later version. See the file COPYING for more
30763 + * information.
30764 + */
30765 +
30766 +#ifndef __KL_TYPES_H
30767 +#define __KL_TYPES_H
30768 +
30769 +/* The following typedef should be used for variables or return values
30770 + * that contain kernel virtual or physical addresses. It should be sized
30771 + * such that it can hold both pointers of 64 bit architectures as well as
30772 + * pointers from 32 bit architectures.
30773 + */
30774 +typedef unsigned long kaddr_t;
30775 +
30776 +/* The following typedef should be used when converting a pointer value
30777 + * (either kernel or application) to an unsigned value for pointer
30778 + * calculations.
30779 + */
30780 +typedef unsigned long uaddr_t;
30781 +
30782 +/* KLIB error type
30783 + */
30784 +typedef uint64_t k_error_t;
30785 +
30786 +/* Typedef that allows a single fprintf() call to work for both
30787 + * 32-bit and 64-bit pointer values.
30788 + */
30789 +#define UADDR(X) ((kaddr_t)X)
30790 +#define UADDR64(X) ((kaddr_t)X))
30791 +/* #define UADDR(X) ((uaddr_t)X) */
30792 +/* #define UADDR64(X) ((uint64_t)((uaddr_t)X)) */
30793 +
30794 +
30795 +/* cpw */
30796 +/* was: #include <asm/kl_types.h> */
30797 +#include "asm/kl_types.h"
30798 +
30799 +#endif /* __KL_TYPES_H */
30800 --- /dev/null
30801 +++ b/kdb/modules/lcrash/klib.h
30802 @@ -0,0 +1,480 @@
30803 +/*
30804 + * $Id: klib.h 1336 2006-10-23 23:27:06Z tjm $
30805 + *
30806 + * This file is part of libklib.
30807 + * A library which provides access to Linux system kernel dumps.
30808 + *
30809 + * Created by Silicon Graphics, Inc.
30810 + * Contributions by IBM, NEC, and others
30811 + *
30812 + * Copyright (C) 1999 - 2005 Silicon Graphics, Inc. All rights reserved.
30813 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
30814 + * Copyright 2000 Junichi Nomura, NEC Solutions <j-nomura@ce.jp.nec.com>
30815 + *
30816 + * This code is free software; you can redistribute it and/or modify
30817 + * it under the terms of the GNU Lesser Public License as published by
30818 + * the Free Software Foundation; either version 2.1 of the License, or
30819 + * (at your option) any later version. See the file COPYING for more
30820 + * information.
30821 + */
30822 +
30823 +/*
30824 + * klib.h -- Interface of the klib library, a library for access to
30825 + * Linux system memory dumps.
30826 + */
30827 +
30828 +#ifndef __KLIB_H
30829 +#define __KLIB_H
30830 +
30831 +/* Include header files
30832 + */
30833 +#if 0
30834 + /* cpw: don't include all this: */
30835 +#include <stdio.h>
30836 +#include <stdlib.h>
30837 +#include <stdarg.h>
30838 +#include <stdint.h>
30839 +#include <unistd.h>
30840 +#include <sys/stat.h>
30841 +#include <unistd.h>
30842 +#include <time.h>
30843 +#include <sys/time.h>
30844 +#include <sys/types.h>
30845 +#include <fcntl.h>
30846 +#include <string.h>
30847 +#include <setjmp.h>
30848 +#include <strings.h>
30849 +#include <errno.h>
30850 +#include <ctype.h>
30851 +#include <bfd.h>
30852 +#include <assert.h>
30853 +#endif
30854 +
30855 +/* cpw: change all the below includes form the < > form to " " */
30856 +
30857 +/* Include libutil header
30858 + */
30859 +#include "kl_lib.h"
30860 +
30861 +/* Include libklib header files
30862 + */
30863 +#include "kl_types.h"
30864 +#include "kl_error.h"
30865 +#include "kl_dump.h"
30866 +#include "kl_mem.h"
30867 +#include "kl_cmp.h"
30868 +#include "kl_typeinfo.h"
30869 +#include "kl_module.h"
30870 +#include "kl_sym.h"
30871 +#include "kl_bfd.h"
30872 +#include "kl_debug.h"
30873 +#include "kl_stabs.h"
30874 +#include "kl_dwarfs.h"
30875 +#include "kl_task.h"
30876 +#include "kl_dump_arch.h"
30877 +
30878 +
30879 +#ifndef TRUE
30880 +# define TRUE 1
30881 +#endif
30882 +#ifndef FALSE
30883 +# define FALSE 0
30884 +#endif
30885 +
30886 +#ifndef MIN
30887 +#define MIN(x,y) (((x)<(y))?(x):(y))
30888 +#endif
30889 +#ifndef MAX
30890 +#define MAX(x,y) (((x)>(y))?(x):(y))
30891 +#endif
30892 +
30893 +#define KL_NR_CPUS 128
30894 +
30895 +/* We have to distinc between HOST_ARCH_* and DUMP_ARCH_*. These two classes of
30896 + * macros are used througout the code for conditional compilation.
30897 + * Additional we have following macros for comparison and switch statements.
30898 + */
30899 +#define KL_ARCH_UNKNOWN 0
30900 +#define KL_ARCH_ALPHA 1
30901 +#define KL_ARCH_ARM 2
30902 +#define KL_ARCH_I386 3
30903 +#define KL_ARCH_IA64 4
30904 +#define KL_ARCH_M68K 5
30905 +#define KL_ARCH_MIPS 6
30906 +#define KL_ARCH_MIPS64 7
30907 +#define KL_ARCH_PPC 8
30908 +#define KL_ARCH_S390 9
30909 +#define KL_ARCH_SH 10
30910 +#define KL_ARCH_SPARK 11
30911 +#define KL_ARCH_SPARK64 12
30912 +#define KL_ARCH_S390X 13
30913 +#define KL_ARCH_PPC64 14
30914 +#define KL_ARCH_X86_64 15
30915 +#define KL_ARCH_IA64_SN2 16
30916 +#define KL_ARCH_IA64_DIG 17
30917 +#define KL_ARCH_IA64_HPSIM 18
30918 +#define KL_ARCH_IA64_HPZX1 19
30919 +#define KL_ARCH_S390SA 20
30920 +
30921 +#define KL_LIVE_SYSTEM 1000
30922 +
30923 +#define ARCH_IS_IA64(A) \
30924 + ((A==KL_ARCH_IA64)|| \
30925 + (A==KL_ARCH_IA64_SN2)|| \
30926 + (A==KL_ARCH_IA64_DIG)|| \
30927 + (A==KL_ARCH_IA64_HPSIM)|| \
30928 + (A==KL_ARCH_IA64_HPZX1))
30929 +
30930 +#ifdef HOST_ARCH_ALPHA
30931 +# define KL_HOST_ARCH KL_ARCH_ALPHA
30932 +#endif
30933 +#ifdef HOST_ARCH_ARM
30934 +# define KL_HOST_ARCH KL_ARCH_ARM
30935 +#endif
30936 +#ifdef HOST_ARCH_I386
30937 +# define KL_HOST_ARCH KL_ARCH_I386
30938 +#endif
30939 +#ifdef HOST_ARCH_IA64
30940 +# define KL_HOST_ARCH KL_ARCH_IA64
30941 +#endif
30942 +#ifdef HOST_ARCH_S390
30943 +# define KL_HOST_ARCH KL_ARCH_S390
30944 +#endif
30945 +#ifdef HOST_ARCH_S390X
30946 +# define KL_HOST_ARCH KL_ARCH_S390X
30947 +#endif
30948 +#ifdef HOST_ARCH_PPC64
30949 +#define KL_HOST_ARCH KL_ARCH_PPC64
30950 +#endif
30951 +#ifdef HOST_ARCH_X86_64
30952 +#define KL_HOST_ARCH KL_ARCH_X86_64
30953 +#endif
30954 +
30955 +#define KL_ARCH_STR_ALPHA "alpha"
30956 +#define KL_ARCH_STR_ARM "arm"
30957 +#define KL_ARCH_STR_I386 "i386"
30958 +#define KL_ARCH_STR_IA64 "ia64"
30959 +#define KL_ARCH_STR_S390 "s390"
30960 +#define KL_ARCH_STR_S390X "s390x"
30961 +#define KL_ARCH_STR_PPC64 "ppc64"
30962 +#define KL_ARCH_STR_X86_64 "x86_64"
30963 +#define KL_ARCH_STR_IA64_SN2 "sn2"
30964 +#define KL_ARCH_STR_UNKNOWN "unknown"
30965 +
30966 +/* for endianess of dump and host arch
30967 + */
30968 +#define KL_UNKNOWN_ENDIAN 0x00
30969 +#define KL_LITTLE_ENDIAN 0x01
30970 +#define KL_BIG_ENDIAN 0x02
30971 +
30972 +/* macros for handling of different Kernel versions
30973 + */
30974 +#define LINUX_2_2_X(R) (((R) & 0xffff00) == 0x020200)
30975 +#define LINUX_2_2_16 0x020210
30976 +#define LINUX_2_2_17 0x020211
30977 +#define LINUX_2_4_X(R) (((R) & 0xffff00) == 0x020400)
30978 +#define LINUX_2_4_0 0x020400
30979 +#define LINUX_2_4_4 0x020404
30980 +#define LINUX_2_4_15 0x02040f
30981 +#define LINUX_2_6_X(R) (((R) & 0xffff00) == 0x020600)
30982 +#define LINUX_2_6_0 0x020600
30983 +
30984 +/* libklib flags
30985 + */
30986 +#define KL_FAILSAFE_FLG 0x0001
30987 +#define KL_NOVERIFY_FLG 0x0002
30988 +#define KL_SILENT_FLG 0x0004
30989 +#define KL_SAVETYPES_FLG 0x0008
30990 +#define KL_USETYPES_FLG 0x0010
30991 +
30992 +/* macros for backward compatibility
30993 + */
30994 +#define NUM_PHYSPAGES KLP->dump->mem.num_physpages
30995 +#define MEM_MAP KLP->dump->mem.mem_map
30996 +#define KL_HIGH_MEMORY KLP->dump->mem.high_memory
30997 +#define KL_INIT_MM KLP->dump->mem.init_mm
30998 +#define KL_NUM_CPUS KLP->dump->mem.num_cpus
30999 +#define KL_PGDAT_LIST KLP->dump->mem.pgdat_list
31000 +
31001 +/* macros for better use of dump architecture dependent functions
31002 + */
31003 +
31004 +/* read integer value from buffer */
31005 +#define KL_GET_PTR(ptr) (*KLP->dump->func.get_ptr)(ptr)
31006 +#define KL_GET_LONG(ptr) ((int64_t) KL_GET_PTR(ptr))
31007 +#define KL_GET_ULONG(ptr) KL_GET_PTR(ptr)
31008 +#define KL_GET_UINT8(ptr) (*KLP->dump->func.get_uint8)(ptr)
31009 +#define KL_GET_UINT16(ptr) (*KLP->dump->func.get_uint16)(ptr)
31010 +#define KL_GET_UINT32(ptr) (*KLP->dump->func.get_uint32)(ptr)
31011 +#define KL_GET_UINT64(ptr) (*KLP->dump->func.get_uint64)(ptr)
31012 +#define KL_GET_INT8(ptr) ((int8_t) KL_GET_UINT8(ptr))
31013 +#define KL_GET_INT16(ptr) ((int16_t) KL_GET_UINT16(ptr))
31014 +#define KL_GET_INT32(ptr) ((int32_t) KL_GET_UINT32(ptr))
31015 +#define KL_GET_INT64(ptr) ((int64_t) KL_GET_UINT64(ptr))
31016 +
31017 +/* read integer value from dump (without address mapping)
31018 + * Use these functions sparsely, e.g. before address translation
31019 + * is properly set up.
31020 + */
31021 +#define KL_READ_PTR(addr) (*KLP->dump->func.read_ptr)(addr)
31022 +#define KL_READ_LONG(addr) ((int64_t) KL_READ_PTR(addr))
31023 +#define KL_READ_ULONG(addr) KL_READ_PTR(addr)
31024 +#define KL_READ_UINT8(addr) (*KLP->dump->func.read_uint8)(addr)
31025 +#define KL_READ_UINT16(addr) (*KLP->dump->func.read_uint16)(addr)
31026 +#define KL_READ_UINT32(addr) (*KLP->dump->func.read_uint32)(addr)
31027 +#define KL_READ_UINT64(addr) (*KLP->dump->func.read_uint64)(addr)
31028 +#define KL_READ_INT8(addr) ((int8_t) KL_READ_UINT8(addr))
31029 +#define KL_READ_INT16(addr) ((int16_t) KL_READ_UINT16(addr))
31030 +#define KL_READ_INT32(addr) ((int32_t) KL_READ_UINT32(addr))
31031 +#define KL_READ_INT64(addr) ((int64_t) KL_READ_UINT64(addr))
31032 +
31033 +/* read integer value from dump (from virtual address) doing address mapping */
31034 +#define KL_VREAD_PTR(addr) (*KLP->dump->func.vread_ptr)(addr)
31035 +#define KL_VREAD_LONG(addr) ((int64_t) KL_VREAD_PTR(addr))
31036 +#define KL_VREAD_ULONG(addr) KL_VREAD_PTR(addr)
31037 +#define KL_VREAD_UINT8(addr) (*KLP->dump->func.vread_uint8)(addr)
31038 +#define KL_VREAD_UINT16(addr) (*KLP->dump->func.vread_uint16)(addr)
31039 +#define KL_VREAD_UINT32(addr) (*KLP->dump->func.vread_uint32)(addr)
31040 +#define KL_VREAD_UINT64(addr) (*KLP->dump->func.vread_uint64)(addr)
31041 +#define KL_VREAD_INT8(addr) ((int8_t) KL_VREAD_UINT8(addr))
31042 +#define KL_VREAD_INT16(addr) ((int16_t) KL_VREAD_UINT16(addr))
31043 +#define KL_VREAD_INT32(addr) ((int32_t) KL_VREAD_UINT32(addr))
31044 +#define KL_VREAD_INT64(addr) ((int64_t) KL_VREAD_UINT64(addr))
31045 +
31046 +/* determine start of stack */
31047 +#define KL_KERNELSTACK_UINT64 (*KLP->dump->arch.kernelstack)
31048 +/* map virtual adress to physical one */
31049 +#define KL_VIRTOP (*KLP->dump->arch.virtop)
31050 +/* travers page table */
31051 +#define KL_MMAP_VIRTOP (*KLP->dump->arch.mmap_virtop)
31052 +/* check whether address points to valid physical memory */
31053 +#define KL_VALID_PHYSMEM (*KLP->dump->arch.valid_physmem)
31054 +/* determine next valid physical address */
31055 +#define KL_NEXT_VALID_PHYSADDR (*KLP->dump->arch.next_valid_physaddr)
31056 +/* XXX */
31057 +#define KL_FIX_VADDR (*KLP->dump->arch.fix_vaddr)
31058 +/* write dump_header_asm_t */
31059 +#define KL_WRITE_DHA (*KLP->dump->arch.write_dha)
31060 +/* size of dump_header_asm_t */
31061 +#define KL_DHA_SIZE (KLP->dump->arch.dha_size)
31062 +/* init virtual to physical address mapping */
31063 +#define KL_INIT_VIRTOP (KLP->dump->arch.init_virtop)
31064 +
31065 +
31066 +/* macros for easier access to dump specific values */
31067 +#define KL_CORE_TYPE KLP->dump->core_type
31068 +#define KL_CORE_FD KLP->dump->core_fd
31069 +#define KL_ARCH KLP->dump->arch.arch
31070 +#define KL_PTRSZ KLP->dump->arch.ptrsz
31071 +#define KL_NBPW (KL_PTRSZ/8)
31072 +#define KL_BYTE_ORDER KLP->dump->arch.byteorder
31073 +#define KL_PAGE_SHIFT KLP->dump->arch.pageshift
31074 +#define KL_PAGE_SIZE KLP->dump->arch.pagesize
31075 +#define KL_PAGE_MASK KLP->dump->arch.pagemask
31076 +#define KL_PAGE_OFFSET KLP->dump->arch.pageoffset
31077 +#define KL_STACK_OFFSET KLP->dump->arch.kstacksize
31078 +#define IS_BIG_ENDIAN() (KL_BYTE_ORDER == KL_BIG_ENDIAN)
31079 +#define IS_LITTLE_ENDIAN() (KL_BYTE_ORDER == KL_LITTLE_ENDIAN)
31080 +#define KL_LINUX_RELEASE KLP->dump->mem.linux_release
31081 +#define KL_KERNEL_FLAGS KLP->dump->mem.kernel_flags
31082 +
31083 +#if 0
31084 +/* cpw: don't need all this dump file stuff: */
31085 +/* macros to access input files */
31086 +#define KL_MAP_FILE KLP->dump->map
31087 +#define KL_DUMP_FILE KLP->dump->dump
31088 +#define KL_KERNTYPES_FILE KLP->kerntypes
31089 +
31090 +#define CORE_IS_KMEM (KL_CORE_TYPE == dev_kmem)
31091 +#define CORE_IS_DUMP ((KL_CORE_TYPE > dev_kmem) && (KL_CORE_TYPE <= unk_core))
31092 +
31093 +
31094 +/* Generic dump header structure (the first three members of
31095 + * dump_header and dump_header_asm are the same).
31096 + */
31097 +typedef struct generic_dump_header_s {
31098 + uint64_t magic_number;
31099 + uint32_t version;
31100 + uint32_t header_size;
31101 +} generic_dump_header_t;
31102 +
31103 +/* Some macros for making it easier to access the generic header
31104 + * information in a dump_header or dump_header_asm stuct.
31105 + */
31106 +#define DHP(dh) ((generic_dump_header_t*)(dh))
31107 +#define DH_MAGIC(dh) DHP(dh)->magic_number
31108 +#define DH_VERSION(dh) DHP(dh)->version
31109 +#define DH_HEADER_SIZE(dh) DHP(dh)->header_size
31110 +
31111 +extern kl_dump_header_t *DUMP_HEADER;
31112 +extern void *DUMP_HEADER_ASM;
31113 +#endif
31114 +
31115 +/* Struct to store some host architecture specific values
31116 + */
31117 +typedef struct kl_hostarch_s {
31118 + int arch; /* KL_ARCH_ */
31119 + int ptrsz; /* 32 or 64 bit */
31120 + int byteorder; /* KL_LITTLE_ENDIAN or KL_BIG_ENDIAN */
31121 +} kl_hostarch_t;
31122 +
31123 +/* Struct klib_s, contains all the information necessary for accessing
31124 + * information in the kernel. A pointer to a klib_t struct will be
31125 + * returned from libkern_init() if core dump analysis (or live system
31126 + * analysis) is possible.
31127 + *
31128 + */
31129 +typedef struct klib_s {
31130 + int k_flags; /* Flags pertaining to klib_s struct */
31131 + kl_hostarch_t *host; /* host arch info */
31132 + kl_dumpinfo_t *dump; /* dump information */
31133 + maplist_t *k_symmap; /* symbol information */
31134 + kltype_t *k_typeinfo; /* type information */
31135 + char *kerntypes; /* pathname for kerntypes file */
31136 +} klib_t;
31137 +
31138 +/* Structure to accomodate all debug formats */
31139 +struct namelist_format_opns {
31140 + /* to open/setup the namelist file */
31141 + int (*open_namelist) (char *filename , int flags);
31142 + int (*setup_typeinfo)(void);
31143 +};
31144 +
31145 +/*
31146 + * global variables
31147 + */
31148 +
31149 +/* Here we store almost everything, we need to know about a dump. */
31150 +extern klib_t *KLP;
31151 +
31152 +/* macros to make live easier */
31153 +#define MIP KLP->dump
31154 +#define STP KLP->k_symmap
31155 +#define TASK_STRUCT_SZ (KLP->dump->mem.struct_sizes.task_struct_sz)
31156 +#define MM_STRUCT_SZ (KLP->dump->mem.struct_sizes.mm_struct_sz)
31157 +#define PAGE_SZ (KLP->dump->mem.struct_sizes.page_sz)
31158 +#define MODULE_SZ (KLP->dump->mem.struct_sizes.module_sz)
31159 +#define NEW_UTSNAME_SZ (KLP->dump->mem.struct_sizes.new_utsname_sz)
31160 +#define SWITCH_STACK_SZ (KLP->dump->mem.struct_sizes.switch_stack_sz)
31161 +#define PT_REGS_SZ (KLP->dump->mem.struct_sizes.pt_regs_sz)
31162 +#define PGLIST_DATA_SZ (KLP->dump->mem.struct_sizes.pglist_data_sz)
31163 +#define RUNQUEUE_SZ (KLP->dump->mem.struct_sizes.runqueue_sz)
31164 +
31165 +#if 0
31166 +cpw: used for sial?
31167 +/* klib_jbuf has to be defined outside libklib.
31168 + * Make sure to call setjmp(klib_jbuf) BEFORE kl_sig_setup() is called! */
31169 +extern jmp_buf klib_jbuf;
31170 +#endif
31171 +
31172 +/* Macros that eliminate the offset paramaters to the kl_uint() and kl_int()
31173 + * functions (just makes things cleaner looking)
31174 + */
31175 +#define KL_UINT(p, s, m) kl_uint(p, s, m, 0)
31176 +#define KL_INT(p, s, m) kl_int(p, s, m, 0)
31177 +
31178 +/* Macros for translating strings into long numeric values depending
31179 + * on the base of 's'.
31180 + */
31181 +#define GET_VALUE(s, value) kl_get_value(s, NULL, 0, value)
31182 +#define GET_HEX_VALUE(s) (kaddr_t)strtoull(s, (char**)NULL, 16)
31183 +#define GET_DEC_VALUE(s) (unsigned)strtoull(s, (char**)NULL, 10)
31184 +#define GET_OCT_VALUE(s) (unsigned)strtoull(s, (char**)NULL, 8)
31185 +
31186 +#define KL_SIGFLG_CORE 0x1
31187 +#define KL_SIGFLG_SILENT 0x2
31188 +#define KL_SIGFLG_LNGJMP 0x4
31189 +
31190 +/* Flag that tells kl_is_valid_kaddr() to perform a word aligned check
31191 + */
31192 +#define WORD_ALIGN_FLAG 1
31193 +
31194 +#define ADDR_TO_PGNO(addr) ((addr - KL_PAGE_OFFSET) >> KL_PAGE_SHIFT);
31195 +
31196 +/* Generalized macros for pointing at different data types at particular
31197 + * offsets in kernel structs.
31198 + */
31199 +/* #define K_ADDR(p, s, f) ((uaddr_t)(p) + kl_member_offset(s, f)) */
31200 +#define K_ADDR(p, s, f) ((p) + kl_member_offset(s, f))
31201 +#define K_PTR(p, s, f) (K_ADDR((void*)p, s, f))
31202 +#define CHAR(p, s, f) (K_ADDR((char*)p, s, f))
31203 +
31204 +#define PTRSZ32 ((KL_PTRSZ == 32) ? 1 : 0)
31205 +#define PTRSZ64 ((KL_PTRSZ == 64) ? 1 : 0)
31206 +
31207 +/* Function prototypes
31208 + */
31209 +/* cpw: remove the last argument FILE * */
31210 +void kl_binary_print(uint64_t);
31211 +void kl_print_bit_value(void *, int, int, int, int);
31212 +void kl_print_char(void *, int);
31213 +void kl_print_uchar(void *, int);
31214 +void kl_print_int2(void *, int);
31215 +void kl_print_uint2(void *, int);
31216 +void kl_print_int4(void *, int);
31217 +void kl_print_uint4(void *, int);
31218 +void kl_print_float4(void *, int);
31219 +void kl_print_int8(void *, int);
31220 +void kl_print_uint8(void *, int);
31221 +void kl_print_float8(void *, int);
31222 +void kl_print_base(void *, int, int, int);
31223 +void kl_print_string(char *);
31224 +
31225 +int kl_get_live_filenames(
31226 + char * /* pointer to buffer for map filename */,
31227 + char * /* pointer to buffer for dump filename */,
31228 + char * /* pointer to buffer for namelist filename */);
31229 +
31230 +int kl_init_klib(
31231 + char * /* map file name */,
31232 + char * /* dump file name */,
31233 + char * /* namelist file name */,
31234 + int /* system arch of memory in dump */,
31235 + int /* rwflag flag (/dev/mem only) */,
31236 + int /* Linux release */);
31237 +
31238 +void kl_free_klib(
31239 + klib_t * /* Pointer to klib_s struct */);
31240 +
31241 +
31242 +int kl_dump_retrieve(
31243 + char * /* dumpdev name */,
31244 + char * /* dumpdir name */,
31245 + int /* progress flag (zero or non-zero) */,
31246 + int /* debug flag (zero or non-zero) */);
31247 +
31248 +int kl_dump_erase(
31249 + char * /* dumpdev name */);
31250 +
31251 +uint64_t kl_strtoull(
31252 + char * /* string containing numeric value */,
31253 + char ** /* pointer to pointer to bad char */,
31254 + int /* base */);
31255 +
31256 +int kl_get_value(
31257 + char * /* param */,
31258 + int * /* mode pointer */,
31259 + int /* number of elements */,
31260 + uint64_t * /* pointer to value */);
31261 +
31262 +/* Functions for working with list_head structs
31263 + */
31264 +kaddr_t kl_list_entry(kaddr_t, char *, char *);
31265 +kaddr_t kl_list_next(kaddr_t);
31266 +kaddr_t kl_list_prev(kaddr_t);
31267 +
31268 +int kl_sig_setup(int);
31269 +
31270 +void kl_set_curnmlist(
31271 + int /* index of namelist */);
31272 +
31273 +int kl_open_namelist(
31274 + char * /* name of namelist */,
31275 + int /* flags */,
31276 + int /* kl_flags */);
31277 +
31278 +int kl_get_structure(kaddr_t, char*, size_t*, void**);
31279 +uint64_t kl_get_bit_value(void*, unsigned int, unsigned int, unsigned int);
31280 +void kl_s390tod_to_timeval(uint64_t, struct timeval*);
31281 +
31282 +#endif /* __KLIB_H */
31283 --- /dev/null
31284 +++ b/kdb/modules/lcrash/lc_eval.h
31285 @@ -0,0 +1,225 @@
31286 +/*
31287 + * $Id: lc_eval.h 1122 2004-12-21 23:26:23Z tjm $
31288 + *
31289 + * This file is part of lcrash, an analysis tool for Linux memory dumps.
31290 + *
31291 + * Created by Silicon Graphics, Inc.
31292 + * Contributions by IBM, and others
31293 + *
31294 + * Copyright (C) 1999 - 2002 Silicon Graphics, Inc. All rights reserved.
31295 + * Copyright (C) 2001, 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
31296 + *
31297 + * This program is free software; you can redistribute it and/or modify
31298 + * it under the terms of the GNU General Public License as published by
31299 + * the Free Software Foundation; either version 2 of the License, or
31300 + * (at your option) any later version. See the file COPYING for more
31301 + * information.
31302 + */
31303 +
31304 +#ifndef __LC_EVAL_H
31305 +#define __LC_EVAL_H
31306 +
31307 +typedef struct type_s {
31308 + int flag;
31309 + union {
31310 + struct type_s *next;
31311 + kltype_t *kltp;
31312 + } un;
31313 +} type_t;
31314 +
31315 +#define t_next un.next
31316 +#define t_kltp un.kltp
31317 +
31318 +/* Structure to hold info on "tokens" extracted from eval and print
31319 + * command input strings.
31320 + */
31321 +typedef struct token_s {
31322 + short type;
31323 + short operator; /* if token is an operator */
31324 + char *string; /* string holding value or identifier */
31325 + char *ptr; /* pointer to start of token */
31326 + struct token_s *next; /* next token in the chain */
31327 +} token_t;
31328 +
31329 +/* Structure returned by the eval() function containing the result
31330 + * of an expression evaluation. This struct is also used to build the
31331 + * parse tree for the expression.
31332 + */
31333 +typedef struct node_s {
31334 + struct node_s *next; /* linked list pointer */
31335 + unsigned char node_type; /* type of node */
31336 + unsigned short flags; /* see below */
31337 + unsigned char operator; /* operator if node is type OPERATOR */
31338 + unsigned char byte_size; /* byte_size of base_type values */
31339 + char *name; /* name of variable or struct member */
31340 + /* value and address are uint64_t in lcrash, but for ia32 ... */
31341 + unsigned long long value; /* numeric value or pointer */
31342 + unsigned long address; /* address (could be same as pointer) */
31343 + type_t *type; /* pointer to type related info */
31344 + char *tok_ptr; /* pointer to token in cmd string */
31345 + struct node_s *left; /* pointer to left child */
31346 + struct node_s *right; /* pointer to right child */
31347 +} node_t;
31348 +
31349 +/* Token and Node types
31350 + */
31351 +#define OPERATOR 1
31352 +#define NUMBER 2
31353 +#define INDEX 3
31354 +#define TYPE_DEF 4
31355 +#define VADDR 5
31356 +#define MEMBER 6
31357 +#define STRING 7
31358 +#define TEXT 8
31359 +#define CHARACTER 9
31360 +#define EVAL_VAR 10
31361 +
31362 +/* Flag values
31363 + */
31364 +#define STRING_FLAG 0x001
31365 +#define ADDRESS_FLAG 0x002
31366 +#define INDIRECTION_FLAG 0x004
31367 +#define POINTER_FLAG 0x008
31368 +#define MEMBER_FLAG 0x010
31369 +#define BOOLIAN_FLAG 0x020
31370 +#define KLTYPE_FLAG 0x040
31371 +#define NOTYPE_FLAG 0x080
31372 +#define UNSIGNED_FLAG 0x100
31373 +#define VOID_FLAG 0x200
31374 +
31375 +/* Flag value for print_eval_error() function
31376 + */
31377 +#define CMD_NAME_FLG 1 /* cmdname is not name of a command */
31378 +#define CMD_STRING_FLG 2 /* cmdname is not name of a command */
31379 +
31380 +/* Expression operators in order of precedence.
31381 + */
31382 +#define CONDITIONAL 1
31383 +#define CONDITIONAL_ELSE 2
31384 +#define LOGICAL_OR 3
31385 +#define LOGICAL_AND 4
31386 +#define BITWISE_OR 5
31387 +#define BITWISE_EXCLUSIVE_OR 6
31388 +#define BITWISE_AND 7
31389 +#define EQUAL 8
31390 +#define NOT_EQUAL 9
31391 +#define LESS_THAN 10
31392 +#define GREATER_THAN 11
31393 +#define LESS_THAN_OR_EQUAL 12
31394 +#define GREATER_THAN_OR_EQUAL 13
31395 +#define RIGHT_SHIFT 14
31396 +#define LEFT_SHIFT 15
31397 +#define ADD 16
31398 +#define SUBTRACT 17
31399 +#define MULTIPLY 18
31400 +#define DIVIDE 19
31401 +#define MODULUS 20
31402 +#define LOGICAL_NEGATION 21
31403 +#define ONES_COMPLEMENT 22
31404 +#define PREFIX_INCREMENT 23
31405 +#define PREFIX_DECREMENT 24
31406 +#define POSTFIX_INCREMENT 25
31407 +#define POSTFIX_DECREMENT 26
31408 +#define CAST 27
31409 +#define UNARY_MINUS 28
31410 +#define UNARY_PLUS 29
31411 +#define INDIRECTION 30
31412 +#define ADDRESS 31
31413 +#define SIZEOF 32
31414 +#define RIGHT_ARROW 33
31415 +#define DOT 34
31416 +#define OPEN_PAREN 100
31417 +#define CLOSE_PAREN 101
31418 +#define OPEN_SQUARE_BRACKET 102
31419 +#define CLOSE_SQUARE_BRACKET 103
31420 +#define SEMI_COLON 104
31421 +#define NOT_YET -1
31422 +
31423 +/* Errors codes primarily for use with eval (print) functions
31424 + */
31425 +#define E_OPEN_PAREN 1100
31426 +#define E_CLOSE_PAREN 1101
31427 +#define E_BAD_STRUCTURE 1102
31428 +#define E_MISSING_STRUCTURE 1103
31429 +#define E_BAD_MEMBER 1104
31430 +#define E_BAD_OPERATOR 1105
31431 +#define E_BAD_OPERAND 1106
31432 +#define E_MISSING_OPERAND 1107
31433 +#define E_BAD_TYPE 1108
31434 +#define E_NOTYPE 1109
31435 +#define E_BAD_POINTER 1110
31436 +#define E_BAD_INDEX 1111
31437 +#define E_BAD_CHAR 1112
31438 +#define E_BAD_STRING 1113
31439 +#define E_END_EXPECTED 1114
31440 +#define E_BAD_EVAR 1115 /* Bad eval variable */
31441 +#define E_BAD_VALUE 1116
31442 +#define E_NO_VALUE 1117
31443 +#define E_DIVIDE_BY_ZERO 1118
31444 +#define E_BAD_CAST 1119
31445 +#define E_NO_ADDRESS 1120
31446 +#define E_SINGLE_QUOTE 1121
31447 +
31448 +#define E_BAD_WHATIS 1197
31449 +#define E_NOT_IMPLEMENTED 1198
31450 +#define E_SYNTAX_ERROR 1199
31451 +
31452 +extern uint64_t eval_error;
31453 +extern char *error_token;
31454 +
31455 +/* Function prototypes
31456 + */
31457 +node_t *eval(char **, int);
31458 +void print_eval_error(char *, char *, char *, uint64_t, int);
31459 +void free_nodes(node_t *);
31460 +
31461 +/* Struct to hold information about eval variables
31462 + */
31463 +typedef struct variable_s {
31464 + btnode_t v_bt; /* Must be first */
31465 + int v_flags;
31466 + char *v_exp; /* What was entered on command line */
31467 + char *v_typestr; /* Actual type string after eval() call */
31468 + node_t *v_node;
31469 +} variable_t;
31470 +
31471 +#define v_left v_bt.bt_left
31472 +#define v_right v_bt.bt_right
31473 +#define v_name v_bt.bt_key
31474 +
31475 +/* Flag values
31476 + */
31477 +#define V_PERM 0x001 /* can't be unset - can be modified */
31478 +#define V_DEFAULT 0x002 /* set at startup */
31479 +#define V_NOMOD 0x004 /* cannot be modified */
31480 +#define V_TYPEDEF 0x008 /* contains typed data */
31481 +#define V_REC_STRUCT 0x010 /* direct ref to struct/member (not pointer) */
31482 +#define V_STRING 0x020 /* contains ASCII string (no type) */
31483 +#define V_COMMAND 0x040 /* contains command string (no type) */
31484 +#define V_OPTION 0x080 /* contains option flag (e.g., $hexints) */
31485 +#define V_PERM_NODE 0x100 /* Don't free node after setting variable */
31486 +
31487 +/* Variable table struct
31488 + */
31489 +typedef struct vtab_s {
31490 + variable_t *vt_root;
31491 + int vt_count;
31492 +} vtab_t;
31493 +
31494 +extern vtab_t *vtab; /* Pointer to table of eval variable info */
31495 +
31496 +/* Function Prototypes
31497 + */
31498 +variable_t *make_variable(char *, char *, node_t *, int);
31499 +void clean_variable(variable_t *);
31500 +void free_variable(variable_t *);
31501 +void init_variables(vtab_t *);
31502 +int set_variable(vtab_t *, char *, char *, node_t *, int);
31503 +int unset_variable(vtab_t *, variable_t *);
31504 +variable_t *find_variable(vtab_t *, char *, int);
31505 +kltype_t *number_to_type(node_t *);
31506 +void free_eval_memory(void);
31507 +/* cpw: was int print_eval_results(node_t *, FILE *, int); */
31508 +int print_eval_results(node_t *, int);
31509 +
31510 +#endif /* __LC_EVAL_H */
31511 --- a/kernel/exit.c
31512 +++ b/kernel/exit.c
31513 @@ -4,6 +4,9 @@
31514 * Copyright (C) 1991, 1992 Linus Torvalds
31515 */
31516
31517 +#ifdef CONFIG_KDB
31518 +#include <linux/kdb.h>
31519 +#endif
31520 #include <linux/mm.h>
31521 #include <linux/slab.h>
31522 #include <linux/interrupt.h>
31523 --- a/kernel/kallsyms.c
31524 +++ b/kernel/kallsyms.c
31525 @@ -479,3 +479,25 @@ __initcall(kallsyms_init);
31526
31527 EXPORT_SYMBOL(__print_symbol);
31528 EXPORT_SYMBOL_GPL(sprint_symbol);
31529 +
31530 +#ifdef CONFIG_KDB
31531 +#include <linux/kdb.h>
31532 +#include <linux/kdbprivate.h>
31533 +
31534 +const char *kdb_walk_kallsyms(loff_t *pos)
31535 +{
31536 + static struct kallsym_iter kdb_walk_kallsyms_iter;
31537 + if (*pos == 0) {
31538 + memset(&kdb_walk_kallsyms_iter, 0, sizeof(kdb_walk_kallsyms_iter));
31539 + reset_iter(&kdb_walk_kallsyms_iter, 0);
31540 + }
31541 + while (1) {
31542 + if (!update_iter(&kdb_walk_kallsyms_iter, *pos))
31543 + return NULL;
31544 + ++*pos;
31545 + /* Some debugging symbols have no name. Ignore them. */
31546 + if (kdb_walk_kallsyms_iter.name[0])
31547 + return kdb_walk_kallsyms_iter.name;
31548 + }
31549 +}
31550 +#endif /* CONFIG_KDB */
31551 --- a/kernel/kexec.c
31552 +++ b/kernel/kexec.c
31553 @@ -37,6 +37,12 @@
31554 #include <asm/system.h>
31555 #include <asm/sections.h>
31556
31557 +#ifdef CONFIG_KDB_KDUMP
31558 +#include <linux/module.h>
31559 +#include <linux/device.h>
31560 +#include <linux/kdb.h>
31561 +#endif
31562 +
31563 /* Per cpu memory for storing cpu states in case of system crash. */
31564 note_buf_t* crash_notes;
31565
31566 @@ -1072,9 +1078,19 @@ void crash_kexec(struct pt_regs *regs)
31567 if (mutex_trylock(&kexec_mutex)) {
31568 if (kexec_crash_image) {
31569 struct pt_regs fixed_regs;
31570 +
31571 crash_setup_regs(&fixed_regs, regs);
31572 crash_save_vmcoreinfo();
31573 + /*
31574 + * If we enabled KDB, we don't want to automatically
31575 + * perform a kdump since KDB will be responsible for
31576 + * executing kdb through a special 'kdump' command.
31577 + */
31578 +#ifdef CONFIG_KDB_KDUMP
31579 + kdba_kdump_prepare(&fixed_regs);
31580 +#else
31581 machine_crash_shutdown(&fixed_regs);
31582 +#endif
31583 machine_kexec(kexec_crash_image);
31584 }
31585 mutex_unlock(&kexec_mutex);
31586 --- a/kernel/module.c
31587 +++ b/kernel/module.c
31588 @@ -2576,12 +2576,23 @@ out:
31589 return -ERANGE;
31590 }
31591
31592 +#ifdef CONFIG_KDB
31593 +#include <linux/kdb.h>
31594 +struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
31595 +#endif /* CONFIG_KDB */
31596 +
31597 int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
31598 char *name, char *module_name, int *exported)
31599 {
31600 struct module *mod;
31601 +#ifdef CONFIG_KDB
31602 + int get_lock = !KDB_IS_RUNNING();
31603 +#else
31604 +#define get_lock 1
31605 +#endif
31606
31607 - preempt_disable();
31608 + if (get_lock)
31609 + preempt_disable();
31610 list_for_each_entry(mod, &modules, list) {
31611 if (symnum < mod->num_symtab) {
31612 *value = mod->symtab[symnum].st_value;
31613 @@ -2590,12 +2601,14 @@ int module_get_kallsym(unsigned int symn
31614 KSYM_NAME_LEN);
31615 strlcpy(module_name, mod->name, MODULE_NAME_LEN);
31616 *exported = is_exported(name, mod);
31617 - preempt_enable();
31618 + if (get_lock)
31619 + preempt_enable();
31620 return 0;
31621 }
31622 symnum -= mod->num_symtab;
31623 }
31624 - preempt_enable();
31625 + if (get_lock)
31626 + preempt_enable();
31627 return -ERANGE;
31628 }
31629
31630 --- a/kernel/panic.c
31631 +++ b/kernel/panic.c
31632 @@ -21,6 +21,9 @@
31633 #include <linux/debug_locks.h>
31634 #include <linux/random.h>
31635 #include <linux/kallsyms.h>
31636 +#ifdef CONFIG_KDB_KDUMP
31637 +#include <linux/kdb.h>
31638 +#endif
31639
31640 int panic_on_oops;
31641 int tainted;
31642 @@ -82,6 +85,11 @@ NORET_TYPE void panic(const char * fmt,
31643 printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf);
31644 bust_spinlocks(0);
31645
31646 +#ifdef CONFIG_KDB_KDUMP
31647 + if (kdb_kdump_state == KDB_KDUMP_RESET) {
31648 + (void)kdb(KDB_REASON_OOPS, 999, get_irq_regs());
31649 + }
31650 +#endif
31651 /*
31652 * If we have crashed and we have a crash kernel loaded let it handle
31653 * everything else.
31654 --- a/kernel/printk.c
31655 +++ b/kernel/printk.c
31656 @@ -443,6 +443,20 @@ void debugger_syslog_data(char *syslog_d
31657 }
31658 #endif /* CONFIG_DEBUG_KERNEL */
31659
31660 +#ifdef CONFIG_KDB
31661 +/* kdb dmesg command needs access to the syslog buffer. do_syslog() uses locks
31662 + * so it cannot be used during debugging. Just tell kdb where the start and
31663 + * end of the physical and logical logs are. This is equivalent to do_syslog(3).
31664 + */
31665 +void kdb_syslog_data(char *syslog_data[4])
31666 +{
31667 + syslog_data[0] = log_buf;
31668 + syslog_data[1] = log_buf + log_buf_len;
31669 + syslog_data[2] = log_buf + log_end - (logged_chars < log_buf_len ? logged_chars : log_buf_len);
31670 + syslog_data[3] = log_buf + log_end;
31671 +}
31672 +#endif /* CONFIG_KDB */
31673 +
31674 /*
31675 * Call the console drivers on a range of log_buf
31676 */
31677 --- a/kernel/sched.c
31678 +++ b/kernel/sched.c
31679 @@ -8358,7 +8358,7 @@ void normalize_rt_tasks(void)
31680
31681 #endif /* CONFIG_MAGIC_SYSRQ */
31682
31683 -#ifdef CONFIG_IA64
31684 +#if defined(CONFIG_IA64) || defined(CONFIG_KDB)
31685 /*
31686 * These functions are only useful for the IA64 MCA handling.
31687 *
31688 @@ -9299,3 +9299,94 @@ struct cgroup_subsys cpuacct_subsys = {
31689 .subsys_id = cpuacct_subsys_id,
31690 };
31691 #endif /* CONFIG_CGROUP_CPUACCT */
31692 +
31693 +#ifdef CONFIG_KDB
31694 +
31695 +#include <linux/kdb.h>
31696 +
31697 +static void
31698 +kdb_prio(char *name, struct rt_prio_array *array, kdb_printf_t xxx_printf,
31699 + unsigned int cpu)
31700 +{
31701 + int pri, printed_header = 0;
31702 + struct task_struct *p;
31703 +
31704 + xxx_printf(" %s rt bitmap: 0x%lx 0x%lx 0x%lx\n",
31705 + name,
31706 + array->bitmap[0], array->bitmap[1], array->bitmap[2]);
31707 +
31708 + pri = sched_find_first_bit(array->bitmap);
31709 + if (pri < MAX_RT_PRIO) {
31710 + xxx_printf(" rt bitmap priorities:");
31711 + while (pri < MAX_RT_PRIO) {
31712 + xxx_printf(" %d", pri);
31713 + pri++;
31714 + pri = find_next_bit(array->bitmap, MAX_RT_PRIO, pri);
31715 + }
31716 + xxx_printf("\n");
31717 + }
31718 +
31719 + for (pri = 0; pri < MAX_RT_PRIO; pri++) {
31720 + int printed_hdr = 0;
31721 + struct list_head *head, *curr;
31722 +
31723 + head = array->queue + pri;
31724 + curr = head->next;
31725 + while(curr != head) {
31726 + struct task_struct *task;
31727 + if (!printed_hdr) {
31728 + xxx_printf(" queue at priority=%d\n", pri);
31729 + printed_hdr = 1;
31730 + }
31731 + task = list_entry(curr, struct task_struct, rt.run_list);
31732 + if (task)
31733 + xxx_printf(" 0x%p %d %s time_slice:%d\n",
31734 + task, task->pid, task->comm,
31735 + task->rt.time_slice);
31736 + curr = curr->next;
31737 + }
31738 + }
31739 + for_each_process(p) {
31740 + if (p->se.on_rq && (task_cpu(p) == cpu) &&
31741 + (p->policy == SCHED_NORMAL)) {
31742 + if (!printed_header) {
31743 + xxx_printf(" sched_normal queue:\n");
31744 + printed_header = 1;
31745 + }
31746 + xxx_printf(" 0x%p %d %s pri:%d spri:%d npri:%d\n",
31747 + p, p->pid, p->comm, p->prio,
31748 + p->static_prio, p->normal_prio);
31749 + }
31750 + }
31751 +}
31752 +
31753 +/* This code must be in sched.c because struct rq is only defined in this
31754 + * source. To allow most of kdb to be modular, this code cannot call any kdb
31755 + * functions directly, any external functions that it needs must be passed in
31756 + * as parameters.
31757 + */
31758 +
31759 +void
31760 +kdb_runqueue(unsigned long cpu, kdb_printf_t xxx_printf)
31761 +{
31762 + struct rq *rq;
31763 +
31764 + rq = cpu_rq(cpu);
31765 +
31766 + xxx_printf("CPU%ld lock:%s curr:0x%p(%d)(%s)",
31767 + cpu, (spin_is_locked(&rq->lock))?"LOCKED":"free",
31768 + rq->curr, rq->curr->pid, rq->curr->comm);
31769 + if (rq->curr == rq->idle)
31770 + xxx_printf(" is idle");
31771 + xxx_printf("\n ");
31772 +#ifdef CONFIG_SMP
31773 + xxx_printf(" cpu_load:%lu %lu %lu",
31774 + rq->cpu_load[0], rq->cpu_load[1], rq->cpu_load[2]);
31775 +#endif
31776 + xxx_printf(" nr_running:%lu nr_switches:%llu\n",
31777 + rq->nr_running, (long long)rq->nr_switches);
31778 + kdb_prio("active", &rq->rt.active, xxx_printf, (unsigned int)cpu);
31779 +}
31780 +EXPORT_SYMBOL(kdb_runqueue);
31781 +
31782 +#endif /* CONFIG_KDB */
31783 --- a/kernel/signal.c
31784 +++ b/kernel/signal.c
31785 @@ -2596,3 +2596,52 @@ void __init signals_init(void)
31786 {
31787 sigqueue_cachep = KMEM_CACHE(sigqueue, SLAB_PANIC);
31788 }
31789 +
31790 +#ifdef CONFIG_KDB
31791 +#include <linux/kdb.h>
31792 +/*
31793 + * kdb_send_sig_info
31794 + *
31795 + * Allows kdb to send signals without exposing signal internals.
31796 + *
31797 + * Inputs:
31798 + * t task
31799 + * siginfo signal information
31800 + * seqno current kdb sequence number (avoid including kdbprivate.h)
31801 + * Outputs:
31802 + * None.
31803 + * Returns:
31804 + * None.
31805 + * Locking:
31806 + * Checks if the required locks are available before calling the main
31807 + * signal code, to avoid kdb deadlocks.
31808 + * Remarks:
31809 + */
31810 +void
31811 +kdb_send_sig_info(struct task_struct *t, struct siginfo *info, int seqno)
31812 +{
31813 + static struct task_struct *kdb_prev_t;
31814 + static int kdb_prev_seqno;
31815 + int sig, new_t;
31816 + if (!spin_trylock(&t->sighand->siglock)) {
31817 + kdb_printf("Can't do kill command now.\n"
31818 + "The sigmask lock is held somewhere else in kernel, try again later\n");
31819 + return;
31820 + }
31821 + spin_unlock(&t->sighand->siglock);
31822 + new_t = kdb_prev_t != t || kdb_prev_seqno != seqno;
31823 + kdb_prev_t = t;
31824 + kdb_prev_seqno = seqno;
31825 + if (t->state != TASK_RUNNING && new_t) {
31826 + kdb_printf("Process is not RUNNING, sending a signal from kdb risks deadlock\n"
31827 + "on the run queue locks. The signal has _not_ been sent.\n"
31828 + "Reissue the kill command if you want to risk the deadlock.\n");
31829 + return;
31830 + }
31831 + sig = info->si_signo;
31832 + if (send_sig_info(sig, info, t))
31833 + kdb_printf("Fail to deliver Signal %d to process %d.\n", sig, t->pid);
31834 + else
31835 + kdb_printf("Signal %d is sent to process %d.\n", sig, t->pid);
31836 +}
31837 +#endif /* CONFIG_KDB */
31838 --- a/kernel/sysctl_check.c
31839 +++ b/kernel/sysctl_check.c
31840 @@ -105,6 +105,7 @@ static const struct trans_ctl_table tran
31841 { KERN_NMI_WATCHDOG, "nmi_watchdog" },
31842 { KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
31843 { KERN_SETUID_DUMPABLE, "suid_dumpable" },
31844 + { KERN_KDB, "kdb" },
31845 {}
31846 };
31847
31848 --- a/lib/bug.c
31849 +++ b/lib/bug.c
31850 @@ -41,6 +41,10 @@
31851 #include <linux/bug.h>
31852 #include <linux/sched.h>
31853
31854 +#ifdef CONFIG_KDB
31855 +#include <linux/kdb.h>
31856 +#endif
31857 +
31858 extern const struct bug_entry __start___bug_table[], __stop___bug_table[];
31859
31860 #ifdef CONFIG_MODULES
31861 @@ -162,5 +166,9 @@ enum bug_trap_type report_bug(unsigned l
31862 "[verbose debug info unavailable]\n",
31863 (void *)bugaddr);
31864
31865 +#ifdef CONFIG_KDB
31866 + kdb(KDB_REASON_ENTER, 0, regs);
31867 +#endif
31868 +
31869 return BUG_TRAP_TYPE_BUG;
31870 }
31871 --- a/mm/hugetlb.c
31872 +++ b/mm/hugetlb.c
31873 @@ -1500,6 +1500,28 @@ int hugetlb_overcommit_handler(struct ct
31874
31875 #endif /* CONFIG_SYSCTL */
31876
31877 +#ifdef CONFIG_KDB
31878 +#include <linux/kdb.h>
31879 +#include <linux/kdbprivate.h>
31880 +/* Like hugetlb_report_meminfo() but using kdb_printf() */
31881 +void
31882 +kdb_hugetlb_report_meminfo(void)
31883 +{
31884 + struct hstate *h = &default_hstate;
31885 + kdb_printf(
31886 + "HugePages_Total: %5lu\n"
31887 + "HugePages_Free: %5lu\n"
31888 + "HugePages_Rsvd: %5lu\n"
31889 + "HugePages_Surp: %5lu\n"
31890 + "Hugepagesize: %5lu kB\n",
31891 + h->nr_huge_pages,
31892 + h->free_huge_pages,
31893 + h->resv_huge_pages,
31894 + h->surplus_huge_pages,
31895 + 1UL << (huge_page_order(h) + PAGE_SHIFT - 10));
31896 +}
31897 +#endif /* CONFIG_KDB */
31898 +
31899 int hugetlb_report_meminfo(char *buf)
31900 {
31901 struct hstate *h = &default_hstate;
31902 --- a/mm/mmzone.c
31903 +++ b/mm/mmzone.c
31904 @@ -22,6 +22,10 @@ struct pglist_data *next_online_pgdat(st
31905 return NULL;
31906 return NODE_DATA(nid);
31907 }
31908 +#ifdef CONFIG_KDB
31909 +EXPORT_SYMBOL(first_online_pgdat);
31910 +EXPORT_SYMBOL(next_online_pgdat);
31911 +#endif
31912
31913 /*
31914 * next_zone - helper magic for for_each_zone()
31915 --- a/mm/swapfile.c
31916 +++ b/mm/swapfile.c
31917 @@ -13,6 +13,10 @@
31918 #include <linux/swap.h>
31919 #include <linux/vmalloc.h>
31920 #include <linux/pagemap.h>
31921 +#ifdef CONFIG_KDB
31922 +#include <linux/kdb.h>
31923 +#include <linux/kdbprivate.h>
31924 +#endif /* CONFIG_KDB */
31925 #include <linux/namei.h>
31926 #include <linux/shm.h>
31927 #include <linux/blkdev.h>
31928 @@ -1750,6 +1754,24 @@ void si_swapinfo(struct sysinfo *val)
31929 spin_unlock(&swap_lock);
31930 }
31931
31932 +#ifdef CONFIG_KDB
31933 +/* Like si_swapinfo() but without the locks */
31934 +void kdb_si_swapinfo(struct sysinfo *val)
31935 +{
31936 + unsigned int i;
31937 + unsigned long nr_to_be_unused = 0;
31938 +
31939 + for (i = 0; i < nr_swapfiles; i++) {
31940 + if (!(swap_info[i].flags & SWP_USED) ||
31941 + (swap_info[i].flags & SWP_WRITEOK))
31942 + continue;
31943 + nr_to_be_unused += swap_info[i].inuse_pages;
31944 + }
31945 + val->freeswap = nr_swap_pages + nr_to_be_unused;
31946 + val->totalswap = total_swap_pages + nr_to_be_unused;
31947 +}
31948 +#endif /* CONFIG_KDB */
31949 +
31950 /*
31951 * Verify that a swap entry is valid and increment its swap map count.
31952 *