summaryrefslogtreecommitdiff
path: root/head.S
blob: 177a94a4ef8f3b14f11f56237fdd07f68cbf5e64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* head.S for bootstub to load protected mode kernel
 * Copyright (C) 2008 Alek Du <alek.du@intel.com>
 * 
 * Note. When FW hand-off control to bootstub, the CPU is already in protected
 * Mode with 1. GDT(8)=4G GDT(10)=4G
 *           2. CS=8, DS=ES=FS=GS=10
 *           3. Paging mode disabled
 *           4. Interrupt ENABLED
 */ 

/* When bootstub get control, the memory map in DRAM is like:
 *		~			~
 * 0x102000	|	initrd		| initrd will move to highest memory otherwise 
 *+bzImage size +-----------------------+ bzImage uncompressing will destory it
 *		|	bzImage		|
 * 0x102000	+-----------------------+
 *		|	boot stub	|
 * 0x101000	+-----------------------+
 *		|	free space	|
 *		|	used as stack	|
 * 0x100108	+-----------------------+
 *		|	initrd size	| MIC need to fill it according to bzImage size
 * 0x100104	+-----------------------+
 *		|	bzImage size	| MIC need to fill it according to initrd  size
 * 0x100100	+-----------------------+
 *		|	kernel cmdline	| MIC need to fill it
 * 0x100000	+-----------------------+
*/

#include "bootstub.h"

.text

.section ".text.head","ax",@progbits
	.globl _start

_start:
	cld
	cli
	/* setup stack, because we are heading off to "C" */
	movl $STACK_OFFSET, %esp
	/* after call bootstub, GDT was set (0x10 and 0x18) IDT was clear
	 * eax will store 32bit entry of bzImage
         */
	calll bootstub
	/* DS=ES=FS=GS=10 */
	movl $__BOOT_DS, %ebx	
	movl %ebx, %ds
	movl %ebx, %es
	movl %ebx, %fs
	movl %ebx, %gs
	movl %ebx, %ss
	ljmp $__BOOT_CS,$1f
1:	
	/* tell kernel where is boot_param */
	movl $(BOOT_PARAMS_OFFSET), %esi
	xor %ebp, %ebp
	xor %edi, %edi
	xor %ebx, %ebx
	
	jmpl *%eax    # Jump to the 32-bit entrypoint