// Copyright 2021 The Pigweed Authors // // 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 // // https://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. syntax = "proto3"; package pw.snapshot; option java_package = "pw.snapshot.proto"; option java_outer_classname = "Snapshot"; import "pw_chrono_protos/chrono.proto"; import "pw_cpu_exception_cortex_m_protos/cpu_state.proto"; import "pw_log/proto/log.proto"; import "pw_thread_protos/thread.proto"; import "pw_snapshot_metadata_proto/snapshot_metadata.proto"; // The Snapshot proto is a list that dictates field numbers that should // be used when serializing proto messages into a "Snapshot" that can be // ingested by Pigweed's upstream tooling. // // There are various field number ranges that are marked for "upstream" use, // and others that are marked for "pigweed users". This allows a user to // define a parallel proto that defines product-specific messages using mutually // exclusive field numbers: // // MySnapshot { // // Use a project-specific logging proto format. // repeated MyLogFormat = 8; // // // Pigweed's snapshot doesn't support my custom RTOS, so write that to // // a field number reserved for downstream projects. // MyCustomRtosInfo = 22; // } // // Writing both proto messages to the same proto encoder is valid because the // field nubmers are mutually exclusive. This prevents collisions that would // break a proto decode. The final message will have to be decoded twice; once // as a pw.snapshot.Snapshot and once as the project-specific message. message Snapshot { repeated pw.log.LogEntry logs = 1; // RESERVED FOR PIGWEED. These field numbers are reserved strictly for things // that are very generally useful and high in count. Downstream projects may // NOT write to these fields. // Encodes to a single byte of tag overhead. reserved 2 to 7; // RESERVED FOR USERS. These field numbers should be used for writing // project-specific proto messages that repeat in high quantity to reduce // proto encoding overhead. Pigweed must not write to these fields. // Encodes to a single byte of tag overhead. reserved 8 to 15; // Note: Proto tags 16-2047 encode with two bytes of overhead. Metadata metadata = 16; // Other data that should be highlighted in this crash. This field may have // entries added to it during a decode. map tags = 17; repeated pw.thread.proto.Thread threads = 18; // If a device has multiple cores, it may be useful to collect an associated // snapshot for attached cores when a snapshot collection is triggered on one // core. By embedding one or more snapshots into a snapshot, the snapshots are // considered associated. repeated Snapshot related_snapshots = 19; pw.cpu_exception.cortex_m.ArmV7mCpuState armv7m_cpu_state = 20; // Platform-specific binary trace data region. Binary trace data is using // pw_trace_tokenized buffer format for stored data. bytes trace_data = 21; // Timestamps that mark when this snapshot occurred. This field is repeated // to accommodate wall-clock time, time since boot, and/or the raw system // clock value. repeated pw.chrono.TimePoint timestamps = 22; // RESERVED FOR PIGWEED. Downstream projects may NOT write to these fields. // Encodes to two bytes of tag overhead. reserved 23 to 1031; // RESERVED FOR USERS. Encodes to two or more bytes of tag overhead. reserved 1032 to max; }