Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup

* '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
This commit is contained in:
Linus Torvalds 2007-11-29 16:25:29 -08:00
commit e1cca7e8d4

View 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
# Make sure the stack is at least minimum size. Take a value
# of zero to mean "full segment."
2:
# 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
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