coresight: etm3x: Adding missing features of Coresight PTM components
authorMuhammad Abdul WAHAB <muhammadabdul.wahab@centralesupelec.fr>
Tue, 29 Nov 2016 16:47:13 +0000 (09:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 29 Nov 2016 19:05:32 +0000 (20:05 +0100)
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>
drivers/hwtracing/coresight/coresight-etm.h
drivers/hwtracing/coresight/coresight-etm3x-sysfs.c

index 4a18ee4999658eccbe16eb619d83efecc1c682cb..ad063d7444e1787a7c42c25f7efd798734f38bbd 100644 (file)
 /* ETMCR - 0x00 */
 #define ETMCR_PWD_DWN          BIT(0)
 #define ETMCR_STALL_MODE       BIT(7)
+#define ETMCR_BRANCH_BROADCAST BIT(8)
 #define ETMCR_ETM_PRG          BIT(10)
 #define ETMCR_ETM_EN           BIT(11)
 #define ETMCR_CYC_ACC          BIT(12)
 #define ETMCR_CTXID_SIZE       (BIT(14)|BIT(15))
 #define ETMCR_TIMESTAMP_EN     BIT(28)
+#define ETMCR_RETURN_STACK     BIT(29)
 /* ETMCCR - 0x04 */
 #define ETMCCR_FIFOFULL                BIT(23)
 /* ETMPDCR - 0x310 */
 #define ETM_MODE_STALL         BIT(2)
 #define ETM_MODE_TIMESTAMP     BIT(3)
 #define ETM_MODE_CTXID         BIT(4)
+#define ETM_MODE_BBROAD                BIT(5)
+#define ETM_MODE_RET_STACK     BIT(6)
 #define ETM_MODE_ALL           (ETM_MODE_EXCLUDE | ETM_MODE_CYCACC | \
                                 ETM_MODE_STALL | ETM_MODE_TIMESTAMP | \
+                                ETM_MODE_BBROAD | ETM_MODE_RET_STACK | \
                                 ETM_MODE_CTXID | ETM_MODE_EXCL_KERN | \
                                 ETM_MODE_EXCL_USER)
 
index 5ea090955c0865713f5345e199a983dca35e23ef..ca98ad13bb8c0dfcb14fb594eaeb0a0348c4167b 100644 (file)
@@ -164,6 +164,16 @@ static ssize_t mode_store(struct device *dev,
        else
                config->ctrl &= ~ETMCR_CTXID_SIZE;
 
+       if (config->mode & ETM_MODE_BBROAD)
+               config->ctrl |= ETMCR_BRANCH_BROADCAST;
+       else
+               config->ctrl &= ~ETMCR_BRANCH_BROADCAST;
+
+       if (config->mode & ETM_MODE_RET_STACK)
+               config->ctrl |= ETMCR_RETURN_STACK;
+       else
+               config->ctrl &= ~ETMCR_RETURN_STACK;
+
        if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
                etm_config_trace_mode(config);