// 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_