// Copyright 2015 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROMIUMOS_WIDE_PROFILING_SAMPLE_INFO_READER_H_ #define CHROMIUMOS_WIDE_PROFILING_SAMPLE_INFO_READER_H_ #include <stdint.h> #include "kernel/perf_event.h" namespace quipper { // Forward declarations of structures. union perf_event; typedef perf_event event_t; struct perf_sample; class SampleInfoReader { public: SampleInfoReader(struct perf_event_attr event_attr, bool read_cross_endian) : event_attr_(event_attr), read_cross_endian_(read_cross_endian) {} bool ReadPerfSampleInfo(const event_t& event, struct perf_sample* sample) const; bool WritePerfSampleInfo(const perf_sample& sample, event_t* event) const; // Given a general perf sample format |sample_type|, return the fields of that // format that are present in a sample for an event of type |event_type|. // // e.g. FORK and EXIT events have the fields {time, pid/tid, cpu, id}. // Given a sample type with fields {ip, time, pid/tid, and period}, return // the intersection of these two field sets: {time, pid/tid}. // // All field formats are bitfields, as defined by enum // perf_event_sample_format in kernel/perf_event.h. static uint64_t GetSampleFieldsForEventType(uint32_t event_type, uint64_t sample_type); // Returns the offset in bytes within a perf event structure at which the raw // perf sample data is located. static uint64_t GetPerfSampleDataOffset(const event_t& event); const perf_event_attr& event_attr() const { return event_attr_; } private: // Event attribute info, which determines the contents of some perf_sample // data. struct perf_event_attr event_attr_; // Set this flag if values (uint32s and uint64s) should be endian-swapped // during reads. bool read_cross_endian_; }; } // namespace quipper #endif // CHROMIUMOS_WIDE_PROFILING_SAMPLE_INFO_READER_H_