xref: /xnu-10063.121.3/bsd/dev/munge.c (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
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_wwllww(void * args)150 munge_wwllww(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[5] = in_args[7];
156 	out_args[4] = in_args[6];
157 	out_args[3] = *(volatile uint64_t*)&in_args[4];
158 	out_args[2] = *(volatile uint64_t*)&in_args[2];
159 	out_args[1] = in_args[1];
160 	out_args[0] = in_args[0];
161 }
162 
163 void
munge_wlw(void * args)164 munge_wlw(void *args)
165 {
166 	volatile uint64_t *out_args = (volatile uint64_t*)args;
167 	volatile uint32_t *in_args = (volatile uint32_t*)args;
168 
169 	out_args[2] = in_args[3];
170 	out_args[1] = *(volatile uint64_t*)&in_args[1];
171 	out_args[0] = in_args[0];
172 }
173 
174 void
munge_wlww(void * args)175 munge_wlww(void *args)
176 {
177 	volatile uint64_t *out_args = (volatile uint64_t*)args;
178 	volatile uint32_t *in_args = (volatile uint32_t*)args;
179 
180 	out_args[3] = in_args[4];
181 	out_args[2] = in_args[3];
182 	out_args[1] = *(volatile uint64_t*)&in_args[1];
183 	out_args[0] = in_args[0];
184 }
185 
186 void
munge_wlwwwll(void * args)187 munge_wlwwwll(void *args)
188 {
189 	volatile uint64_t *out_args = (volatile uint64_t*)args;
190 	volatile uint32_t *in_args = (volatile uint32_t*)args;
191 
192 	out_args[6] = *(volatile uint64_t*)&in_args[8];
193 	out_args[5] = *(volatile uint64_t*)&in_args[6];
194 	out_args[4] = in_args[5];
195 	out_args[3] = in_args[4];
196 	out_args[2] = in_args[3];
197 	out_args[1] = *(volatile uint64_t*)&in_args[1];
198 	out_args[0] = in_args[0];
199 }
200 
201 void
munge_wlwwwllw(void * args)202 munge_wlwwwllw(void *args)
203 {
204 	volatile uint64_t *out_args = (volatile uint64_t*)args;
205 	volatile uint32_t *in_args = (volatile uint32_t*)args;
206 
207 	out_args[7] = in_args[10];
208 	munge_wlwwwll(args);
209 }
210 
211 void
munge_wlwwlwlw(void * args)212 munge_wlwwlwlw(void *args)
213 {
214 	volatile uint64_t *out_args = (volatile uint64_t*)args;
215 	volatile uint32_t *in_args = (volatile uint32_t*)args;
216 
217 	out_args[7] = in_args[10];
218 	out_args[6] = *(volatile uint64_t*)&in_args[8];
219 	out_args[5] = in_args[7];
220 	out_args[4] = *(volatile uint64_t*)&in_args[5];
221 	out_args[3] = in_args[4];
222 	out_args[2] = in_args[3];
223 	out_args[1] = *(volatile uint64_t*)&in_args[1];
224 	out_args[0] = in_args[0];
225 }
226 
227 void
munge_wll(void * args)228 munge_wll(void *args)
229 {
230 	volatile uint64_t *out_args = (volatile uint64_t*)args;
231 	volatile uint32_t *in_args = (volatile uint32_t*)args;
232 
233 	out_args[2] = *(volatile uint64_t*)&in_args[3];
234 	out_args[1] = *(volatile uint64_t*)&in_args[1];
235 	out_args[0] = in_args[0];
236 }
237 
238 void
munge_wlll(void * args)239 munge_wlll(void *args)
240 {
241 	volatile uint64_t *out_args = (volatile uint64_t*)args;
242 	volatile uint32_t *in_args = (volatile uint32_t*)args;
243 
244 	out_args[3] = *(volatile uint64_t*)&in_args[5];
245 	out_args[2] = *(volatile uint64_t*)&in_args[3];
246 	out_args[1] = *(volatile uint64_t*)&in_args[1];
247 	out_args[0] = in_args[0];
248 }
249 
250 void
munge_wlllww(void * args)251 munge_wlllww(void *args)
252 {
253 	volatile uint64_t *out_args = (volatile uint64_t*)args;
254 	volatile uint32_t *in_args = (volatile uint32_t*)args;
255 
256 	out_args[5] = in_args[8];
257 	out_args[4] = in_args[7];
258 	out_args[3] = *(volatile uint64_t*)&in_args[5];
259 	out_args[2] = *(volatile uint64_t*)&in_args[3];
260 	out_args[1] = *(volatile uint64_t*)&in_args[1];
261 	out_args[0] = in_args[0];
262 }
263 
264 void
munge_wllll(void * args)265 munge_wllll(void *args)
266 {
267 	volatile uint64_t *out_args = (volatile uint64_t*)args;
268 	volatile uint32_t *in_args = (volatile uint32_t*)args;
269 
270 	out_args[4] = *(volatile uint64_t*)&in_args[7];
271 	out_args[3] = *(volatile uint64_t*)&in_args[5];
272 	out_args[2] = *(volatile uint64_t*)&in_args[3];
273 	out_args[1] = *(volatile uint64_t*)&in_args[1];
274 	out_args[0] = in_args[0];
275 }
276 
277 void
munge_wllww(void * args)278 munge_wllww(void *args)
279 {
280 	volatile uint64_t *out_args = (volatile uint64_t*)args;
281 	volatile uint32_t *in_args = (volatile uint32_t*)args;
282 
283 	out_args[4] = in_args[6];
284 	out_args[3] = in_args[5];
285 	out_args[2] = *(volatile uint64_t*)&in_args[3];
286 	out_args[1] = *(volatile uint64_t*)&in_args[1];
287 	out_args[0] = in_args[0];
288 }
289 
290 void
munge_wllwwll(void * args)291 munge_wllwwll(void *args)
292 {
293 	volatile uint64_t *out_args = (volatile uint64_t*)args;
294 	volatile uint32_t *in_args = (volatile uint32_t*)args;
295 
296 	out_args[6] = *(volatile uint64_t*)&in_args[9];
297 	out_args[5] = *(volatile uint64_t*)&in_args[7];
298 	out_args[4] = in_args[6];
299 	out_args[3] = in_args[5];
300 	out_args[2] = *(volatile uint64_t*)&in_args[3];
301 	out_args[1] = *(volatile uint64_t*)&in_args[1];
302 	out_args[0] = in_args[0];
303 }
304 
305 void
munge_wwwlw(void * args)306 munge_wwwlw(void *args)
307 {
308 	volatile uint64_t *out_args = (volatile uint64_t*)args;
309 	volatile uint32_t *in_args = (volatile uint32_t*)args;
310 
311 	out_args[4] = in_args[5];
312 	out_args[3] = *(volatile uint64_t*)&in_args[3];
313 	out_args[2] = in_args[2];
314 	out_args[1] = in_args[1];
315 	out_args[0] = in_args[0];
316 }
317 
318 void
munge_wwwlww(void * args)319 munge_wwwlww(void *args)
320 {
321 	volatile uint64_t *out_args = (volatile uint64_t*)args;
322 	volatile uint32_t *in_args = (volatile uint32_t*)args;
323 
324 	out_args[5] = in_args[6];
325 	out_args[4] = in_args[5];
326 	out_args[3] = *(volatile uint64_t*)&in_args[3];
327 	out_args[2] = in_args[2];
328 	out_args[1] = in_args[1];
329 	out_args[0] = in_args[0];
330 }
331 
332 void
munge_wwwlwww(void * args)333 munge_wwwlwww(void *args)
334 {
335 	volatile uint64_t *out_args = (volatile uint64_t*)args;
336 	volatile uint32_t *in_args = (volatile uint32_t*)args;
337 
338 	out_args[6] = in_args[7];
339 	out_args[5] = in_args[6];
340 	out_args[4] = in_args[5];
341 	out_args[3] = *(volatile uint64_t*)&in_args[3];
342 	out_args[2] = in_args[2];
343 	out_args[1] = in_args[1];
344 	out_args[0] = in_args[0];
345 }
346 
347 void
munge_wwwl(void * args)348 munge_wwwl(void *args)
349 {
350 	volatile uint64_t *out_args = (volatile uint64_t*)args;
351 	volatile uint32_t *in_args = (volatile uint32_t*)args;
352 
353 	out_args[3] = *(volatile uint64_t*)&in_args[3];
354 	out_args[2] = in_args[2];
355 	out_args[1] = in_args[1];
356 	out_args[0] = in_args[0];
357 }
358 
359 void
munge_wwwwlw(void * args)360 munge_wwwwlw(void *args)
361 {
362 	volatile uint64_t *out_args = (volatile uint64_t*)args;
363 	volatile uint32_t *in_args = (volatile uint32_t*)args;
364 
365 	out_args[5] = in_args[6];
366 	out_args[4] = *(volatile uint64_t*)&in_args[4];
367 	out_args[3] = in_args[3];
368 	out_args[2] = in_args[2];
369 	out_args[1] = in_args[1];
370 	out_args[0] = in_args[0];
371 }
372 
373 void
munge_wwwwllww(void * args)374 munge_wwwwllww(void *args)
375 {
376 	volatile uint64_t *out_args = (volatile uint64_t*)args;
377 	volatile uint32_t *in_args = (volatile uint32_t*)args;
378 
379 	out_args[7] = in_args[9];
380 	out_args[6] = in_args[8];
381 	out_args[5] = *(volatile uint64_t*)&in_args[6];
382 	out_args[4] = *(volatile uint64_t*)&in_args[4];
383 	out_args[3] = in_args[3];
384 	out_args[2] = in_args[2];
385 	out_args[1] = in_args[1];
386 	out_args[0] = in_args[0];
387 }
388 
389 void
munge_wwwwl(void * args)390 munge_wwwwl(void *args)
391 {
392 	volatile uint64_t *out_args = (volatile uint64_t*)args;
393 	volatile uint32_t *in_args = (volatile uint32_t*)args;
394 
395 	out_args[4] = *(volatile uint64_t*)&in_args[4];
396 	out_args[3] = in_args[3];
397 	out_args[2] = in_args[2];
398 	out_args[1] = in_args[1];
399 	out_args[0] = in_args[0];
400 }
401 
402 void
munge_wwwwwl(void * args)403 munge_wwwwwl(void *args)
404 {
405 	volatile uint64_t *out_args = (volatile uint64_t*)args;
406 	volatile uint32_t *in_args = (volatile uint32_t*)args;
407 
408 	out_args[5] = *(volatile uint64_t*)&in_args[5];
409 	out_args[4] = in_args[4];
410 	out_args[3] = in_args[3];
411 	out_args[2] = in_args[2];
412 	out_args[1] = in_args[1];
413 	out_args[0] = in_args[0];
414 }
415 
416 void
munge_wwwwwlww(void * args)417 munge_wwwwwlww(void *args)
418 {
419 	volatile uint64_t *out_args = (volatile uint64_t*)args;
420 	volatile uint32_t *in_args = (volatile uint32_t*)args;
421 
422 	out_args[7] = in_args[8];
423 	out_args[6] = in_args[7];
424 	out_args[5] = *(volatile uint64_t*)&in_args[5];
425 	out_args[4] = in_args[4];
426 	out_args[3] = in_args[3];
427 	out_args[2] = in_args[2];
428 	out_args[1] = in_args[1];
429 	out_args[0] = in_args[0];
430 }
431 
432 void
munge_wwwwwllw(void * args)433 munge_wwwwwllw(void *args)
434 {
435 	volatile uint64_t *out_args = (volatile uint64_t*)args;
436 	volatile uint32_t *in_args = (volatile uint32_t*)args;
437 
438 	out_args[7] = in_args[9];
439 	out_args[6] = *(volatile uint64_t*)&in_args[7];
440 	out_args[5] = *(volatile uint64_t*)&in_args[5];
441 	out_args[4] = in_args[4];
442 	out_args[3] = in_args[3];
443 	out_args[2] = in_args[2];
444 	out_args[1] = in_args[1];
445 	out_args[0] = in_args[0];
446 }
447 
448 void
munge_wwwwwlll(void * args)449 munge_wwwwwlll(void *args)
450 {
451 	volatile uint64_t *out_args = (volatile uint64_t*)args;
452 	volatile uint32_t *in_args = (volatile uint32_t*)args;
453 
454 	out_args[7] = *(volatile uint64_t*)&in_args[9];
455 	out_args[6] = *(volatile uint64_t*)&in_args[7];
456 	out_args[5] = *(volatile uint64_t*)&in_args[5];
457 	out_args[4] = in_args[4];
458 	out_args[3] = in_args[3];
459 	out_args[2] = in_args[2];
460 	out_args[1] = in_args[1];
461 	out_args[0] = in_args[0];
462 }
463 
464 void
munge_wwwwwwl(void * args)465 munge_wwwwwwl(void *args)
466 {
467 	volatile uint64_t *out_args = (volatile uint64_t*)args;
468 	volatile uint32_t *in_args = (volatile uint32_t*)args;
469 
470 	out_args[6] = *(volatile uint64_t*)&in_args[6];
471 	out_args[5] = in_args[5];
472 	out_args[4] = in_args[4];
473 	out_args[3] = in_args[3];
474 	out_args[2] = in_args[2];
475 	out_args[1] = in_args[1];
476 	out_args[0] = in_args[0];
477 }
478 
479 void
munge_wwwwwwlw(void * args)480 munge_wwwwwwlw(void *args)
481 {
482 	volatile uint64_t *out_args = (volatile uint64_t*)args;
483 	volatile uint32_t *in_args = (volatile uint32_t*)args;
484 
485 	out_args[7] = in_args[8];
486 	out_args[6] = *(volatile uint64_t*)&in_args[6];
487 	out_args[5] = in_args[5];
488 	out_args[4] = in_args[4];
489 	out_args[3] = in_args[3];
490 	out_args[2] = in_args[2];
491 	out_args[1] = in_args[1];
492 	out_args[0] = in_args[0];
493 }
494 
495 void
munge_wwwwwwll(void * args)496 munge_wwwwwwll(void *args)
497 {
498 	volatile uint64_t *out_args = (volatile uint64_t*)args;
499 	volatile uint32_t *in_args = (volatile uint32_t*)args;
500 
501 	out_args[7] = *(volatile uint64_t*)&in_args[8];
502 	out_args[6] = *(volatile uint64_t*)&in_args[6];
503 	out_args[5] = in_args[5];
504 	out_args[4] = in_args[4];
505 	out_args[3] = in_args[3];
506 	out_args[2] = in_args[2];
507 	out_args[1] = in_args[1];
508 	out_args[0] = in_args[0];
509 }
510 
511 void
munge_wsw(void * args)512 munge_wsw(void *args)
513 {
514 	volatile uint64_t *out_args = (volatile uint64_t*)args;
515 	volatile uint32_t *in_args = (volatile uint32_t*)args;
516 
517 	out_args[2] = in_args[2];
518 	out_args[1] = (int64_t)(int)in_args[1]; /* Sign-extend */
519 	out_args[0] = in_args[0];
520 }
521 
522 void
munge_wws(void * args)523 munge_wws(void *args)
524 {
525 	volatile uint64_t *out_args = (volatile uint64_t*)args;
526 	volatile uint32_t *in_args = (volatile uint32_t*)args;
527 
528 	out_args[2] = (int64_t)(int)in_args[2]; /* Sign-extend */
529 	out_args[1] = in_args[1];
530 	out_args[0] = in_args[0];
531 }
532 
533 void
munge_wwws(void * args)534 munge_wwws(void *args)
535 {
536 	volatile uint64_t *out_args = (volatile uint64_t*)args;
537 	volatile uint32_t *in_args = (volatile uint32_t*)args;
538 
539 	out_args[3] = (int64_t)(int)in_args[3]; /* Sign-extend */
540 	out_args[2] = in_args[2];
541 	out_args[1] = in_args[1];
542 	out_args[0] = in_args[0];
543 }
544 
545 
546 void
munge_wwwsw(void * args)547 munge_wwwsw(void *args)
548 {
549 	volatile uint64_t *out_args = (volatile uint64_t*)args;
550 	volatile uint32_t *in_args = (volatile uint32_t*)args;
551 
552 	out_args[4] = in_args[4];
553 	out_args[3] = (int64_t)(int)in_args[3]; /* Sign-extend */
554 	out_args[2] = in_args[2];
555 	out_args[1] = in_args[1];
556 	out_args[0] = in_args[0];
557 }
558 
559 void
munge_llllllll(void * args __unused)560 munge_llllllll(void *args __unused)
561 {
562 	/* Nothing to do, already all 64-bit */
563 }
564 
565 void
munge_llllll(void * args __unused)566 munge_llllll(void *args __unused)
567 {
568 	/* Nothing to do, already all 64-bit */
569 }
570 
571 void
munge_llll(void * args __unused)572 munge_llll(void *args __unused)
573 {
574 	/* Nothing to do, already all 64-bit */
575 }
576 
577 void
munge_lll(void * args __unused)578 munge_lll(void *args __unused)
579 {
580 	/* Nothing to do, already all 64-bit */
581 }
582 
583 void
munge_ll(void * args __unused)584 munge_ll(void *args __unused)
585 {
586 	/* Nothing to do, already all 64-bit */
587 }
588 
589 void
munge_l(void * args __unused)590 munge_l(void *args __unused)
591 {
592 	/* Nothing to do, already all 64-bit */
593 }
594 
595 void
munge_lw(void * args)596 munge_lw(void *args)
597 {
598 	volatile uint64_t *out_args = (volatile uint64_t*)args;
599 	volatile uint32_t *in_args = (volatile uint32_t*)args;
600 
601 	out_args[1] = in_args[2];
602 	out_args[0] = *(volatile uint64_t*)&in_args[0];
603 }
604 
605 void
munge_lwww(void * args)606 munge_lwww(void *args)
607 {
608 	volatile uint64_t *out_args = (volatile uint64_t*)args;
609 	volatile uint32_t *in_args = (volatile uint32_t*)args;
610 
611 	out_args[3] = in_args[4];
612 	out_args[2] = in_args[3];
613 	out_args[1] = in_args[2];
614 	out_args[0] = *(volatile uint64_t*)&in_args[0];
615 }
616 
617 void
munge_lwwwwwww(void * args)618 munge_lwwwwwww(void *args)
619 {
620 	volatile uint64_t *out_args = (volatile uint64_t*)args;
621 	volatile uint32_t *in_args = (volatile uint32_t*)args;
622 
623 	out_args[7] = in_args[8];
624 	out_args[6] = in_args[7];
625 	out_args[5] = in_args[6];
626 	out_args[4] = in_args[5];
627 	out_args[3] = in_args[4];
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_wwlww(void * args)634 munge_wwlww(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[4] = in_args[5];
640 	out_args[3] = in_args[4];
641 	out_args[2] = *(volatile uint64_t*)&in_args[2];
642 	out_args[1] = in_args[1];
643 	out_args[0] = in_args[0];
644 }
645 
646 void
munge_wwlwww(void * args)647 munge_wwlwww(void *args)
648 {
649 	volatile uint64_t *out_args = (volatile uint64_t*)args;
650 	volatile uint32_t *in_args = (volatile uint32_t*)args;
651 
652 	out_args[5] = in_args[6];
653 	out_args[4] = in_args[5];
654 	out_args[3] = in_args[4];
655 	out_args[2] = *(volatile uint64_t*)&in_args[2];
656 	out_args[1] = in_args[1];
657 	out_args[0] = in_args[0];
658 }
659 
660 void
munge_wlwwwl(void * args)661 munge_wlwwwl(void *args)
662 {
663 	volatile uint64_t *out_args = (volatile uint64_t*)args;
664 	volatile uint32_t *in_args = (volatile uint32_t*)args;
665 
666 	out_args[5] = *(volatile uint64_t*)&in_args[6];
667 	out_args[4] = in_args[5];
668 	out_args[3] = in_args[4];
669 	out_args[2] = in_args[3];
670 	out_args[1] = *(volatile uint64_t*)&in_args[1];
671 	out_args[0] = in_args[0];
672 }
673 
674 void
munge_wwlwwwl(void * args)675 munge_wwlwwwl(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[6] = *(volatile uint64_t*)&in_args[7];
681 	out_args[5] = in_args[6];
682 	out_args[4] = in_args[5];
683 	out_args[3] = in_args[4];
684 	out_args[2] = *(volatile uint64_t*)&in_args[2];
685 	out_args[1] = in_args[1];
686 	out_args[0] = in_args[0];
687 }
688 
689 /*
690  * Munge array of 32-bit values into an array of 64-bit values,
691  * without sign extension.  Note, src and dest can be the same
692  * (copies from end of array)
693  */
694 static inline __attribute__((always_inline)) void
munge_32_to_64_unsigned(volatile uint64_t * dest,volatile uint32_t * src,int count)695 munge_32_to_64_unsigned(volatile uint64_t *dest, volatile uint32_t *src, int count)
696 {
697 	int i;
698 
699 	for (i = count - 1; i >= 0; i--) {
700 		dest[i] = src[i];
701 	}
702 }
703