1 /*
2 * Coyright (c) 2005-2006 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29 #include <sys/cdefs.h>
30 #include <sys/types.h>
31 #include <sys/munge.h>
32 #include <stdint.h>
33
34 /*
35 * Refer to comments in bsd/sys/munge.h
36 */
37
38 static inline __attribute__((always_inline)) void
39 munge_32_to_64_unsigned(volatile uint64_t *dest, volatile uint32_t *src, int count);
40
41 void
munge_w(void * args)42 munge_w(void *args)
43 {
44 munge_32_to_64_unsigned(args, args, 1);
45 }
46
47 void
munge_ww(void * args)48 munge_ww(void *args)
49 {
50 munge_32_to_64_unsigned(args, args, 2);
51 }
52
53 void
munge_www(void * args)54 munge_www(void *args)
55 {
56 munge_32_to_64_unsigned(args, args, 3);
57 }
58
59 void
munge_wwww(void * args)60 munge_wwww(void *args)
61 {
62 munge_32_to_64_unsigned(args, args, 4);
63 }
64
65 void
munge_wwwww(void * args)66 munge_wwwww(void *args)
67 {
68 munge_32_to_64_unsigned(args, args, 5);
69 }
70
71 void
munge_wwwwww(void * args)72 munge_wwwwww(void *args)
73 {
74 munge_32_to_64_unsigned(args, args, 6);
75 }
76
77 void
munge_wwwwwww(void * args)78 munge_wwwwwww(void *args)
79 {
80 munge_32_to_64_unsigned(args, args, 7);
81 }
82
83 void
munge_wwwwwwww(void * args)84 munge_wwwwwwww(void *args)
85 {
86 munge_32_to_64_unsigned(args, args, 8);
87 }
88
89 void
munge_wl(void * args)90 munge_wl(void *args)
91 {
92 volatile uint64_t *out_args = (volatile uint64_t*)args;
93 volatile uint32_t *in_args = (volatile uint32_t*)args;
94
95 out_args[1] = *(volatile uint64_t*)&in_args[1];
96 out_args[0] = in_args[0];
97 }
98
99 void
munge_wwl(void * args)100 munge_wwl(void *args)
101 {
102 volatile uint64_t *out_args = (volatile uint64_t*)args;
103 volatile uint32_t *in_args = (volatile uint32_t*)args;
104
105 out_args[2] = *(volatile uint64_t*)&in_args[2];
106 out_args[1] = in_args[1];
107 out_args[0] = in_args[0];
108 }
109
110 void
munge_wwlw(void * args)111 munge_wwlw(void *args)
112 {
113 volatile uint64_t *out_args = (volatile uint64_t*)args;
114 volatile uint32_t *in_args = (volatile uint32_t*)args;
115
116 out_args[3] = in_args[4];
117 out_args[2] = *(volatile uint64_t*)&in_args[2];
118 out_args[1] = in_args[1];
119 out_args[0] = in_args[0];
120 }
121 void
munge_wwlll(void * args)122 munge_wwlll(void *args)
123 {
124 volatile uint64_t *out_args = (volatile uint64_t*)args;
125 volatile uint32_t *in_args = (volatile uint32_t*)args;
126
127 out_args[4] = *(volatile uint64_t*)&in_args[6];
128 out_args[3] = *(volatile uint64_t*)&in_args[4];
129 out_args[2] = *(volatile uint64_t*)&in_args[2];
130 out_args[1] = in_args[1];
131 out_args[0] = in_args[0];
132 }
133
134 void
munge_wwlllll(void * args)135 munge_wwlllll(void *args)
136 {
137 volatile uint64_t *out_args = (volatile uint64_t*)args;
138 volatile uint32_t *in_args = (volatile uint32_t*)args;
139
140 out_args[6] = *(volatile uint64_t*)&in_args[10];
141 out_args[5] = *(volatile uint64_t*)&in_args[8];
142 out_args[4] = *(volatile uint64_t*)&in_args[6];
143 out_args[3] = *(volatile uint64_t*)&in_args[4];
144 out_args[2] = *(volatile uint64_t*)&in_args[2];
145 out_args[1] = in_args[1];
146 out_args[0] = in_args[0];
147 }
148
149 void
munge_wwllllll(void * args)150 munge_wwllllll(void *args)
151 {
152 volatile uint64_t *out_args = (volatile uint64_t*)args;
153 volatile uint32_t *in_args = (volatile uint32_t*)args;
154
155 out_args[7] = *(volatile uint64_t*)&in_args[12];
156 out_args[6] = *(volatile uint64_t*)&in_args[10];
157 out_args[5] = *(volatile uint64_t*)&in_args[8];
158 out_args[4] = *(volatile uint64_t*)&in_args[6];
159 out_args[3] = *(volatile uint64_t*)&in_args[4];
160 out_args[2] = *(volatile uint64_t*)&in_args[2];
161 out_args[1] = in_args[1];
162 out_args[0] = in_args[0];
163 }
164
165
166 void
munge_wwllww(void * args)167 munge_wwllww(void *args)
168 {
169 volatile uint64_t *out_args = (volatile uint64_t*)args;
170 volatile uint32_t *in_args = (volatile uint32_t*)args;
171
172 out_args[5] = in_args[7];
173 out_args[4] = in_args[6];
174 out_args[3] = *(volatile uint64_t*)&in_args[4];
175 out_args[2] = *(volatile uint64_t*)&in_args[2];
176 out_args[1] = in_args[1];
177 out_args[0] = in_args[0];
178 }
179
180 void
munge_wlw(void * args)181 munge_wlw(void *args)
182 {
183 volatile uint64_t *out_args = (volatile uint64_t*)args;
184 volatile uint32_t *in_args = (volatile uint32_t*)args;
185
186 out_args[2] = in_args[3];
187 out_args[1] = *(volatile uint64_t*)&in_args[1];
188 out_args[0] = in_args[0];
189 }
190
191 void
munge_wlww(void * args)192 munge_wlww(void *args)
193 {
194 volatile uint64_t *out_args = (volatile uint64_t*)args;
195 volatile uint32_t *in_args = (volatile uint32_t*)args;
196
197 out_args[3] = in_args[4];
198 out_args[2] = in_args[3];
199 out_args[1] = *(volatile uint64_t*)&in_args[1];
200 out_args[0] = in_args[0];
201 }
202
203 void
munge_wlwwwll(void * args)204 munge_wlwwwll(void *args)
205 {
206 volatile uint64_t *out_args = (volatile uint64_t*)args;
207 volatile uint32_t *in_args = (volatile uint32_t*)args;
208
209 out_args[6] = *(volatile uint64_t*)&in_args[8];
210 out_args[5] = *(volatile uint64_t*)&in_args[6];
211 out_args[4] = in_args[5];
212 out_args[3] = in_args[4];
213 out_args[2] = in_args[3];
214 out_args[1] = *(volatile uint64_t*)&in_args[1];
215 out_args[0] = in_args[0];
216 }
217
218 void
munge_wlwwwllw(void * args)219 munge_wlwwwllw(void *args)
220 {
221 volatile uint64_t *out_args = (volatile uint64_t*)args;
222 volatile uint32_t *in_args = (volatile uint32_t*)args;
223
224 out_args[7] = in_args[10];
225 munge_wlwwwll(args);
226 }
227
228 void
munge_wlwwlwlw(void * args)229 munge_wlwwlwlw(void *args)
230 {
231 volatile uint64_t *out_args = (volatile uint64_t*)args;
232 volatile uint32_t *in_args = (volatile uint32_t*)args;
233
234 out_args[7] = in_args[10];
235 out_args[6] = *(volatile uint64_t*)&in_args[8];
236 out_args[5] = in_args[7];
237 out_args[4] = *(volatile uint64_t*)&in_args[5];
238 out_args[3] = in_args[4];
239 out_args[2] = in_args[3];
240 out_args[1] = *(volatile uint64_t*)&in_args[1];
241 out_args[0] = in_args[0];
242 }
243
244 void
munge_wll(void * args)245 munge_wll(void *args)
246 {
247 volatile uint64_t *out_args = (volatile uint64_t*)args;
248 volatile uint32_t *in_args = (volatile uint32_t*)args;
249
250 out_args[2] = *(volatile uint64_t*)&in_args[3];
251 out_args[1] = *(volatile uint64_t*)&in_args[1];
252 out_args[0] = in_args[0];
253 }
254
255 void
munge_wlll(void * args)256 munge_wlll(void *args)
257 {
258 volatile uint64_t *out_args = (volatile uint64_t*)args;
259 volatile uint32_t *in_args = (volatile uint32_t*)args;
260
261 out_args[3] = *(volatile uint64_t*)&in_args[5];
262 out_args[2] = *(volatile uint64_t*)&in_args[3];
263 out_args[1] = *(volatile uint64_t*)&in_args[1];
264 out_args[0] = in_args[0];
265 }
266
267 void
munge_wlllww(void * args)268 munge_wlllww(void *args)
269 {
270 volatile uint64_t *out_args = (volatile uint64_t*)args;
271 volatile uint32_t *in_args = (volatile uint32_t*)args;
272
273 out_args[5] = in_args[8];
274 out_args[4] = in_args[7];
275 out_args[3] = *(volatile uint64_t*)&in_args[5];
276 out_args[2] = *(volatile uint64_t*)&in_args[3];
277 out_args[1] = *(volatile uint64_t*)&in_args[1];
278 out_args[0] = in_args[0];
279 }
280
281 void
munge_wllll(void * args)282 munge_wllll(void *args)
283 {
284 volatile uint64_t *out_args = (volatile uint64_t*)args;
285 volatile uint32_t *in_args = (volatile uint32_t*)args;
286
287 out_args[4] = *(volatile uint64_t*)&in_args[7];
288 out_args[3] = *(volatile uint64_t*)&in_args[5];
289 out_args[2] = *(volatile uint64_t*)&in_args[3];
290 out_args[1] = *(volatile uint64_t*)&in_args[1];
291 out_args[0] = in_args[0];
292 }
293
294 void
munge_wllww(void * args)295 munge_wllww(void *args)
296 {
297 volatile uint64_t *out_args = (volatile uint64_t*)args;
298 volatile uint32_t *in_args = (volatile uint32_t*)args;
299
300 out_args[4] = in_args[6];
301 out_args[3] = in_args[5];
302 out_args[2] = *(volatile uint64_t*)&in_args[3];
303 out_args[1] = *(volatile uint64_t*)&in_args[1];
304 out_args[0] = in_args[0];
305 }
306
307 void
munge_wllwwll(void * args)308 munge_wllwwll(void *args)
309 {
310 volatile uint64_t *out_args = (volatile uint64_t*)args;
311 volatile uint32_t *in_args = (volatile uint32_t*)args;
312
313 out_args[6] = *(volatile uint64_t*)&in_args[9];
314 out_args[5] = *(volatile uint64_t*)&in_args[7];
315 out_args[4] = in_args[6];
316 out_args[3] = in_args[5];
317 out_args[2] = *(volatile uint64_t*)&in_args[3];
318 out_args[1] = *(volatile uint64_t*)&in_args[1];
319 out_args[0] = in_args[0];
320 }
321
322 void
munge_wwwlw(void * args)323 munge_wwwlw(void *args)
324 {
325 volatile uint64_t *out_args = (volatile uint64_t*)args;
326 volatile uint32_t *in_args = (volatile uint32_t*)args;
327
328 out_args[4] = in_args[5];
329 out_args[3] = *(volatile uint64_t*)&in_args[3];
330 out_args[2] = in_args[2];
331 out_args[1] = in_args[1];
332 out_args[0] = in_args[0];
333 }
334
335 void
munge_wwwlww(void * args)336 munge_wwwlww(void *args)
337 {
338 volatile uint64_t *out_args = (volatile uint64_t*)args;
339 volatile uint32_t *in_args = (volatile uint32_t*)args;
340
341 out_args[5] = in_args[6];
342 out_args[4] = in_args[5];
343 out_args[3] = *(volatile uint64_t*)&in_args[3];
344 out_args[2] = in_args[2];
345 out_args[1] = in_args[1];
346 out_args[0] = in_args[0];
347 }
348
349 void
munge_wwwlwww(void * args)350 munge_wwwlwww(void *args)
351 {
352 volatile uint64_t *out_args = (volatile uint64_t*)args;
353 volatile uint32_t *in_args = (volatile uint32_t*)args;
354
355 out_args[6] = in_args[7];
356 out_args[5] = in_args[6];
357 out_args[4] = in_args[5];
358 out_args[3] = *(volatile uint64_t*)&in_args[3];
359 out_args[2] = in_args[2];
360 out_args[1] = in_args[1];
361 out_args[0] = in_args[0];
362 }
363
364 void
munge_wwwl(void * args)365 munge_wwwl(void *args)
366 {
367 volatile uint64_t *out_args = (volatile uint64_t*)args;
368 volatile uint32_t *in_args = (volatile uint32_t*)args;
369
370 out_args[3] = *(volatile uint64_t*)&in_args[3];
371 out_args[2] = in_args[2];
372 out_args[1] = in_args[1];
373 out_args[0] = in_args[0];
374 }
375
376 void
munge_wwwwlw(void * args)377 munge_wwwwlw(void *args)
378 {
379 volatile uint64_t *out_args = (volatile uint64_t*)args;
380 volatile uint32_t *in_args = (volatile uint32_t*)args;
381
382 out_args[5] = in_args[6];
383 out_args[4] = *(volatile uint64_t*)&in_args[4];
384 out_args[3] = in_args[3];
385 out_args[2] = in_args[2];
386 out_args[1] = in_args[1];
387 out_args[0] = in_args[0];
388 }
389
390 void
munge_wwwwllww(void * args)391 munge_wwwwllww(void *args)
392 {
393 volatile uint64_t *out_args = (volatile uint64_t*)args;
394 volatile uint32_t *in_args = (volatile uint32_t*)args;
395
396 out_args[7] = in_args[9];
397 out_args[6] = in_args[8];
398 out_args[5] = *(volatile uint64_t*)&in_args[6];
399 out_args[4] = *(volatile uint64_t*)&in_args[4];
400 out_args[3] = in_args[3];
401 out_args[2] = in_args[2];
402 out_args[1] = in_args[1];
403 out_args[0] = in_args[0];
404 }
405
406 void
munge_wwwwl(void * args)407 munge_wwwwl(void *args)
408 {
409 volatile uint64_t *out_args = (volatile uint64_t*)args;
410 volatile uint32_t *in_args = (volatile uint32_t*)args;
411
412 out_args[4] = *(volatile uint64_t*)&in_args[4];
413 out_args[3] = in_args[3];
414 out_args[2] = in_args[2];
415 out_args[1] = in_args[1];
416 out_args[0] = in_args[0];
417 }
418
419 void
munge_wwwwwl(void * args)420 munge_wwwwwl(void *args)
421 {
422 volatile uint64_t *out_args = (volatile uint64_t*)args;
423 volatile uint32_t *in_args = (volatile uint32_t*)args;
424
425 out_args[5] = *(volatile uint64_t*)&in_args[5];
426 out_args[4] = in_args[4];
427 out_args[3] = in_args[3];
428 out_args[2] = in_args[2];
429 out_args[1] = in_args[1];
430 out_args[0] = in_args[0];
431 }
432
433 void
munge_wwwwwlww(void * args)434 munge_wwwwwlww(void *args)
435 {
436 volatile uint64_t *out_args = (volatile uint64_t*)args;
437 volatile uint32_t *in_args = (volatile uint32_t*)args;
438
439 out_args[7] = in_args[8];
440 out_args[6] = in_args[7];
441 out_args[5] = *(volatile uint64_t*)&in_args[5];
442 out_args[4] = in_args[4];
443 out_args[3] = in_args[3];
444 out_args[2] = in_args[2];
445 out_args[1] = in_args[1];
446 out_args[0] = in_args[0];
447 }
448
449 void
munge_wwwwwllw(void * args)450 munge_wwwwwllw(void *args)
451 {
452 volatile uint64_t *out_args = (volatile uint64_t*)args;
453 volatile uint32_t *in_args = (volatile uint32_t*)args;
454
455 out_args[7] = in_args[9];
456 out_args[6] = *(volatile uint64_t*)&in_args[7];
457 out_args[5] = *(volatile uint64_t*)&in_args[5];
458 out_args[4] = in_args[4];
459 out_args[3] = in_args[3];
460 out_args[2] = in_args[2];
461 out_args[1] = in_args[1];
462 out_args[0] = in_args[0];
463 }
464
465 void
munge_wwwwwlll(void * args)466 munge_wwwwwlll(void *args)
467 {
468 volatile uint64_t *out_args = (volatile uint64_t*)args;
469 volatile uint32_t *in_args = (volatile uint32_t*)args;
470
471 out_args[7] = *(volatile uint64_t*)&in_args[9];
472 out_args[6] = *(volatile uint64_t*)&in_args[7];
473 out_args[5] = *(volatile uint64_t*)&in_args[5];
474 out_args[4] = in_args[4];
475 out_args[3] = in_args[3];
476 out_args[2] = in_args[2];
477 out_args[1] = in_args[1];
478 out_args[0] = in_args[0];
479 }
480
481 void
munge_wwwwwwl(void * args)482 munge_wwwwwwl(void *args)
483 {
484 volatile uint64_t *out_args = (volatile uint64_t*)args;
485 volatile uint32_t *in_args = (volatile uint32_t*)args;
486
487 out_args[6] = *(volatile uint64_t*)&in_args[6];
488 out_args[5] = in_args[5];
489 out_args[4] = in_args[4];
490 out_args[3] = in_args[3];
491 out_args[2] = in_args[2];
492 out_args[1] = in_args[1];
493 out_args[0] = in_args[0];
494 }
495
496 void
munge_wwwwwwlw(void * args)497 munge_wwwwwwlw(void *args)
498 {
499 volatile uint64_t *out_args = (volatile uint64_t*)args;
500 volatile uint32_t *in_args = (volatile uint32_t*)args;
501
502 out_args[7] = in_args[8];
503 out_args[6] = *(volatile uint64_t*)&in_args[6];
504 out_args[5] = in_args[5];
505 out_args[4] = in_args[4];
506 out_args[3] = in_args[3];
507 out_args[2] = in_args[2];
508 out_args[1] = in_args[1];
509 out_args[0] = in_args[0];
510 }
511
512 void
munge_wwwwwwll(void * args)513 munge_wwwwwwll(void *args)
514 {
515 volatile uint64_t *out_args = (volatile uint64_t*)args;
516 volatile uint32_t *in_args = (volatile uint32_t*)args;
517
518 out_args[7] = *(volatile uint64_t*)&in_args[8];
519 out_args[6] = *(volatile uint64_t*)&in_args[6];
520 out_args[5] = in_args[5];
521 out_args[4] = in_args[4];
522 out_args[3] = in_args[3];
523 out_args[2] = in_args[2];
524 out_args[1] = in_args[1];
525 out_args[0] = in_args[0];
526 }
527
528 void
munge_wsw(void * args)529 munge_wsw(void *args)
530 {
531 volatile uint64_t *out_args = (volatile uint64_t*)args;
532 volatile uint32_t *in_args = (volatile uint32_t*)args;
533
534 out_args[2] = in_args[2];
535 out_args[1] = (int64_t)(int)in_args[1]; /* Sign-extend */
536 out_args[0] = in_args[0];
537 }
538
539 void
munge_wws(void * args)540 munge_wws(void *args)
541 {
542 volatile uint64_t *out_args = (volatile uint64_t*)args;
543 volatile uint32_t *in_args = (volatile uint32_t*)args;
544
545 out_args[2] = (int64_t)(int)in_args[2]; /* Sign-extend */
546 out_args[1] = in_args[1];
547 out_args[0] = in_args[0];
548 }
549
550 void
munge_wwws(void * args)551 munge_wwws(void *args)
552 {
553 volatile uint64_t *out_args = (volatile uint64_t*)args;
554 volatile uint32_t *in_args = (volatile uint32_t*)args;
555
556 out_args[3] = (int64_t)(int)in_args[3]; /* Sign-extend */
557 out_args[2] = in_args[2];
558 out_args[1] = in_args[1];
559 out_args[0] = in_args[0];
560 }
561
562
563 void
munge_wwwsw(void * args)564 munge_wwwsw(void *args)
565 {
566 volatile uint64_t *out_args = (volatile uint64_t*)args;
567 volatile uint32_t *in_args = (volatile uint32_t*)args;
568
569 out_args[4] = in_args[4];
570 out_args[3] = (int64_t)(int)in_args[3]; /* Sign-extend */
571 out_args[2] = in_args[2];
572 out_args[1] = in_args[1];
573 out_args[0] = in_args[0];
574 }
575
576 void
munge_llllllll(void * args __unused)577 munge_llllllll(void *args __unused)
578 {
579 /* Nothing to do, already all 64-bit */
580 }
581
582 void
munge_llllll(void * args __unused)583 munge_llllll(void *args __unused)
584 {
585 /* Nothing to do, already all 64-bit */
586 }
587
588 void
munge_llll(void * args __unused)589 munge_llll(void *args __unused)
590 {
591 /* Nothing to do, already all 64-bit */
592 }
593
594 void
munge_lll(void * args __unused)595 munge_lll(void *args __unused)
596 {
597 /* Nothing to do, already all 64-bit */
598 }
599
600 void
munge_ll(void * args __unused)601 munge_ll(void *args __unused)
602 {
603 /* Nothing to do, already all 64-bit */
604 }
605
606 void
munge_l(void * args __unused)607 munge_l(void *args __unused)
608 {
609 /* Nothing to do, already all 64-bit */
610 }
611
612 void
munge_lw(void * args)613 munge_lw(void *args)
614 {
615 volatile uint64_t *out_args = (volatile uint64_t*)args;
616 volatile uint32_t *in_args = (volatile uint32_t*)args;
617
618 out_args[1] = in_args[2];
619 out_args[0] = *(volatile uint64_t*)&in_args[0];
620 }
621
622 void
munge_lww(void * args)623 munge_lww(void *args)
624 {
625 volatile uint64_t *out_args = (volatile uint64_t*)args;
626 volatile uint32_t *in_args = (volatile uint32_t*)args;
627
628 out_args[2] = in_args[3];
629 out_args[1] = in_args[2];
630 out_args[0] = *(volatile uint64_t*)&in_args[0];
631 }
632
633 void
munge_lwww(void * args)634 munge_lwww(void *args)
635 {
636 volatile uint64_t *out_args = (volatile uint64_t*)args;
637 volatile uint32_t *in_args = (volatile uint32_t*)args;
638
639 out_args[3] = in_args[4];
640 out_args[2] = in_args[3];
641 out_args[1] = in_args[2];
642 out_args[0] = *(volatile uint64_t*)&in_args[0];
643 }
644
645 void
munge_lwwwwwww(void * args)646 munge_lwwwwwww(void *args)
647 {
648 volatile uint64_t *out_args = (volatile uint64_t*)args;
649 volatile uint32_t *in_args = (volatile uint32_t*)args;
650
651 out_args[7] = in_args[8];
652 out_args[6] = in_args[7];
653 out_args[5] = in_args[6];
654 out_args[4] = in_args[5];
655 out_args[3] = in_args[4];
656 out_args[2] = in_args[3];
657 out_args[1] = in_args[2];
658 out_args[0] = *(volatile uint64_t*)&in_args[0];
659 }
660
661 void
munge_wwlww(void * args)662 munge_wwlww(void *args)
663 {
664 volatile uint64_t *out_args = (volatile uint64_t*)args;
665 volatile uint32_t *in_args = (volatile uint32_t*)args;
666
667 out_args[4] = in_args[5];
668 out_args[3] = in_args[4];
669 out_args[2] = *(volatile uint64_t*)&in_args[2];
670 out_args[1] = in_args[1];
671 out_args[0] = in_args[0];
672 }
673
674 void
munge_wwlwww(void * args)675 munge_wwlwww(void *args)
676 {
677 volatile uint64_t *out_args = (volatile uint64_t*)args;
678 volatile uint32_t *in_args = (volatile uint32_t*)args;
679
680 out_args[5] = in_args[6];
681 out_args[4] = in_args[5];
682 out_args[3] = in_args[4];
683 out_args[2] = *(volatile uint64_t*)&in_args[2];
684 out_args[1] = in_args[1];
685 out_args[0] = in_args[0];
686 }
687
688 void
munge_wlwwwl(void * args)689 munge_wlwwwl(void *args)
690 {
691 volatile uint64_t *out_args = (volatile uint64_t*)args;
692 volatile uint32_t *in_args = (volatile uint32_t*)args;
693
694 out_args[5] = *(volatile uint64_t*)&in_args[6];
695 out_args[4] = in_args[5];
696 out_args[3] = in_args[4];
697 out_args[2] = in_args[3];
698 out_args[1] = *(volatile uint64_t*)&in_args[1];
699 out_args[0] = in_args[0];
700 }
701
702 void
munge_wwlwwwl(void * args)703 munge_wwlwwwl(void *args)
704 {
705 volatile uint64_t *out_args = (volatile uint64_t*)args;
706 volatile uint32_t *in_args = (volatile uint32_t*)args;
707
708 out_args[6] = *(volatile uint64_t*)&in_args[7];
709 out_args[5] = in_args[6];
710 out_args[4] = in_args[5];
711 out_args[3] = in_args[4];
712 out_args[2] = *(volatile uint64_t*)&in_args[2];
713 out_args[1] = in_args[1];
714 out_args[0] = in_args[0];
715 }
716
717 /*
718 * Munge array of 32-bit values into an array of 64-bit values,
719 * without sign extension. Note, src and dest can be the same
720 * (copies from end of array)
721 */
722 static inline __attribute__((always_inline)) void
munge_32_to_64_unsigned(volatile uint64_t * dest,volatile uint32_t * src,int count)723 munge_32_to_64_unsigned(volatile uint64_t *dest, volatile uint32_t *src, int count)
724 {
725 int i;
726
727 for (i = count - 1; i >= 0; i--) {
728 dest[i] = src[i];
729 }
730 }
731