87 lines
2.6 KiB
ArmAsm
87 lines
2.6 KiB
ArmAsm
/*
|
|
* head.S for bootstub to load protected mode kernel
|
|
*
|
|
* Copyright (C) 2008-2010 Intel Corporation.
|
|
* Author: Alek Du <alek.du@intel.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
*
|
|
* 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:
|
|
* ~ ~
|
|
* 0x1102000 | initrd | initrd will move to highest memory otherwise
|
|
*+bzImage size +-----------------------+ bzImage uncompressing will destory it
|
|
* | bzImage |
|
|
* 0x1102000 +-----------------------+
|
|
* | boot stub |
|
|
* 0x1101000 +-----------------------+
|
|
* | free space |
|
|
* | used as stack |
|
|
* 0x1100110 +-----------------------+
|
|
* | SPI0 or SPI1 | MIC need to fill it:
|
|
* | | 0x0: SPI0, 0x1: SPI1
|
|
* 0x110010c +-----------------------+
|
|
* | boot stub spi uart | MIC need to fill it:
|
|
* | suppression flag | 0x1 suppression, 0x0 default
|
|
* 0x1100108 +-----------------------+
|
|
* | initrd size | MIC need to fill it: initrd file size
|
|
* 0x1100104 +-----------------------+
|
|
* | bzImage size | MIC need to fill it: bzImage file size
|
|
* 0x1100100 +-----------------------+
|
|
* | kernel cmdline | MIC need to fill it
|
|
* 0x1100000 +-----------------------+
|
|
*/
|
|
|
|
#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
|
|
calll bootstub
|
|
/* after call bootstub, GDT is set, IDT is clear
|
|
* eax contains 32-bit entry of bzImage
|
|
*/
|
|
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
|
|
mov %eax, %ecx
|
|
mov mb_magic, %eax
|
|
mov mb_info, %ebx
|
|
|
|
jmpl *%ecx # Jump to the 32-bit entrypoint
|