2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
26 cc -I. -DKERNEL_PRIVATE -O -o fs_usage fs_usage.c
29 #define Default_DELAY 1 /* default delay interval */
39 #include <sys/types.h>
40 #include <sys/param.h>
45 #include <bsd/curses.h>
46 #include <sys/ioctl.h>
48 #ifndef KERNEL_PRIVATE
49 #define KERNEL_PRIVATE
50 #include <sys/kdebug.h>
53 #include <sys/kdebug.h>
54 #endif /*KERNEL_PRIVATE*/
56 #include <sys/sysctl.h>
58 #import <mach/clock_types.h>
79 #define MAX_THREADS 512
80 struct th_info th_state
[MAX_THREADS
];
87 int select_pid_mode
= 0; /* Flag set indicates that output is restricted
88 to selected pids or commands */
90 int one_good_pid
= 0; /* Used to fail gracefully when bad pids given */
93 #define DBG_ZERO_FILL_FAULT 1
94 #define DBG_PAGEIN_FAULT 2
95 #define DBG_COW_FAULT 3
96 #define DBG_CACHE_HIT_FAULT 4
98 #define TRACE_DATA_NEWTHREAD 0x07000004
99 #define TRACE_STRING_NEWTHREAD 0x07010004
100 #define TRACE_STRING_EXEC 0x07010008
102 #define MACH_vmfault 0x01300000
103 #define MACH_sched 0x01400000
104 #define MACH_stkhandoff 0x01400008
105 #define VFS_LOOKUP 0x03010090
106 #define BSC_exit 0x040C0004
108 #define MSC_map_fd 0x010c00ac
109 #define BSC_recvmsg 0x040C006C
110 #define BSC_sendmsg 0x040C0070
111 #define BSC_recvfrom 0x040C0074
112 #define BSC_sendto 0x040C0214
114 #define BSC_read 0x040C000C
115 #define BSC_write 0x040C0010
116 #define BSC_open 0x040C0014
117 #define BSC_close 0x040C0018
118 #define BSC_link 0x040C0024
119 #define BSC_unlink 0x040C0028
120 #define BSC_mknod 0x040C0038
121 #define BSC_chmod 0x040C003C
122 #define BSC_chown 0x040C0040
123 #define BSC_access 0x040C0084
124 #define BSC_chflags 0x040C0088
125 #define BSC_fchflags 0x040C008C
126 #define BSC_sync 0x040C0090
127 #define BSC_symlink 0x040C00E4
128 #define BSC_readlink 0x040C00E8
129 #define BSC_fsync 0x040C017C
130 #define BSC_readv 0x040C01E0
131 #define BSC_writev 0x040C01E4
132 #define BSC_fchown 0x040C01EC
133 #define BSC_fchmod 0x040C01F0
134 #define BSC_rename 0x040C0200
135 #define BSC_mkdir 0x040C0220
136 #define BSC_rmdir 0x040C0224
137 #define BSC_statfs 0x040C0274
138 #define BSC_fstatfs 0x040C0278
139 #define BSC_stat 0x040C02F0
140 #define BSC_fstat 0x040C02F4
141 #define BSC_lstat 0x040C02F8
142 #define BSC_pathconf 0x040C02FC
143 #define BSC_fpathconf 0x040C0300
144 #define BSC_getdirentries 0x040C0310
145 #define BSC_mmap 0x040c0314
146 #define BSC_lseek 0x040c031c
147 #define BSC_truncate 0x040C0320
148 #define BSC_ftruncate 0x040C0324
149 #define BSC_statv 0x040C0364
150 #define BSC_lstatv 0x040C0368
151 #define BSC_fstatv 0x040C036C
152 #define BSC_mkcomplex 0x040C0360
153 #define BSC_getattrlist 0x040C0370
154 #define BSC_setattrlist 0x040C0374
155 #define BSC_getdirentriesattr 0x040C0378
156 #define BSC_exchangedata 0x040C037C
157 #define BSC_checkuseraccess 0x040C0380
158 #define BSC_searchfs 0x040C0384
160 // Carbon File Manager support
161 #define FILEMGR_PBGETCATALOGINFO 0x1e000020
162 #define FILEMGR_PBGETCATALOGINFOBULK 0x1e000024
163 #define FILEMGR_PBCREATEFILEUNICODE 0x1e000028
164 #define FILEMGR_PBCREATEDIRECTORYUNICODE 0x1e00002c
165 #define FILEMGR_PBCREATEFORK 0x1e000030
166 #define FILEMGR_PBDELETEFORK 0x1e000034
167 #define FILEMGR_PBITERATEFORK 0x1e000038
168 #define FILEMGR_PBOPENFORK 0x1e00003c
169 #define FILEMGR_PBREADFORK 0x1e000040
170 #define FILEMGR_PBWRITEFORK 0x1e000044
171 #define FILEMGR_PBALLOCATEFORK 0x1e000048
172 #define FILEMGR_PBDELETEOBJECT 0x1e00004c
173 #define FILEMGR_PBEXCHANGEOBJECT 0x1e000050
174 #define FILEMGR_PBGETFORKCBINFO 0x1e000054
175 #define FILEMGR_PBGETVOLUMEINFO 0x1e000058
176 #define FILEMGR_PBMAKEFSREF 0x1e00005c
177 #define FILEMGR_PBMAKEFSREFUNICODE 0x1e000060
178 #define FILEMGR_PBMOVEOBJECT 0x1e000064
179 #define FILEMGR_PBOPENITERATOR 0x1e000068
180 #define FILEMGR_PBRENAMEUNICODE 0x1e00006c
181 #define FILEMGR_PBSETCATALOGINFO 0x1e000070
182 #define FILEMGR_PBSETVOLUMEINFO 0x1e000074
183 #define FILEMGR_FSREFMAKEPATH 0x1e000078
184 #define FILEMGR_FSPATHMAKEREF 0x1e00007c
186 #define FILEMGR_PBGETCATINFO 0x1e010000
187 #define FILEMGR_PBGETCATINFOLITE 0x1e010004
188 #define FILEMGR_PBHGETFINFO 0x1e010008
189 #define FILEMGR_PBXGETVOLINFO 0x1e01000c
190 #define FILEMGR_PBHCREATE 0x1e010010
191 #define FILEMGR_PBHOPENDF 0x1e010014
192 #define FILEMGR_PBHOPENRF 0x1e010018
193 #define FILEMGR_PBHGETDIRACCESS 0x1e01001c
194 #define FILEMGR_PBHSETDIRACCESS 0x1e010020
195 #define FILEMGR_PBHMAPID 0x1e010024
196 #define FILEMGR_PBHMAPNAME 0x1e010028
197 #define FILEMGR_PBCLOSE 0x1e01002c
198 #define FILEMGR_PBFLUSHFILE 0x1e010030
199 #define FILEMGR_PBGETEOF 0x1e010034
200 #define FILEMGR_PBSETEOF 0x1e010038
201 #define FILEMGR_PBGETFPOS 0x1e01003c
202 #define FILEMGR_PBREAD 0x1e010040
203 #define FILEMGR_PBWRITE 0x1e010044
204 #define FILEMGR_PBGETFCBINFO 0x1e010048
205 #define FILEMGR_PBSETFINFO 0x1e01004c
206 #define FILEMGR_PBALLOCATE 0x1e010050
207 #define FILEMGR_PBALLOCCONTIG 0x1e010054
208 #define FILEMGR_PBSETFPOS 0x1e010058
209 #define FILEMGR_PBSETCATINFO 0x1e01005c
210 #define FILEMGR_PBGETVOLPARMS 0x1e010060
211 #define FILEMGR_PBSETVINFO 0x1e010064
212 #define FILEMGR_PBMAKEFSSPEC 0x1e010068
213 #define FILEMGR_PBHGETVINFO 0x1e01006c
214 #define FILEMGR_PBCREATEFILEIDREF 0x1e010070
215 #define FILEMGR_PBDELETEFILEIDREF 0x1e010074
216 #define FILEMGR_PBRESOLVEFILEIDREF 0x1e010078
217 #define FILEMGR_PBFLUSHVOL 0x1e01007c
218 #define FILEMGR_PBHRENAME 0x1e010080
219 #define FILEMGR_PBCATMOVE 0x1e010084
220 #define FILEMGR_PBEXCHANGEFILES 0x1e010088
221 #define FILEMGR_PBHDELETE 0x1e01008c
222 #define FILEMGR_PBDIRCREATE 0x1e010090
223 #define FILEMGR_PBCATSEARCH 0x1e010094
224 #define FILEMGR_PBHSETFLOCK 0x1e010098
225 #define FILEMGR_PBHRSTFLOCK 0x1e01009c
226 #define FILEMGR_PBLOCKRANGE 0x1e0100a0
227 #define FILEMGR_PBUNLOCKRANGE 0x1e0100a4
230 #define FILEMGR_CLASS 0x1e
236 int exclude_pids
= 0;
238 struct kinfo_proc
*kp_buffer
= 0;
241 #define SAMPLE_SIZE 60000
243 #define DBG_ZERO_FILL_FAULT 1
244 #define DBG_PAGEIN_FAULT 2
245 #define DBG_COW_FAULT 3
246 #define DBG_CACHE_HIT_FAULT 4
248 #define DBG_FUNC_ALL (DBG_FUNC_START | DBG_FUNC_END)
249 #define DBG_FUNC_MASK 0xfffffffc
251 /* Default divisor */
252 #define DIVISOR 16.6666 /* Trace divisor converts to microseconds */
253 double divisor
= DIVISOR
;
259 kbufinfo_t bufinfo
= {0, 0, 0, 0};
261 int total_threads
= 0;
262 kd_threadmap
*mapptr
= 0;
264 int trace_enabled
= 0;
265 int set_remove_flag
= 1;
277 void leave() /* exit under normal conditions -- INT handler */
282 void set_pidexclude();
287 if (exclude_pids
== 0) {
288 for (i
= 0; i
< num_of_pids
; i
++)
289 set_pidcheck(pids
[i
], 0);
292 for (i
= 0; i
< num_of_pids
; i
++)
293 set_pidexclude(pids
[i
], 0);
308 fprintf(stderr
, "Usage: %s [-e] [-w] [pid | cmd [pid | cmd]....]\n", myname
);
309 fprintf(stderr
, " -e exclude the pids specified from the sample\n");
310 fprintf(stderr
, " -w force wider, detailed, output\n");
311 fprintf(stderr
, " pid selects process(s) to sample\n");
312 fprintf(stderr
, " cmd selects process(s) matching command string to sample\n");
322 char *myname
= "fs_usage";
329 void set_pidexclude();
332 if ( geteuid() != 0 ) {
333 printf("'fs_usage' must be run as root...\n");
341 if ((myname
= rindex(argv
[0], '/')) == 0) {
349 while ((ch
= getopt(argc
, argv
, "ew")) != EOF
) {
365 while (argc
> 0 && num_of_pids
< (MAX_PIDS
- 1)) {
373 pids
[num_of_pids
++] = getpid();
376 for (i
= 0; i
< num_of_pids
; i
++)
379 printf("exclude pid %d\n", pids
[i
]);
381 printf("pid %d\n", pids
[i
]);
385 /* set up signal handlers */
386 signal(SIGINT
, leave
);
387 signal(SIGQUIT
, leave
);
388 signal(SIGTERM
, leave
);
389 signal(SIGWINCH
, sigwinch
);
391 if ((my_buffer
= malloc(SAMPLE_SIZE
* sizeof(kd_buf
))) == (char *)0)
392 quit("can't allocate memory for tracing info\n");
395 set_numbufs(SAMPLE_SIZE
);
398 if (exclude_pids
== 0) {
399 for (i
= 0; i
< num_of_pids
; i
++)
400 set_pidcheck(pids
[i
], 1);
402 for (i
= 0; i
< num_of_pids
; i
++)
403 set_pidexclude(pids
[i
], 1);
406 if (select_pid_mode
&& !one_good_pid
)
409 An attempt to restrict output to a given
410 pid or command has failed. Exit gracefully
433 struct kinfo_proc
*kp
;
438 mib
[2] = KERN_PROC_ALL
;
441 if (sysctl(mib
, 4, NULL
, &bufSize
, NULL
, 0) < 0)
442 quit("trace facility failure, KERN_PROC_ALL\n");
444 if((kp
= (struct kinfo_proc
*)malloc(bufSize
)) == (struct kinfo_proc
*)0)
445 quit("can't allocate memory for proc buffer\n");
447 if (sysctl(mib
, 4, kp
, &bufSize
, NULL
, 0) < 0)
448 quit("trace facility failure, KERN_PROC_ALL\n");
450 kp_nentries
= bufSize
/ sizeof(struct kinfo_proc
);
455 struct th_info
*find_thread(int thread
, int type
) {
458 for (ti
= th_state
; ti
< &th_state
[cur_max
]; ti
++) {
459 if (ti
->thread
== thread
) {
460 if (type
== ti
->type
)
462 if (ti
->in_filemgr
) {
471 return ((struct th_info
*)0);
478 mib
[1] = KERN_KDEBUG
;
479 mib
[2] = KERN_KDENABLE
; /* protocol */
482 mib
[5] = 0; /* no flags */
483 if (sysctl(mib
, 4, NULL
, &needed
, NULL
, 0) < 0)
484 quit("trace facility failure, KERN_KDENABLE\n");
493 set_numbufs(int nbufs
)
496 mib
[1] = KERN_KDEBUG
;
497 mib
[2] = KERN_KDSETBUF
;
500 mib
[5] = 0; /* no flags */
501 if (sysctl(mib
, 4, NULL
, &needed
, NULL
, 0) < 0)
502 quit("trace facility failure, KERN_KDSETBUF\n");
505 mib
[1] = KERN_KDEBUG
;
506 mib
[2] = KERN_KDSETUP
;
509 mib
[5] = 0; /* no flags */
510 if (sysctl(mib
, 3, NULL
, &needed
, NULL
, 0) < 0)
511 quit("trace facility failure, KERN_KDSETUP\n");
515 set_pidcheck(int pid
, int on_off
)
519 kr
.type
= KDBG_TYPENONE
;
522 needed
= sizeof(kd_regtype
);
524 mib
[1] = KERN_KDEBUG
;
525 mib
[2] = KERN_KDPIDTR
;
530 if (sysctl(mib
, 3, &kr
, &needed
, NULL
, 0) < 0) {
532 printf("pid %d does not exist\n", pid
);
540 on_off == 0 turns off pid exclusion
541 on_off == 1 turns on pid exclusion
544 set_pidexclude(int pid
, int on_off
)
550 kr
.type
= KDBG_TYPENONE
;
553 needed
= sizeof(kd_regtype
);
555 mib
[1] = KERN_KDEBUG
;
556 mib
[2] = KERN_KDPIDEX
;
561 if (sysctl(mib
, 3, &kr
, &needed
, NULL
, 0) < 0) {
563 printf("pid %d does not exist\n", pid
);
568 get_bufinfo(kbufinfo_t
*val
)
570 needed
= sizeof (*val
);
572 mib
[1] = KERN_KDEBUG
;
573 mib
[2] = KERN_KDGETBUF
;
576 mib
[5] = 0; /* no flags */
578 if (sysctl(mib
, 3, val
, &needed
, 0, 0) < 0)
579 quit("trace facility failure, KERN_KDGETBUF\n");
591 mib
[1] = KERN_KDEBUG
;
592 mib
[2] = KERN_KDREMOVE
; /* protocol */
595 mib
[5] = 0; /* no flags */
596 if (sysctl(mib
, 3, NULL
, &needed
, NULL
, 0) < 0)
601 quit("the trace facility is currently in use...\n fs_usage, sc_usage, and latency use this feature.\n\n");
603 quit("trace facility failure, KERN_KDREMOVE\n");
611 kr
.type
= KDBG_RANGETYPE
;
614 needed
= sizeof(kd_regtype
);
616 mib
[1] = KERN_KDEBUG
;
617 mib
[2] = KERN_KDSETREG
;
620 mib
[5] = 0; /* no flags */
622 if (sysctl(mib
, 3, &kr
, &needed
, NULL
, 0) < 0)
623 quit("trace facility failure, KERN_KDSETREG\n");
626 mib
[1] = KERN_KDEBUG
;
627 mib
[2] = KERN_KDSETUP
;
630 mib
[5] = 0; /* no flags */
632 if (sysctl(mib
, 3, NULL
, &needed
, NULL
, 0) < 0)
633 quit("trace facility failure, KERN_KDSETUP\n");
641 void read_command_map();
642 void create_map_entry();
644 /* Get kernel buffer information */
645 get_bufinfo(&bufinfo
);
651 needed
= bufinfo
.nkdbufs
* sizeof(kd_buf
);
653 mib
[1] = KERN_KDEBUG
;
654 mib
[2] = KERN_KDREADTR
;
657 mib
[5] = 0; /* no flags */
659 if (sysctl(mib
, 3, my_buffer
, &needed
, NULL
, 0) < 0)
660 quit("trace facility failure, KERN_KDREADTR\n");
663 if (bufinfo
.flags
& KDBG_WRAPPED
) {
664 printf("buffer wrapped count = %d\n", count
);
666 for (i
= 0; i
< cur_max
; i
++) {
667 th_state
[i
].thread
= 0;
668 th_state
[i
].vfslookup
= 0;
669 th_state
[i
].pathname
[0] = 0;
677 kd
= (kd_buf
*)my_buffer
;
679 printf("READTR returned %d items\n", count
);
681 for (i
= 0; i
< count
; i
++) {
685 unsigned long long now
;
687 void enter_syscall();
689 void kill_thread_map();
691 thread
= kd
[i
].arg5
& KDBG_THREAD_MASK
;
692 debugid
= kd
[i
].debugid
;
693 type
= kd
[i
].debugid
& DBG_FUNC_MASK
;
697 case TRACE_DATA_NEWTHREAD
:
699 for (n
= 0, ti
= th_state
; ti
< &th_state
[MAX_THREADS
]; ti
++, n
++) {
703 if (ti
== &th_state
[MAX_THREADS
])
709 ti
->child_thread
= kd
[i
].arg1
;
712 case TRACE_STRING_NEWTHREAD
:
713 if ((ti
= find_thread(thread
, 0)) == (struct th_info
*)0)
715 if (ti
->child_thread
== 0)
717 create_map_entry(ti
->child_thread
, (char *)&kd
[i
].arg1
);
719 if (ti
== &th_state
[cur_max
- 1])
721 ti
->child_thread
= 0;
725 case TRACE_STRING_EXEC
:
726 create_map_entry(thread
, (char *)&kd
[i
].arg1
);
730 kill_thread_map(thread
);
734 case MACH_stkhandoff
:
735 if (ti
= find_thread(thread
, 0))
740 if ((ti
= find_thread(thread
, 0)) == (struct th_info
*)0)
743 if (ti
->vfslookup
== 0) {
745 memset(&ti
->pathname
[0], 0, 32);
746 sargptr
= (long *)&ti
->pathname
[0];
748 *sargptr
++ = kd
[i
].arg2
;
749 *sargptr
++ = kd
[i
].arg3
;
750 *sargptr
++ = kd
[i
].arg4
;
752 } else if (ti
->vfslookup
== 1) {
755 sargptr
= (long *)&ti
->pathname
[12];
756 *sargptr
++ = kd
[i
].arg1
;
757 *sargptr
++ = kd
[i
].arg2
;
758 *sargptr
++ = kd
[i
].arg3
;
759 *sargptr
++ = kd
[i
].arg4
;
763 now
= (((unsigned long long)kd
[i
].timestamp
.tv_sec
) << 32) |
764 (unsigned long long)((unsigned int)(kd
[i
].timestamp
.tv_nsec
));
766 if (debugid
& DBG_FUNC_START
) {
770 case FILEMGR_PBGETCATALOGINFO
:
771 p
= "GetCatalogInfo";
773 case FILEMGR_PBGETCATALOGINFOBULK
:
774 p
= "GetCatalogInfoBulk";
776 case FILEMGR_PBCREATEFILEUNICODE
:
777 p
= "CreateFileUnicode";
779 case FILEMGR_PBCREATEDIRECTORYUNICODE
:
780 p
= "CreateDirectoryUnicode";
782 case FILEMGR_PBCREATEFORK
:
785 case FILEMGR_PBDELETEFORK
:
788 case FILEMGR_PBITERATEFORK
:
791 case FILEMGR_PBOPENFORK
:
794 case FILEMGR_PBREADFORK
:
797 case FILEMGR_PBWRITEFORK
:
800 case FILEMGR_PBALLOCATEFORK
:
801 p
= "PBAllocateFork";
803 case FILEMGR_PBDELETEOBJECT
:
804 p
= "PBDeleteObject";
806 case FILEMGR_PBEXCHANGEOBJECT
:
807 p
= "PBExchangeObject";
809 case FILEMGR_PBGETFORKCBINFO
:
810 p
= "PBGetForkCBInfo";
812 case FILEMGR_PBGETVOLUMEINFO
:
813 p
= "PBGetVolumeInfo";
815 case FILEMGR_PBMAKEFSREF
:
818 case FILEMGR_PBMAKEFSREFUNICODE
:
819 p
= "PBMakeFSRefUnicode";
821 case FILEMGR_PBMOVEOBJECT
:
824 case FILEMGR_PBOPENITERATOR
:
825 p
= "PBOpenIterator";
827 case FILEMGR_PBRENAMEUNICODE
:
828 p
= "PBRenameUnicode";
830 case FILEMGR_PBSETCATALOGINFO
:
831 p
= "SetCatalogInfo";
833 case FILEMGR_PBSETVOLUMEINFO
:
836 case FILEMGR_FSREFMAKEPATH
:
839 case FILEMGR_FSPATHMAKEREF
:
843 case FILEMGR_PBGETCATINFO
:
846 case FILEMGR_PBGETCATINFOLITE
:
847 p
= "GetCatInfoLite";
849 case FILEMGR_PBHGETFINFO
:
852 case FILEMGR_PBXGETVOLINFO
:
855 case FILEMGR_PBHCREATE
:
858 case FILEMGR_PBHOPENDF
:
861 case FILEMGR_PBHOPENRF
:
864 case FILEMGR_PBHGETDIRACCESS
:
865 p
= "PBHGetDirAccess";
867 case FILEMGR_PBHSETDIRACCESS
:
868 p
= "PBHSetDirAccess";
870 case FILEMGR_PBHMAPID
:
873 case FILEMGR_PBHMAPNAME
:
876 case FILEMGR_PBCLOSE
:
879 case FILEMGR_PBFLUSHFILE
:
882 case FILEMGR_PBGETEOF
:
885 case FILEMGR_PBSETEOF
:
888 case FILEMGR_PBGETFPOS
:
894 case FILEMGR_PBWRITE
:
897 case FILEMGR_PBGETFCBINFO
:
900 case FILEMGR_PBSETFINFO
:
903 case FILEMGR_PBALLOCATE
:
906 case FILEMGR_PBALLOCCONTIG
:
909 case FILEMGR_PBSETFPOS
:
912 case FILEMGR_PBSETCATINFO
:
915 case FILEMGR_PBGETVOLPARMS
:
918 case FILEMGR_PBSETVINFO
:
921 case FILEMGR_PBMAKEFSSPEC
:
924 case FILEMGR_PBHGETVINFO
:
927 case FILEMGR_PBCREATEFILEIDREF
:
928 p
= "PBCreateFileIDRef";
930 case FILEMGR_PBDELETEFILEIDREF
:
931 p
= "PBDeleteFileIDRef";
933 case FILEMGR_PBRESOLVEFILEIDREF
:
934 p
= "PBResolveFileIDRef";
936 case FILEMGR_PBFLUSHVOL
:
939 case FILEMGR_PBHRENAME
:
942 case FILEMGR_PBCATMOVE
:
945 case FILEMGR_PBEXCHANGEFILES
:
946 p
= "PBExchangeFiles";
948 case FILEMGR_PBHDELETE
:
951 case FILEMGR_PBDIRCREATE
:
954 case FILEMGR_PBCATSEARCH
:
957 case FILEMGR_PBHSETFLOCK
:
960 case FILEMGR_PBHRSTFLOCK
:
963 case FILEMGR_PBLOCKRANGE
:
966 case FILEMGR_PBUNLOCKRANGE
:
973 enter_syscall(thread
, type
, &kd
[i
], p
, (double)now
);
979 if (kd
[i
].arg2
== DBG_PAGEIN_FAULT
)
980 exit_syscall("PAGE_IN", thread
, type
, 0, kd
[i
].arg1
, 0, 2, (double)now
);
982 if (ti
= find_thread(thread
, type
)) {
983 if (ti
== &th_state
[cur_max
- 1])
991 exit_syscall("map_fd", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
995 exit_syscall("mmap", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
999 exit_syscall("recvmsg", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1003 exit_syscall("sendmsg", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1007 exit_syscall("recvfrom", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1011 exit_syscall("sendto", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1015 exit_syscall("stat", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1019 exit_syscall("open", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 2, 0, (double)now
);
1023 exit_syscall("close", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1027 exit_syscall("read", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1031 exit_syscall("write", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1035 exit_syscall("fstat", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1039 exit_syscall("lstat", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1043 exit_syscall("link", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1047 exit_syscall("unlink", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1051 exit_syscall("mknod", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1055 exit_syscall("chmod", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1059 exit_syscall("chown", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1063 exit_syscall("access", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1067 exit_syscall("chflags", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1071 exit_syscall("fchflags", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1075 exit_syscall("sync", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1079 exit_syscall("symlink", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1083 exit_syscall("readlink", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1087 exit_syscall("fsync", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1091 exit_syscall("readv", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1095 exit_syscall("writev", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1099 exit_syscall("fchown", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1103 exit_syscall("fchmod", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1107 exit_syscall("rename", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1111 exit_syscall("mkdir", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1115 exit_syscall("rmdir", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1119 exit_syscall("statfs", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1123 exit_syscall("fstatfs", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1127 exit_syscall("pathconf", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1131 exit_syscall("fpathconf", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1134 case BSC_getdirentries
:
1135 exit_syscall("getdirentries", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 1, (double)now
);
1139 exit_syscall("lseek", thread
, type
, kd
[i
].arg1
, kd
[i
].arg3
, 1, 5, (double)now
);
1143 exit_syscall("truncate", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1147 exit_syscall("ftruncate", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 3, (double)now
);
1151 exit_syscall("statv", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1155 exit_syscall("lstatv", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1159 exit_syscall("fstatv", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 1, 0, (double)now
);
1163 exit_syscall("mkcomplex", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1166 case BSC_getattrlist
:
1167 exit_syscall("getattrlist", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1170 case BSC_setattrlist
:
1171 exit_syscall("setattrlist", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1174 case BSC_getdirentriesattr
:
1175 exit_syscall("getdirentriesattr", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 1, (double)now
);
1178 case BSC_exchangedata
:
1179 exit_syscall("exchangedata", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1182 case BSC_checkuseraccess
:
1183 exit_syscall("checkuseraccess", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1187 exit_syscall("searchfs", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1190 case FILEMGR_PBGETCATALOGINFO
:
1191 exit_syscall("GetCatalogInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1193 case FILEMGR_PBGETCATALOGINFOBULK
:
1194 exit_syscall("GetCatalogInfoBulk", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1196 case FILEMGR_PBCREATEFILEUNICODE
:
1197 exit_syscall("CreateFileUnicode", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1199 case FILEMGR_PBCREATEDIRECTORYUNICODE
:
1200 exit_syscall("CreateDirectoryUnicode", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1202 case FILEMGR_PBCREATEFORK
:
1203 exit_syscall("PBCreateFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1205 case FILEMGR_PBDELETEFORK
:
1206 exit_syscall("PBDeleteFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1208 case FILEMGR_PBITERATEFORK
:
1209 exit_syscall("PBIterateFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1211 case FILEMGR_PBOPENFORK
:
1212 exit_syscall("PBOpenFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1214 case FILEMGR_PBREADFORK
:
1215 exit_syscall("PBReadFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1217 case FILEMGR_PBWRITEFORK
:
1218 exit_syscall("PBWriteFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1220 case FILEMGR_PBALLOCATEFORK
:
1221 exit_syscall("PBAllocateFork", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1223 case FILEMGR_PBDELETEOBJECT
:
1224 exit_syscall("PBDeleteObject", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1226 case FILEMGR_PBEXCHANGEOBJECT
:
1227 exit_syscall("PBExchangeObject", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1229 case FILEMGR_PBGETFORKCBINFO
:
1230 exit_syscall("PBGetForkCBInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1232 case FILEMGR_PBGETVOLUMEINFO
:
1233 exit_syscall("PBGetVolumeInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1235 case FILEMGR_PBMAKEFSREF
:
1236 exit_syscall("PBMakeFSRef", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1238 case FILEMGR_PBMAKEFSREFUNICODE
:
1239 exit_syscall("PBMakeFSRefUnicode", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1241 case FILEMGR_PBMOVEOBJECT
:
1242 exit_syscall("PBMoveObject", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1244 case FILEMGR_PBOPENITERATOR
:
1245 exit_syscall("PBOpenIterator", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1247 case FILEMGR_PBRENAMEUNICODE
:
1248 exit_syscall("PBRenameUnicode", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1250 case FILEMGR_PBSETCATALOGINFO
:
1251 exit_syscall("PBSetCatalogInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1253 case FILEMGR_PBSETVOLUMEINFO
:
1254 exit_syscall("PBSetVolumeInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1256 case FILEMGR_FSREFMAKEPATH
:
1257 exit_syscall("FSRefMakePath", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1259 case FILEMGR_FSPATHMAKEREF
:
1260 exit_syscall("FSPathMakeRef", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1262 case FILEMGR_PBGETCATINFO
:
1263 exit_syscall("GetCatInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1265 case FILEMGR_PBGETCATINFOLITE
:
1266 exit_syscall("GetCatInfoLite", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1268 case FILEMGR_PBHGETFINFO
:
1269 exit_syscall("PBHGetFInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1271 case FILEMGR_PBXGETVOLINFO
:
1272 exit_syscall("PBXGetVolInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1274 case FILEMGR_PBHCREATE
:
1275 exit_syscall("PBHCreate", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1277 case FILEMGR_PBHOPENDF
:
1278 exit_syscall("PBHOpenDF", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1280 case FILEMGR_PBHOPENRF
:
1281 exit_syscall("PBHOpenRF", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1283 case FILEMGR_PBHGETDIRACCESS
:
1284 exit_syscall("PBHGetDirAccess", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1286 case FILEMGR_PBHSETDIRACCESS
:
1287 exit_syscall("PBHSetDirAccess", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1289 case FILEMGR_PBHMAPID
:
1290 exit_syscall("PBHMapID", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1292 case FILEMGR_PBHMAPNAME
:
1293 exit_syscall("PBHMapName", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1295 case FILEMGR_PBCLOSE
:
1296 exit_syscall("PBClose", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1298 case FILEMGR_PBFLUSHFILE
:
1299 exit_syscall("PBFlushFile", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1301 case FILEMGR_PBGETEOF
:
1302 exit_syscall("PBGetEOF", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1304 case FILEMGR_PBSETEOF
:
1305 exit_syscall("PBSetEOF", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1307 case FILEMGR_PBGETFPOS
:
1308 exit_syscall("PBGetFPos", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1310 case FILEMGR_PBREAD
:
1311 exit_syscall("PBRead", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1313 case FILEMGR_PBWRITE
:
1314 exit_syscall("PBWrite", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1316 case FILEMGR_PBGETFCBINFO
:
1317 exit_syscall("PBGetFCBInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1319 case FILEMGR_PBSETFINFO
:
1320 exit_syscall("PBSetFInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1322 case FILEMGR_PBALLOCATE
:
1323 exit_syscall("PBAllocate", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1325 case FILEMGR_PBALLOCCONTIG
:
1326 exit_syscall("PBAllocContig", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1328 case FILEMGR_PBSETFPOS
:
1329 exit_syscall("PBSetFPos", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1331 case FILEMGR_PBSETCATINFO
:
1332 exit_syscall("PBSetCatInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1334 case FILEMGR_PBGETVOLPARMS
:
1335 exit_syscall("PBGetVolParms", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1337 case FILEMGR_PBSETVINFO
:
1338 exit_syscall("PBSetVInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1340 case FILEMGR_PBMAKEFSSPEC
:
1341 exit_syscall("PBMakeFSSpec", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1343 case FILEMGR_PBHGETVINFO
:
1344 exit_syscall("PBHGetVInfo", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1346 case FILEMGR_PBCREATEFILEIDREF
:
1347 exit_syscall("PBCreateFileIDRef", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1349 case FILEMGR_PBDELETEFILEIDREF
:
1350 exit_syscall("PBDeleteFileIDRef", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1352 case FILEMGR_PBRESOLVEFILEIDREF
:
1353 exit_syscall("PBResolveFileIDRef", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1355 case FILEMGR_PBFLUSHVOL
:
1356 exit_syscall("PBFlushVol", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1358 case FILEMGR_PBHRENAME
:
1359 exit_syscall("PBHRename", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1361 case FILEMGR_PBCATMOVE
:
1362 exit_syscall("PBCatMove", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1364 case FILEMGR_PBEXCHANGEFILES
:
1365 exit_syscall("PBExchangeFiles", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1367 case FILEMGR_PBHDELETE
:
1368 exit_syscall("PBHDelete", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1370 case FILEMGR_PBDIRCREATE
:
1371 exit_syscall("PBDirCreate", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1373 case FILEMGR_PBCATSEARCH
:
1374 exit_syscall("PBCatSearch", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1376 case FILEMGR_PBHSETFLOCK
:
1377 exit_syscall("PBHSetFLock", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1379 case FILEMGR_PBHRSTFLOCK
:
1380 exit_syscall("PBHRstFLock", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1382 case FILEMGR_PBLOCKRANGE
:
1383 exit_syscall("PBLockRange", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1385 case FILEMGR_PBUNLOCKRANGE
:
1386 exit_syscall("PBUnlockRange", thread
, type
, kd
[i
].arg1
, kd
[i
].arg2
, 0, 0, (double)now
);
1396 enter_syscall(int thread
, int type
, kd_buf
*kd
, char *name
, double now
)
1405 kd_threadmap
*find_thread_map();
1446 case BSC_getdirentries
:
1454 case BSC_getattrlist
:
1455 case BSC_setattrlist
:
1456 case BSC_getdirentriesattr
:
1457 case BSC_exchangedata
:
1458 case BSC_checkuseraccess
:
1460 case FILEMGR_PBGETCATALOGINFO
:
1461 case FILEMGR_PBGETCATALOGINFOBULK
:
1462 case FILEMGR_PBCREATEFILEUNICODE
:
1463 case FILEMGR_PBCREATEDIRECTORYUNICODE
:
1464 case FILEMGR_PBCREATEFORK
:
1465 case FILEMGR_PBDELETEFORK
:
1466 case FILEMGR_PBITERATEFORK
:
1467 case FILEMGR_PBOPENFORK
:
1468 case FILEMGR_PBREADFORK
:
1469 case FILEMGR_PBWRITEFORK
:
1470 case FILEMGR_PBALLOCATEFORK
:
1471 case FILEMGR_PBDELETEOBJECT
:
1472 case FILEMGR_PBEXCHANGEOBJECT
:
1473 case FILEMGR_PBGETFORKCBINFO
:
1474 case FILEMGR_PBGETVOLUMEINFO
:
1475 case FILEMGR_PBMAKEFSREF
:
1476 case FILEMGR_PBMAKEFSREFUNICODE
:
1477 case FILEMGR_PBMOVEOBJECT
:
1478 case FILEMGR_PBOPENITERATOR
:
1479 case FILEMGR_PBRENAMEUNICODE
:
1480 case FILEMGR_PBSETCATALOGINFO
:
1481 case FILEMGR_PBSETVOLUMEINFO
:
1482 case FILEMGR_FSREFMAKEPATH
:
1483 case FILEMGR_FSPATHMAKEREF
:
1485 case FILEMGR_PBGETCATINFO
:
1486 case FILEMGR_PBGETCATINFOLITE
:
1487 case FILEMGR_PBHGETFINFO
:
1488 case FILEMGR_PBXGETVOLINFO
:
1489 case FILEMGR_PBHCREATE
:
1490 case FILEMGR_PBHOPENDF
:
1491 case FILEMGR_PBHOPENRF
:
1492 case FILEMGR_PBHGETDIRACCESS
:
1493 case FILEMGR_PBHSETDIRACCESS
:
1494 case FILEMGR_PBHMAPID
:
1495 case FILEMGR_PBHMAPNAME
:
1496 case FILEMGR_PBCLOSE
:
1497 case FILEMGR_PBFLUSHFILE
:
1498 case FILEMGR_PBGETEOF
:
1499 case FILEMGR_PBSETEOF
:
1500 case FILEMGR_PBGETFPOS
:
1501 case FILEMGR_PBREAD
:
1502 case FILEMGR_PBWRITE
:
1503 case FILEMGR_PBGETFCBINFO
:
1504 case FILEMGR_PBSETFINFO
:
1505 case FILEMGR_PBALLOCATE
:
1506 case FILEMGR_PBALLOCCONTIG
:
1507 case FILEMGR_PBSETFPOS
:
1508 case FILEMGR_PBSETCATINFO
:
1509 case FILEMGR_PBGETVOLPARMS
:
1510 case FILEMGR_PBSETVINFO
:
1511 case FILEMGR_PBMAKEFSSPEC
:
1512 case FILEMGR_PBHGETVINFO
:
1513 case FILEMGR_PBCREATEFILEIDREF
:
1514 case FILEMGR_PBDELETEFILEIDREF
:
1515 case FILEMGR_PBRESOLVEFILEIDREF
:
1516 case FILEMGR_PBFLUSHVOL
:
1517 case FILEMGR_PBHRENAME
:
1518 case FILEMGR_PBCATMOVE
:
1519 case FILEMGR_PBEXCHANGEFILES
:
1520 case FILEMGR_PBHDELETE
:
1521 case FILEMGR_PBDIRCREATE
:
1522 case FILEMGR_PBCATSEARCH
:
1523 case FILEMGR_PBHSETFLOCK
:
1524 case FILEMGR_PBHRSTFLOCK
:
1525 case FILEMGR_PBLOCKRANGE
:
1526 case FILEMGR_PBUNLOCKRANGE
:
1529 for (i
= 0, ti
= th_state
; ti
< &th_state
[MAX_THREADS
]; ti
++, i
++) {
1530 if (ti
->thread
== 0)
1533 if (ti
== &th_state
[MAX_THREADS
])
1538 if ((type
>> 24) == FILEMGR_CLASS
) {
1541 l_usecs
= (long long)(now
/ divisor
);
1542 secs
= l_usecs
/ 1000000;
1544 if (bias_secs
== 0) {
1545 curr_time
= time((long *)0);
1546 bias_secs
= curr_time
- secs
;
1548 curr_time
= bias_secs
+ secs
;
1549 printf("%-8.8s", &(ctime(&curr_time
)[11]));
1551 if (COLS
> 110 || wideflag
) {
1552 usecs
= l_usecs
- (long long)((long long)secs
* 1000000);
1553 printf(".%03ld", (long)usecs
/ 1000);
1555 map
= find_thread_map(thread
);
1560 sprintf(buf
, " %s", name
);
1565 memset(&buf
[clen
], ' ', 26 - clen
);
1567 sprintf(&buf
[25], "(%d, 0x%x, 0x%x, 0x%x)", (short)kd
->arg1
, kd
->arg2
, kd
->arg3
, kd
->arg4
);
1568 clen
= strlen(&buf
[25]) + 25;
1569 memset(&buf
[clen
], ' ', 128 - clen
);
1571 if (COLS
> 110 || wideflag
)
1572 sprintf(&buf
[81], "%s\n", map
->command
);
1574 sprintf(&buf
[60], "%.12s\n", map
->command
);
1579 printf(" %-24.24s (%5d, %#x, 0x%x, 0x%x)\n", name
, (short)kd
->arg1
, kd
->arg2
, kd
->arg3
, kd
->arg4
);
1584 ti
->thread
= thread
;
1589 ti
->arg1
= kd
->arg1
;
1590 ti
->arg2
= kd
->arg2
;
1591 ti
->arg3
= kd
->arg3
;
1592 ti
->arg4
= kd
->arg4
;
1593 ti
->pathname
[0] = 0;
1604 exit_syscall(char *sc_name
, int thread
, int type
, int error
, int retval
,
1605 int has_fd
, int has_ret
, double now
)
1614 kd_threadmap
*find_thread_map();
1616 if ((ti
= find_thread(thread
, type
)) == (struct th_info
*)0)
1618 map
= find_thread_map(thread
);
1619 l_usecs
= (long long)(now
/ divisor
);
1620 secs
= l_usecs
/ 1000000;
1622 if (bias_secs
== 0) {
1623 curr_time
= time((long *)0);
1624 bias_secs
= curr_time
- secs
;
1626 curr_time
= bias_secs
+ secs
;
1627 printf("%-8.8s", &(ctime(&curr_time
)[11]));
1630 if (COLS
> 110 || wideflag
) {
1632 usecs
= l_usecs
- (long long)((long long)secs
* 1000000);
1633 printf(".%03ld", (long)usecs
/ 1000);
1635 if ((type
>> 24) != FILEMGR_CLASS
) {
1636 if (find_thread(thread
, -1)) {
1644 if (((type
>> 24) == FILEMGR_CLASS
) && (COLS
> 110 || wideflag
))
1645 printf(" %-18.18s", sc_name
);
1647 printf(" %-15.15s", sc_name
);
1649 if (COLS
> 110 || wideflag
) {
1650 if (has_fd
== 2 && error
== 0)
1651 printf(" F=%-3d", retval
);
1652 else if (has_fd
== 1)
1653 printf(" F=%-3d", ti
->arg1
);
1654 else if (has_ret
!= 2)
1658 printf("[%3d] ", error
);
1659 else if (has_ret
== 3)
1660 printf("O=0x%8.8x", ti
->arg3
);
1661 else if (has_ret
== 5)
1662 printf("O=0x%8.8x", retval
);
1663 else if (has_ret
== 2)
1664 printf(" A=0x%8.8x ", retval
);
1665 else if (has_ret
== 1)
1666 printf(" B=0x%-6x", retval
);
1667 else if (has_ret
== 4)
1668 printf("R=0x%-8x", retval
);
1672 printf(" %-28.28s ", ti
->pathname
);
1674 usecs
= (unsigned long)(((double)now
- ti
->stime
) / divisor
);
1675 secs
= usecs
/ 1000000;
1676 usecs
-= secs
* 1000000;
1678 if ((type
>> 24) != FILEMGR_CLASS
&& !nopadding
)
1681 printf(" %2ld.%06ld", (long)secs
, (long)usecs
);
1688 if (COLS
> 110 || wideflag
)
1689 printf(" %s", map
->command
);
1691 printf(" %.12s", map
->command
);
1695 if (ti
== &th_state
[cur_max
- 1])
1708 This flag is turned off when calling
1709 quit() due to a set_remove() failure.
1711 if (set_remove_flag
)
1714 printf("fs_usage: ");
1726 unsigned int abs_to_ns_num
;
1727 unsigned int abs_to_ns_denom
;
1728 unsigned int proc_to_abs_num
;
1729 unsigned int proc_to_abs_denom
;
1731 extern void MKGetTimeBaseInfo(unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *);
1733 MKGetTimeBaseInfo (&delta
, &abs_to_ns_num
, &abs_to_ns_denom
,
1734 &proc_to_abs_num
, &proc_to_abs_denom
);
1736 divisor
= ((double)abs_to_ns_denom
/ (double)abs_to_ns_num
) * 1000;
1740 void read_command_map()
1749 total_threads
= bufinfo
.nkdthreads
;
1750 size
= bufinfo
.nkdthreads
* sizeof(kd_threadmap
);
1754 if (mapptr
= (kd_threadmap
*) malloc(size
))
1755 bzero (mapptr
, size
);
1758 printf("Thread map is not initialized -- this is not fatal\n");
1763 /* Now read the threadmap */
1765 mib
[1] = KERN_KDEBUG
;
1766 mib
[2] = KERN_KDTHRMAP
;
1769 mib
[5] = 0; /* no flags */
1770 if (sysctl(mib
, 3, mapptr
, &size
, NULL
, 0) < 0)
1772 /* This is not fatal -- just means I cant map command strings */
1774 printf("Can't read the thread map -- this is not fatal\n");
1783 void create_map_entry(int thread
, char *command
)
1791 for (i
= 0, map
= 0; !map
&& i
< total_threads
; i
++)
1793 if (mapptr
[i
].thread
== thread
)
1794 map
= &mapptr
[i
]; /* Reuse this entry, the thread has been reassigned */
1797 if (!map
) /* look for invalid entries that I can reuse*/
1799 for (i
= 0, map
= 0; !map
&& i
< total_threads
; i
++)
1801 if (mapptr
[i
].valid
== 0 )
1802 map
= &mapptr
[i
]; /* Reuse this invalid entry */
1808 /* If reach here, then this is a new thread and
1809 * there are no invalid entries to reuse
1810 * Double the size of the thread map table.
1813 n
= total_threads
* 2;
1814 mapptr
= (kd_threadmap
*) realloc(mapptr
, n
* sizeof(kd_threadmap
));
1815 bzero(&mapptr
[total_threads
], total_threads
*sizeof(kd_threadmap
));
1816 map
= &mapptr
[total_threads
];
1821 map
->thread
= thread
;
1822 (void)strncpy (map
->command
, command
, sizeof(map
->command
));
1823 map
->command
[sizeof(map
->command
)-1] = '\0';
1827 kd_threadmap
*find_thread_map(int thread
)
1833 return((kd_threadmap
*)0);
1835 for (i
= 0; i
< total_threads
; i
++)
1838 if (map
->valid
&& (map
->thread
== thread
))
1843 return ((kd_threadmap
*)0);
1848 kill_thread_map(int thread
)
1852 if (map
= find_thread_map(thread
)) {
1855 map
->command
[0] = '\0';
1867 ret
= (int)strtol(str
, &cp
, 10);
1868 if (cp
== str
|| *cp
) {
1869 /* Assume this is a command string and find matching pids */
1873 for (i
=0; i
< kp_nentries
&& num_of_pids
< (MAX_PIDS
- 1); i
++) {
1874 if(kp_buffer
[i
].kp_proc
.p_stat
== 0)
1877 if(!strcmp(str
, kp_buffer
[i
].kp_proc
.p_comm
))
1878 pids
[num_of_pids
++] = kp_buffer
[i
].kp_proc
.p_pid
;
1882 else if (num_of_pids
< (MAX_PIDS
- 1))
1883 pids
[num_of_pids
++] = ret
;