• Andre Przywara's avatar
    kselftest/arm64: sve: Do not use non-canonical FFR register value · 7011d725
    Andre Przywara authored
    The "First Fault Register" (FFR) is an SVE register that mimics a
    predicate register, but clears bits when a load or store fails to handle
    an element of a vector. The supposed usage scenario is to initialise
    this register (using SETFFR), then *read* it later on to learn about
    elements that failed to load or store. Explicit writes to this register
    using the WRFFR instruction are only supposed to *restore* values
    previously read from the register (for context-switching only).
    As the manual describes, this register holds only certain values, it:
    "... contains a monotonic predicate value, in which starting from bit 0
    there are zero or more 1 bits, followed only by 0 bits in any remaining
    bit positions."
    Any other value is UNPREDICTABLE and is not supposed to be "restored"
    into the register.
    
    The SVE test currently tries to write a signature pattern into the
    register, which is *not* a canonical FFR value. Apparently the existing
    setups treat UNPREDICTABLE as "read-as-written", but a new
    implementation actually only stores canonical values. As a consequence,
    the sve-test fails immediately when comparing the FFR value:
    -----------
     # ./sve-test
    Vector length:  128 bits
    PID:    207
    Mismatch: PID=207, iteration=0, reg=48
            Expected [cf00]
            Got      [0f00]
    Aborted
    -----------
    
    Fix this by only populating the FFR with proper canonical values.
    Effectively the requirement described above limits us to 17 unique
    values over 16 bits worth of FFR, so we condense our signature down to 4
    bits (2 bits from the PID, 2 bits from the generation) and generate the
    canonical pattern from it. Any bits describing elements above the
    minimum 128 bit are set to 0.
    
    This aligns the FFR usage to the architecture and fixes the test on
    microarchitectures implementing FFR in a more restricted way.
    Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
    Reviwed-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210319120128.29452-1-andre.przywara@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    7011d725
sve-test.S 11.4 KB