xref: /aosp_15_r20/external/AFLplusplus/src/afl-gotcpu.c (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker    american fuzzy lop++ - free CPU gizmo
3*08b48e0bSAndroid Build Coastguard Worker    -----------------------------------
4*08b48e0bSAndroid Build Coastguard Worker 
5*08b48e0bSAndroid Build Coastguard Worker    Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker 
7*08b48e0bSAndroid Build Coastguard Worker    Now maintained by Marc Heuse <[email protected]>,
8*08b48e0bSAndroid Build Coastguard Worker                         Heiko Eißfeldt <[email protected]> and
9*08b48e0bSAndroid Build Coastguard Worker                         Andrea Fioraldi <[email protected]>
10*08b48e0bSAndroid Build Coastguard Worker 
11*08b48e0bSAndroid Build Coastguard Worker    Copyright 2016, 2017 Google Inc. All rights reserved.
12*08b48e0bSAndroid Build Coastguard Worker    Copyright 2019-2024 AFLplusplus Project. All rights reserved.
13*08b48e0bSAndroid Build Coastguard Worker 
14*08b48e0bSAndroid Build Coastguard Worker    Licensed under the Apache License, Version 2.0 (the "License");
15*08b48e0bSAndroid Build Coastguard Worker    you may not use this file except in compliance with the License.
16*08b48e0bSAndroid Build Coastguard Worker    You may obtain a copy of the License at:
17*08b48e0bSAndroid Build Coastguard Worker 
18*08b48e0bSAndroid Build Coastguard Worker      https://www.apache.org/licenses/LICENSE-2.0
19*08b48e0bSAndroid Build Coastguard Worker 
20*08b48e0bSAndroid Build Coastguard Worker    This tool provides a fairly accurate measurement of CPU preemption rate.
21*08b48e0bSAndroid Build Coastguard Worker    It is meant to complement the quick-and-dirty load average widget shown
22*08b48e0bSAndroid Build Coastguard Worker    in the afl-fuzz UI. See docs/fuzzing_in_depth.md#c-using-multiple-cores
23*08b48e0bSAndroid Build Coastguard Worker    for more info.
24*08b48e0bSAndroid Build Coastguard Worker 
25*08b48e0bSAndroid Build Coastguard Worker    For some work loads, the tool may actually suggest running more instances
26*08b48e0bSAndroid Build Coastguard Worker    than you have CPU cores. This can happen if the tested program is spending
27*08b48e0bSAndroid Build Coastguard Worker    a portion of its run time waiting for I/O, rather than being 100%
28*08b48e0bSAndroid Build Coastguard Worker    CPU-bound.
29*08b48e0bSAndroid Build Coastguard Worker 
30*08b48e0bSAndroid Build Coastguard Worker    The idea for the getrusage()-based approach comes from Jakub Wilk.
31*08b48e0bSAndroid Build Coastguard Worker 
32*08b48e0bSAndroid Build Coastguard Worker  */
33*08b48e0bSAndroid Build Coastguard Worker 
34*08b48e0bSAndroid Build Coastguard Worker #define AFL_MAIN
35*08b48e0bSAndroid Build Coastguard Worker #ifndef _GNU_SOURCE
36*08b48e0bSAndroid Build Coastguard Worker   #define _GNU_SOURCE
37*08b48e0bSAndroid Build Coastguard Worker #endif
38*08b48e0bSAndroid Build Coastguard Worker 
39*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
40*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
41*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
42*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
43*08b48e0bSAndroid Build Coastguard Worker #include <sched.h>
44*08b48e0bSAndroid Build Coastguard Worker 
45*08b48e0bSAndroid Build Coastguard Worker #include <sys/time.h>
46*08b48e0bSAndroid Build Coastguard Worker #include <sys/times.h>
47*08b48e0bSAndroid Build Coastguard Worker #include <sys/resource.h>
48*08b48e0bSAndroid Build Coastguard Worker #include <sys/wait.h>
49*08b48e0bSAndroid Build Coastguard Worker 
50*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
51*08b48e0bSAndroid Build Coastguard Worker #include "debug.h"
52*08b48e0bSAndroid Build Coastguard Worker #include "common.h"
53*08b48e0bSAndroid Build Coastguard Worker 
54*08b48e0bSAndroid Build Coastguard Worker #if defined(__linux__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
55*08b48e0bSAndroid Build Coastguard Worker     defined(__APPLE__) || defined(__DragonFly__) || defined(__sun)
56*08b48e0bSAndroid Build Coastguard Worker   #define HAVE_AFFINITY 1
57*08b48e0bSAndroid Build Coastguard Worker   #if defined(__FreeBSD__) || defined(__DragonFly__)
58*08b48e0bSAndroid Build Coastguard Worker     #include <pthread.h>
59*08b48e0bSAndroid Build Coastguard Worker     #include <pthread_np.h>
60*08b48e0bSAndroid Build Coastguard Worker     #if defined(__FreeBSD__)
61*08b48e0bSAndroid Build Coastguard Worker       #include <sys/cpuset.h>
62*08b48e0bSAndroid Build Coastguard Worker     #endif
63*08b48e0bSAndroid Build Coastguard Worker     #define cpu_set_t cpuset_t
64*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__NetBSD__)
65*08b48e0bSAndroid Build Coastguard Worker     #include <pthread.h>
66*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__APPLE__)
67*08b48e0bSAndroid Build Coastguard Worker     #include <pthread.h>
68*08b48e0bSAndroid Build Coastguard Worker     #include <mach/thread_act.h>
69*08b48e0bSAndroid Build Coastguard Worker     #include <mach/thread_policy.h>
70*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__sun)
71*08b48e0bSAndroid Build Coastguard Worker     #include <sys/pset.h>
72*08b48e0bSAndroid Build Coastguard Worker   #endif
73*08b48e0bSAndroid Build Coastguard Worker #endif               /* __linux__ || __FreeBSD__ || __NetBSD__ || __APPLE__ */
74*08b48e0bSAndroid Build Coastguard Worker 
75*08b48e0bSAndroid Build Coastguard Worker /* Get CPU usage in microseconds. */
76*08b48e0bSAndroid Build Coastguard Worker 
get_cpu_usage_us(void)77*08b48e0bSAndroid Build Coastguard Worker static u64 get_cpu_usage_us(void) {
78*08b48e0bSAndroid Build Coastguard Worker 
79*08b48e0bSAndroid Build Coastguard Worker   struct rusage u;
80*08b48e0bSAndroid Build Coastguard Worker 
81*08b48e0bSAndroid Build Coastguard Worker   getrusage(RUSAGE_SELF, &u);
82*08b48e0bSAndroid Build Coastguard Worker 
83*08b48e0bSAndroid Build Coastguard Worker   return (u.ru_utime.tv_sec * 1000000ULL) + u.ru_utime.tv_usec +
84*08b48e0bSAndroid Build Coastguard Worker          (u.ru_stime.tv_sec * 1000000ULL) + u.ru_stime.tv_usec;
85*08b48e0bSAndroid Build Coastguard Worker 
86*08b48e0bSAndroid Build Coastguard Worker }
87*08b48e0bSAndroid Build Coastguard Worker 
88*08b48e0bSAndroid Build Coastguard Worker /* Measure preemption rate. */
89*08b48e0bSAndroid Build Coastguard Worker 
measure_preemption(u32 target_ms)90*08b48e0bSAndroid Build Coastguard Worker static u32 measure_preemption(u32 target_ms) {
91*08b48e0bSAndroid Build Coastguard Worker 
92*08b48e0bSAndroid Build Coastguard Worker   volatile u32 v1, v2 = 0;
93*08b48e0bSAndroid Build Coastguard Worker 
94*08b48e0bSAndroid Build Coastguard Worker   u64 st_t, en_t, st_c, en_c, real_delta, slice_delta;
95*08b48e0bSAndroid Build Coastguard Worker   // s32 loop_repeats = 0;
96*08b48e0bSAndroid Build Coastguard Worker 
97*08b48e0bSAndroid Build Coastguard Worker   st_t = get_cur_time_us();
98*08b48e0bSAndroid Build Coastguard Worker   st_c = get_cpu_usage_us();
99*08b48e0bSAndroid Build Coastguard Worker 
100*08b48e0bSAndroid Build Coastguard Worker repeat_loop:
101*08b48e0bSAndroid Build Coastguard Worker 
102*08b48e0bSAndroid Build Coastguard Worker   v1 = CTEST_BUSY_CYCLES;
103*08b48e0bSAndroid Build Coastguard Worker 
104*08b48e0bSAndroid Build Coastguard Worker   while (v1--) {
105*08b48e0bSAndroid Build Coastguard Worker 
106*08b48e0bSAndroid Build Coastguard Worker     v2++;
107*08b48e0bSAndroid Build Coastguard Worker 
108*08b48e0bSAndroid Build Coastguard Worker   }
109*08b48e0bSAndroid Build Coastguard Worker 
110*08b48e0bSAndroid Build Coastguard Worker   sched_yield();
111*08b48e0bSAndroid Build Coastguard Worker 
112*08b48e0bSAndroid Build Coastguard Worker   en_t = get_cur_time_us();
113*08b48e0bSAndroid Build Coastguard Worker 
114*08b48e0bSAndroid Build Coastguard Worker   if (en_t - st_t < target_ms * 1000) {
115*08b48e0bSAndroid Build Coastguard Worker 
116*08b48e0bSAndroid Build Coastguard Worker     // loop_repeats++;
117*08b48e0bSAndroid Build Coastguard Worker     goto repeat_loop;
118*08b48e0bSAndroid Build Coastguard Worker 
119*08b48e0bSAndroid Build Coastguard Worker   }
120*08b48e0bSAndroid Build Coastguard Worker 
121*08b48e0bSAndroid Build Coastguard Worker   /* Let's see what percentage of this time we actually had a chance to
122*08b48e0bSAndroid Build Coastguard Worker      run, and how much time was spent in the penalty box. */
123*08b48e0bSAndroid Build Coastguard Worker 
124*08b48e0bSAndroid Build Coastguard Worker   en_c = get_cpu_usage_us();
125*08b48e0bSAndroid Build Coastguard Worker 
126*08b48e0bSAndroid Build Coastguard Worker   real_delta = (en_t - st_t) / 1000;
127*08b48e0bSAndroid Build Coastguard Worker   slice_delta = (en_c - st_c) / 1000;
128*08b48e0bSAndroid Build Coastguard Worker 
129*08b48e0bSAndroid Build Coastguard Worker   return real_delta * 100 / slice_delta;
130*08b48e0bSAndroid Build Coastguard Worker 
131*08b48e0bSAndroid Build Coastguard Worker }
132*08b48e0bSAndroid Build Coastguard Worker 
133*08b48e0bSAndroid Build Coastguard Worker /* Do the benchmark thing. */
134*08b48e0bSAndroid Build Coastguard Worker 
main(int argc,char ** argv)135*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
136*08b48e0bSAndroid Build Coastguard Worker 
137*08b48e0bSAndroid Build Coastguard Worker   if (argc > 1) {
138*08b48e0bSAndroid Build Coastguard Worker 
139*08b48e0bSAndroid Build Coastguard Worker     printf("afl-gotcpu" VERSION " by Michal Zalewski\n");
140*08b48e0bSAndroid Build Coastguard Worker     printf("\n%s \n\n", argv[0]);
141*08b48e0bSAndroid Build Coastguard Worker     printf("afl-gotcpu does not have command line options\n");
142*08b48e0bSAndroid Build Coastguard Worker     printf("afl-gotcpu prints out which CPUs are available\n");
143*08b48e0bSAndroid Build Coastguard Worker     return -1;
144*08b48e0bSAndroid Build Coastguard Worker 
145*08b48e0bSAndroid Build Coastguard Worker   }
146*08b48e0bSAndroid Build Coastguard Worker 
147*08b48e0bSAndroid Build Coastguard Worker #ifdef HAVE_AFFINITY
148*08b48e0bSAndroid Build Coastguard Worker 
149*08b48e0bSAndroid Build Coastguard Worker   u32 cpu_cnt = sysconf(_SC_NPROCESSORS_ONLN), idle_cpus = 0, maybe_cpus = 0, i;
150*08b48e0bSAndroid Build Coastguard Worker 
151*08b48e0bSAndroid Build Coastguard Worker   SAYF(cCYA "afl-gotcpu" VERSION cRST " by Michal Zalewski\n");
152*08b48e0bSAndroid Build Coastguard Worker 
153*08b48e0bSAndroid Build Coastguard Worker   ACTF("Measuring per-core preemption rate (this will take %0.02f sec)...",
154*08b48e0bSAndroid Build Coastguard Worker        ((double)CTEST_CORE_TRG_MS) / 1000);
155*08b48e0bSAndroid Build Coastguard Worker 
156*08b48e0bSAndroid Build Coastguard Worker   for (i = 0; i < cpu_cnt; i++) {
157*08b48e0bSAndroid Build Coastguard Worker 
158*08b48e0bSAndroid Build Coastguard Worker     s32 fr = fork();
159*08b48e0bSAndroid Build Coastguard Worker 
160*08b48e0bSAndroid Build Coastguard Worker     if (fr < 0) { PFATAL("fork failed"); }
161*08b48e0bSAndroid Build Coastguard Worker 
162*08b48e0bSAndroid Build Coastguard Worker     if (!fr) {
163*08b48e0bSAndroid Build Coastguard Worker 
164*08b48e0bSAndroid Build Coastguard Worker       u32 util_perc;
165*08b48e0bSAndroid Build Coastguard Worker   #if defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__)
166*08b48e0bSAndroid Build Coastguard Worker       cpu_set_t c;
167*08b48e0bSAndroid Build Coastguard Worker 
168*08b48e0bSAndroid Build Coastguard Worker       CPU_ZERO(&c);
169*08b48e0bSAndroid Build Coastguard Worker       CPU_SET(i, &c);
170*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__NetBSD__)
171*08b48e0bSAndroid Build Coastguard Worker       cpuset_t *c;
172*08b48e0bSAndroid Build Coastguard Worker 
173*08b48e0bSAndroid Build Coastguard Worker       c = cpuset_create();
174*08b48e0bSAndroid Build Coastguard Worker       if (c == NULL) PFATAL("cpuset_create failed");
175*08b48e0bSAndroid Build Coastguard Worker 
176*08b48e0bSAndroid Build Coastguard Worker       cpuset_set(i, c);
177*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__APPLE__) && defined(__x86_64__)
178*08b48e0bSAndroid Build Coastguard Worker       // the api is not workable on arm64, core's principle
179*08b48e0bSAndroid Build Coastguard Worker       // differs significantly hive of core per type vs individual ones.
180*08b48e0bSAndroid Build Coastguard Worker       // Possible TODO: For arm64 is to slightly change the meaning
181*08b48e0bSAndroid Build Coastguard Worker       // of gotcpu since it makes no sense on this platform
182*08b48e0bSAndroid Build Coastguard Worker       // but rather just displaying current policy ?
183*08b48e0bSAndroid Build Coastguard Worker       thread_affinity_policy_data_t c = {i};
184*08b48e0bSAndroid Build Coastguard Worker       thread_port_t native_thread = pthread_mach_thread_np(pthread_self());
185*08b48e0bSAndroid Build Coastguard Worker       if (thread_policy_set(native_thread, THREAD_AFFINITY_POLICY,
186*08b48e0bSAndroid Build Coastguard Worker                             (thread_policy_t)&c, 1) != KERN_SUCCESS)
187*08b48e0bSAndroid Build Coastguard Worker         PFATAL("thread_policy_set failed");
188*08b48e0bSAndroid Build Coastguard Worker   #elif defined(__sun)
189*08b48e0bSAndroid Build Coastguard Worker       psetid_t c;
190*08b48e0bSAndroid Build Coastguard Worker 
191*08b48e0bSAndroid Build Coastguard Worker       if (pset_create(&c)) PFATAL("pset_create failed");
192*08b48e0bSAndroid Build Coastguard Worker 
193*08b48e0bSAndroid Build Coastguard Worker       if (pset_assign(c, i, NULL)) PFATAL("pset_assign failed");
194*08b48e0bSAndroid Build Coastguard Worker   #endif
195*08b48e0bSAndroid Build Coastguard Worker 
196*08b48e0bSAndroid Build Coastguard Worker   #if defined(__FreeBSD__) || defined(__DragonFly__)
197*08b48e0bSAndroid Build Coastguard Worker       if (pthread_setaffinity_np(pthread_self(), sizeof(c), &c))
198*08b48e0bSAndroid Build Coastguard Worker         PFATAL("pthread_setaffinity_np failed");
199*08b48e0bSAndroid Build Coastguard Worker   #endif
200*08b48e0bSAndroid Build Coastguard Worker 
201*08b48e0bSAndroid Build Coastguard Worker   #if defined(__NetBSD__)
202*08b48e0bSAndroid Build Coastguard Worker       if (pthread_setaffinity_np(pthread_self(), cpuset_size(c), c))
203*08b48e0bSAndroid Build Coastguard Worker         PFATAL("pthread_setaffinity_np failed");
204*08b48e0bSAndroid Build Coastguard Worker 
205*08b48e0bSAndroid Build Coastguard Worker       cpuset_destroy(c);
206*08b48e0bSAndroid Build Coastguard Worker   #endif
207*08b48e0bSAndroid Build Coastguard Worker 
208*08b48e0bSAndroid Build Coastguard Worker   #if defined(__sun)
209*08b48e0bSAndroid Build Coastguard Worker       if (pset_bind(c, P_PID, getpid(), NULL)) PFATAL("pset_bind failed");
210*08b48e0bSAndroid Build Coastguard Worker 
211*08b48e0bSAndroid Build Coastguard Worker       pset_destroy(c);
212*08b48e0bSAndroid Build Coastguard Worker   #endif
213*08b48e0bSAndroid Build Coastguard Worker 
214*08b48e0bSAndroid Build Coastguard Worker   #if defined(__linux__)
215*08b48e0bSAndroid Build Coastguard Worker       if (sched_setaffinity(0, sizeof(c), &c)) {
216*08b48e0bSAndroid Build Coastguard Worker 
217*08b48e0bSAndroid Build Coastguard Worker         const char *error_code = "Unkown error code";
218*08b48e0bSAndroid Build Coastguard Worker         if (errno == EFAULT) error_code = "EFAULT";
219*08b48e0bSAndroid Build Coastguard Worker         if (errno == EINVAL) error_code = "EINVAL";
220*08b48e0bSAndroid Build Coastguard Worker         if (errno == EPERM) error_code = "EPERM";
221*08b48e0bSAndroid Build Coastguard Worker         if (errno == ESRCH) error_code = "ESRCH";
222*08b48e0bSAndroid Build Coastguard Worker 
223*08b48e0bSAndroid Build Coastguard Worker         PFATAL("sched_setaffinity failed for cpu %d, error: %s", i, error_code);
224*08b48e0bSAndroid Build Coastguard Worker 
225*08b48e0bSAndroid Build Coastguard Worker       }
226*08b48e0bSAndroid Build Coastguard Worker 
227*08b48e0bSAndroid Build Coastguard Worker   #endif
228*08b48e0bSAndroid Build Coastguard Worker 
229*08b48e0bSAndroid Build Coastguard Worker       util_perc = measure_preemption(CTEST_CORE_TRG_MS);
230*08b48e0bSAndroid Build Coastguard Worker 
231*08b48e0bSAndroid Build Coastguard Worker       if (util_perc < 110) {
232*08b48e0bSAndroid Build Coastguard Worker 
233*08b48e0bSAndroid Build Coastguard Worker         SAYF("    Core #%u: " cLGN "AVAILABLE" cRST "(%u%%)\n", i, util_perc);
234*08b48e0bSAndroid Build Coastguard Worker         exit(0);
235*08b48e0bSAndroid Build Coastguard Worker 
236*08b48e0bSAndroid Build Coastguard Worker       } else if (util_perc < 250) {
237*08b48e0bSAndroid Build Coastguard Worker 
238*08b48e0bSAndroid Build Coastguard Worker         SAYF("    Core #%u: " cYEL "CAUTION " cRST "(%u%%)\n", i, util_perc);
239*08b48e0bSAndroid Build Coastguard Worker         exit(1);
240*08b48e0bSAndroid Build Coastguard Worker 
241*08b48e0bSAndroid Build Coastguard Worker       }
242*08b48e0bSAndroid Build Coastguard Worker 
243*08b48e0bSAndroid Build Coastguard Worker       SAYF("    Core #%u: " cLRD "OVERBOOKED " cRST "(%u%%)\n" cRST, i,
244*08b48e0bSAndroid Build Coastguard Worker            util_perc);
245*08b48e0bSAndroid Build Coastguard Worker       exit(2);
246*08b48e0bSAndroid Build Coastguard Worker 
247*08b48e0bSAndroid Build Coastguard Worker     }
248*08b48e0bSAndroid Build Coastguard Worker 
249*08b48e0bSAndroid Build Coastguard Worker   }
250*08b48e0bSAndroid Build Coastguard Worker 
251*08b48e0bSAndroid Build Coastguard Worker   for (i = 0; i < cpu_cnt; i++) {
252*08b48e0bSAndroid Build Coastguard Worker 
253*08b48e0bSAndroid Build Coastguard Worker     int ret;
254*08b48e0bSAndroid Build Coastguard Worker     if (waitpid(-1, &ret, 0) < 0) { PFATAL("waitpid failed"); }
255*08b48e0bSAndroid Build Coastguard Worker 
256*08b48e0bSAndroid Build Coastguard Worker     if (WEXITSTATUS(ret) == 0) { idle_cpus++; }
257*08b48e0bSAndroid Build Coastguard Worker     if (WEXITSTATUS(ret) <= 1) { maybe_cpus++; }
258*08b48e0bSAndroid Build Coastguard Worker 
259*08b48e0bSAndroid Build Coastguard Worker   }
260*08b48e0bSAndroid Build Coastguard Worker 
261*08b48e0bSAndroid Build Coastguard Worker   SAYF(cGRA "\n>>> ");
262*08b48e0bSAndroid Build Coastguard Worker 
263*08b48e0bSAndroid Build Coastguard Worker   if (idle_cpus) {
264*08b48e0bSAndroid Build Coastguard Worker 
265*08b48e0bSAndroid Build Coastguard Worker     if (maybe_cpus == idle_cpus) {
266*08b48e0bSAndroid Build Coastguard Worker 
267*08b48e0bSAndroid Build Coastguard Worker       SAYF(cLGN "PASS: " cRST "You can run more processes on %u core%s.",
268*08b48e0bSAndroid Build Coastguard Worker            idle_cpus, idle_cpus > 1 ? "s" : "");
269*08b48e0bSAndroid Build Coastguard Worker 
270*08b48e0bSAndroid Build Coastguard Worker     } else {
271*08b48e0bSAndroid Build Coastguard Worker 
272*08b48e0bSAndroid Build Coastguard Worker       SAYF(cLGN "PASS: " cRST "You can run more processes on %u to %u core%s.",
273*08b48e0bSAndroid Build Coastguard Worker            idle_cpus, maybe_cpus, maybe_cpus > 1 ? "s" : "");
274*08b48e0bSAndroid Build Coastguard Worker 
275*08b48e0bSAndroid Build Coastguard Worker     }
276*08b48e0bSAndroid Build Coastguard Worker 
277*08b48e0bSAndroid Build Coastguard Worker     SAYF(cGRA " <<<" cRST "\n\n");
278*08b48e0bSAndroid Build Coastguard Worker     return 0;
279*08b48e0bSAndroid Build Coastguard Worker 
280*08b48e0bSAndroid Build Coastguard Worker   }
281*08b48e0bSAndroid Build Coastguard Worker 
282*08b48e0bSAndroid Build Coastguard Worker   if (maybe_cpus) {
283*08b48e0bSAndroid Build Coastguard Worker 
284*08b48e0bSAndroid Build Coastguard Worker     SAYF(cYEL "CAUTION: " cRST "You may still have %u core%s available.",
285*08b48e0bSAndroid Build Coastguard Worker          maybe_cpus, maybe_cpus > 1 ? "s" : "");
286*08b48e0bSAndroid Build Coastguard Worker     SAYF(cGRA " <<<" cRST "\n\n");
287*08b48e0bSAndroid Build Coastguard Worker     return 1;
288*08b48e0bSAndroid Build Coastguard Worker 
289*08b48e0bSAndroid Build Coastguard Worker   }
290*08b48e0bSAndroid Build Coastguard Worker 
291*08b48e0bSAndroid Build Coastguard Worker   SAYF(cLRD "FAIL: " cRST "All cores are overbooked.");
292*08b48e0bSAndroid Build Coastguard Worker   SAYF(cGRA " <<<" cRST "\n\n");
293*08b48e0bSAndroid Build Coastguard Worker   return 2;
294*08b48e0bSAndroid Build Coastguard Worker 
295*08b48e0bSAndroid Build Coastguard Worker #else
296*08b48e0bSAndroid Build Coastguard Worker 
297*08b48e0bSAndroid Build Coastguard Worker   u32 util_perc;
298*08b48e0bSAndroid Build Coastguard Worker 
299*08b48e0bSAndroid Build Coastguard Worker   SAYF(cCYA "afl-gotcpu" VERSION cRST " by Michal Zalewski\n");
300*08b48e0bSAndroid Build Coastguard Worker 
301*08b48e0bSAndroid Build Coastguard Worker   /* Run a busy loop for CTEST_TARGET_MS. */
302*08b48e0bSAndroid Build Coastguard Worker 
303*08b48e0bSAndroid Build Coastguard Worker   ACTF("Measuring gross preemption rate (this will take %0.02f sec)...",
304*08b48e0bSAndroid Build Coastguard Worker        ((double)CTEST_TARGET_MS) / 1000);
305*08b48e0bSAndroid Build Coastguard Worker 
306*08b48e0bSAndroid Build Coastguard Worker   util_perc = measure_preemption(CTEST_TARGET_MS);
307*08b48e0bSAndroid Build Coastguard Worker 
308*08b48e0bSAndroid Build Coastguard Worker   /* Deliver the final verdict. */
309*08b48e0bSAndroid Build Coastguard Worker 
310*08b48e0bSAndroid Build Coastguard Worker   SAYF(cGRA "\n>>> ");
311*08b48e0bSAndroid Build Coastguard Worker 
312*08b48e0bSAndroid Build Coastguard Worker   if (util_perc < 105) {
313*08b48e0bSAndroid Build Coastguard Worker 
314*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLGN "PASS: " cRST "You can probably run additional processes.");
315*08b48e0bSAndroid Build Coastguard Worker 
316*08b48e0bSAndroid Build Coastguard Worker   } else if (util_perc < 130) {
317*08b48e0bSAndroid Build Coastguard Worker 
318*08b48e0bSAndroid Build Coastguard Worker     SAYF(cYEL "CAUTION: " cRST "Your CPU may be somewhat overbooked (%u%%).",
319*08b48e0bSAndroid Build Coastguard Worker          util_perc);
320*08b48e0bSAndroid Build Coastguard Worker 
321*08b48e0bSAndroid Build Coastguard Worker   } else {
322*08b48e0bSAndroid Build Coastguard Worker 
323*08b48e0bSAndroid Build Coastguard Worker     SAYF(cLRD "FAIL: " cRST "Your CPU is overbooked (%u%%).", util_perc);
324*08b48e0bSAndroid Build Coastguard Worker 
325*08b48e0bSAndroid Build Coastguard Worker   }
326*08b48e0bSAndroid Build Coastguard Worker 
327*08b48e0bSAndroid Build Coastguard Worker   SAYF(cGRA " <<<" cRST "\n\n");
328*08b48e0bSAndroid Build Coastguard Worker 
329*08b48e0bSAndroid Build Coastguard Worker   return (util_perc > 105) + (util_perc > 130);
330*08b48e0bSAndroid Build Coastguard Worker 
331*08b48e0bSAndroid Build Coastguard Worker #endif                                                    /* ^HAVE_AFFINITY */
332*08b48e0bSAndroid Build Coastguard Worker 
333*08b48e0bSAndroid Build Coastguard Worker }
334*08b48e0bSAndroid Build Coastguard Worker 
335