1. 09 10月, 2017 1 次提交
    • P
      MIPS: Fix cmpxchg on 32b signed ints for 64b kernel with !kernel_uses_llsc · 133d68e0
      Paul Burton 提交于
      Commit 8263db4d ("MIPS: cmpxchg: Implement __cmpxchg() as a
      function") refactored our implementation of __cmpxchg() to be a function
      rather than a macro, with the aim of making it easier to read & modify.
      Unfortunately the commit breaks use of cmpxchg() for signed 32 bit
      values when we have a 64 bit kernel with kernel_uses_llsc == false,
      because:
      
       - In cmpxchg_local() we cast the old value to the type the pointer
         points to, and then to an unsigned long. If the pointer points to a
         signed type smaller than 64 bits then the old value will be sign
         extended to 64 bits. That is, bits beyond the size of the pointed to
         type will be set to 1 if the old value is negative. In the case of a
         signed 32 bit integer with a negative value, bits 63:32 will all be
         set.
      
       - In __cmpxchg_asm() we load the value from memory, ie. dereference the
         pointer, and store the value as an unsigned integer (__ret) whose
         size matches the pointer. For a 32 bit cmpxchg() this means we store
         the value in a u32, because the pointer provided to __cmpxchg_asm()
         by __cmpxchg() is of type volatile u32 *.
      
       - __cmpxchg_asm() then checks whether the value in memory (__ret)
         matches the provided old value, by comparing the two values. This
         results in the u32 being promoted to a 64 bit unsigned long to match
         the old argument - however because both types are unsigned the value
         is zero extended, which does not match the sign extension performed
         on the old value in cmpxchg_local() earlier.
      
      This mismatch means that unfortunate cmpxchg() calls can incorrectly
      fail for 64 bit kernels with kernel_uses_llsc == false. This is the case
      on at least non-SMP Cavium Octeon kernels, which hardcode
      kernel_uses_llsc in their cpu-feature-overrides.h header. Using a
      v4.13-rc7 kernel configured using cavium_octeon_defconfig with SMP
      manually disabled, this presents itself as oddity when we reach
      userland - for example:
      
        can't run '/bin/mount': Text file busy
        can't run '/bin/mkdir': Text file busy
        can't run '/bin/mkdir': Text file busy
        can't run '/bin/mount': Text file busy
        can't run '/bin/hostname': Text file busy
        can't run '/etc/init.d/rcS': Text file busy
        can't run '/sbin/getty': Text file busy
        can't run '/sbin/getty': Text file busy
      
      It appears that some part of the init process, which is in this case
      buildroot's busybox init, is running successfully. It never manages to
      reach the login prompt though, and complains about /sbin/getty being
      busy repeatedly and indefinitely.
      
      Fix this by casting the old value provided to __cmpxchg_asm() to an
      appropriately sized unsigned integer, such that we consistently
      zero-extend avoiding the mismatch. The __cmpxchg_small() case for 8 & 16
      bit values is unaffected because __cmpxchg_small() already masks
      provided values appropriately.
      Signed-off-by: NPaul Burton <paul.burton@imgtec.com>
      Fixes: 8263db4d ("MIPS: cmpxchg: Implement __cmpxchg() as a function")
      Cc: linux-mips@linux-mips.org
      Patchwork: https://patchwork.linux-mips.org/patch/17226/
      Cc: linux-mips@linux-mips.org
      Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      133d68e0
  2. 29 6月, 2017 9 次提交
  3. 13 5月, 2015 1 次提交
  4. 01 4月, 2015 1 次提交
  5. 17 2月, 2015 2 次提交
  6. 24 11月, 2014 1 次提交
    • M
      MIPS: Fix microMIPS LL/SC immediate offsets · b0984c43
      Maciej W. Rozycki 提交于
      In the microMIPS encoding some memory access instructions have their
      immediate offset reduced to 12 bits only.  That does not match the GCC
      `R' constraint we use in some places to satisfy the requirement,
      resulting in build failures like this:
      
      {standard input}: Assembler messages:
      {standard input}:720: Error: macro used $at after ".set noat"
      {standard input}:720: Warning: macro instruction expanded into multiple instructions
      
      Fix the problem by defining a macro, `GCC_OFF12_ASM', that expands to
      the right constraint depending on whether microMIPS or standard MIPS
      code is produced.  Also apply the fix to where `m' is used as in the
      worst case this change does nothing, e.g. where the pointer was already
      in a register such as a function argument and no further offset was
      requested, and in the best case it avoids an extraneous sequence of up
      to two instructions to load the high 20 bits of the address in the LL/SC
      loop.  This reduces the risk of lock contention that is the higher the
      more instructions there are in the critical section between LL and SC.
      
      Strictly speaking we could just bulk-replace `R' with `ZC' as the latter
      constraint adjusts automatically depending on the ISA selected.
      However it was only introduced with GCC 4.9 and we keep supporing older
      compilers for the standard MIPS configuration, hence the slightly more
      complicated approach I chose.
      
      The choice of a zero-argument function-like rather than an object-like
      macro was made so that it does not look like a function call taking the
      C expression used for the constraint as an argument.  This is so as not
      to confuse the reader or formatting checkers like `checkpatch.pl' and
      follows previous practice.
      Signed-off-by: NMaciej W. Rozycki <macro@codesourcery.com>
      Signed-off-by: NSteven J. Hill <Steven.Hill@imgtec.com>
      Cc: linux-mips@linux-mips.org
      Patchwork: https://patchwork.linux-mips.org/patch/8482/Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      b0984c43
  7. 01 4月, 2014 1 次提交
    • R
      MIPS: Fix gigaton of warning building with microMIPS. · a809d460
      Ralf Baechle 提交于
      With binutils 2.24 the attempt to switch with microMIPS mode to MIPS III
      mode through .set mips3 results in *lots* of warnings like
      
      {standard input}: Assembler messages:
      {standard input}:397: Warning: the 64-bit MIPS architecture does not support the `smartmips' extension
      
      during a kernel build.  Fixed by using .set arch=r4000 instead.
      
      This breaks support for building the kernel with binutils 2.13 which
      was supported for 32 bit kernels only anyway and 2.14 which was a bad
      vintage for MIPS anyway.
      Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      a809d460
  8. 01 2月, 2013 1 次提交
  9. 19 7月, 2012 1 次提交
  10. 29 3月, 2012 1 次提交
  11. 30 10月, 2010 1 次提交
    • R
      MIPS: Get rid of branches to .subsections. · 7837314d
      Ralf Baechle 提交于
      It was a nice optimization - on paper at least.  In practice it results in
      branches that may exceed the maximum legal range for a branch.  We can
      fight that problem with -ffunction-sections but -ffunction-sections again
      is incompatible with -pg used by the function tracer.
      
      By rewriting the loop around all simple LL/SC blocks to C we reduce the
      amount of inline assembler and at the same time allow GCC to often fill
      the branch delay slots with something sensible or whatever else clever
      optimization it may have up in its sleeve.
      
      With this optimization gone we also no longer need -ffunction-sections,
      so drop it.
      
      This optimization was originally introduced in 2.6.21, commit
      5999eca25c1fd4b9b9aca7833b04d10fe4bc877d (linux-mips.org) rsp.
      f65e4fa8 (kernel.org).
      
      Original fix for the issues which caused me to pull this optimization by
      Paul Gortmaker <paul.gortmaker@windriver.com>.
      Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
      7837314d
  12. 01 5月, 2010 1 次提交
  13. 27 2月, 2010 1 次提交
  14. 18 9月, 2009 1 次提交
  15. 11 10月, 2008 1 次提交
  16. 08 2月, 2008 1 次提交
  17. 12 10月, 2007 1 次提交
  18. 03 10月, 2007 1 次提交