aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMuhammad Abdul WAHAB <muhammadabdul.wahab@centralesupelec.fr>2016-11-29 11:47:13 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-11-29 14:05:32 -0500
commita39f841a5b5b2215f99ed6dd6f75b8e06807a810 (patch)
treeae2958d9f8b5efc0bfef7713d4a3117c4324864f
parenta3e4df85b0dd77f33e62142158f7d11f5aa836b5 (diff)
coresight: etm3x: Adding missing features of Coresight PTM components
In the current driver for Coresight components, two features of PTM components are missing: 1. Branch Broadcasting (present also in ETM but called Branch Output) 2. Return Stack (only present in PTM v1.0 and PTMv1.1) These features can be added simply to the code using `mode` field of `etm_config` struct. 1. **Branch Broadcast** : The branch broadcast feature is present in ETM components as well and is called Branch output. It allows to retrieve addresses for direct branch addresses alongside the indirect branch addresses. For example, it could be useful in cases when tracing without source code. 2. **Return Stack** : The return stack option allows to retrieve the return addresses of function calls. It can be useful to avoid CRA (Code Reuse Attacks) by keeping a shadowstack. Signed-off-by: Muhammad Abdul Wahab <muhammadabdul.wahab@centralesupelec.fr> Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/hwtracing/coresight/coresight-etm.h5
-rw-r--r--drivers/hwtracing/coresight/coresight-etm3x-sysfs.c10
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/hwtracing/coresight/coresight-etm.h b/drivers/hwtracing/coresight/coresight-etm.h
index 4a18ee499965..ad063d7444e1 100644
--- a/drivers/hwtracing/coresight/coresight-etm.h
+++ b/drivers/hwtracing/coresight/coresight-etm.h
@@ -89,11 +89,13 @@
89/* ETMCR - 0x00 */ 89/* ETMCR - 0x00 */
90#define ETMCR_PWD_DWN BIT(0) 90#define ETMCR_PWD_DWN BIT(0)
91#define ETMCR_STALL_MODE BIT(7) 91#define ETMCR_STALL_MODE BIT(7)
92#define ETMCR_BRANCH_BROADCAST BIT(8)
92#define ETMCR_ETM_PRG BIT(10) 93#define ETMCR_ETM_PRG BIT(10)
93#define ETMCR_ETM_EN BIT(11) 94#define ETMCR_ETM_EN BIT(11)
94#define ETMCR_CYC_ACC BIT(12) 95#define ETMCR_CYC_ACC BIT(12)
95#define ETMCR_CTXID_SIZE (BIT(14)|BIT(15)) 96#define ETMCR_CTXID_SIZE (BIT(14)|BIT(15))
96#define ETMCR_TIMESTAMP_EN BIT(28) 97#define ETMCR_TIMESTAMP_EN BIT(28)
98#define ETMCR_RETURN_STACK BIT(29)
97/* ETMCCR - 0x04 */ 99/* ETMCCR - 0x04 */
98#define ETMCCR_FIFOFULL BIT(23) 100#define ETMCCR_FIFOFULL BIT(23)
99/* ETMPDCR - 0x310 */ 101/* ETMPDCR - 0x310 */
@@ -110,8 +112,11 @@
110#define ETM_MODE_STALL BIT(2) 112#define ETM_MODE_STALL BIT(2)
111#define ETM_MODE_TIMESTAMP BIT(3) 113#define ETM_MODE_TIMESTAMP BIT(3)
112#define ETM_MODE_CTXID BIT(4) 114#define ETM_MODE_CTXID BIT(4)
115#define ETM_MODE_BBROAD BIT(5)
116#define ETM_MODE_RET_STACK BIT(6)
113#define ETM_MODE_ALL (ETM_MODE_EXCLUDE | ETM_MODE_CYCACC | \ 117#define ETM_MODE_ALL (ETM_MODE_EXCLUDE | ETM_MODE_CYCACC | \
114 ETM_MODE_STALL | ETM_MODE_TIMESTAMP | \ 118 ETM_MODE_STALL | ETM_MODE_TIMESTAMP | \
119 ETM_MODE_BBROAD | ETM_MODE_RET_STACK | \
115 ETM_MODE_CTXID | ETM_MODE_EXCL_KERN | \ 120 ETM_MODE_CTXID | ETM_MODE_EXCL_KERN | \
116 ETM_MODE_EXCL_USER) 121 ETM_MODE_EXCL_USER)
117 122
diff --git a/drivers/hwtracing/coresight/coresight-etm3x-sysfs.c b/drivers/hwtracing/coresight/coresight-etm3x-sysfs.c
index 5ea090955c08..ca98ad13bb8c 100644
--- a/drivers/hwtracing/coresight/coresight-etm3x-sysfs.c
+++ b/drivers/hwtracing/coresight/coresight-etm3x-sysfs.c
@@ -164,6 +164,16 @@ static ssize_t mode_store(struct device *dev,
164 else 164 else
165 config->ctrl &= ~ETMCR_CTXID_SIZE; 165 config->ctrl &= ~ETMCR_CTXID_SIZE;
166 166
167 if (config->mode & ETM_MODE_BBROAD)
168 config->ctrl |= ETMCR_BRANCH_BROADCAST;
169 else
170 config->ctrl &= ~ETMCR_BRANCH_BROADCAST;
171
172 if (config->mode & ETM_MODE_RET_STACK)
173 config->ctrl |= ETMCR_RETURN_STACK;
174 else
175 config->ctrl &= ~ETMCR_RETURN_STACK;
176
167 if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER)) 177 if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
168 etm_config_trace_mode(config); 178 etm_config_trace_mode(config);
169 179