Upgraded GRUB2 to 2.00 release.
[AROS.git] / arch / all-pc / boot / grub2-aros / grub-core / kern / i386 / int.S
blob7edace4045ce5eaa1e76ae5337be4300f09804fe
1 /*
2  *  GRUB  --  GRand Unified Bootloader
3  *  Copyright (C) 2010,2011 Free Software Foundation, Inc.
4  *
5  *  GRUB is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  GRUB is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
17  */
19 FUNCTION(grub_bios_interrupt)
20         pushf
21         cli
22         popf
23         pushl    %ebp
24         pushl    %ecx
25         pushl    %eax
26         pushl    %ebx
27         pushl    %esi
28         pushl    %edi   
29         pushl    %edx
30         
31         movb     %al, intno
32         movl     (%edx), %eax
33         movl     %eax, LOCAL(bios_register_eax)
34         movw     4(%edx), %ax
35         movw     %ax, LOCAL(bios_register_es)
36         movw     6(%edx), %ax
37         movw     %ax, LOCAL(bios_register_ds)
38         movw     8(%edx), %ax
39         movw     %ax, LOCAL(bios_register_flags)
41         movl    12(%edx), %ebx
42         movl    16(%edx), %ecx
43         movl    20(%edx), %edi
44         movl    24(%edx), %esi
45         movl    28(%edx), %edx
47         PROT_TO_REAL
48         .code16
49         pushf
50         cli
51         
52         mov     %ds, %ax
53         push    %ax
55         /* movw imm16, %ax*/
56         .byte   0xb8
57 LOCAL(bios_register_es):
58         .short  0
59         movw    %ax, %es
60         /* movw imm16, %ax*/
61         .byte   0xb8
62 LOCAL(bios_register_ds):
63         .short  0
64         movw    %ax, %ds
66         /* movw imm16, %ax*/
67         .byte   0xb8
68 LOCAL(bios_register_flags):
69         .short  0
70         push    %ax
71         popf
73         /* movl imm32, %eax*/
74         .byte   0x66, 0xb8
75 LOCAL(bios_register_eax):
76         .long   0
77         
78         /* int imm8.  */
79         .byte   0xcd
80 intno:  
81         .byte   0
83         movl    %eax, %cs:LOCAL(bios_register_eax)
84         movw    %ds, %ax
85         movw    %ax, %cs:LOCAL(bios_register_ds)
86         pop     %ax
87         mov     %ax, %ds
88         pushf
89         pop     %ax
90         movw    %ax, LOCAL(bios_register_flags)
91         mov     %es, %ax
92         movw    %ax, LOCAL(bios_register_es)
94         popf
95         REAL_TO_PROT
96         .code32
98         popl    %eax
100         movl    %ebx, 12(%eax)
101         movl    %ecx, 16(%eax)
102         movl    %edi, 20(%eax)
103         movl    %esi, 24(%eax)
104         movl    %edx, 28(%eax)
106         movl     %eax, %edx
108         movl     LOCAL(bios_register_eax), %eax
109         movl     %eax, (%edx)
110         movw     LOCAL(bios_register_es), %ax
111         movw     %ax, 4(%edx)
112         movw     LOCAL(bios_register_ds), %ax
113         movw     %ax, 6(%edx)
114         movw     LOCAL(bios_register_flags), %ax
115         movw     %ax, 8(%edx)
117         popl    %edi
118         popl    %esi
119         popl    %ebx
120         popl    %eax
121         popl    %ecx
122         popl    %ebp
123         ret