Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
  1. Apr 15, 2022
  2. Apr 14, 2022
  3. Apr 12, 2022
    • Alexander Lobakin's avatar
      asm-generic: fix __get_unaligned_be48() on 32 bit platforms · b9768752
      Alexander Lobakin authored
      While testing the new macros for working with 48 bit containers,
      I faced a weird problem:
      
      32 + 16: 0x2ef6e8da 0x79e60000
      48: 0xffffe8da + 0x79e60000
      
      All the bits starting from the 32nd were getting 1d in 9/10 cases.
      The debug showed:
      
      p[0]: 0x00002e0000000000
      p[1]: 0x00002ef600000000
      p[2]: 0xffffffffe8000000
      p[3]: 0xffffffffe8da0000
      p[4]: 0xffffffffe8da7900
      p[5]: 0xffffffffe8da79e6
      
      that the value becomes a garbage after the third OR, i.e. on
      `p[2] << 24`.
      When the 31st bit is 1 and there's no explicit cast to an unsigned,
      it's being considered as a signed int and getting sign-extended on
      OR, so `e8000000` becomes `ffffffffe8000000` and messes up the
      result.
      Cast the @p[2] to u64 as well to avoid this. Now:
      
      32 + 16: 0x7ef6a490 0xddc10000
      48: 0x7ef6a490 + 0xddc10000
      
      p[0]: 0x00007e0000000000
      p[1]: 0x00007ef600000000
      p[2]: 0x00007ef6a4000000
      p[3]: 0x00007ef6a4900000
      p[4]: 0x00007ef6a490dd00
      p[5]: 0x00007ef6a490ddc1
      
      Fixes: c2ea5fcf
      
       ("asm-generic: introduce be48 unaligned accessors")
      Signed-off-by: default avatarAlexander Lobakin <alobakin@pm.me>
      Link: https://lore.kernel.org/r/20220412215220.75677-1-alobakin@pm.me
      
      
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      b9768752
  4. Apr 11, 2022
  5. Apr 06, 2022
  6. Apr 03, 2022
  7. Apr 02, 2022