lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 23 Sep 2021 15:39:16 +0100 From: Suzuki K Poulose <suzuki.poulose@....com> To: mathieu.poirier@...aro.org, linux-arm-kernel@...ts.infradead.org Cc: anshuman.khandual@....com, mike.leach@...aro.org, leo.yan@...aro.org, coresight@...ts.linaro.org, linux-kernel@...r.kernel.org, Suzuki K Poulose <suzuki.poulose@....com> Subject: [PATCH v4 2/5] coresight: trbe: Fix handling of spurious interrupts On a spurious IRQ, right now we disable the TRBE and then re-enable it back, resetting the "buffer" pointers(i.e BASE, LIMIT and more importantly WRITE) to the original pointers from the AUX handle. This implies that we overwrite any trace that was written so far, (by overwriting TRBPTR) while we should have ignored the IRQ. On detecting a spurious IRQ after examining the TRBSR we simply re-enable the TRBE without touching the other parameters. Cc: Anshuman Khandual <anshuman.khandual@....com> Cc: Mathieu Poirier <mathieu.poirier@...aro.org> Cc: Mike Leach <mike.leach@...aro.org> Cc: Leo Yan <leo.yan@...aro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@....com> --- drivers/hwtracing/coresight/coresight-trbe.c | 22 ++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-trbe.c b/drivers/hwtracing/coresight/coresight-trbe.c index e78800ba5b5b..47120d263639 100644 --- a/drivers/hwtracing/coresight/coresight-trbe.c +++ b/drivers/hwtracing/coresight/coresight-trbe.c @@ -684,20 +684,16 @@ static int arm_trbe_disable(struct coresight_device *csdev) static void trbe_handle_spurious(struct perf_output_handle *handle) { - struct trbe_buf *buf = etm_perf_sink_config(handle); + u64 limitr = read_sysreg_s(SYS_TRBLIMITR_EL1); - buf->trbe_limit = compute_trbe_buffer_limit(handle); - buf->trbe_write = buf->trbe_base + PERF_IDX2OFF(handle->head, buf); - if (buf->trbe_limit == buf->trbe_base) { - trbe_drain_and_disable_local(); - /* - * Just communicate trace truncation event to the user space by - * marking it with PERF_AUX_FLAG_TRUNCATED. - */ - perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED); - return; - } - trbe_enable_hw(buf); + /* + * If the IRQ was spurious, simply re-enable the TRBE + * back without modifying the buffer parameters to + * retain the trace collected so far. + */ + limitr |= TRBLIMITR_ENABLE; + write_sysreg_s(limitr, SYS_TRBLIMITR_EL1); + isb(); } static void trbe_handle_overflow(struct perf_output_handle *handle) -- 2.24.1
Powered by blists - more mailing lists