Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux...
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 30 Nov 2007 00:25:29 +0000 (16:25 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 30 Nov 2007 00:25:29 +0000 (16:25 -0800)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup:
  x86 setup: don't recalculate ss:esp unless really necessary

arch/x86/boot/header.S

index 6ef5a060fa11085df5be8d4616acd5541b53d5d2..4cc5b0411db58dd8201081702f4b93822a72101d 100644 (file)
@@ -236,39 +236,30 @@ start_of_setup:
        movw    %ax, %es
        cld
 
-# Apparently some ancient versions of LILO invoked the kernel
-# with %ss != %ds, which happened to work by accident for the
-# old code.  If the CAN_USE_HEAP flag is set in loadflags, or
-# %ss != %ds, then adjust the stack pointer.
+# Apparently some ancient versions of LILO invoked the kernel with %ss != %ds,
+# which happened to work by accident for the old code.  Recalculate the stack
+# pointer if %ss is invalid.  Otherwise leave it alone, LOADLIN sets up the
+# stack behind its own code, so we can't blindly put it directly past the heap.
 
-       # Smallest possible stack we can tolerate
-       movw    $(_end+STACK_SIZE), %cx
-
-       movw    heap_end_ptr, %dx
-       addw    $512, %dx
-       jnc     1f
-       xorw    %dx, %dx        # Wraparound - whole segment available
-1:     testb   $CAN_USE_HEAP, loadflags
-       jnz     2f
-
-       # No CAN_USE_HEAP
        movw    %ss, %dx
        cmpw    %ax, %dx        # %ds == %ss?
        movw    %sp, %dx
-       # If so, assume %sp is reasonably set, otherwise use
-       # the smallest possible stack.
-       jne     4f              # -> Smallest possible stack...
+       je      2f              # -> assume %sp is reasonably set
+
+       # Invalid %ss, make up a new stack
+       movw    $_end, %dx
+       testb   $CAN_USE_HEAP, loadflags
+       jz      1f
+       movw    heap_end_ptr, %dx
+1:     addw    $STACK_SIZE, %dx
+       jnc     2f
+       xorw    %dx, %dx        # Prevent wraparound
 
-       # Make sure the stack is at least minimum size.  Take a value
-       # of zero to mean "full segment."
-2:
+2:     # Now %dx should point to the end of our stack space
        andw    $~3, %dx        # dword align (might as well...)
        jnz     3f
        movw    $0xfffc, %dx    # Make sure we're not zero
-3:     cmpw    %cx, %dx
-       jnb     5f
-4:     movw    %cx, %dx        # Minimum value we can possibly use
-5:     movw    %ax, %ss
+3:     movw    %ax, %ss
        movzwl  %dx, %esp       # Clear upper half of %esp
        sti                     # Now we should have a working stack