diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index c51bddde6bd2c2ffc98451da943131bbdaf6f3f1..ad4727c1518c37ca3e46482404b538b7dfed9f9d 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c @@ -44,6 +44,7 @@ struct tracectx { unsigned long range_end; unsigned long data_range_start; unsigned long data_range_end; + bool dump_initial_etb; struct device *dev; struct clk *emu_clk; struct mutex mutex; @@ -105,6 +106,7 @@ static int trace_start(struct tracectx *t) etb_unlock(t); + t->dump_initial_etb = false; etb_writel(t, 0, ETBR_WRITEADDR); etb_writel(t, 0, ETBR_FORMATTERCTRL); etb_writel(t, 1, ETBR_CTRL); @@ -311,6 +313,8 @@ static ssize_t etb_read(struct file *file, char __user *data, etb_unlock(t); total = etb_getdatalen(t); + if (total == 0 && t->dump_initial_etb) + total = t->etb_bufsz; if (total == t->etb_bufsz) first = etb_readl(t, ETBR_WRITEADDR); @@ -384,6 +388,7 @@ static int __init etb_probe(struct amba_device *dev, struct amba_id *id) goto out_release; } + t->dump_initial_etb = true; amba_set_drvdata(dev, t); etb_unlock(t);