1/*
2 * head.S for bootstub to load protected mode kernel
3 *
4 * Copyright (C) 2008-2010 Intel Corporation.
5 * Author: Alek Du <alek.du@intel.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms and conditions of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22/*
23 *
24 * Note. When FW hand-off control to bootstub, the CPU is already in protected
25 * Mode with 1. GDT(8)=4G GDT(10)=4G
26 *           2. CS=8, DS=ES=FS=GS=10
27 *           3. Paging mode disabled
28 *           4. Interrupt ENABLED
29 *
30 * When bootstub get control, the memory map in DRAM is like:
31 *		~			~
32 * 0x1102000	|	initrd		| initrd will move to highest memory otherwise
33 *+bzImage size +-----------------------+ bzImage uncompressing will destory it
34 *		|	bzImage		|
35 * 0x1102000	+-----------------------+
36 *		|	boot stub	|
37 * 0x1101000	+-----------------------+
38 *		|	free space	|
39 *		|	used as stack	|
40 * 0x1100110	+-----------------------+
41 *		|	SPI0 or SPI1	| MIC need to fill it:
42 *		|			| 0x0: SPI0, 0x1: SPI1
43 * 0x110010c	+-----------------------+
44 *		|   boot stub spi uart	| MIC need to fill it:
45 *		|   suppression flag	| 0x1 suppression, 0x0 default
46 * 0x1100108	+-----------------------+
47 *		|	initrd size	| MIC need to fill it: initrd file size
48 * 0x1100104	+-----------------------+
49 *		|	bzImage size	| MIC need to fill it: bzImage file size
50 * 0x1100100	+-----------------------+
51 *		|	kernel cmdline	| MIC need to fill it
52 * 0x1100000	+-----------------------+
53*/
54
55#include "bootstub.h"
56
57.text
58
59.section ".text.head","ax",@progbits
60	.globl _start
61
62_start:
63	cld
64	cli
65	/* setup stack, because we are heading off to "C" */
66	movl $STACK_OFFSET, %esp
67	calll bootstub
68	/* after call bootstub, GDT is set, IDT is clear
69	* eax contains 32-bit entry of bzImage
70	*/
71	movl $__BOOT_DS, %ebx
72	movl %ebx, %ds
73	movl %ebx, %es
74	movl %ebx, %fs
75	movl %ebx, %gs
76	movl %ebx, %ss
77	ljmp $__BOOT_CS,$1f
781:
79	/* tell kernel where is boot_param */
80	movl $(BOOT_PARAMS_OFFSET), %esi
81	xor %ebp, %ebp
82	xor %edi, %edi
83	mov %eax, %ecx
84	mov mb_magic, %eax
85	mov mb_info, %ebx
86
87	jmpl *%ecx    # Jump to the 32-bit entrypoint
88