// Added and adapted from: https://android.googlesource.com/platform/system/core/+/refs/heads/main/debuggerd/proto/tombstone.proto
// Sentry changes:
// * change the java_package
//
// Copyright (C) 2020 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.
//
// Protobuf definition for Android tombstones.
//
// An app can get hold of these for any `REASON_CRASH_NATIVE` instance of
// `android.app.ApplicationExitInfo`.
//
// https://developer.android.com/reference/android/app/ApplicationExitInfo#getTraceInputStream()
//
syntax = "proto3";
option java_package = "io.sentry.android.core.internal.tombstone";
option java_outer_classname = "TombstoneProtos";
// NOTE TO OEMS:
// If you add custom fields to this proto, do not use numbers in the reserved range.
// NOTE TO CONSUMERS:
// With proto3 -- unlike proto2 -- HasValue is unreliable for any field
// where the default value for that type is also a valid value for the field.
// This means, for example, that a boolean that is false or an integer that
// is zero will appear to be missing --- but because they're not actually
// marked as `optional` in this schema, consumers should just use values
// without first checking whether or not they're "present".
// https://protobuf.dev/programming-guides/proto3/#default
message CrashDetail {
  bytes name = 1;
  bytes data = 2;
  reserved 3 to 999;
}
message StackHistoryBufferEntry {
  BacktraceFrame addr = 1;
  uint64 fp = 2;
  uint64 tag = 3;
  reserved 4 to 999;
}
message StackHistoryBuffer {
  uint64 tid = 1;
  repeated StackHistoryBufferEntry entries = 2;
  reserved 3 to 999;
}
message Tombstone {
  Architecture arch = 1;
  Architecture guest_arch = 24;
  string build_fingerprint = 2;
  string revision = 3;
  string timestamp = 4;
  uint32 pid = 5;
  uint32 tid = 6;
  uint32 uid = 7;
  string selinux_label = 8;
  repeated string command_line = 9;
  // Process uptime in seconds.
  uint32 process_uptime = 20;
  Signal signal_info = 10;
  string abort_message = 14;
  repeated CrashDetail crash_details = 21;
  repeated Cause causes = 15;
  map<uint32, Thread> threads = 16;
  map<uint32, Thread> guest_threads = 25;
  repeated MemoryMapping memory_mappings = 17;
  repeated LogBuffer log_buffers = 18;
  repeated FD open_fds = 19;
  uint32 page_size = 22;
  bool has_been_16kb_mode = 23;
  StackHistoryBuffer stack_history_buffer = 26;
  reserved 27 to 999;
}
enum Architecture {
  ARM32 = 0;
  ARM64 = 1;
  X86 = 2;
  X86_64 = 3;
  RISCV64 = 4;
  NONE = 5;
  reserved 6 to 999;
}
message Signal {
  int32 number = 1;
  string name = 2;
  int32 code = 3;
  string code_name = 4;
  bool has_sender = 5;
  int32 sender_uid = 6;
  int32 sender_pid = 7;
  bool has_fault_address = 8;
  uint64 fault_address = 9;
  // Note, may or may not contain the dump of the actual memory contents. Currently, on arm64, we
  // only include metadata, and not the contents.
  MemoryDump fault_adjacent_metadata = 10;
  reserved 11 to 999;
}
message HeapObject {
  uint64 address = 1;
  uint64 size = 2;
  uint64 allocation_tid = 3;
  repeated BacktraceFrame allocation_backtrace = 4;
  uint64 deallocation_tid = 5;
  repeated BacktraceFrame deallocation_backtrace = 6;
}
message MemoryError {
  enum Tool {
    GWP_ASAN = 0;
    SCUDO = 1;
    reserved 2 to 999;
  }
  Tool tool = 1;
  enum Type {
    UNKNOWN = 0;
    USE_AFTER_FREE = 1;
    DOUBLE_FREE = 2;
    INVALID_FREE = 3;
    BUFFER_OVERFLOW = 4;
    BUFFER_UNDERFLOW = 5;
    reserved 6 to 999;
  }
  Type type = 2;
  oneof location {
    HeapObject heap = 3;
  }
  reserved 4 to 999;
}
message Cause {
  string human_readable = 1;
  oneof details {
    MemoryError memory_error = 2;
  }
  reserved 3 to 999;
}
message Register {
  string name = 1;
  uint64 u64 = 2;
  reserved 3 to 999;
}
message Thread {
  int32 id = 1;
  string name = 2;
  repeated Register registers = 3;
  repeated string backtrace_note = 7;
  repeated string unreadable_elf_files = 9;
  repeated BacktraceFrame current_backtrace = 4;
  repeated MemoryDump memory_dump = 5;
  int64 tagged_addr_ctrl = 6;
  int64 pac_enabled_keys = 8;
  reserved 10 to 999;
}
message BacktraceFrame {
  uint64 rel_pc = 1;
  uint64 pc = 2;
  uint64 sp = 3;
  string function_name = 4;
  uint64 function_offset = 5;
  string file_name = 6;
  uint64 file_map_offset = 7;
  string build_id = 8;
  reserved 9 to 999;
}
message ArmMTEMetadata {
  // One memory tag per granule (e.g. every 16 bytes) of regular memory.
  bytes memory_tags = 1;
  reserved 2 to 999;
}
message MemoryDump {
  string register_name = 1;
  string mapping_name = 2;
  uint64 begin_address = 3;
  bytes memory = 4;
  oneof metadata {
    ArmMTEMetadata arm_mte_metadata = 6;
  }
  reserved 5, 7 to 999;
}
message MemoryMapping {
  uint64 begin_address = 1;
  uint64 end_address = 2;
  uint64 offset = 3;
  bool read = 4;
  bool write = 5;
  bool execute = 6;
  string mapping_name = 7;
  string build_id = 8;
  uint64 load_bias = 9;
  reserved 10 to 999;
}
message FD {
  int32 fd = 1;
  string path = 2;
  string owner = 3;
  uint64 tag = 4;
  reserved 5 to 999;
}
message LogBuffer {
  string name = 1;
  repeated LogMessage logs = 2;
  reserved 3 to 999;
}
message LogMessage {
  string timestamp = 1;
  uint32 pid = 2;
  uint32 tid = 3;
  uint32 priority = 4;
  string tag = 5;
  string message = 6;
  reserved 7 to 999;
}
