1 """
2 FreeBSD support...
3 """
4
5 import os
6 import ctypes
7 import ctypes.util as cutil
8
9 import envi.memory as e_mem
10 import envi.cli as e_cli
11
12 import vtrace
13 import vtrace.archs.i386 as v_i386
14 import vtrace.archs.amd64 as v_amd64
15 import vtrace.platforms.base as v_base
16 import vtrace.platforms.posix as v_posix
17 import vtrace.util as v_util
18
19 libkvm = ctypes.CDLL(cutil.find_library("kvm"))
20
21
22 KERN_PROC_ALL = 0
23 KERN_PROC_PID = 1
24 KERN_PROC_PGRP = 2
25 KERN_PROC_SESSION = 3
26 KERN_PROC_TTY = 4
27 KERN_PROC_UID = 5
28 KERN_PROC_RUID = 6
29 KERN_PROC_ARGS = 7
30 KERN_PROC_PROC = 8
31 KERN_PROC_SV_NAME = 9
32 KERN_PROC_RGID = 10
33 KERN_PROC_GID = 11
34 KERN_PROC_PATHNAME = 12
35 KERN_PROC_INC_THREAD = 0x10
36
37 pid_t = ctypes.c_int32
38 lwpid_t = ctypes.c_int32
39 void_p = ctypes.c_void_p
40 dev_t = ctypes.c_uint32
41 sigset_t = ctypes.c_uint32*4
42 uid_t = ctypes.c_uint32
43 gid_t = ctypes.c_uint32
44 fixpt_t = ctypes.c_uint32
45 caddr_t = ctypes.c_void_p
46 vm_size_t = ctypes.c_ulong
47 segsz_t = ctypes.c_ulong
48
49
50 KI_NGROUPS = 16
51 OCOMMLEN = 16
52 WMESGLEN = 8
53 LOGNAMELEN = 17
54 LOCKNAMELEN = 8
55 COMMLEN = 19
56 KI_EMULNAMELEN = 16
57 KI_NSPARE_INT = 10
58 KI_NSPARE_PTR = 7
59 KI_NSPARE_LONG = 12
63 return ctypes.c_char * size
64
66 _fields_ = (
67 ("pri_class", ctypes.c_ubyte),
68 ("pri_level", ctypes.c_ubyte),
69 ("pri_native", ctypes.c_ubyte),
70 ("pri_user", ctypes.c_ubyte)
71 )
72
74 _fields_ = (
75 ("tv_sec", ctypes.c_long),
76 ("tv_usec", ctypes.c_long)
77 )
78
79 -class RUSAGE(ctypes.Structure):
80 _fields_ = (
81 ("ru_utime", TIMEVAL),
82 ("ru_stime", TIMEVAL),
83 ("ru_maxrss", ctypes.c_long),
84 ("ru_ixrss", ctypes.c_long),
85 ("ru_idrss", ctypes.c_long),
86 ("ru_isrss", ctypes.c_long),
87 ("ru_minflt", ctypes.c_long),
88 ("ru_majflt", ctypes.c_long),
89 ("ru_nswap", ctypes.c_long),
90 ("ru_inblock", ctypes.c_long),
91 ("ru_oublock", ctypes.c_long),
92 ("ru_msgsnd", ctypes.c_long),
93 ("ru_msgrcv", ctypes.c_long),
94 ("ru_nsignals", ctypes.c_long),
95 ("ru_nvcsw", ctypes.c_long),
96 ("ru_nivcsw", ctypes.c_long),
97 )
98
101 _fields_ = (
102 ("ki_structsize", ctypes.c_int),
103 ("ki_layout", ctypes.c_int),
104 ("ki_args", void_p),
105 ("ki_paddr", void_p),
106 ("ki_addr", void_p),
107 ("ki_tracep", void_p),
108 ("ki_textvp", void_p),
109 ("ki_fd", void_p),
110 ("ki_vmspace", void_p),
111 ("ki_wchan", void_p),
112 ("ki_pid", pid_t),
113 ("ki_ppid", pid_t),
114 ("ki_pgid", pid_t),
115 ("ki_tpgid", pid_t),
116 ("ki_sid", pid_t),
117 ("ki_tsid", pid_t),
118 ("ki_jobc", ctypes.c_short),
119 ("ki_spare_short1", ctypes.c_short),
120 ("ki_tdev", dev_t),
121 ("ki_siglist", sigset_t),
122 ("ki_sigmask", sigset_t),
123 ("ki_sigignore", sigset_t),
124 ("ki_sigcatch", sigset_t),
125 ("ki_uid", uid_t),
126 ("ki_ruid", uid_t),
127 ("ki_svuid", uid_t),
128 ("ki_rgid", gid_t),
129 ("ki_svgid", gid_t),
130 ("ki_ngroups", ctypes.c_short),
131 ("ki_spare_short2", ctypes.c_short),
132 ("ki_groups", gid_t * KI_NGROUPS),
133 ("ki_size", vm_size_t),
134 ("ki_rssize", segsz_t),
135 ("ki_swrss", segsz_t),
136 ("ki_tsize", segsz_t),
137 ("ki_dsize", segsz_t),
138 ("ki_ssize", segsz_t),
139 ("ki_xstat", ctypes.c_ushort),
140 ("ki_acflag", ctypes.c_ushort),
141 ("ki_pctcpu", fixpt_t),
142 ("ki_estcpu", ctypes.c_uint),
143 ("ki_slptime", ctypes.c_uint),
144 ("ki_swtime", ctypes.c_uint),
145 ("ki_spareint1", ctypes.c_int),
146 ("ki_runtime", ctypes.c_uint64),
147 ("ki_start", TIMEVAL),
148 ("ki_childtime", TIMEVAL),
149 ("ki_flag", ctypes.c_long),
150 ("ki_kiflag", ctypes.c_long),
151 ("ki_traceflag", ctypes.c_int),
152 ("ki_stat", ctypes.c_char),
153 ("ki_nice", ctypes.c_ubyte),
154 ("ki_lock", ctypes.c_char),
155 ("ki_rqindex", ctypes.c_char),
156 ("ki_oncpu", ctypes.c_char),
157 ("ki_lastcpu", ctypes.c_char),
158 ("ki_ocomm", c_buf(OCOMMLEN+1)),
159 ("ki_wmesg", c_buf(WMESGLEN+1)),
160 ("ki_login", c_buf(LOGNAMELEN+1)),
161 ("ki_lockname", c_buf(LOCKNAMELEN+1)),
162 ("ki_comm", c_buf(COMMLEN+1)),
163 ("ki_emul", c_buf(KI_EMULNAMELEN+1)),
164 ("ki_sparestrings",c_buf(68)),
165 ("ki_spareints", ctypes.c_int*KI_NSPARE_INT),
166 ("ki_jid", ctypes.c_int),
167 ("ki_numthreads", ctypes.c_int),
168 ("ki_tid", lwpid_t),
169 ("ki_pri", PRIORITY),
170 ("ki_rusage", RUSAGE),
171
172 ("ki_rusage_ch", RUSAGE),
173 ("ki_pcb", void_p),
174 ("ki_kstack", void_p),
175 ("ki_udata", void_p),
176 ("ki_spareptrs", void_p*KI_NSPARE_PTR),
177 ("ki_sparelongs", ctypes.c_long*KI_NSPARE_LONG),
178 ("ki_sflag", ctypes.c_long),
179 ("ki_tdflags", ctypes.c_long),
180 )
181
182 libkvm.kvm_getprocs.argtypes = [caddr_t, ctypes.c_int, ctypes.c_int, caddr_t]
183 libkvm.kvm_getprocs.restype = ctypes.POINTER(KINFO_PROC)
184
185 libkvm.kvm_open.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p]
186 libkvm.kvm_open.restype = caddr_t
187
188
189 PT_TRACE_ME = 0
190 PT_READ_I = 1
191 PT_READ_D = 2
192 PT_WRITE_I = 4
193 PT_WRITE_D = 5
194 PT_CONTINUE = 7
195 PT_KILL = 8
196 PT_STEP = 9
197 PT_ATTACH = 10
198 PT_DETACH = 11
199 PT_IO = 12
200 PT_LWPINFO = 13
201 PT_GETNUMLWPS = 14
202 PT_GETLWPLIST = 15
203 PT_CLEARSTEP = 16
204 PT_SETSTEP = 17
205 PT_SUSPEND = 18
206 PT_RESUME = 19
207 PT_TO_SCE = 20
208 PT_TO_SCX = 21
209 PT_SYSCALL = 22
210 PT_GETREGS = 33
211 PT_SETREGS = 34
212 PT_GETFPREGS = 35
213 PT_SETFPREGS = 36
214 PT_GETDBREGS = 37
215 PT_SETDBREGS = 38
221 _fields_ = [
222 ("piod_op", ctypes.c_int),
223 ("piod_offs", ctypes.c_void_p),
224 ("piod_addr", ctypes.c_void_p),
225 ("piod_len", ctypes.c_uint)
226 ]
227
228
229 PIOD_READ_D = 1
230 PIOD_WRITE_D = 2
231 PIOD_READ_I = 3
232 PIOD_WRITE_I = 4
235 _fields_ = (
236 ("pl_lwpid", lwpid_t),
237 ("pl_event", ctypes.c_int),
238 ("pl_flags", ctypes.c_int),
239 ("pl_sigmask", sigset_t),
240 ("pl_siglist", sigset_t),
241 )
242
243 PL_EVENT_NONE = 0
244 PL_EVENT_SIGNAL = 1
245
246 PL_FLAGS_SA = 0
247 PL_FLAGS_BOUND = 1
250
252 self.initMode("Syscall", False, "Break on Syscalls")
253 self.kvmh = libkvm.kvm_open(None, None, None, 0, "vtrace")
254 if not os.path.exists('/proc/curproc/file'):
255 raise Exception("VDB needs /proc! (use: mount -t procfs procfs /proc)")
256
258 print "FIXME I DON'T THINK THIS IS BEING CALLED"
259 if self.kvmh != None:
260 libkvm.kvm_close(self.kvmh)
261
276
290
291 @v_base.threadwrap
295
297 return os.readlink('/proc/%d/file' % pid)
298
299
311
315
316 @v_base.threadwrap
330
331 @v_base.threadwrap
336
337 @v_base.threadwrap
350
351 @v_base.threadwrap
355
356 @v_base.threadwrap
366
367 @v_base.threadwrap
371
372 @v_base.threadwrap
376
379
382
412
426
428 _fields_ = (
429 ("fs", ctypes.c_ulong),
430 ("es", ctypes.c_ulong),
431 ("ds", ctypes.c_ulong),
432 ("edi", ctypes.c_ulong),
433 ("esi", ctypes.c_ulong),
434 ("ebp", ctypes.c_ulong),
435 ("isp", ctypes.c_ulong),
436 ("ebx", ctypes.c_ulong),
437 ("edx", ctypes.c_ulong),
438 ("ecx", ctypes.c_ulong),
439 ("eax", ctypes.c_ulong),
440 ("trapno", ctypes.c_ulong),
441 ("err", ctypes.c_ulong),
442 ("eip", ctypes.c_ulong),
443 ("cs", ctypes.c_ulong),
444 ("eflags", ctypes.c_ulong),
445 ("esp", ctypes.c_ulong),
446 ("ss", ctypes.c_ulong),
447 ("gs", ctypes.c_ulong),
448 ("debug0", ctypes.c_ulong),
449 ("debug1", ctypes.c_ulong),
450 ("debug2", ctypes.c_ulong),
451 ("debug3", ctypes.c_ulong),
452 ("debug4", ctypes.c_ulong),
453 ("debug5", ctypes.c_ulong),
454 ("debug6", ctypes.c_ulong),
455 ("debug7", ctypes.c_ulong),
456 )
457
458 i386_DBG_OFF = (19*4)
461 _fields_ = (
462 ("r15", ctypes.c_ulonglong),
463 ("r14", ctypes.c_ulonglong),
464 ("r13", ctypes.c_ulonglong),
465 ("r12", ctypes.c_ulonglong),
466 ("r11", ctypes.c_ulonglong),
467 ("r10", ctypes.c_ulonglong),
468 ("r9", ctypes.c_ulonglong),
469 ("r8", ctypes.c_ulonglong),
470 ("rdi", ctypes.c_ulonglong),
471 ("rsi", ctypes.c_ulonglong),
472 ("rbp", ctypes.c_ulonglong),
473 ("rbx", ctypes.c_ulonglong),
474 ("rdx", ctypes.c_ulonglong),
475 ("rcx", ctypes.c_ulonglong),
476 ("rax", ctypes.c_ulonglong),
477 ("trapno", ctypes.c_ulonglong),
478 ("err", ctypes.c_ulonglong),
479 ("rip", ctypes.c_ulonglong),
480 ("cs", ctypes.c_ulonglong),
481 ("rflags", ctypes.c_ulonglong),
482 ("rsp", ctypes.c_ulonglong),
483 ("ss", ctypes.c_ulonglong),
484 ("debug0", ctypes.c_ulonglong),
485 ("debug1", ctypes.c_ulonglong),
486 ("debug2", ctypes.c_ulonglong),
487 ("debug3", ctypes.c_ulonglong),
488 ("debug4", ctypes.c_ulonglong),
489 ("debug5", ctypes.c_ulonglong),
490 ("debug6", ctypes.c_ulonglong),
491 ("debug7", ctypes.c_ulonglong),
492 ("debug8", ctypes.c_ulonglong),
493 ("debug9", ctypes.c_ulonglong),
494 ("debug10", ctypes.c_ulonglong),
495 ("debug11", ctypes.c_ulonglong),
496 ("debug12", ctypes.c_ulonglong),
497 ("debug13", ctypes.c_ulonglong),
498 ("debug14", ctypes.c_ulonglong),
499 ("debug15", ctypes.c_ulonglong),
500 )
501
502 amd64_DBG_OFF = (22*ctypes.sizeof(ctypes.c_uint64))
503
504 -class FreeBSDi386Trace(
505 vtrace.Trace,
506 FreeBSDMixin,
507 v_i386.i386Mixin,
508 v_posix.ElfMixin,
509 v_posix.PosixMixin,
510 v_base.TracerBase):
544
545
546 -class FreeBSDAmd64Trace(
547 vtrace.Trace,
548 FreeBSDMixin,
549 v_amd64.Amd64Mixin,
550 v_posix.ElfMixin,
551 v_posix.PosixMixin,
552 v_base.TracerBase):
591