Makefiles: export the firmware type as a cpp variable
[syslinux.git] / memdisk / start32.S
blobecebe684cbcf64c830c8c59144daf2ea7dfed884
1 /* -----------------------------------------------------------------------
2  *
3  *   Copyright 2003-2009 H. Peter Anvin - All Rights Reserved
4  *   Copyright 2009 Intel Corporation; author: H. Peter Anvin
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
9  *   Boston MA 02110-1301, USA; either version 2 of the License, or
10  *   (at your option) any later version; incorporated herein by reference.
11  *
12  * ----------------------------------------------------------------------- */
15  * Simple stub to get us to the right point in the 32-bit code;
16  * this module must be linked first
17  */
19         .section ".init", "ax"
20         .globl _start
21 _start:
22         /* Zero the bss */
23         cld
24         movl    $__bss_start, %edi
25         movl    $__bss_end, %ecx
26         subl    %edi, %ecx
27         xorl    %eax, %eax
28         shrl    $2, %ecx
29         rep ; stosl
31         /* Set up the protected-mode IDT and the interrupt jump buffers */
32         movl    $idt, %edi
33         movl    $ijb, %eax
34         movl    $0xee000000, %ebx       /* Interrupt gate */
35         movw    %cs, %bx                /* Target segment */
37         /* Make the IDT */
38         movl    $256, %ecx
40         stosl
41         stosl
42         movl    %ebx, -6(%edi)
43         addl    $8, %eax
44         loop    1b
46         /*
47          * Each entry in the interrupt jump buffer contains the following
48          * instructions:
49          *
50          * 60           pushal
51          * b0xx         movb $xx, %al           # interrupt number
52          * e9xxxxxxxx   jmp handle_interrupt
53          */
54         movl    $0xe900b060, %eax
55         movl    $256, %ecx
57         movl    %eax, (%edi)
58         addl    $(1 << 16), %eax
59         movl    $handle_interrupt-8, %edx
60         subl    %edi, %edx
61         movl    %edx, 4(%edi)
62         addl    $8, %edi
63         loop    1b
65 #if __SIZEOF_POINTER__ == 4
66         lidtl   idt_ptr
67 #elif __SIZEOF_POINTER__ == 8
68         lidt    idt_ptr
69 #else
70 #error "unsupported architecture"
71 #endif
72         
73         /* Save arguments, switch stacks */
74         movl    %esp, %eax              /* Pointer to arguments */
75         movl    $__stack_end, %esp
76         
77         call    setup
78         jmp     *(rm_args)              /* First argument is return */
80         .section ".text","ax"
81         .globl  intcall
82         .type   intcall, @function
83 intcall:
84         jmp     *(rm_args+1*4)          /* Intcall is argument 1 */
85         .size   intcall, .-intcall
87         .type   handle_interrupt, @function
88 handle_interrupt:
89         jmp     *(rm_args+4*4)          /* Interrupt pointer is argument 4 */
90         .size   handle_interrupt, .-handle_interrupt
92         .section ".rodata","a"
93 idt_ptr:
94         .word   8*256-1
95         .long   idt
96         .word   0
98         .section ".bss.large","aw"
99         .balign 2048
100 idt:
101         .space  8*256
102 ijb:
103         .space  8*256
105 __stack:
106         .space  65536
107 __stack_end: