diff options
Diffstat (limited to 'arch/x86/boot/compressed/head_32.S')
| -rw-r--r-- | arch/x86/boot/compressed/head_32.S | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index f35ea2237522..a0ae2e7f6cec 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
| @@ -27,13 +27,22 @@ | |||
| 27 | #include <asm/segment.h> | 27 | #include <asm/segment.h> |
| 28 | #include <asm/page.h> | 28 | #include <asm/page.h> |
| 29 | #include <asm/boot.h> | 29 | #include <asm/boot.h> |
| 30 | #include <asm/asm-offsets.h> | ||
| 30 | 31 | ||
| 31 | .section ".text.head","ax",@progbits | 32 | .section ".text.head","ax",@progbits |
| 32 | .globl startup_32 | 33 | .globl startup_32 |
| 33 | 34 | ||
| 34 | startup_32: | 35 | startup_32: |
| 35 | cld | 36 | /* check to see if KEEP_SEGMENTS flag is meaningful */ |
| 36 | cli | 37 | cmpw $0x207, BP_version(%esi) |
| 38 | jb 1f | ||
| 39 | |||
| 40 | /* test KEEP_SEGMENTS flag to see if the bootloader is asking | ||
| 41 | * us to not reload segments */ | ||
| 42 | testb $(1<<6), BP_loadflags(%esi) | ||
| 43 | jnz 2f | ||
| 44 | |||
| 45 | 1: cli | ||
| 37 | movl $(__BOOT_DS),%eax | 46 | movl $(__BOOT_DS),%eax |
| 38 | movl %eax,%ds | 47 | movl %eax,%ds |
| 39 | movl %eax,%es | 48 | movl %eax,%es |
| @@ -41,6 +50,8 @@ startup_32: | |||
| 41 | movl %eax,%gs | 50 | movl %eax,%gs |
| 42 | movl %eax,%ss | 51 | movl %eax,%ss |
| 43 | 52 | ||
| 53 | 2: cld | ||
| 54 | |||
| 44 | /* Calculate the delta between where we were compiled to run | 55 | /* Calculate the delta between where we were compiled to run |
| 45 | * at and where we were actually loaded at. This can only be done | 56 | * at and where we were actually loaded at. This can only be done |
| 46 | * with a short local call on x86. Nothing else will tell us what | 57 | * with a short local call on x86. Nothing else will tell us what |
