提交 4f6fce54 编写于 作者: M Mathieu Poirier 提交者: Greg Kroah-Hartman

coresight: etm4x: implementing user/kernel mode tracing

Adding new mode to limit tracing to kernel or user space.
Signed-off-by: NMathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 c38a9ec2
...@@ -440,6 +440,9 @@ static ssize_t mode_store(struct device *dev, ...@@ -440,6 +440,9 @@ static ssize_t mode_store(struct device *dev,
else else
config->vinst_ctrl &= ~BIT(11); config->vinst_ctrl &= ~BIT(11);
if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
etm4_config_trace_mode(config);
spin_unlock(&drvdata->spinlock); spin_unlock(&drvdata->spinlock);
return size; return size;
......
...@@ -566,6 +566,41 @@ static void etm4_set_default(struct etmv4_config *config) ...@@ -566,6 +566,41 @@ static void etm4_set_default(struct etmv4_config *config)
config->vissctlr = 0x0; config->vissctlr = 0x0;
} }
void etm4_config_trace_mode(struct etmv4_config *config)
{
u32 addr_acc, mode;
mode = config->mode;
mode &= (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER);
/* excluding kernel AND user space doesn't make sense */
WARN_ON_ONCE(mode == (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER));
/* nothing to do if neither flags are set */
if (!(mode & ETM_MODE_EXCL_KERN) && !(mode & ETM_MODE_EXCL_USER))
return;
addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP];
/* clear default config */
addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS);
/*
* EXLEVEL_NS, bits[15:12]
* The Exception levels are:
* Bit[12] Exception level 0 - Application
* Bit[13] Exception level 1 - OS
* Bit[14] Exception level 2 - Hypervisor
* Bit[15] Never implemented
*/
if (mode & ETM_MODE_EXCL_KERN)
addr_acc |= ETM_EXLEVEL_NS_OS;
else
addr_acc |= ETM_EXLEVEL_NS_APP;
config->addr_acc[ETM_DEFAULT_ADDR_COMP] = addr_acc;
config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = addr_acc;
}
static int etm4_cpu_callback(struct notifier_block *nfb, unsigned long action, static int etm4_cpu_callback(struct notifier_block *nfb, unsigned long action,
void *hcpu) void *hcpu)
{ {
......
...@@ -176,7 +176,9 @@ ...@@ -176,7 +176,9 @@
#define ETM_MODE_TRACE_RESET BIT(25) #define ETM_MODE_TRACE_RESET BIT(25)
#define ETM_MODE_TRACE_ERR BIT(26) #define ETM_MODE_TRACE_ERR BIT(26)
#define ETM_MODE_VIEWINST_STARTSTOP BIT(27) #define ETM_MODE_VIEWINST_STARTSTOP BIT(27)
#define ETMv4_MODE_ALL 0xFFFFFFF #define ETMv4_MODE_ALL (GENMASK(27, 0) | \
ETM_MODE_EXCL_KERN | \
ETM_MODE_EXCL_USER)
#define TRCSTATR_IDLE_BIT 0 #define TRCSTATR_IDLE_BIT 0
#define ETM_DEFAULT_ADDR_COMP 0 #define ETM_DEFAULT_ADDR_COMP 0
...@@ -414,4 +416,5 @@ enum etm_addr_type { ...@@ -414,4 +416,5 @@ enum etm_addr_type {
}; };
extern const struct attribute_group *coresight_etmv4_groups[]; extern const struct attribute_group *coresight_etmv4_groups[];
void etm4_config_trace_mode(struct etmv4_config *config);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册