mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 03:27:03 +02:00
soc: qcom: Minidump support for VMs
Add minidump support for VMs. RM call is used to manage regions of VMs. Change-Id: I85a21223e13f2a8477919858aebaca8b11b5faeb Signed-off-by: Cong Zhang <quic_congzhan@quicinc.com>
This commit is contained in:
parent
75dda42eb8
commit
accaa1e653
|
|
@ -567,7 +567,7 @@ config QCOM_HUNG_TASK_ENH
|
|||
|
||||
config QCOM_MINIDUMP
|
||||
tristate "QCOM Minidump Support"
|
||||
depends on QCOM_SMEM
|
||||
depends on QCOM_SMEM || ARCH_QTI_VM
|
||||
help
|
||||
This enables minidump feature. It allows various clients to
|
||||
register to dump their state at system bad state (panic/WDT,etc.,).
|
||||
|
|
|
|||
|
|
@ -284,19 +284,19 @@ bool md_register_memory_dump(int size, char *name)
|
|||
bool md_unregister_memory_dump(char *name)
|
||||
{
|
||||
struct page *page;
|
||||
struct md_region *mdr;
|
||||
struct md_region mdr;
|
||||
struct md_region md_entry;
|
||||
|
||||
mdr = md_get_region(name);
|
||||
if (!mdr) {
|
||||
if (!mdr.virt_addr) {
|
||||
pr_err("minidump entry for %s not found\n", name);
|
||||
return false;
|
||||
}
|
||||
strscpy(md_entry.name, mdr->name, sizeof(md_entry.name));
|
||||
md_entry.virt_addr = mdr->virt_addr;
|
||||
md_entry.phys_addr = mdr->phys_addr;
|
||||
md_entry.size = mdr->size;
|
||||
page = virt_to_page(mdr->virt_addr);
|
||||
strscpy(md_entry.name, mdr.name, sizeof(md_entry.name));
|
||||
md_entry.virt_addr = mdr.virt_addr;
|
||||
md_entry.phys_addr = mdr.phys_addr;
|
||||
md_entry.size = mdr.size;
|
||||
page = virt_to_page(mdr.virt_addr);
|
||||
|
||||
if (msm_minidump_remove_region(&md_entry) < 0)
|
||||
return false;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -8,6 +8,14 @@
|
|||
#define __MINIDUMP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
enum minidump_entry_cmd {
|
||||
MINIDUMP_ADD,
|
||||
MINIDUMP_REMOVE,
|
||||
MINIDUMP_UPDATE,
|
||||
MINIDUMP_NO_CMD
|
||||
};
|
||||
|
||||
#define MAX_NAME_LENGTH 12
|
||||
/* md_region - Minidump table entry
|
||||
|
|
@ -27,8 +35,19 @@ struct md_region {
|
|||
};
|
||||
|
||||
struct md_pending_region {
|
||||
struct list_head list;
|
||||
struct md_region entry;
|
||||
struct list_head list;
|
||||
struct md_region entry;
|
||||
};
|
||||
|
||||
struct md_rm_region {
|
||||
char name[MAX_NAME_LENGTH];
|
||||
u32 slot_num;
|
||||
};
|
||||
|
||||
struct md_rm_request {
|
||||
struct md_region entry;
|
||||
struct work_struct work;
|
||||
enum minidump_entry_cmd work_cmd;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -49,7 +68,7 @@ extern int msm_minidump_remove_region(const struct md_region *entry);
|
|||
*/
|
||||
extern int msm_minidump_update_region(int regno, const struct md_region *entry);
|
||||
extern bool msm_minidump_enabled(void);
|
||||
extern struct md_region *md_get_region(char *name);
|
||||
extern struct md_region md_get_region(char *name);
|
||||
extern void dump_stack_minidump(u64 sp);
|
||||
extern int msm_minidump_get_available_region(void);
|
||||
#else
|
||||
|
|
@ -63,7 +82,11 @@ static inline int msm_minidump_remove_region(const struct md_region *entry)
|
|||
return 0;
|
||||
}
|
||||
static inline bool msm_minidump_enabled(void) { return false; }
|
||||
static inline struct md_region *md_get_region(char *name) { return NULL; }
|
||||
static inline struct md_region md_get_region(char *name)
|
||||
{
|
||||
struct md_region mdr = {0};
|
||||
return mdr;
|
||||
}
|
||||
static inline void dump_stack_minidump(u64 sp) {}
|
||||
static inline void add_trace_event(char *buf, size_t size) {}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user