#ident "@(#)README 1.6 95/06/13 SMI"
FILES
Makefile - compiles the header files and also the interpreter.
It also runs forthgen on your *.fdbg files and
creates the forthdebug file. It will also install the
forthdebug file in kernel/drv.
parser.c - source file
stabs.c - source file
stabs.h - header file
*.fdbg - a file specifying a struct you are interested in and
the necessary header files
*.fth - generated by forthgen from *.fdbg
kdbg.fth - It has the forth program.
forthgen - It is the program that generates the words in *.fth files
for the structs whose names are specified in *.fdbg files.
forthdebug - is the concatenation of kdbg.fth and and all *fth files. This file
gets installed in kernel/drv and will be read in by the
kernel during boot up (if obpdebug or fortdebug are set).
Ques: How do I create a word for a struct I am interested in?
Ans:
1) Look in fdbg/*.fdbg files to make sure that it isn't already in the
debugger.
2) If not, then edit one of the existing *.fdbg files or create a new
file called somename.fdbg - if you think the existing ones don't satisfy
your needs. Just add the names of the structs you are interested in. If
you want only certain members of the structs to be printed then add the
member names and the format wanted below the struct name. Look at the
*.fdbg files to see how this is done. Remember to check in to SCCS.
3) Add the somename file where the struct is defined to the Makefile
4) Now do a "make". Look in the file forthdebug to see if words for
your structs have been created. If not, go back to step 2.
5) Install(1) will pick up forthdebug and install in kernel/misc
Ques: How do I add forth words?
Ans: In the .fdbg file - of your choice - type in the following
forth_start
type words here
forth_end
All lines between the forth_start and forth_end will be
copied over to the forthdebug file without any modifications.
Ques: How do I run it?
Ans: Here is a sample session. Comments are in ()s.
ok kdbg-words
( enter the debugger )
ok words
( list debugging words available )
( not all these are in the gate yet, but the most-requested
( .threadlist is )
( the printing words start with '.' e.g. .thread .tte )
( I will move the non-printing words to a separate vocabulary )
( soon )
.machcpu machcpu-words .intr_vector intr_vector-words
.tte tte-words .sfmmu sfmmu-words
.sf_hment sf_hment-words .hmehash_bucket
hmehash_bucket-words .hme_blk hme_blk-words .ctx
ctx-words .threadlist .stacktrace i7 i6
i5 i4 i3 i2 i1
i0 l7 l6 l5 l4
l3 l2 l1 l0 i7x
i6x i5x i4x i3x i2x
i1x i0x l7x l6x l5x
l4x l3x l2x l1x l0x
v9bias .lwp .thread ._kthread
_kthread-words .memlistlist .memlist
memlist-words ._klwp _klwp-words .mstate
mstate-words .k_siginfo k_siginfo-words
.kmem_cache kmem_cache-words .kmem_slab
kmem_slab-words .hment hment-words .hat
hat-words .dev_info dev_info-words .cred
cred-words .cpulist .cpun .cpu
cpu-words .callout callout-words .buf
buf-words .as as-words .rwlock .label
.disp .mutex ._rwlock_impl _rwlock_impl-words
._label_t
_label_t-words .itimerval itimerval-words
.timeval timeval-words ._disp _disp-words
.adaptive_mutex adaptive_mutex-words .dev_t
c-struct bits-field array-field struct-field
ptr-field byte-field short-field long-field
ext-field voc-print name-print 0plevel -plevel
+plevel plevel sizeof index print
.str .o another? next-word
ok .threadlist
( .threadlist prints threads 1 page at a time )
( try that with kadb )
thread e0402000 pc: e0094e98 sp: e0401aa8
call e008b254 genunix:main from e00069d8 _start+108
( 0 2 3c 2 e0428290 e0411840 )
call e00531a0 krtld:exitto from e0053e84 krtld:kobj_init+128
( e00068d0 e0425400 e04604f0 e0425000 e005829c e0437800 )
thread e0891ec0 free
thread e0895ec0 free
thread e0899ec0 free
thread e089dec0 free
thread e08a1ec0 free
thread e08a5ec0 free
thread e08a9ec0 free
thread e08adec0 free
thread e08b1ec0 free
thread e08b9ec0 pc: e002ec3c sp: e08b9e00
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( e0423c00 0 e0428290 e0428290 0 e0423c48 )
???? from e002ebfc idle
( 0 0 0 0 0 0 )
thread e08bdec0 pc: e005dd9c sp: e08bdda0
call e005dd38 genunix:cv_wait from e006bdd4 genunix:callout_thread+1c
( e045d890 e045d890 80000000 e045da3c e045da3c e045da3c )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 0 e0428290 e0428290 e045d8a4 e045d890 )
???? from e006bdb8 genunix:callout_thread
( 0 0 0 0 0 0 )
thread e08c1ec0 pc: e005dd9c sp: e08c1da0
call e005dd38 genunix:cv_wait from e006bdd4 genunix:callout_thread+1c
( e045d890 e045d890 80000000 e045db68 e045db68 e045db68 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 0 e0428290 e0428290 e045d8a4 e045d890 )
???? from e006bdb8 genunix:callout_thread
( 0 0 0 0 0 0 )
thread e08c5ec0 free
thread e08cbec0 pc: e005dd9c sp: e08cbd90
call e005dd38 genunix:cv_wait from e00b9c24 genunix:background+158
( e046000c e046000c 0 10000 0 0 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 fffffffe 10000 fc408734 0 e046000c )
???? from e00b9acc genunix:background
( 0 0 0 0 0 0 )
thread e08d1ec0 pc: e005dd9c sp: e08d1d90
call e005dd38 genunix:cv_wait from e00b9d8c genunix:freebs+c8
( e045f040 e045f040 2 e044dca0 2 0 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( e044dca8 e045fd1c e0428290 e045fe04 0 e045f040 )
???? from e00b9cc4 genunix:freebs
( 0 0 0 0 0 0 )
thread e08d7ec0 pc: e005dd9c sp: e08d7d90
call e005dd38 genunix:cv_wait from e00bdb08 genunix:qwriter_outer_thread+c4
( e045f078 e045f078 0 e044f4b8 e00080f0 fc14b580 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( e044f4bc 0 e045c2d8 0 e045f078 0 )
???? from e00bda44 genunix:qwriter_outer_thread
( 0 0 0 0 0 0 )
thread e08dbec0 pc: e005dd9c sp: e08dbd40
call e005dd38 genunix:cv_wait from fc2620f4 ufs:ufs_thread_run+6c
( fc13ca78 fc13ca78 0 456 0 fc14b5a8 )
call fc262088 ufs:ufs_thread_run from fc262868 ufs:ufs_thread_idle+1c
( fc13ca64 fffd fc13ca78 fc13ca68 fc13ca72 fc13ca70 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 fc13ca64 fc13ca78 e0428290 0 0 )
???? from fc26284c ufs:ufs_thread_idle
( 0 0 7b60c 0 239b8 7b609 )
thread e08dfec0 pc: e005dd9c sp: e08dfd40
call e005dd38 genunix:cv_wait from fc2620f4 ufs:ufs_thread_run+6c
( fc13caf0 fc13caf0 0 1 0 ffffffd8 )
call fc262088 ufs:ufs_thread_run from fc262ccc ufs:ufs_thread_hlock+20
( fc13cadc fffd fc13caf0 fc13cae0 fc13caea fc13cae8 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 0 fc13cadc fc13caea fc13caf0 0 )
???? from fc262cac ufs:ufs_thread_hlock
( 0 0 0 32540 16a09 0 )
thread e08e3ec0 pc: e005dd9c sp: e08e3d80
call e005dd38 genunix:cv_wait from fc30236c esp:esp_callback+1e4
( fc14b66c fc14b66c 2 19 fc14b674 0 )
jmpl e00074b0 client_handler+38 from e001ef80 thread_start+4
( 0 fc14b682 0 1 0 0 )
???? from fc302188 esp:esp_callback
( fc17f008 0 78278 c3c09 0 78284 )
thread fc44b480 pc: e005e4b0 sp: e0a1b7d0
call e005e358 genunix:cv_wait_sig_swap from e00b896c genunix:strwaitq+280
( 0 fc40b6e4 fc5eb028 0 fc44ee20 fc44b480 )
call e00b86ec genunix:strwaitq from e00b36d0 genunix:strgetmsg+2a8
( fc40b698 fc408246 0 3 e0a1b9b0 fc408200 )
call e00b3428 genunix:strgetmsg from e00a6508 genunix:msgio+254
( 0 e0a1ba18 0 fc40b6a8 fc40b6e4 0 )
call e00a62b4 genunix:msgio from e00a60d8 genunix:getmsg+88
( e0a1ba90 e0a1bb10 1 e0a1baab e0a1baac fc3209dc )
jmpl 0 from e00656c8 genunix:syscall_ap+70
( fc44ee88 e0a1bb10 0 0 e043e9c4 0 )
jmpl ffbf0000 from e0025824 syscall_trap+194
( 3 0 dffffd88 dffffd68 e00a6050 fc44ee20 )
XXXXXXX from df7876a4
( 3 dffffd7c dffffd88 dffffd68 84 27b18 )
thread fc44b5c0 pc: e005e4b0 sp: e0a17980
call e005e358 genunix:cv_wait_sig_swap from e00903e8 genunix:poll+cb8
( 0 fc14a950 fc5eb698 800 fc44f008 fc44b5c0 )
( at this point I got bored )
( and printed a single thread )
ok fc44b480 .thread
t_ts = NULL
t_prioinv = NULL
t_rprof = NULL
t_mstate = 9
t_waitrq = 0
t_kpri_req = 0
t_disp_time = 14976
t_disp_cpu = e0423c00
t_oldspl = 0
t_lockp = e045a310
t_pctcpu = 10
t_lbolt = 6ef
t_cred = fc19ff90
t_pollstate = NULL
t_sysnum = 85
t_whatstop = 0
t_whystop = 0
t_trace = NULL
t_prev = e08e3ec0
t_next = fc44b5c0
t_procp = fc5eb028
t_lwp = fc44ee20
t_back = fc44b480
t_forw = fc44b480
t_sigqueue = NULL
t_itimerid = 0
t_realitimer =
it_value =
tv_usec = 0 i = 110
disp_lock = 0
cpu_prev_onln = e0423c00
cpu_next_onln = e0423c00
cpu_prev = e0423c00
cpu_next = e0423c00
cpu_fpowner = fc44fd60
cpu_callo = NULL
cpu_lwp = NULL
cpu_pause_thread = e09fbec0
cpu_idle_thread = e08b9ec0
cpu_thread = e08b9ec0
cpu_flags = 1b
cpu_seqid = 0
cpu_id = 0
( and here's the phys installed list )
ok :phys_install l@ .memlistlist
prev = NULL
next = fc004168
size = 2000000
address = 0
prev = fc004150
next = NULL
size = 2000000
address = 10000000
NOTE: note the . (period) in front of the name of the struct. You need to add
that to the name so that it does not clash with variables with same names.