Rev 3783 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3783 | Rev 3817 | ||
|---|---|---|---|
| Line 137... | Line 137... | ||
| 137 | __hypercall_fast(p1, p2, p3, p4, 0, function_number) |
137 | __hypercall_fast(p1, p2, p3, p4, 0, function_number) |
| 138 | #define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \ |
138 | #define __hypercall_fast5(function_number, p1, p2, p3, p4, p5) \ |
| 139 | __hypercall_fast(p1, p2, p3, p4, p5, function_number) |
139 | __hypercall_fast(p1, p2, p3, p4, p5, function_number) |
| 140 | 140 | ||
| 141 | /** |
141 | /** |
| 142 | * Performs a fast hypervisor API call which can returns a value. |
142 | * Performs a fast hypervisor API call which returns no value except for the |
| - | 143 | * error status. |
|
| 143 | * |
144 | * |
| 144 | * @param p1 the 1st argument of the hypervisor API call |
145 | * @param p1 the 1st argument of the hypervisor API call |
| 145 | * @param p2 the 2nd argument of the hypervisor API call |
146 | * @param p2 the 2nd argument of the hypervisor API call |
| 146 | * @param p3 the 3rd argument of the hypervisor API call |
147 | * @param p3 the 3rd argument of the hypervisor API call |
| 147 | * @param p4 the 4th argument of the hypervisor API call |
148 | * @param p4 the 4th argument of the hypervisor API call |
| 148 | * @param p5 the 5th argument of the hypervisor API call |
149 | * @param p5 the 5th argument of the hypervisor API call |
| 149 | * @param function_number function number of the call |
150 | * @param function_number function number of the call |
| 150 | * @param ret1 pointer to an address where the return value |
- | |
| 151 | * of the hypercall should be saved, or NULL |
- | |
| 152 | * @return error status |
151 | * @return error status |
| 153 | */ |
152 | */ |
| 154 | static inline uint64_t |
153 | static inline uint64_t |
| 155 | __hypercall_fast_ret1(const uint64_t p1, const uint64_t p2, const uint64_t p3, |
154 | __hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3, |
| 156 | const uint64_t p4, const uint64_t p5, const uint64_t function_number, |
155 | const uint64_t p4, const uint64_t p5, const uint64_t function_number) |
| 157 | uint64_t * const ret1) |
- | |
| 158 | { |
156 | { |
| 159 | register uint64_t a6 asm("o5") = function_number; |
157 | register uint64_t a6 asm("o5") = function_number; |
| 160 | register uint64_t a1 asm("o0") = p1; |
158 | register uint64_t a1 asm("o0") = p1; |
| 161 | register uint64_t a2 asm("o1") = p2; |
159 | register uint64_t a2 asm("o1") = p2; |
| 162 | register uint64_t a3 asm("o2") = p3; |
160 | register uint64_t a3 asm("o2") = p3; |
| Line 168... | Line 166... | ||
| 168 | : "=r" (a1) |
166 | : "=r" (a1) |
| 169 | : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), |
167 | : "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), |
| 170 | "i" (FAST_TRAP) |
168 | "i" (FAST_TRAP) |
| 171 | : "memory" |
169 | : "memory" |
| 172 | ); |
170 | ); |
| 173 | 171 | ||
| 174 | if (ret1 != NULL) |
- | |
| 175 | *ret1 = a2; |
- | |
| 176 | return a1; |
172 | return a1; |
| 177 | } |
173 | } |
| 178 | 174 | ||
| 179 | /** |
175 | /** |
| 180 | * Performs a fast hypervisor API call which return no value except for the |
176 | * Performs a fast hypervisor API call which can return a value. |
| 181 | * error status. |
- | |
| 182 | * |
177 | * |
| 183 | * @param p1 the 1st argument of the hypervisor API call |
178 | * @param p1 the 1st argument of the hypervisor API call |
| 184 | * @param p2 the 2nd argument of the hypervisor API call |
179 | * @param p2 the 2nd argument of the hypervisor API call |
| 185 | * @param p3 the 3rd argument of the hypervisor API call |
180 | * @param p3 the 3rd argument of the hypervisor API call |
| 186 | * @param p4 the 4th argument of the hypervisor API call |
181 | * @param p4 the 4th argument of the hypervisor API call |
| 187 | * @param p5 the 5th argument of the hypervisor API call |
182 | * @param p5 the 5th argument of the hypervisor API call |
| 188 | * @param function_number function number of the call |
183 | * @param function_number function number of the call |
| - | 184 | * @param ret1 pointer to an address where the return value |
|
| - | 185 | * of the hypercall should be saved, or NULL |
|
| 189 | * @return error status |
186 | * @return error status |
| 190 | */ |
187 | */ |
| 191 | static inline uint64_t |
188 | static inline uint64_t |
| 192 | __hypercall_fast(const uint64_t p1, const uint64_t p2, const uint64_t p3, |
189 | __hypercall_fast_ret1(const uint64_t p1, const uint64_t p2, const uint64_t p3, |
| 193 | const uint64_t p4, const uint64_t p5, const uint64_t function_number) |
190 | const uint64_t p4, const uint64_t p5, const uint64_t function_number, |
| - | 191 | uint64_t * const ret1) |
|
| 194 | { |
192 | { |
| 195 | return __hypercall_fast_ret1(p1, p2, p3, p4, p5, function_number, |
193 | uint64_t errno = __hypercall_fast(p1, p2, p3, p4, p5, function_number); |
| 196 | NULL); |
194 | if (ret1 != NULL) { |
| - | 195 | asm volatile ("mov %%o1, %0\n" : "=r" (*ret1)); |
|
| - | 196 | } |
|
| - | 197 | return errno; |
|
| 197 | } |
198 | } |
| 198 | 199 | ||
| 199 | /** |
200 | /** |
| 200 | * Performs a hyperfast hypervisor API call. |
201 | * Performs a hyperfast hypervisor API call. |
| 201 | * |
202 | * |