1206376Srpaulo/*- 2206376Srpaulo * Copyright (c) 2008-2010 Rui Paulo <rpaulo@FreeBSD.org> 3206376Srpaulo * All rights reserved. 4206376Srpaulo * 5206376Srpaulo * Redistribution and use in source and binary forms, with or without 6206376Srpaulo * modification, are permitted provided that the following conditions 7206376Srpaulo * are met: 8206376Srpaulo * 1. Redistributions of source code must retain the above copyright 9206376Srpaulo * notice, this list of conditions and the following disclaimer. 10206376Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 11206376Srpaulo * notice, this list of conditions and the following disclaimer in the 12206376Srpaulo * documentation and/or other materials provided with the distribution. 13206376Srpaulo * 14206376Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15206376Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16206376Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17206376Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18206376Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19206376Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20206376Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21206376Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22206376Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23206376Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24206376Srpaulo * SUCH DAMAGE. 25206376Srpaulo * 26206376Srpaulo * $FreeBSD$ 27206376Srpaulo */ 28206376Srpaulo 29206376Srpaulo .text 30206376Srpaulo 31206376Srpaulo#include <machine/asm.h> 32206376Srpaulo 33206376Srpaulo#define EFI_SUCCESS 0 34206376Srpaulo 35206376Srpaulo/* 36206376Srpaulo * EFI entry point. 37206376Srpaulo * _start(EFI_IMAGE image_handle, EFI_SYSTEM_TABLE *system_table); 38206376Srpaulo * 39206376Srpaulo * We calculate the base address along with _DYNAMIC, relocate us and finally 40206376Srpaulo * pass control to efi_main. 41206376Srpaulo */ 42206376Srpaulo 43206376SrpauloENTRY(_start) 44206376Srpaulo pushl %ebp 45206376Srpaulo movl %esp, %ebp 46206376Srpaulo 47206376Srpaulo pushl 12(%ebp) /* image_handle */ 48206376Srpaulo pushl 8(%ebp) /* system_table */ 49206376Srpaulo call 0f 50206376Srpaulo0: popl %eax 51206376Srpaulo movl %eax, %ebx 52206376Srpaulo addl $ImageBase-0b, %eax 53206376Srpaulo addl $_DYNAMIC-0b, %ebx 54206376Srpaulo pushl %ebx /* dynamic */ 55206376Srpaulo pushl %eax /* ImageBase */ 56206376Srpaulo call _reloc 57206376Srpaulo cmpl $EFI_SUCCESS, %eax 58206376Srpaulo jne 1f 59206376Srpaulo popl %ebx /* remove ImageBase from the stack */ 60206376Srpaulo popl %ebx /* remove dynamic from the stack */ 61206376Srpaulo call efi_main 62206376Srpaulo1: leave 63206376Srpaulo ret 64206376SrpauloEND(_start) 65206376Srpaulo 66206376Srpaulo .data 67206376Srpaulo .section .reloc, "a" 68206376Srpaulo .long 0 69206376Srpaulo .long 10 70206376Srpaulo .word 0 71