Loading arch/x86/boot/header.S +16 −25 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
arch/x86/boot/header.S +16 −25 Original line number Diff line number Diff line Loading @@ -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 Loading