ASoC: SOF: Xtensa: dump ar registers to restore call stack
authorRander Wang <rander.wang@intel.com>
Tue, 19 Sep 2023 09:24:08 +0000 (12:24 +0300)
committerMark Brown <broonie@kernel.org>
Tue, 19 Sep 2023 12:48:44 +0000 (13:48 +0100)
On Xtensa platform ar0 is for caller address and ar1 is for stack
address. The ar register dump can be used to rebuild call stack with
FW elf file by debug tools.

Signed-off-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Link: https://lore.kernel.org/r/20230919092416.4137-2-peter.ujfalusi@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/xtensa/core.c

index bebbe3a2865c45c46ff7412dd71906db4be51b9c..7c91a919eadc764e241db4de1ee348ae7591345f 100644 (file)
@@ -132,6 +132,17 @@ static void xtensa_stack(struct snd_sof_dev *sdev, const char *level, void *oops
                                   buf, sizeof(buf), false);
                dev_printk(level, sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
        }
+
+       if (!xoops->plat_hdr.numaregs)
+               return;
+
+       dev_printk(level, sdev->dev, "AR registers:\n");
+       /* the number of ar registers is a multiple of 4 */
+       for (i = 0; i < xoops->plat_hdr.numaregs; i += 4) {
+               hex_dump_to_buffer(xoops->ar + i, 16, 16, 4,
+                                  buf, sizeof(buf), false);
+               dev_printk(level, sdev->dev, "%#x: %s\n", i * 4, buf);
+       }
 }
 
 const struct dsp_arch_ops sof_xtensa_arch_ops = {