59 lines
1.2 KiB
ArmAsm
59 lines
1.2 KiB
ArmAsm
|
/*
|
||
|
* 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 0x00001000, which is also where
|
||
|
* the page directory will exist. The startup code will be overwritten by
|
||
|
* the page directory.
|
||
|
*
|
||
|
* Page 0 is deliberately kept safe, since System Management Mode code in
|
||
|
* laptops may need to access the BIOS data stored there. This is also
|
||
|
* useful for future device drivers that either access the BIOS via VM86
|
||
|
* mode.
|
||
|
*/
|
||
|
.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
|