blob: 48e0640a1b6dbcd3f3d27671687620b28cac8a98 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.fuzzer;
using zx;
/// Details about an instrumented process.
///
/// See also:
///
/// * https://fuchsia.dev/fuchsia-src/reference/syscalls/object_get_info#zx_info_task_stats
/// * https://fuchsia.dev/fuchsia-src/reference/syscalls/object_get_info#zx_info_task_runtime
type ProcessStats = struct {
/// The kernel object identifier of the task.
koid uint64;
/// The total size of mapped memory ranges in this process.
mem_mapped_bytes uint64;
/// Committed memory that is only mapped into this process.
mem_private_bytes uint64;
/// Committed memory that is mapped into this and at least one other
/// process.
mem_shared_bytes uint64;
/// Estimate of how much of |mem_shared_bytes| that this process owns.
mem_scaled_shared_bytes uint64;
/// The total amount of time this process was running on a CPU and not
/// blocked.
cpu_time zx.Duration;
/// The total amount of time this process was ready but not actually using a
/// CPU.
queue_time zx.Duration;
/// The total amount of time this process spent handling page faults.
page_fault_time zx.Duration;
/// The total amount of time this process spent waiting on contended kernel
/// locks.
lock_contention_time zx.Duration;
};
/// See `Controller.Monitor`. Used to indicate why an update was sent.
type UpdateReason = flexible enum : uint8 {
/// Represents an otherwise unspecified update. Useful when integrating
/// other engines as runners, e.g. libFuzzer.
MISC = 1;
/// A fuzzing action is starting. See, e.g. `Controller.Fuzz`,
/// `Controller.Merge`, etc.
INIT = 2;
/// An input produced new feedback.
NEW = 3;
/// Periodic status update, configured with `Options.pulse_interval`.
PULSE = 4;
/// A shorter input for some particular feedback has been found.
REDUCE = 5;
/// A fuzzing action is complete.
DONE = 6;
};
/// The maximum number of processes for which stats will be returned via
/// `Status`.
const MAX_PROCESS_STATS uint16 = 256;
/// See `Controller.GetStatus`.
//
// TODO(https://fxbug.dev/42074956): Include workflow enum.
type Status = table {
/// True if the fuzzer is working on a commands, e.g. it is fuzzing.
1: running bool;
/// Number of runs performed so far.
2: runs uint32;
/// Time spent so far.
3: elapsed zx.Duration;
/// Number of program edges covered so far.
4: covered_pcs uint64;
/// Number of opaque features encountered so far.
5: covered_features uint64;
/// Number of inputs in the "live" corpus.
6: corpus_num_inputs uint64;
/// Total size of the inputs in the "live" corpus.
7: corpus_total_size uint64;
/// Information about the instrumented processes attached to the engine.
8: process_stats vector<ProcessStats>:MAX_PROCESS_STATS;
};
/// See `Status`. This protocol is used to push status from the `Controller` to
/// callers.
closed protocol Monitor {
/// Sends the current status.
///
/// + request `reason` the cause of a status change.
/// + status `status` the reported fuzzing metrics.
strict Update(struct {
reason UpdateReason;
status Status;
}) -> ();
};