lkml.org 
[lkml]   [2012]   [Jun]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/15] ARM: etm: Allow range selection
    Date
    From: Arve Hjønnevåg <arve@android.com>

    Trace kernel text segment by default as before, allow tracing of other
    ranges by writing a range to /sys/devices/etm/trace_range, or to trace
    everything by writing 0 0.

    CC: Russell King <linux@arm.linux.org.uk>
    CC: Paul Gortmaker <paul.gortmaker@windriver.com>
    CC: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    CC: Mathieu Poirier <mathieu.poirier@linaro.org>

    Acked-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Signed-off-by: Arve Hjønnevåg <arve@android.com>
    Signed-off-by: John Stultz <john.stultz@linaro.org>
    ---
    arch/arm/kernel/etm.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
    1 files changed, 46 insertions(+), 3 deletions(-)

    diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c
    index a51bccc..bf34d34 100644
    --- a/arch/arm/kernel/etm.c
    +++ b/arch/arm/kernel/etm.c
    @@ -41,12 +41,17 @@ struct tracectx {
    unsigned long flags;
    int ncmppairs;
    int etm_portsz;
    + unsigned long range_start;
    + unsigned long range_end;
    struct device *dev;
    struct clk *emu_clk;
    struct mutex mutex;
    };

    -static struct tracectx tracer;
    +static struct tracectx tracer = {
    + .range_start = (unsigned long)_stext,
    + .range_end = (unsigned long)_etext,
    +};

    static inline bool trace_isrunning(struct tracectx *t)
    {
    @@ -116,8 +121,12 @@ static int trace_start(struct tracectx *t)
    return -EFAULT;
    }

    - etm_setup_address_range(t, 1, (unsigned long)_stext,
    - (unsigned long)_etext, 0, 0);
    + if (t->range_start || t->range_end)
    + etm_setup_address_range(t, 1,
    + t->range_start, t->range_end, 0, 0);
    + else
    + etm_writel(t, ETMTE_INCLEXCL, ETMR_TRACEENCTRL);
    +
    etm_writel(t, 0, ETMR_TRACEENCTRL2);
    etm_writel(t, 0, ETMR_TRACESSCTRL);
    etm_writel(t, 0x6f, ETMR_TRACEENEVT);
    @@ -526,6 +535,35 @@ static ssize_t trace_mode_store(struct kobject *kobj,
    static struct kobj_attribute trace_mode_attr =
    __ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);

    +static ssize_t trace_range_show(struct kobject *kobj,
    + struct kobj_attribute *attr,
    + char *buf)
    +{
    + return sprintf(buf, "%08lx %08lx\n",
    + tracer.range_start, tracer.range_end);
    +}
    +
    +static ssize_t trace_range_store(struct kobject *kobj,
    + struct kobj_attribute *attr,
    + const char *buf, size_t n)
    +{
    + unsigned long range_start, range_end;
    +
    + if (sscanf(buf, "%lx %lx", &range_start, &range_end) != 2)
    + return -EINVAL;
    +
    + mutex_lock(&tracer.mutex);
    + tracer.range_start = range_start;
    + tracer.range_end = range_end;
    + mutex_unlock(&tracer.mutex);
    +
    + return n;
    +}
    +
    +
    +static struct kobj_attribute trace_range_attr =
    + __ATTR(trace_range, 0644, trace_range_show, trace_range_store);
    +
    static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id)
    {
    struct tracectx *t = &tracer;
    @@ -577,6 +615,10 @@ static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id
    if (ret)
    dev_dbg(&dev->dev, "Failed to create trace_mode in sysfs\n");

    + ret = sysfs_create_file(&dev->dev.kobj, &trace_range_attr.attr);
    + if (ret)
    + dev_dbg(&dev->dev, "Failed to create trace_range in sysfs\n");
    +
    dev_dbg(t->dev, "ETM AMBA driver initialized.\n");

    out:
    @@ -606,6 +648,7 @@ static int etm_remove(struct amba_device *dev)
    sysfs_remove_file(&dev->dev.kobj, &trace_running_attr.attr);
    sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr);
    sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr);
    + sysfs_remove_file(&dev->dev.kobj, &trace_range_attr.attr);

    return 0;
    }
    --
    1.7.3.2.146.gca209
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-06-13 06:21    [W:0.028 / U:121.916 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site