4 * Copyright (C) 1991, 1992, 1993 Linus Torvalds
8 * head.S contains the 32-bit startup code.
10 * NOTE!!! Startup happens at absolute address 0x00001000, which is also where
11 * the page directory will exist. The startup code will be overwritten by
12 * the page directory. [According to comments etc elsewhere on a compressed
13 * kernel it will end up at 0x1000 + 1Mb I hope so as I assume this. - AC]
15 * Page 0 is deliberately kept safe, since System Management Mode code in
16 * laptops may need to access the BIOS data stored there. This is also
17 * useful for future device drivers that either access the BIOS via VM86
22 * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
26 #include <linux/linkage.h>
27 #include <asm/segment.h>
31 #define __BOOT_CS 0x10
33 #define __BOOT_DS 0x18
41 movl $(__BOOT_DS),%eax
49 1: incl %eax # check that A20 really IS enabled
50 movl %eax,0x000000 # loop forever if it isn't
55 * Initialize eflags. Some BIOS's leave bits like NT set. This would
56 * confuse the debugger if this code is traced.
57 * XXX - best to initialize before switching to protected mode.
72 * Do the decompression, and jump to the new kernel..
74 subl $16,%esp # place for structure on the stack
76 pushl %esi # real mode pointer as second arg
77 pushl %eax # address of structure as first arg
78 call decompress_kernel
81 popl %esi # discard address
82 popl %esi # real mode pointer
84 ljmp $(__BOOT_CS), $__PHYSICAL_START
87 * We come here, if we were loaded high.
88 * We need to move the move-in-place routine down to 0x1000
89 * and then start it with the buffer addresses in registers,
90 * which we got from the stack.
93 movl $move_routine_start,%esi
95 movl $move_routine_end,%ecx
103 popl %esi # discard the address
104 popl %ebx # real mode pointer
105 popl %esi # low_buffer_start
107 popl %edx # high_buffer_start
109 movl $__PHYSICAL_START,%edi
110 cli # make sure we don't get interrupted
111 ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine
114 * Routine (template) for moving the decompressed kernel in place,
115 * if we were high loaded. This _must_ PIC-code !
127 movl %eax,%ecx # NOTE: rep movsb won't move if %ecx == 0
132 movl %ebx,%esi # Restore setup pointer
134 ljmp $(__BOOT_CS), $__PHYSICAL_START