2009-07-20 Joe Auricchio <jauricchio@gmail.com>
[grub2/phcoder.git] / efiemu / runtime / efiemu.S
blobb502314ee346bb670f838b676c262b06c799f7b2
1 /*
2  *  GRUB  --  GRand Unified Bootloader
3  *  Copyright (C) 2006,2007,2009  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 #include <grub/symbol.h>
22  * x86_64 uses registry to pass parameters. Unfortunately, gcc and efi use
23  * different call conversion, so we need to do some conversion.
24  *
25  * gcc:
26  *   %rdi,  %rsi,  %rdx,  %rcx, %r8, %r9, 8(%rsp), 16(%rsp), ...
27  *
28  * efi:
29  *   %rcx,  %rdx,  %r8,  %r9,  32(%rsp), 40(%rsp), 48(%rsp), ...
30  *
31  */
33         .file   "efiemu.S"
34         .text
36 FUNCTION (efiemu_get_time)
37         push %rdi
38         push %rsi
39         mov %rcx, %rdi
40         mov %rdx, %rsi
41         call efiemu_get_time_real
42         pop %rsi
43         pop %rdi
44         ret
46 FUNCTION (efiemu_set_time)
47         push %rdi
48         push %rsi
49         mov %rcx, %rdi
50         call efiemu_set_time_real
51         pop %rsi
52         pop %rdi
53         ret
56 FUNCTION (efiemu_get_wakeup_time)
57         push %rdi
58         push %rsi
59         mov %rcx, %rdi
60         mov %rdx, %rsi
61         mov %r8, %rdx
62         call efiemu_get_wakeup_time_real
63         pop %rsi
64         pop %rdi
65         ret
67 FUNCTION (efiemu_set_wakeup_time)
68         push %rdi
69         push %rsi
70         mov %rcx, %rdi
71         mov %rdx, %rsi
72         call efiemu_set_wakeup_time_real
73         pop %rsi
74         pop %rdi
75         ret
77 FUNCTION (efiemu_get_variable)
78         push %rdi
79         push %rsi
80         mov %rcx, %rdi
81         mov %rdx, %rsi
82         mov %r8, %rdx
83         mov %r9, %rcx
84         mov 56(%rsp), %r8
85         call efiemu_get_variable_real
86         pop %rsi
87         pop %rdi
88         ret
90 FUNCTION (efiemu_get_next_variable_name)
91         push %rdi
92         push %rsi
93         mov %rcx, %rdi
94         mov %rdx, %rsi
95         mov %r8, %rdx
96         call efiemu_get_next_variable_name_real
97         pop %rsi
98         pop %rdi
99         ret
101 FUNCTION (efiemu_set_variable)
102         push %rdi
103         push %rsi
104         mov %rcx, %rdi
105         mov %rdx, %rsi
106         mov %r8, %rdx
107         mov %r9, %rcx
108         mov 56(%rsp), %r8
109         call efiemu_set_variable_real
110         pop %rsi
111         pop %rdi
112         ret
114 FUNCTION (efiemu_get_next_high_monotonic_count)
115         push %rdi
116         push %rsi
117         mov %rcx, %rdi
118         call efiemu_get_next_high_monotonic_count_real
119         pop %rsi
120         pop %rdi
121         ret
123 FUNCTION (efiemu_reset_system)
124         push %rdi
125         push %rsi
126         mov %rcx, %rdi
127         mov %rdx, %rsi
128         mov %r8, %rdx
129         mov %r9, %rcx
130         call efiemu_reset_system_real
131         pop %rsi
132         pop %rdi
133         ret
135         /* The following functions are always called in physical mode */
136         .section ".text-physical", "ax"
138 FUNCTION (efiemu_set_virtual_address_map)
139         push %rdi
140         push %rsi
141         mov %rcx, %rdi
142         mov %rdx, %rsi
143         mov %r8, %rdx
144         mov %r9, %rcx
145         call efiemu_set_virtual_address_map_real
146         pop %rsi
147         pop %rdi
148         ret
150 FUNCTION (efiemu_convert_pointer)
151         push %rdi
152         push %rsi
153         mov %rcx, %rdi
154         mov %rdx, %rsi
155         call efiemu_convert_pointer_real
156         pop %rsi
157         pop %rdi
158         ret