xref: /xnu-11215/bsd/dev/munge.c (revision 4f1223e8)
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