| From e5395e8740af09ede5d97818528e9dd9e70b3fc0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 Sep 2018 13:18:00 -0600 |
| Subject: coresight: etm4x: Configure EL2 exception level when kernel is |
| running in HYP |
| |
| From: Tomasz Nowicki <tnowicki@caviumnetworks.com> |
| |
| [ Upstream commit b860801e3237ec4c74cf8de0be4816996757ae5c ] |
| |
| For non-VHE systems host kernel runs at EL1 and jumps to EL2 whenever |
| hypervisor code should be executed. In this case ETM4x driver must |
| restrict configuration to EL1 when it setups kernel tracing. |
| However, there is no separate hypervisor privilege level when VHE |
| is enabled, the host kernel runs at EL2. |
| |
| This patch fixes configuration of TRCACATRn register for VHE systems |
| so that ETM_EXLEVEL_NS_HYP bit is used instead of ETM_EXLEVEL_NS_OS |
| to on/off kernel tracing. At the same time, it moves common code |
| to new helper. |
| |
| Signed-off-by: Tomasz Nowicki <tnowicki@caviumnetworks.com> |
| Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/hwtracing/coresight/coresight-etm4x.c | 40 +++++++++---------- |
| 1 file changed, 20 insertions(+), 20 deletions(-) |
| |
| diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c |
| index e45b5ec2f4512..b7bc08cf90c69 100644 |
| --- a/drivers/hwtracing/coresight/coresight-etm4x.c |
| +++ b/drivers/hwtracing/coresight/coresight-etm4x.c |
| @@ -28,6 +28,7 @@ |
| #include <linux/pm_runtime.h> |
| #include <asm/sections.h> |
| #include <asm/local.h> |
| +#include <asm/virt.h> |
| |
| #include "coresight-etm4x.h" |
| #include "coresight-etm-perf.h" |
| @@ -616,7 +617,7 @@ static void etm4_set_default_config(struct etmv4_config *config) |
| config->vinst_ctrl |= BIT(0); |
| } |
| |
| -static u64 etm4_get_access_type(struct etmv4_config *config) |
| +static u64 etm4_get_ns_access_type(struct etmv4_config *config) |
| { |
| u64 access_type = 0; |
| |
| @@ -627,17 +628,26 @@ static u64 etm4_get_access_type(struct etmv4_config *config) |
| * Bit[13] Exception level 1 - OS |
| * Bit[14] Exception level 2 - Hypervisor |
| * Bit[15] Never implemented |
| - * |
| - * Always stay away from hypervisor mode. |
| */ |
| - access_type = ETM_EXLEVEL_NS_HYP; |
| - |
| - if (config->mode & ETM_MODE_EXCL_KERN) |
| - access_type |= ETM_EXLEVEL_NS_OS; |
| + if (!is_kernel_in_hyp_mode()) { |
| + /* Stay away from hypervisor mode for non-VHE */ |
| + access_type = ETM_EXLEVEL_NS_HYP; |
| + if (config->mode & ETM_MODE_EXCL_KERN) |
| + access_type |= ETM_EXLEVEL_NS_OS; |
| + } else if (config->mode & ETM_MODE_EXCL_KERN) { |
| + access_type = ETM_EXLEVEL_NS_HYP; |
| + } |
| |
| if (config->mode & ETM_MODE_EXCL_USER) |
| access_type |= ETM_EXLEVEL_NS_APP; |
| |
| + return access_type; |
| +} |
| + |
| +static u64 etm4_get_access_type(struct etmv4_config *config) |
| +{ |
| + u64 access_type = etm4_get_ns_access_type(config); |
| + |
| /* |
| * EXLEVEL_S, bits[11:8], don't trace anything happening |
| * in secure state. |
| @@ -891,20 +901,10 @@ void etm4_config_trace_mode(struct etmv4_config *config) |
| |
| addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP]; |
| /* clear default config */ |
| - addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS); |
| + addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS | |
| + ETM_EXLEVEL_NS_HYP); |
| |
| - /* |
| - * 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; |
| + addr_acc |= etm4_get_ns_access_type(config); |
| |
| config->addr_acc[ETM_DEFAULT_ADDR_COMP] = addr_acc; |
| config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = addr_acc; |
| -- |
| 2.20.1 |
| |