|
@@ -575,6 +575,10 @@ void hif_fw_assert_ramdump_pattern(struct hif_usb_softc *sc)
|
|
|
uint8_t *data;
|
|
|
uint8_t *ram_ptr = NULL;
|
|
|
char *fw_ram_seg_name[FW_RAM_SEG_CNT] = {"DRAM", "IRAM", "AXI"};
|
|
|
+ size_t fw_ram_reg_size[FW_RAM_SEG_CNT] = {
|
|
|
+ FW_RAMDUMP_DRAMSIZE,
|
|
|
+ FW_RAMDUMP_IRAMSIZE,
|
|
|
+ FW_RAMDUMP_AXISIZE };
|
|
|
|
|
|
data = sc->fw_data;
|
|
|
len = sc->fw_data_len;
|
|
@@ -588,7 +592,7 @@ void hif_fw_assert_ramdump_pattern(struct hif_usb_softc *sc)
|
|
|
HIF_ERROR("Firmware %s dump:\n", fw_ram_seg_name[i]);
|
|
|
sc->ramdump[i] =
|
|
|
qdf_mem_malloc(sizeof(struct fw_ramdump) +
|
|
|
- FW_RAMDUMP_SEG_SIZE);
|
|
|
+ fw_ram_reg_size[i]);
|
|
|
if (!sc->ramdump[i]) {
|
|
|
pr_err("Fail to allocate memory for ram dump");
|
|
|
QDF_BUG(0);
|
|
@@ -606,7 +610,12 @@ void hif_fw_assert_ramdump_pattern(struct hif_usb_softc *sc)
|
|
|
reg++;
|
|
|
ram_ptr = (sc->ramdump[i])->mem + (sc->ramdump[i])->length;
|
|
|
(sc->ramdump[i])->length += (len - 8);
|
|
|
- qdf_mem_copy(ram_ptr, (A_UINT8 *) reg, len - 8);
|
|
|
+ if (sc->ramdump[i]->length <= fw_ram_reg_size[i]) {
|
|
|
+ qdf_mem_copy(ram_ptr, (A_UINT8 *) reg, len - 8);
|
|
|
+ } else {
|
|
|
+ HIF_ERROR("memory copy overlap\n");
|
|
|
+ QDF_BUG(0);
|
|
|
+ }
|
|
|
|
|
|
if (pattern == FW_RAMDUMP_END_PATTERN) {
|
|
|
HIF_ERROR("%s memory size = %d\n", fw_ram_seg_name[i],
|