Handle loading above 1 MB, for bug-compatibility with Grub
[wraplinux.git] / highmove / highmove.S
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2008 rPath, Inc. - All Rights Reserved
4  *   Copyright 2010 Intel Corporation; author: H. Peter Anvin
5  *
6  *   Permission is hereby granted, free of charge, to any person
7  *   obtaining a copy of this software and associated documentation
8  *   files (the "Software"), to deal in the Software without
9  *   restriction, including without limitation the rights to use,
10  *   copy, modify, merge, publish, distribute, sublicense, and/or
11  *   sell copies of the Software, and to permit persons to whom
12  *   the Software is furnished to do so, subject to the following
13  *   conditions:
14  *
15  *   The above copyright notice and this permission notice shall
16  *   be included in all copies or substantial portions of the Software.
17  *
18  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20  *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22  *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23  *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25  *   OTHER DEALINGS IN THE SOFTWARE.
26  *
27  * ----------------------------------------------------------------------- */
28
29 /*
30  * Stub to work around Grub, or other loaders which can't load directly
31  * into low memory.  This code needs four parameters which should
32  * immediately precede it: source of code to be copied, target of code
33  * to be copied, length of code to be copied, post-copy entry point.
34  */
35                 /* Parameters */
36                 .section ".startupinfo","a",@progbits
37 mv_src:         .long   0
38 mv_dst:         .long   0
39 mv_len:         .long   0
40 mv_entry:       .long   0
41
42                 /* We will be entered in flat 32-bit protected mode... */
43                 .section ".start","ax",@progbits
44                 .globl  _start
45                 .code32
46 _start:
47                 call    1f
48 1:              pushfl
49                 pushl   %ecx
50                 pushl   %ebx
51                 pushl   %esi
52                 pushl   %edi
53                 movl    (5*4)(%esp), %ebx
54                 subl    $1b, %ebx
55
56                 movl    mv_entry(%ebx), %ecx
57                 movl    %ecx, (5*4)(%esp)       /* Where to go next */
58
59                 movl    mv_src(%ebx), %esi
60                 movl    mv_dst(%ebx), %edi
61                 movl    mv_len(%ebx), %ecx
62                 addl    $3, %ecx
63                 shrl    $2, %ecx
64
65                 cld
66                 rep ; movsl
67
68                 popl    %edi
69                 popl    %esi
70                 popl    %ebx
71                 popl    %ecx
72                 popfl
73                 retl                            /* Goes to the entry point */