1*2c2f96dcSApple OSS Distributions #ifndef KTRACE_HELPERS_H
2*2c2f96dcSApple OSS Distributions #define KTRACE_HELPERS_H
3*2c2f96dcSApple OSS Distributions
4*2c2f96dcSApple OSS Distributions #include <darwintest.h>
5*2c2f96dcSApple OSS Distributions #include <ktrace/ktrace.h>
6*2c2f96dcSApple OSS Distributions #include <libproc.h>
7*2c2f96dcSApple OSS Distributions #include <sys/sysctl.h>
8*2c2f96dcSApple OSS Distributions #include <sys/kdebug.h>
9*2c2f96dcSApple OSS Distributions
10*2c2f96dcSApple OSS Distributions static inline void
reset_ktrace(void)11*2c2f96dcSApple OSS Distributions reset_ktrace(void)
12*2c2f96dcSApple OSS Distributions {
13*2c2f96dcSApple OSS Distributions (void)sysctl((int[]){ CTL_KERN, KERN_KDEBUG, KERN_KDREMOVE }, 3,
14*2c2f96dcSApple OSS Distributions NULL, 0, NULL, 0);
15*2c2f96dcSApple OSS Distributions kperf_reset();
16*2c2f96dcSApple OSS Distributions }
17*2c2f96dcSApple OSS Distributions
18*2c2f96dcSApple OSS Distributions static inline void
start_controlling_ktrace(void)19*2c2f96dcSApple OSS Distributions start_controlling_ktrace(void)
20*2c2f96dcSApple OSS Distributions {
21*2c2f96dcSApple OSS Distributions T_SETUPBEGIN;
22*2c2f96dcSApple OSS Distributions
23*2c2f96dcSApple OSS Distributions int state = 0;
24*2c2f96dcSApple OSS Distributions size_t statesz = sizeof(state);
25*2c2f96dcSApple OSS Distributions int ret = sysctlbyname("ktrace.state", &state, &statesz, NULL, 0);
26*2c2f96dcSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "getting ktrace state");
27*2c2f96dcSApple OSS Distributions
28*2c2f96dcSApple OSS Distributions if (state == 1) {
29*2c2f96dcSApple OSS Distributions int ownerpid = 0;
30*2c2f96dcSApple OSS Distributions size_t pidsz = sizeof(ownerpid);
31*2c2f96dcSApple OSS Distributions ret = sysctlbyname("ktrace.owning_pid", &ownerpid, &pidsz, NULL, 0);
32*2c2f96dcSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_SUCCESS(ret, "getting owning pid");
33*2c2f96dcSApple OSS Distributions
34*2c2f96dcSApple OSS Distributions if (ownerpid <= 0) {
35*2c2f96dcSApple OSS Distributions T_LOG("ktrace is in foreground, but no owner");
36*2c2f96dcSApple OSS Distributions goto out;
37*2c2f96dcSApple OSS Distributions }
38*2c2f96dcSApple OSS Distributions
39*2c2f96dcSApple OSS Distributions char ownername[1024];
40*2c2f96dcSApple OSS Distributions ret = proc_name(ownerpid, ownername, sizeof(ownername));
41*2c2f96dcSApple OSS Distributions if (ret == 0) {
42*2c2f96dcSApple OSS Distributions T_LOG("ktrace is in foreground, but owner (%d) has no name", ownerpid);
43*2c2f96dcSApple OSS Distributions goto out;
44*2c2f96dcSApple OSS Distributions }
45*2c2f96dcSApple OSS Distributions
46*2c2f96dcSApple OSS Distributions T_LOG("ktrace is in foreground, owned by %s, sending SIGKILL", ownername);
47*2c2f96dcSApple OSS Distributions kill(ownerpid, SIGKILL);
48*2c2f96dcSApple OSS Distributions usleep(500000);
49*2c2f96dcSApple OSS Distributions
50*2c2f96dcSApple OSS Distributions ret = proc_name(ownerpid, ownername, sizeof(ownername));
51*2c2f96dcSApple OSS Distributions T_QUIET; T_ASSERT_EQ(ret, 0, "should have killed ktrace owner");
52*2c2f96dcSApple OSS Distributions }
53*2c2f96dcSApple OSS Distributions
54*2c2f96dcSApple OSS Distributions out:
55*2c2f96dcSApple OSS Distributions reset_ktrace();
56*2c2f96dcSApple OSS Distributions T_ATEND(reset_ktrace);
57*2c2f96dcSApple OSS Distributions T_SETUPEND;
58*2c2f96dcSApple OSS Distributions }
59*2c2f96dcSApple OSS Distributions
60*2c2f96dcSApple OSS Distributions static inline void
assert_kdebug_test(kdebug_test_t flavor,const char * msg)61*2c2f96dcSApple OSS Distributions assert_kdebug_test(kdebug_test_t flavor, const char *msg)
62*2c2f96dcSApple OSS Distributions {
63*2c2f96dcSApple OSS Distributions size_t size = flavor;
64*2c2f96dcSApple OSS Distributions int mib[] = { CTL_KERN, KERN_KDEBUG, KERN_KDTEST };
65*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_SUCCESS(sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL,
66*2c2f96dcSApple OSS Distributions &size, NULL, 0), "KERN_KDTEST %d: %s", flavor, msg);
67*2c2f96dcSApple OSS Distributions }
68*2c2f96dcSApple OSS Distributions
69*2c2f96dcSApple OSS Distributions static inline uint64_t
ns_from_abs(ktrace_session_t s,uint64_t abstime)70*2c2f96dcSApple OSS Distributions ns_from_abs(ktrace_session_t s, uint64_t abstime)
71*2c2f96dcSApple OSS Distributions {
72*2c2f96dcSApple OSS Distributions uint64_t ns = 0;
73*2c2f96dcSApple OSS Distributions int error = ktrace_convert_timestamp_to_nanoseconds(s, abstime, &ns);
74*2c2f96dcSApple OSS Distributions T_QUIET; T_ASSERT_POSIX_ZERO(error, "convert abstime to nanoseconds");
75*2c2f96dcSApple OSS Distributions return ns;
76*2c2f96dcSApple OSS Distributions }
77*2c2f96dcSApple OSS Distributions
78*2c2f96dcSApple OSS Distributions static inline uint64_t
relns_from_abs(ktrace_session_t s,uint64_t abstime)79*2c2f96dcSApple OSS Distributions relns_from_abs(ktrace_session_t s, uint64_t abstime)
80*2c2f96dcSApple OSS Distributions {
81*2c2f96dcSApple OSS Distributions return ns_from_abs(s, abstime - ktrace_get_earliest_timestamp(s));
82*2c2f96dcSApple OSS Distributions }
83*2c2f96dcSApple OSS Distributions
84*2c2f96dcSApple OSS Distributions #endif /* !defined(KTRACE_HELPERS_H) */
85