tcc.c revision 1.1.1.1.36.1 1 1.1.1.1.36.1 christos /* $NetBSD: tcc.c,v 1.1.1.1.36.1 2019/06/10 22:08:34 christos Exp $ */
2 1.1 jakllsch
3 1.1 jakllsch /*
4 1.1 jakllsch * Test if our calling convention gymnastics actually work
5 1.1 jakllsch */
6 1.1 jakllsch
7 1.1 jakllsch #include <efi.h>
8 1.1 jakllsch #include <efilib.h>
9 1.1 jakllsch
10 1.1 jakllsch #if 0
11 1.1 jakllsch extern void dump_stack(void);
12 1.1 jakllsch asm( ".globl dump_stack\n"
13 1.1 jakllsch "dump_stack:\n"
14 1.1 jakllsch " movq %rsp, %rdi\n"
15 1.1 jakllsch " jmp *dump_stack_helper@GOTPCREL(%rip)\n"
16 1.1 jakllsch ".size dump_stack, .-dump_stack");
17 1.1 jakllsch
18 1.1 jakllsch void dump_stack_helper(uint64_t rsp_val)
19 1.1 jakllsch {
20 1.1 jakllsch uint64_t *rsp = (uint64_t *)rsp_val;
21 1.1 jakllsch int x;
22 1.1 jakllsch
23 1.1 jakllsch Print(L"%%rsp: 0x%08x%08x stack:\r\n",
24 1.1 jakllsch (rsp_val & 0xffffffff00000000) >>32,
25 1.1 jakllsch rsp_val & 0xffffffff);
26 1.1 jakllsch for (x = 0; x < 8; x++) {
27 1.1 jakllsch Print(L"%08x: ", ((uint64_t)rsp) & 0xffffffff);
28 1.1 jakllsch Print(L"%016x ", *rsp++);
29 1.1 jakllsch Print(L"%016x ", *rsp++);
30 1.1 jakllsch Print(L"%016x ", *rsp++);
31 1.1 jakllsch Print(L"%016x\r\n", *rsp++);
32 1.1 jakllsch }
33 1.1 jakllsch }
34 1.1 jakllsch #endif
35 1.1 jakllsch
36 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_failure_callback(void)
37 1.1 jakllsch {
38 1.1 jakllsch return EFI_UNSUPPORTED;
39 1.1 jakllsch }
40 1.1 jakllsch
41 1.1 jakllsch EFI_STATUS test_failure(void)
42 1.1 jakllsch {
43 1.1 jakllsch return uefi_call_wrapper(test_failure_callback, 0);
44 1.1 jakllsch }
45 1.1 jakllsch
46 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call0_callback(void)
47 1.1 jakllsch {
48 1.1 jakllsch return EFI_SUCCESS;
49 1.1 jakllsch }
50 1.1 jakllsch
51 1.1 jakllsch EFI_STATUS test_call0(void)
52 1.1 jakllsch {
53 1.1 jakllsch return uefi_call_wrapper(test_call0_callback, 0);
54 1.1 jakllsch }
55 1.1 jakllsch
56 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call1_callback(UINT32 a)
57 1.1 jakllsch {
58 1.1 jakllsch if (a != 0x12345678) {
59 1.1 jakllsch return EFI_LOAD_ERROR;
60 1.1 jakllsch }
61 1.1 jakllsch return EFI_SUCCESS;
62 1.1 jakllsch }
63 1.1 jakllsch
64 1.1 jakllsch EFI_STATUS test_call1(void)
65 1.1 jakllsch {
66 1.1 jakllsch return uefi_call_wrapper(test_call1_callback, 1,0x12345678);
67 1.1 jakllsch }
68 1.1 jakllsch
69 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call2_callback(UINT32 a, UINT32 b)
70 1.1 jakllsch {
71 1.1 jakllsch if (a != 0x12345678) {
72 1.1 jakllsch return EFI_LOAD_ERROR;
73 1.1 jakllsch }
74 1.1 jakllsch if (b != 0x23456789) {
75 1.1 jakllsch return EFI_INVALID_PARAMETER;
76 1.1 jakllsch }
77 1.1 jakllsch return EFI_SUCCESS;
78 1.1 jakllsch }
79 1.1 jakllsch
80 1.1 jakllsch EFI_STATUS test_call2(void)
81 1.1 jakllsch {
82 1.1 jakllsch return uefi_call_wrapper(test_call2_callback, 2,
83 1.1 jakllsch 0x12345678, 0x23456789);
84 1.1 jakllsch }
85 1.1 jakllsch
86 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call3_callback(UINT32 a, UINT32 b,
87 1.1 jakllsch UINT32 c)
88 1.1 jakllsch {
89 1.1 jakllsch if (a != 0x12345678)
90 1.1 jakllsch return EFI_LOAD_ERROR;
91 1.1 jakllsch if (b != 0x23456789)
92 1.1 jakllsch return EFI_INVALID_PARAMETER;
93 1.1 jakllsch if (c != 0x3456789a)
94 1.1 jakllsch return EFI_UNSUPPORTED;
95 1.1 jakllsch return EFI_SUCCESS;
96 1.1 jakllsch }
97 1.1 jakllsch
98 1.1 jakllsch EFI_STATUS test_call3(void)
99 1.1 jakllsch {
100 1.1 jakllsch return uefi_call_wrapper(test_call3_callback, 3,
101 1.1 jakllsch 0x12345678, 0x23456789, 0x3456789a);
102 1.1 jakllsch }
103 1.1 jakllsch
104 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call4_callback(UINT32 a, UINT32 b,
105 1.1 jakllsch UINT32 c, UINT32 d)
106 1.1 jakllsch {
107 1.1 jakllsch if (a != 0x12345678)
108 1.1 jakllsch return EFI_LOAD_ERROR;
109 1.1 jakllsch if (b != 0x23456789)
110 1.1 jakllsch return EFI_INVALID_PARAMETER;
111 1.1 jakllsch if (c != 0x3456789a)
112 1.1 jakllsch return EFI_UNSUPPORTED;
113 1.1 jakllsch if (d != 0x456789ab)
114 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
115 1.1 jakllsch
116 1.1 jakllsch return EFI_SUCCESS;
117 1.1 jakllsch }
118 1.1 jakllsch
119 1.1 jakllsch EFI_STATUS test_call4(void)
120 1.1 jakllsch {
121 1.1 jakllsch return uefi_call_wrapper(test_call4_callback, 4,
122 1.1 jakllsch 0x12345678, 0x23456789, 0x3456789a, 0x456789ab);
123 1.1 jakllsch }
124 1.1 jakllsch
125 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call5_callback(UINT32 a, UINT32 b,
126 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e)
127 1.1 jakllsch {
128 1.1 jakllsch if (a != 0x12345678)
129 1.1 jakllsch return EFI_LOAD_ERROR;
130 1.1 jakllsch if (b != 0x23456789)
131 1.1 jakllsch return EFI_INVALID_PARAMETER;
132 1.1 jakllsch if (c != 0x3456789a)
133 1.1 jakllsch return EFI_UNSUPPORTED;
134 1.1 jakllsch if (d != 0x456789ab)
135 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
136 1.1 jakllsch if (e != 0x56789abc)
137 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
138 1.1 jakllsch
139 1.1 jakllsch return EFI_SUCCESS;
140 1.1 jakllsch }
141 1.1 jakllsch
142 1.1 jakllsch EFI_STATUS test_call5(void)
143 1.1 jakllsch {
144 1.1 jakllsch return uefi_call_wrapper(test_call5_callback, 5,
145 1.1 jakllsch 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc);
146 1.1 jakllsch }
147 1.1 jakllsch
148 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call6_callback(UINT32 a, UINT32 b,
149 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e, UINT32 f)
150 1.1 jakllsch {
151 1.1 jakllsch if (a != 0x12345678)
152 1.1 jakllsch return EFI_LOAD_ERROR;
153 1.1 jakllsch if (b != 0x23456789)
154 1.1 jakllsch return EFI_INVALID_PARAMETER;
155 1.1 jakllsch if (c != 0x3456789a)
156 1.1 jakllsch return EFI_UNSUPPORTED;
157 1.1 jakllsch if (d != 0x456789ab)
158 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
159 1.1 jakllsch if (e != 0x56789abc)
160 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
161 1.1 jakllsch if (f != 0x6789abcd)
162 1.1 jakllsch return EFI_NOT_READY;
163 1.1 jakllsch
164 1.1 jakllsch return EFI_SUCCESS;
165 1.1 jakllsch }
166 1.1 jakllsch
167 1.1 jakllsch EFI_STATUS test_call6(void)
168 1.1 jakllsch {
169 1.1 jakllsch return uefi_call_wrapper(test_call6_callback, 6,
170 1.1 jakllsch 0x12345678, 0x23456789, 0x3456789a, 0x456789ab, 0x56789abc,
171 1.1 jakllsch 0x6789abcd);
172 1.1 jakllsch }
173 1.1 jakllsch
174 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call7_callback(UINT32 a, UINT32 b,
175 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g)
176 1.1 jakllsch {
177 1.1 jakllsch if (a != 0x12345678)
178 1.1 jakllsch return EFI_LOAD_ERROR;
179 1.1 jakllsch if (b != 0x23456789)
180 1.1 jakllsch return EFI_INVALID_PARAMETER;
181 1.1 jakllsch if (c != 0x3456789a)
182 1.1 jakllsch return EFI_UNSUPPORTED;
183 1.1 jakllsch if (d != 0x456789ab)
184 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
185 1.1 jakllsch if (e != 0x56789abc)
186 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
187 1.1 jakllsch if (f != 0x6789abcd)
188 1.1 jakllsch return EFI_NOT_READY;
189 1.1 jakllsch if (g != 0x789abcde)
190 1.1 jakllsch return EFI_DEVICE_ERROR;
191 1.1 jakllsch
192 1.1 jakllsch return EFI_SUCCESS;
193 1.1 jakllsch }
194 1.1 jakllsch
195 1.1 jakllsch EFI_STATUS test_call7(void)
196 1.1 jakllsch {
197 1.1 jakllsch return uefi_call_wrapper(test_call7_callback, 7,
198 1.1 jakllsch 0x12345678, 0x23456789, 0x3456789a, 0x456789ab,
199 1.1 jakllsch 0x56789abc, 0x6789abcd, 0x789abcde);
200 1.1 jakllsch }
201 1.1 jakllsch
202 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call8_callback(UINT32 a, UINT32 b,
203 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h)
204 1.1 jakllsch {
205 1.1 jakllsch if (a != 0x12345678)
206 1.1 jakllsch return EFI_LOAD_ERROR;
207 1.1 jakllsch if (b != 0x23456789)
208 1.1 jakllsch return EFI_INVALID_PARAMETER;
209 1.1 jakllsch if (c != 0x3456789a)
210 1.1 jakllsch return EFI_UNSUPPORTED;
211 1.1 jakllsch if (d != 0x456789ab)
212 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
213 1.1 jakllsch if (e != 0x56789abc)
214 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
215 1.1 jakllsch if (f != 0x6789abcd)
216 1.1 jakllsch return EFI_NOT_READY;
217 1.1 jakllsch if (g != 0x789abcde)
218 1.1 jakllsch return EFI_DEVICE_ERROR;
219 1.1 jakllsch if (h != 0x89abcdef)
220 1.1 jakllsch return EFI_WRITE_PROTECTED;
221 1.1 jakllsch
222 1.1 jakllsch return EFI_SUCCESS;
223 1.1 jakllsch }
224 1.1 jakllsch
225 1.1 jakllsch EFI_STATUS test_call8(void)
226 1.1 jakllsch {
227 1.1 jakllsch return uefi_call_wrapper(test_call8_callback, 8,
228 1.1 jakllsch 0x12345678,
229 1.1 jakllsch 0x23456789,
230 1.1 jakllsch 0x3456789a,
231 1.1 jakllsch 0x456789ab,
232 1.1 jakllsch 0x56789abc,
233 1.1 jakllsch 0x6789abcd,
234 1.1 jakllsch 0x789abcde,
235 1.1 jakllsch 0x89abcdef);
236 1.1 jakllsch }
237 1.1 jakllsch
238 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call9_callback(UINT32 a, UINT32 b,
239 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h, UINT32 i)
240 1.1 jakllsch {
241 1.1 jakllsch if (a != 0x12345678)
242 1.1 jakllsch return EFI_LOAD_ERROR;
243 1.1 jakllsch if (b != 0x23456789)
244 1.1 jakllsch return EFI_INVALID_PARAMETER;
245 1.1 jakllsch if (c != 0x3456789a)
246 1.1 jakllsch return EFI_UNSUPPORTED;
247 1.1 jakllsch if (d != 0x456789ab)
248 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
249 1.1 jakllsch if (e != 0x56789abc)
250 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
251 1.1 jakllsch if (f != 0x6789abcd)
252 1.1 jakllsch return EFI_NOT_READY;
253 1.1 jakllsch if (g != 0x789abcde)
254 1.1 jakllsch return EFI_DEVICE_ERROR;
255 1.1 jakllsch if (h != 0x89abcdef)
256 1.1 jakllsch return EFI_WRITE_PROTECTED;
257 1.1 jakllsch if (i != 0x9abcdef0)
258 1.1 jakllsch return EFI_OUT_OF_RESOURCES;
259 1.1 jakllsch
260 1.1 jakllsch return EFI_SUCCESS;
261 1.1 jakllsch }
262 1.1 jakllsch
263 1.1 jakllsch EFI_STATUS test_call9(void)
264 1.1 jakllsch {
265 1.1 jakllsch return uefi_call_wrapper(test_call9_callback, 9,
266 1.1 jakllsch 0x12345678,
267 1.1 jakllsch 0x23456789,
268 1.1 jakllsch 0x3456789a,
269 1.1 jakllsch 0x456789ab,
270 1.1 jakllsch 0x56789abc,
271 1.1 jakllsch 0x6789abcd,
272 1.1 jakllsch 0x789abcde,
273 1.1 jakllsch 0x89abcdef,
274 1.1 jakllsch 0x9abcdef0);
275 1.1 jakllsch }
276 1.1 jakllsch
277 1.1 jakllsch extern EFI_STATUS test_call10(void);
278 1.1 jakllsch EFI_STATUS EFI_FUNCTION test_call10_callback(UINT32 a, UINT32 b,
279 1.1 jakllsch UINT32 c, UINT32 d, UINT32 e, UINT32 f, UINT32 g, UINT32 h, UINT32 i,
280 1.1 jakllsch UINT32 j)
281 1.1 jakllsch {
282 1.1 jakllsch if (a != 0x12345678)
283 1.1 jakllsch return EFI_LOAD_ERROR;
284 1.1 jakllsch if (b != 0x23456789)
285 1.1 jakllsch return EFI_INVALID_PARAMETER;
286 1.1 jakllsch if (c != 0x3456789a)
287 1.1 jakllsch return EFI_UNSUPPORTED;
288 1.1 jakllsch if (d != 0x456789ab)
289 1.1 jakllsch return EFI_BAD_BUFFER_SIZE;
290 1.1 jakllsch if (e != 0x56789abc)
291 1.1 jakllsch return EFI_BUFFER_TOO_SMALL;
292 1.1 jakllsch if (f != 0x6789abcd)
293 1.1 jakllsch return EFI_NOT_READY;
294 1.1 jakllsch if (g != 0x789abcde)
295 1.1 jakllsch return EFI_DEVICE_ERROR;
296 1.1 jakllsch if (h != 0x89abcdef)
297 1.1 jakllsch return EFI_WRITE_PROTECTED;
298 1.1 jakllsch if (i != 0x9abcdef0)
299 1.1 jakllsch return EFI_OUT_OF_RESOURCES;
300 1.1 jakllsch if (j != 0xabcdef01)
301 1.1 jakllsch return EFI_VOLUME_CORRUPTED;
302 1.1 jakllsch
303 1.1 jakllsch return EFI_SUCCESS;
304 1.1 jakllsch }
305 1.1 jakllsch
306 1.1 jakllsch EFI_STATUS test_call10(void)
307 1.1 jakllsch {
308 1.1 jakllsch return uefi_call_wrapper(test_call10_callback, 10,
309 1.1 jakllsch 0x12345678,
310 1.1 jakllsch 0x23456789,
311 1.1 jakllsch 0x3456789a,
312 1.1 jakllsch 0x456789ab,
313 1.1 jakllsch 0x56789abc,
314 1.1 jakllsch 0x6789abcd,
315 1.1 jakllsch 0x789abcde,
316 1.1 jakllsch 0x89abcdef,
317 1.1 jakllsch 0x9abcdef0,
318 1.1 jakllsch 0xabcdef01);
319 1.1 jakllsch }
320 1.1 jakllsch
321 1.1 jakllsch EFI_STATUS
322 1.1 jakllsch efi_main (EFI_HANDLE *image, EFI_SYSTEM_TABLE *systab)
323 1.1 jakllsch {
324 1.1 jakllsch EFI_STATUS rc = EFI_SUCCESS;
325 1.1 jakllsch
326 1.1 jakllsch InitializeLib(image, systab);
327 1.1 jakllsch PoolAllocationType = 2; /* klooj */
328 1.1 jakllsch
329 1.1.1.1.36.1 christos #ifdef __x86_64__
330 1.1 jakllsch __asm__ volatile("out %0,%1" : : "a" ((uint8_t)0x14), "dN" (0x80));
331 1.1.1.1.36.1 christos #endif
332 1.1 jakllsch
333 1.1 jakllsch Print(L"Hello\r\n");
334 1.1 jakllsch rc = test_failure();
335 1.1 jakllsch if (EFI_ERROR(rc)) {
336 1.1 jakllsch Print(L"Returning Failure works\n");
337 1.1 jakllsch } else {
338 1.1 jakllsch Print(L"Returning failure doesn't work.\r\n");
339 1.1 jakllsch Print(L"%%rax was 0x%016x, should have been 0x%016x\n",
340 1.1 jakllsch rc, EFI_UNSUPPORTED);
341 1.1 jakllsch return EFI_INVALID_PARAMETER;
342 1.1 jakllsch }
343 1.1 jakllsch
344 1.1 jakllsch rc = test_call0();
345 1.1 jakllsch if (!EFI_ERROR(rc)) {
346 1.1 jakllsch Print(L"0 args works just fine here.\r\n");
347 1.1 jakllsch } else {
348 1.1 jakllsch Print(L"0 args failed: 0x%016x\n", rc);
349 1.1 jakllsch return rc;
350 1.1 jakllsch }
351 1.1 jakllsch
352 1.1 jakllsch rc = test_call1();
353 1.1 jakllsch if (!EFI_ERROR(rc)) {
354 1.1 jakllsch Print(L"1 arg works just fine here.\r\n");
355 1.1 jakllsch } else {
356 1.1 jakllsch Print(L"1 arg failed: 0x%016x\n", rc);
357 1.1 jakllsch return rc;
358 1.1 jakllsch }
359 1.1 jakllsch
360 1.1 jakllsch rc = test_call2();
361 1.1 jakllsch if (!EFI_ERROR(rc)) {
362 1.1 jakllsch Print(L"2 args works just fine here.\r\n");
363 1.1 jakllsch } else {
364 1.1 jakllsch Print(L"2 args failed: 0x%016x\n", rc);
365 1.1 jakllsch return rc;
366 1.1 jakllsch }
367 1.1 jakllsch
368 1.1 jakllsch rc = test_call3();
369 1.1 jakllsch if (!EFI_ERROR(rc)) {
370 1.1 jakllsch Print(L"3 args works just fine here.\r\n");
371 1.1 jakllsch } else {
372 1.1 jakllsch Print(L"3 args failed: 0x%016x\n", rc);
373 1.1 jakllsch return rc;
374 1.1 jakllsch }
375 1.1 jakllsch
376 1.1 jakllsch rc = test_call4();
377 1.1 jakllsch if (!EFI_ERROR(rc)) {
378 1.1 jakllsch Print(L"4 args works just fine here.\r\n");
379 1.1 jakllsch } else {
380 1.1 jakllsch Print(L"4 args failed: 0x%016x\n", rc);
381 1.1 jakllsch return rc;
382 1.1 jakllsch }
383 1.1 jakllsch
384 1.1 jakllsch rc = test_call5();
385 1.1 jakllsch if (!EFI_ERROR(rc)) {
386 1.1 jakllsch Print(L"5 args works just fine here.\r\n");
387 1.1 jakllsch } else {
388 1.1 jakllsch Print(L"5 args failed: 0x%016x\n", rc);
389 1.1 jakllsch return rc;
390 1.1 jakllsch }
391 1.1 jakllsch
392 1.1 jakllsch rc = test_call6();
393 1.1 jakllsch if (!EFI_ERROR(rc)) {
394 1.1 jakllsch Print(L"6 args works just fine here.\r\n");
395 1.1 jakllsch } else {
396 1.1 jakllsch Print(L"6 args failed: 0x%016x\n", rc);
397 1.1 jakllsch return rc;
398 1.1 jakllsch }
399 1.1 jakllsch
400 1.1 jakllsch rc = test_call7();
401 1.1 jakllsch if (!EFI_ERROR(rc)) {
402 1.1 jakllsch Print(L"7 args works just fine here.\r\n");
403 1.1 jakllsch } else {
404 1.1 jakllsch Print(L"7 args failed: 0x%016x\n", rc);
405 1.1 jakllsch return rc;
406 1.1 jakllsch }
407 1.1 jakllsch
408 1.1 jakllsch rc = test_call8();
409 1.1 jakllsch if (!EFI_ERROR(rc)) {
410 1.1 jakllsch Print(L"8 args works just fine here.\r\n");
411 1.1 jakllsch } else {
412 1.1 jakllsch Print(L"8 args failed: 0x%016x\n", rc);
413 1.1 jakllsch return rc;
414 1.1 jakllsch }
415 1.1 jakllsch
416 1.1 jakllsch rc = test_call9();
417 1.1 jakllsch if (!EFI_ERROR(rc)) {
418 1.1 jakllsch Print(L"9 args works just fine here.\r\n");
419 1.1 jakllsch } else {
420 1.1 jakllsch Print(L"9 args failed: 0x%016x\n", rc);
421 1.1 jakllsch return rc;
422 1.1 jakllsch }
423 1.1 jakllsch
424 1.1 jakllsch rc = test_call10();
425 1.1 jakllsch if (!EFI_ERROR(rc)) {
426 1.1 jakllsch Print(L"10 args works just fine here.\r\n");
427 1.1 jakllsch } else {
428 1.1 jakllsch Print(L"10 args failed: 0x%016x\n", rc);
429 1.1 jakllsch return rc;
430 1.1 jakllsch }
431 1.1 jakllsch
432 1.1 jakllsch return rc;
433 1.1 jakllsch }
434