qcacmn: Add checks in qdf_minidump_log

Add a check in qdf_minidump_log() and qdf_mindump_remove() so that
log types that are not allowed for minidump are not added to the minidump
table  and also are not requested to be removed when they are not in the
minidump.

Change-Id: Id4cfdc0de1fc9baf40ae89ad5d3b3f9543df2805
CRs-Fixed: 3171812
这个提交包含在:
Alan Chen
2022-04-08 12:41:53 -07:00
提交者 Madan Koyyalamudi
父节点 a8a385329d
当前提交 65dd63b576

查看文件

@@ -486,13 +486,50 @@ __qdf_minidump_remove(void *addr, size_t size, const char *name)
minidump_remove_segments((const uintptr_t)addr);
}
#elif defined(WLAN_QCOM_MINIDUMP)
#define MAX_WLAN_MINIDUMP_ENTRIES 4
enum minidump_log_type {
MD_HTC_CREDIT = 0,
MD_WLAN_LOGS,
MD_WMI_TX_CMP,
MD_HAL_SOC,
};
static const char *minidump_table[MAX_WLAN_MINIDUMP_ENTRIES];
static int qdf_get_name_idx(const char *name)
{
int i;
static const char * const wlan_str[] = {
[MD_HTC_CREDIT] = "htc_credit",
[MD_WLAN_LOGS] = "wlan_logs",
[MD_WMI_TX_CMP] = "wmi_tx_cmp",
[MD_HAL_SOC] = "hal_soc"
};
for (i = 0; i < ARRAY_SIZE(wlan_str); i++) {
if (strncmp(name, wlan_str[i], strlen(wlan_str[i])) == 0)
return i;
}
return -EINVAL;
}
static inline void
__qdf_minidump_log(void *start_addr, const size_t size,
const char *name)
{
struct md_region md_entry;
int ret;
int ret, index;
index = qdf_get_name_idx(name);
if (index < 0) {
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF,
"%s: invalid entry %s\n",
__func__, name);
QDF_DEBUG_PANIC("Unknown minidump entry");
return;
}
snprintf(md_entry.name, sizeof(md_entry.name), name);
md_entry.virt_addr = (uintptr_t)start_addr;
md_entry.phys_addr = virt_to_phys(start_addr);
@@ -502,6 +539,9 @@ __qdf_minidump_log(void *start_addr, const size_t size,
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF,
"%s: failed to log %pK (%s)\n",
__func__, start_addr, name);
minidump_table[index] = NULL;
} else {
minidump_table[index] = name;
}
}
@@ -510,12 +550,21 @@ __qdf_minidump_remove(void *start_addr, const size_t size,
const char *name)
{
struct md_region md_entry;
int index;
index = qdf_get_name_idx(name);
if (index < 0 || !minidump_table[index]) {
QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF,
"%s: entry was not added",
__func__);
return;
}
snprintf(md_entry.name, sizeof(md_entry.name), name);
md_entry.virt_addr = (uintptr_t)start_addr;
md_entry.phys_addr = virt_to_phys(start_addr);
md_entry.size = size;
msm_minidump_remove_region(&md_entry);
minidump_table[qdf_get_name_idx(name)] = NULL;
}
#else
static inline void