Core.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <sys/arch/regs.h>
  9. #ifndef KERNEL
  10. # include <AK/ByteString.h>
  11. #endif
  12. namespace ELF::Core {
  13. struct [[gnu::packed]] NotesEntryHeader {
  14. enum Type : u8 {
  15. Null = 0, // Terminates segment
  16. ProcessInfo,
  17. ThreadInfo,
  18. MemoryRegionInfo,
  19. Metadata,
  20. };
  21. Type type;
  22. };
  23. struct [[gnu::packed]] NotesEntry {
  24. NotesEntryHeader header;
  25. char data[];
  26. };
  27. struct [[gnu::packed]] ProcessInfo {
  28. NotesEntryHeader header;
  29. // Information is stored as JSON blob to allow arbitrary
  30. // number and length of strings/objects/arrays.
  31. //
  32. // Keys:
  33. // - "pid" (int)
  34. // - "termination_signal" (u8)
  35. // - "executable_path" (ByteString)
  36. // - "arguments" (Vector<ByteString>)
  37. // - "environment" (Vector<ByteString>)
  38. char json_data[]; // Null terminated
  39. };
  40. struct [[gnu::packed]] ThreadInfo {
  41. NotesEntryHeader header;
  42. int tid;
  43. PtraceRegisters regs;
  44. };
  45. struct [[gnu::packed]] MemoryRegionInfo {
  46. NotesEntryHeader header;
  47. uint64_t region_start;
  48. uint64_t region_end;
  49. uint16_t program_header_index;
  50. char region_name[]; // Null terminated
  51. #ifndef KERNEL
  52. ByteString object_name() const
  53. {
  54. StringView memory_region_name { region_name, strlen(region_name) };
  55. if (memory_region_name.contains("Loader.so"sv))
  56. return "Loader.so"sv;
  57. auto maybe_colon_index = memory_region_name.find(':');
  58. if (!maybe_colon_index.has_value())
  59. return {};
  60. return memory_region_name.substring_view(0, *maybe_colon_index).to_byte_string();
  61. }
  62. #endif
  63. };
  64. struct [[gnu::packed]] Metadata {
  65. NotesEntryHeader header;
  66. // Arbitrary metadata, set via SC_set_coredump_metadata.
  67. // Limited to 16 entries and 16 KiB keys/values by the kernel.
  68. //
  69. // Well-known keys:
  70. // - "assertion": Used by LibC's __assertion_failed() to store assertion info
  71. // - "pledge_violation": Used by the Kernel's require_promise() to store pledge violation info
  72. char json_data[]; // Null terminated
  73. };
  74. }