• Marco Elver's avatar
    kcsan: Fix encoding masks and regain address bit · 1d094cef
    Marco Elver authored
    The watchpoint encoding masks for size and address were off-by-one bit
    each, with the size mask using 1 unnecessary bit and the address mask
    missing 1 bit. However, due to the way the size is shifted into the
    encoded watchpoint, we were effectively wasting and never using the
    extra bit.
    
    For example, on x86 with PAGE_SIZE==4K, we have 1 bit for the is-write
    bit, 14 bits for the size bits, and then 49 bits left for the address.
    Prior to this fix we would end up with this usage:
    
    	[ write<1> | size<14> | wasted<1> | address<48> ]
    
    Fix it by subtracting 1 bit from the GENMASK() end and start ranges of
    size and address respectively. The added static_assert()s verify that
    the masks are as expected. With the fixed version, we get the expected
    usage:
    
    	[ write<1> | size<14> |             address<49> ]
    
    Functionally no change is expected, since that extra address bit is
    insignificant for enabled architectures.
    Acked-by: default avatarBoqun Feng <boqun.feng@gmail.com>
    Signed-off-by: default avatarMarco Elver <elver@google.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    1d094cef
encoding.h 3 KB