1. 06 12月, 2008 1 次提交
    • L
      [ARM] 5340/1: fix stack placement after noexecstack changes · 794baba6
      Lennert Buytenhek 提交于
      Commit 8ec53663 ("[ARM] Improve
      non-executable support") added support for detecting non-executable
      stack binaries.  One of the things it does is to make READ_IMPLIES_EXEC
      be set in ->personality if we are running on a CPU that doesn't support
      the XN ("Execute Never") page table bit or if we are running a binary
      that needs an executable stack.
      
      This exposed a latent bug in ARM's asm/processor.h due to which we'll
      end up placing the stack at a very low address, where it will bump into
      the heap on any application that uses significant amount of stack or
      heap or both, causing many interesting crashes.
      
      Fix this by testing the ADDR_LIMIT_32BIT bit in ->personality instead
      of testing for equality against PER_LINUX_32BIT.
      Reviewed-by: NNicolas Pitre <nico@marvell.com>
      Signed-off-by: NLennert Buytenhek <buytenh@marvell.com>
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      794baba6
  2. 16 8月, 2008 1 次提交
    • N
      [ARM] 5196/1: fix inline asm constraints for preload · 16f719de
      Nicolas Pitre 提交于
      With gcc 4.3 and later, a pointer that has already been dereferenced is
      assumed not to be null since it should have caused a segmentation fault
      otherwise, hence any subsequent test against NULL is optimized away.
      
      Current inline asm constraint used in the implementation of prefetch()
      makes gcc believe that the pointer is dereferenced even though the PLD
      instruction does not load any data and does not cause a segmentation
      fault on null pointers, which causes all sorts of interesting results
      when reaching the end of a linked lists for example.
      
      Let's use a better constraint to properly represent the actual usage of
      the pointer value.
      
      Problem reported by Chris Steel.
      Signed-off-by: NNicolas Pitre <nico@marvell.com>
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      16f719de
  3. 03 8月, 2008 1 次提交
  4. 09 2月, 2008 1 次提交
  5. 14 12月, 2006 1 次提交
    • N
      [ARM] 4016/1: prefetch macro is wrong wrt gcc's "delete-null-pointer-checks" · 02828845
      Nicolas Pitre 提交于
       optimization
      
      The gcc manual says:
      
      |`-fdelete-null-pointer-checks'
      |     Use global dataflow analysis to identify and eliminate useless
      |     checks for null pointers.  The compiler assumes that dereferencing
      |     a null pointer would have halted the program.  If a pointer is
      |     checked after it has already been dereferenced, it cannot be null.
      |     Enabled at levels `-O2', `-O3', `-Os'.
      
      Now the problem can be seen with this test case:
      
      #include <linux/prefetch.h>
      extern void bar(char *x);
      void foo(char *x)
      {
      	prefetch(x);
      	if (x)
      		bar(x);
      }
      
      Because the constraint to the inline asm used in the prefetch() macro is
      a memory operand, gcc assumes that the asm code does dereference the
      pointer and the delete-null-pointer-checks optimization kicks in.
      Inspection of generated assembly for the above example shows that bar()
      is indeed called unconditionally without any test on the value of x.
      
      Of course in the prefetch case there is no real dereference and it
      cannot be assumed that a null pointer would have been caught at that
      point. This causes kernel oopses with constructs like
      hlist_for_each_entry() where the list's 'next' content is prefetched
      before the pointer is tested against NULL, and only when gcc feels like
      applying this optimization which doesn't happen all the time with more
      complex code.
      
      It appears that the way to prevent delete-null-pointer-checks
      optimization to occur in this case is to make prefetch() into a static
      inline function instead of a macro. At least this is what is done on
      x86_64 where a similar inline asm memory operand is used (I presume they
      would have seen the same problem if it didn't work) and resulting code
      for the above example confirms that.
      
      An alternative would consist of replacing the memory operand by a
      register operand containing the pointer, and use the addressing mode
      explicitly in the asm template. But that would be less optimal than an
      offsettable memory reference.
      Signed-off-by: NNicolas Pitre <nico@cam.org>
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      02828845
  6. 30 11月, 2006 1 次提交
  7. 14 1月, 2006 1 次提交
  8. 13 1月, 2006 2 次提交
  9. 05 5月, 2005 1 次提交
    • R
      [PATCH] ARM: Fix kernel stack offset calculations · 4f7a1812
      Russell King 提交于
      Various places in the ARM kernel implicitly assumed that kernel
      stacks are always 8K due to hard coded constants.  Replace these
      constants with definitions.
      
      Correct the allowable range of kernel stack pointer values within
      the allocation.  Arrange for the entire kernel stack to be zeroed,
      not just the upper 4K if CONFIG_DEBUG_STACK_USAGE is set.
      Signed-off-by: NRussell King <rmk@arm.linux.org.uk>
      4f7a1812
  10. 17 4月, 2005 1 次提交
    • L
      Linux-2.6.12-rc2 · 1da177e4
      Linus Torvalds 提交于
      Initial git repository build. I'm not bothering with the full history,
      even though we have it. We can create a separate "historical" git
      archive of that later if we want to, and in the meantime it's about
      3.2GB when imported into git - space that would just make the early
      git days unnecessarily complicated, when we don't have a lot of good
      infrastructure for it.
      
      Let it rip!
      1da177e4