Skip to content

Commit 7d2266e

Browse files
coresight: etm4x: implementing user/kernel mode tracing
Adding new mode to limit tracing to kernel or user space. Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 4f6fce54528e0382281cf199635d098e4b108357)
1 parent 2c25a4e commit 7d2266e

3 files changed

Lines changed: 42 additions & 1 deletion

File tree

drivers/hwtracing/coresight/coresight-etm4x-sysfs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ static ssize_t mode_store(struct device *dev,
440440
else
441441
config->vinst_ctrl &= ~BIT(11);
442442

443+
if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
444+
etm4_config_trace_mode(config);
445+
443446
spin_unlock(&drvdata->spinlock);
444447

445448
return size;

drivers/hwtracing/coresight/coresight-etm4x.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,41 @@ static void etm4_set_default(struct etmv4_config *config)
566566
config->vissctlr = 0x0;
567567
}
568568

569+
void etm4_config_trace_mode(struct etmv4_config *config)
570+
{
571+
u32 addr_acc, mode;
572+
573+
mode = config->mode;
574+
mode &= (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER);
575+
576+
/* excluding kernel AND user space doesn't make sense */
577+
WARN_ON_ONCE(mode == (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER));
578+
579+
/* nothing to do if neither flags are set */
580+
if (!(mode & ETM_MODE_EXCL_KERN) && !(mode & ETM_MODE_EXCL_USER))
581+
return;
582+
583+
addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP];
584+
/* clear default config */
585+
addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS);
586+
587+
/*
588+
* EXLEVEL_NS, bits[15:12]
589+
* The Exception levels are:
590+
* Bit[12] Exception level 0 - Application
591+
* Bit[13] Exception level 1 - OS
592+
* Bit[14] Exception level 2 - Hypervisor
593+
* Bit[15] Never implemented
594+
*/
595+
if (mode & ETM_MODE_EXCL_KERN)
596+
addr_acc |= ETM_EXLEVEL_NS_OS;
597+
else
598+
addr_acc |= ETM_EXLEVEL_NS_APP;
599+
600+
config->addr_acc[ETM_DEFAULT_ADDR_COMP] = addr_acc;
601+
config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = addr_acc;
602+
}
603+
569604
static int etm4_cpu_callback(struct notifier_block *nfb, unsigned long action,
570605
void *hcpu)
571606
{

drivers/hwtracing/coresight/coresight-etm4x.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@
176176
#define ETM_MODE_TRACE_RESET BIT(25)
177177
#define ETM_MODE_TRACE_ERR BIT(26)
178178
#define ETM_MODE_VIEWINST_STARTSTOP BIT(27)
179-
#define ETMv4_MODE_ALL 0xFFFFFFF
179+
#define ETMv4_MODE_ALL (GENMASK(27, 0) | \
180+
ETM_MODE_EXCL_KERN | \
181+
ETM_MODE_EXCL_USER)
180182

181183
#define TRCSTATR_IDLE_BIT 0
182184
#define ETM_DEFAULT_ADDR_COMP 0
@@ -414,4 +416,5 @@ enum etm_addr_type {
414416
};
415417

416418
extern const struct attribute_group *coresight_etmv4_groups[];
419+
void etm4_config_trace_mode(struct etmv4_config *config);
417420
#endif

0 commit comments

Comments
 (0)