blob: b6ed8b70f94c5e0f7da065e20ead128ff09fda68 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SRC_TRACE_PROCESSOR_SYSCALL_TRACKER_H_
#define SRC_TRACE_PROCESSOR_SYSCALL_TRACKER_H_
#include <tuple>
#include "perfetto/base/string_view.h"
#include "src/trace_processor/trace_processor_context.h"
#include "src/trace_processor/trace_storage.h"
namespace perfetto {
namespace trace_processor {
// Maximum syscall number known.
static constexpr size_t kSyscallCount = 330;
enum Architecture {
kUnknown = 0,
kAarch64,
kX86_64,
};
class SyscallTracker {
public:
explicit SyscallTracker(TraceProcessorContext*);
SyscallTracker(const SyscallTracker&) = delete;
SyscallTracker& operator=(const SyscallTracker&) = delete;
virtual ~SyscallTracker();
void SetArchitecture(Architecture architecture);
void Enter(int64_t ts, UniqueTid utid, uint32_t syscall_num);
void Exit(int64_t ts, UniqueTid utid, uint32_t syscall_num);
private:
TraceProcessorContext* const context_;
inline StringId SyscallNumberToStringId(uint32_t syscall) {
if (syscall > kSyscallCount)
return 0;
// We see two write sys calls around each userspace slice that is going via
// trace_marker, this violates the assumption that userspace slices are
// perfectly nested. For the moment ignore all write sys calls.
// TODO(hjd): Remove this limitation.
StringId id = arch_syscall_to_string_id_[syscall];
if (id == sys_write_string_id_)
return 0;
return id;
}
// This is table from platform specific syscall number directly to
// the relevent StringId (this avoids having to always do two conversions).
std::array<StringId, kSyscallCount> arch_syscall_to_string_id_;
StringId sys_write_string_id_;
};
} // namespace trace_processor
} // namespace perfetto
#endif // SRC_TRACE_PROCESSOR_SYSCALL_TRACKER_H_