// Copyright 2022 The Fuchsia 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 SRC_LIB_ZXDUMP_CORE_H_
#define SRC_LIB_ZXDUMP_CORE_H_

#include <lib/elfldltl/layout.h>

#include <string_view>

namespace zxdump {

// Zircon core dumps are always in the 64-bit little-endian ELF format.
using Elf = elfldltl::Elf64<elfldltl::ElfData::k2Lsb>;

// Minimum size of an ELF file.
inline constexpr size_t kMinimumElf = sizeof(Elf::Ehdr);

// Note headers, names, and descriptions are aligned in the file.
// The alignment padding is not included in n_namesz or n_descsz.
// Note n_namesz does include the mandatory NUL terminator.
inline constexpr uint32_t NoteAlign(size_t note_size = 1) {
  return Elf::Nhdr::Align(static_cast<uint32_t>(note_size));
}

// These note names in an ET_CORE file give data about a process.
//
// The n_type field contains the ZX_INFO_* or ZX_PROP_* value and the contents
// of the note are exactly as returned by get_info / get_property.
inline constexpr std::string_view kProcessInfoNoteName{"ZirconProcessInfo"};
inline constexpr std::string_view kProcessPropertyNoteName{"ZirconProcessProperty"};

// Many threads appear in the same ET_CORE file for one process.  These note
// names give information about each thread, and appear after all the process
// notes: first all the notes for one thread; then all the notes for the next
// thread; and so on.  The first note for each thread is ZX_INFO_HANDLE_BASIC,
// so that can be used to partition a run of thread notes in a core file into
// the set of notes for each separate thread.
//
// These are get_info / get_property for threads, as for processes above.
inline constexpr std::string_view kThreadInfoNoteName{"ZirconThreadInfo"};
inline constexpr std::string_view kThreadPropertyNoteName{"ZirconThreadProperty"};

// The n_type field contains the zx_thread_state_topic_t value and the contents
// of the note are exactly as returned by read_state.
inline constexpr std::string_view kThreadStateNoteName{"ZirconThreadState"};

// The n_type field is always zero.  The contents is a time_t value, i.e.
// 64-bit count of seconds since 1970-1-1T0:00 UTC.  (A note holding 0 claims
// to be a dump made in 1970; to elide the dump date, the note should be
// omitted entirely.)
inline constexpr std::string_view kDateNoteName{"ZirconDumpDate"};

// The contents are JSON, schema based on zx::system methods.
inline constexpr std::string_view kSystemNoteName{"ZirconSystem.json"};

// The n_type field contains the zx_thread_state_topic_t value and the contents
// of the note are exactly as returned by get_info.  This is used for the
// system-wide info types that are fetched via privileged resource handles.
// In job archives, this prefix is followed by "." and the topic in decimal.
inline constexpr std::string_view kKernelInfoNoteName{"ZirconKernelInfo"};

// The suffix is something arbitrary but nonempty that indicates the format and
// meaning of the contents.  By convention, it ends in ".json" or ".txt" if the
// contents are UTF-8 JSON text or arbitrary UTF-8 text, respectively.
inline constexpr std::string_view kRemarkNotePrefix{"ZirconDump."};

}  // namespace zxdump

#endif  // SRC_LIB_ZXDUMP_CORE_H_
