1278bdf4ed3f50071d1513ade6bff408d4c823ba
[coreboot.git] / payloads / libpayload / i386 / head.S
1 /*
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  */
29         
30         .global _entry, _leave
31         .text
32         .align 4
33
34 /* Our entry point - assume that the CPU is in
35  *  32 bit protected mode and all segments are in a
36  *  flat model.  Thats our operating mode, so we won't
37  *  change anything
38  */
39         
40 _entry:
41         call _init
42
43         /* We're back - go back to the bootloader */
44         ret
45
46 /* This function saves off the previous stack and
47    switches us to our own execution enviornment
48 */      
49
50 _init:
51         /* No interrupts, please */
52         cli
53
54         /* Get the current stack pointer */
55         movl %esp, %esi
56
57         movl _istack, %ebx
58
59         /* lret needs %cs in the stack, so copy it over */
60         movw %cs, 4(%ebx)
61
62         /* Exchange the current stack pointer for the one in
63            the initial stack (which happens to be the new
64            stack pointer) */
65
66         xchgl %esi, 16(%ebx)
67
68         /* Set the new stack pointer */
69         movl %esi, %esp
70
71         /* Return into the main entry function
72            and go
73          */
74
75         lret
76
77 _leave:
78         movl _istack, %ebx
79
80         /* Restore the stack pointer from the storage area */
81         movl 16(%ebx), %esp
82
83         /* Return to the original context */
84         lret
85