blob: db18a5195fc1be97aecf135a5196a672dda99837 [file] [log] [blame]
Jordan Crousef6145c32008-03-19 23:56:58 +00001/*
2 * This file is part of the libpayload project.
3 *
4 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
Uwe Hermann6a441bf2008-03-20 19:54:59 +000029
Jordan Crouse20c9cf12008-10-20 16:51:43 +000030 .code32
Jordan Crousef6145c32008-03-19 23:56:58 +000031 .global _entry, _leave
32 .text
33 .align 4
34
Uwe Hermann6a441bf2008-03-20 19:54:59 +000035/*
36 * Our entry point - assume that the CPU is in 32 bit protected mode and
37 * all segments are in a flat model. That's our operating mode, so we won't
38 * change anything.
Jordan Crousef6145c32008-03-19 23:56:58 +000039 */
Jordan Crousef6145c32008-03-19 23:56:58 +000040_entry:
41 call _init
42
Uwe Hermann6a441bf2008-03-20 19:54:59 +000043 /* We're back - go back to the bootloader. */
Jordan Crousef6145c32008-03-19 23:56:58 +000044 ret
45
Jordan Crouse20c9cf12008-10-20 16:51:43 +000046 .align 4
47
48#define MB_MAGIC 0x1BADB002
49#define MB_FLAGS 0x00010003
50
51mb_header:
52 .long MB_MAGIC
53 .long MB_FLAGS
54 .long -(MB_MAGIC + MB_FLAGS)
55 .long mb_header
56 .long _start
57 .long _edata
58 .long _end
59 .long _init
60
Uwe Hermann6a441bf2008-03-20 19:54:59 +000061/*
62 * This function saves off the previous stack and switches us to our
63 * own execution environment.
64 */
Jordan Crousef6145c32008-03-19 23:56:58 +000065_init:
Uwe Hermann6a441bf2008-03-20 19:54:59 +000066 /* No interrupts, please. */
Jordan Crousef6145c32008-03-19 23:56:58 +000067 cli
68
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000069 /* Store current stack pointer. */
Jordan Crousef6145c32008-03-19 23:56:58 +000070 movl %esp, %esi
71
Jordan Crouse20c9cf12008-10-20 16:51:43 +000072 /* Store EAX and EBX */
73
74 movl %eax,loader_eax
75 movl %ebx,loader_ebx
76
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000077 /* Setup new stack. */
Jordan Crouse38604042008-04-05 01:07:27 +000078 movl $_stack, %ebx
Jordan Crousef6145c32008-03-19 23:56:58 +000079
Jordan Crouse38604042008-04-05 01:07:27 +000080 movl %ebx, %esp
Jordan Crousef6145c32008-03-19 23:56:58 +000081
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000082 /* Save old stack pointer. */
83 pushl %esi
Jordan Crousef6145c32008-03-19 23:56:58 +000084
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000085 /* Let's rock. */
86 call start_main
Jordan Crouse9dac1b42008-05-20 20:10:49 +000087
88 /* %eax has the return value - pass it on unmolested */
Jordan Crousef6145c32008-03-19 23:56:58 +000089_leave:
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000090 /* Get old stack pointer. */
91 popl %ebx
Jordan Crousef6145c32008-03-19 23:56:58 +000092
Klaus Schnass2c6b33c2008-03-31 21:02:29 +000093 /* Restore old stack. */
Jordan Crouse9dac1b42008-05-20 20:10:49 +000094 movl %ebx, %esp
Jordan Crousef6145c32008-03-19 23:56:58 +000095
Uwe Hermann6a441bf2008-03-20 19:54:59 +000096 /* Return to the original context. */
Jordan Crouse9dac1b42008-05-20 20:10:49 +000097 ret