| /* |
| * linux/boot/head.S |
| * |
| * Copyright (C) 1991, 1992, 1993 Linus Torvalds |
| */ |
| |
| /* |
| * head.S contains the 32-bit startup code. |
| * |
| * NOTE!!! Startup happens at absolute address 0x00000000, which is also where |
| * the page directory will exist. The startup code will be overwritten by |
| * the page directory. |
| */ |
| .text |
| |
| #include <linux/segment.h> |
| |
| startup_32: |
| cld |
| cli |
| movl $KERNEL_DS,%eax |
| mov %ax,%ds |
| mov %ax,%es |
| mov %ax,%fs |
| mov %ax,%gs |
| lss _stack_start,%esp |
| xorl %eax,%eax |
| 1: incl %eax # check that A20 really IS enabled |
| movl %eax,0x000000 # loop forever if it isn't |
| cmpl %eax,0x100000 |
| je 1b |
| /* |
| * Initialize eflags. Some BIOS's leave bits like NT set. This would |
| * confuse the debugger if this code is traced. |
| * XXX - best to initialize before switching to protected mode. |
| */ |
| pushl $0 |
| popfl |
| /* |
| * Clear BSS |
| */ |
| xorl %eax,%eax |
| movl $__edata,%edi |
| movl $__end,%ecx |
| subl %edi,%ecx |
| cld |
| rep |
| stosb |
| /* |
| * Do the decompression, and jump to the new kernel.. |
| */ |
| call _decompress_kernel |
| ljmp $KERNEL_CS, $0x100000 |