lkml.org 
[lkml]   [2018]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 139/173] coresight: tpiu: Fix disabling timeouts
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Robin Murphy <robin.murphy@arm.com>

    [ Upstream commit ccff2dfaceaca4517432f5c149594215fe9098cc ]

    Probing the TPIU driver under UBSan triggers an out-of-bounds shift
    warning in coresight_timeout():

    ...
    [ 5.677530] UBSAN: Undefined behaviour in drivers/hwtracing/coresight/coresight.c:929:16
    [ 5.685542] shift exponent 64 is too large for 64-bit type 'long unsigned int'
    ...

    On closer inspection things are exponentially out of whack because we're
    passing a bitmask where a bit number should be. Amusingly, it seems that
    both calls will find their expected values by sheer luck and appear to
    succeed: 1 << FFCR_FON_MAN ends up at bit 64 which whilst undefined
    evaluates as zero in practice, while 1 << FFSR_FT_STOPPED finds bit 2
    (TCPresent) which apparently is usually tied high.

    Following the examples of other drivers, define separate FOO and FOO_BIT
    macros for masks vs. indices, and put things right.

    CC: Robert Walker <robert.walker@arm.com>
    CC: Mike Leach <mike.leach@linaro.org>
    CC: Mathieu Poirier <mathieu.poirier@linaro.org>
    Fixes: 11595db8e17f ("coresight: Fix disabling of CoreSight TPIU")
    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/hwtracing/coresight/coresight-tpiu.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    --- a/drivers/hwtracing/coresight/coresight-tpiu.c
    +++ b/drivers/hwtracing/coresight/coresight-tpiu.c
    @@ -47,8 +47,9 @@

    /** register definition **/
    /* FFSR - 0x300 */
    -#define FFSR_FT_STOPPED BIT(1)
    +#define FFSR_FT_STOPPED_BIT 1
    /* FFCR - 0x304 */
    +#define FFCR_FON_MAN_BIT 6
    #define FFCR_FON_MAN BIT(6)
    #define FFCR_STOP_FI BIT(12)

    @@ -93,9 +94,9 @@ static void tpiu_disable_hw(struct tpiu_
    /* Generate manual flush */
    writel_relaxed(FFCR_STOP_FI | FFCR_FON_MAN, drvdata->base + TPIU_FFCR);
    /* Wait for flush to complete */
    - coresight_timeout(drvdata->base, TPIU_FFCR, FFCR_FON_MAN, 0);
    + coresight_timeout(drvdata->base, TPIU_FFCR, FFCR_FON_MAN_BIT, 0);
    /* Wait for formatter to stop */
    - coresight_timeout(drvdata->base, TPIU_FFSR, FFSR_FT_STOPPED, 1);
    + coresight_timeout(drvdata->base, TPIU_FFSR, FFSR_FT_STOPPED_BIT, 1);

    CS_LOCK(drvdata->base);
    }

    \
     
     \ /
      Last update: 2018-09-24 14:24    [W:4.085 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site