Writing Device Drivers

kadb Command Usage

The general form of a kadb command is:

    [ address ] [ ,count ] command [;]

If address is omitted, the current location is used (`.' could also be used to represent the current location). The address can be a kernel symbol. If count is omitted, it defaults to 1.

Commands to kadb consist of a verb followed by a modifier or list of modifiers. Verbs can be:

Prints locations starting at address in the kernel address space

Prints the value of address itself

Assigns a value to a debugger variable or machine register 

Reads a value from a debugger variable or machine register 

RETURN 

Repeats the previous command with a count of 1. Increments `.' (the current location) 

With / and =, output format specifiers can be used. Lowercase letters normally print 2 bytes, uppercase letters print 4 bytes. The values of these specifiers are:

o, O 

2-, 4-byte octal 

8-byte octal 

8-byte unsigned octal 

d, D 

2-, 4-byte decimal 

8-byte decimal 

8-byte unsigned decimal 

x, X 

2-, 4-byte hexadecimal 

8-byte hexadecimal 

4–byte hexadecimal for 32–bit programs, 8–byte hexadecimal for 64–bit programs. Use this format specifier to examine pointers. 

u, U 

2-, 4-byte unsigned decimal 

Prints the addressed character 

Prints the addressed character using ^ escape notation 

Prints the addressed string 

Prints the addressed string using ^ escape notation 

Prints as machine instructions (disassemble) 

Prints the value of `.' in symbolic form 

w, W 

2-, 4-byte write 

8-byte write 


Caution – Caution –

When using w, W or Z to modify a kernel variable, make sure that the size of the variable matches the size of the write you are performing. If you specify an incorrect size you could corrupt neighboring data.


For example, to set a bit in the moddebug variable when debugging a driver, first examine the value of moddebug, then set it to the desired bit.

kadb[0]: moddebug/X
moddebug:
moddebug:       1000
kadb[0]: moddebug/W 0x80001000
moddebug:       0x1000 = 0x80001000

Routines can be disassembled with the `i' command. This is useful when tracing crashes, since the only information might be the program counter at the time of the crash. For example, to print the first four instructions of the kmem_alloc function:

kadb[0]: kmem_alloc,4/i
kmem_alloc:
kmem_alloc: save    %sp, -0x60, %sp
sub     %i0, 0x1, %l6
sra     %l6, 0x3, %i5
tst     %i5

Specify symbolic notation with the `a' command, to show the addresses:

kadb[0]: kmem_alloc,4/ai
kmem_alloc:    
kmem_alloc:     save    %sp, -0x60, %sp
kmem_alloc+4:   sub     %i0, 0x1, %l6
kmem_alloc+8:   sra     %l6, 0x3, %i5
kmem_alloc+0xc: tst     %i5