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