minidump.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef __MINIDUMP_H
  7. #define __MINIDUMP_H
  8. #include <linux/types.h>
  9. #include <linux/workqueue.h>
  10. enum minidump_entry_cmd {
  11. MINIDUMP_ADD,
  12. MINIDUMP_REMOVE,
  13. MINIDUMP_UPDATE,
  14. MINIDUMP_NO_CMD
  15. };
  16. #if IS_ENABLED(CONFIG_ARCH_QTI_VM)
  17. #define MAX_NAME_LENGTH 9
  18. #else
  19. #define MAX_NAME_LENGTH 12
  20. #endif
  21. /* md_region - Minidump table entry
  22. * @name: Entry name, Minidump will dump binary with this name.
  23. * @id: Entry ID, used only for SDI dumps.
  24. * @virt_addr: Address of the entry.
  25. * @phys_addr: Physical address of the entry to dump.
  26. * @size: Number of byte to dump from @address location
  27. * it should be 4 byte aligned.
  28. */
  29. struct md_region {
  30. char name[MAX_NAME_LENGTH + 1];
  31. u32 id;
  32. u64 virt_addr;
  33. u64 phys_addr;
  34. u64 size;
  35. };
  36. struct md_pending_region {
  37. struct list_head list;
  38. struct md_region entry;
  39. };
  40. struct md_rm_request {
  41. struct md_region entry;
  42. struct work_struct work;
  43. enum minidump_entry_cmd work_cmd;
  44. };
  45. /*
  46. * Register an entry in Minidump table
  47. * Returns:
  48. * region number: entry position in minidump table.
  49. * Negative error number on failures.
  50. */
  51. #if IS_ENABLED(CONFIG_QCOM_MINIDUMP)
  52. extern int msm_minidump_add_region(const struct md_region *entry);
  53. extern int msm_minidump_remove_region(const struct md_region *entry);
  54. /*
  55. * Update registered region address in Minidump table.
  56. * It does not hold any locks, so strictly serialize the region updates.
  57. * Returns:
  58. * Zero: on successfully update
  59. * Negetive error number on failures.
  60. */
  61. extern int msm_minidump_update_region(int regno, const struct md_region *entry);
  62. extern bool msm_minidump_enabled(void);
  63. extern struct md_region md_get_region(char *name);
  64. extern void dump_stack_minidump(u64 sp);
  65. extern int msm_minidump_get_available_region(void);
  66. #else
  67. static inline int msm_minidump_add_region(const struct md_region *entry)
  68. {
  69. /* Return quietly, if minidump is not supported */
  70. return 0;
  71. }
  72. static inline int msm_minidump_remove_region(const struct md_region *entry)
  73. {
  74. return 0;
  75. }
  76. static inline bool msm_minidump_enabled(void) { return false; }
  77. static inline struct md_region md_get_region(char *name)
  78. {
  79. struct md_region mdr = {0};
  80. return mdr;
  81. }
  82. static inline void dump_stack_minidump(u64 sp) {}
  83. static inline void add_trace_event(char *buf, size_t size) {}
  84. #endif
  85. #if IS_ENABLED(CONFIG_QCOM_MINIDUMP_PANIC_DUMP)
  86. extern void md_dump_process(void);
  87. #else
  88. static inline void md_dump_process(void) {}
  89. #endif
  90. #define MAX_OWNER_STRING 32
  91. struct va_md_entry {
  92. unsigned long vaddr;
  93. unsigned char owner[MAX_OWNER_STRING];
  94. unsigned int size;
  95. void (*cb)(void *dst, unsigned long size);
  96. };
  97. #if IS_ENABLED(CONFIG_QCOM_VA_MINIDUMP)
  98. extern bool qcom_va_md_enabled(void);
  99. extern int qcom_va_md_register(const char *name, struct notifier_block *nb);
  100. extern int qcom_va_md_unregister(const char *name, struct notifier_block *nb);
  101. extern int qcom_va_md_add_region(struct va_md_entry *entry);
  102. #else
  103. static inline bool qcom_va_md_enabled(void) { return false; }
  104. static inline int qcom_va_md_register(const char *name, struct notifier_block *nb)
  105. {
  106. return -ENODEV;
  107. }
  108. static inline int qcom_va_md_unregister(const char *name, struct notifier_block *nb)
  109. {
  110. return -ENODEV;
  111. }
  112. static inline int qcom_va_md_add_region(struct va_md_entry *entry)
  113. {
  114. return -ENODEV;
  115. }
  116. #endif
  117. #endif