]> git.saurik.com Git - apple/xnu.git/blob - bsd/dev/munge.c
xnu-2422.115.4.tar.gz
[apple/xnu.git] / bsd / dev / munge.c
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 static inline __attribute__((always_inline)) void
35 munge_32_to_64_unsigned(volatile uint64_t *dest, volatile uint32_t *src, int count);
36
37 /*
38 * Refer to comments in bsd/sys/munge.h
39 */
40 void
41 munge_w(const void *arg0 __unused, void *args)
42 {
43 munge_32_to_64_unsigned(args, args, 1);
44 }
45
46 void
47 munge_ww(const void *arg0 __unused, void *args)
48 {
49 munge_32_to_64_unsigned(args, args, 2);
50 }
51
52 void
53 munge_www(const void *arg0 __unused, void *args)
54 {
55 munge_32_to_64_unsigned(args, args, 3);
56 }
57
58 void
59 munge_wwww(const void *arg0 __unused, void *args)
60 {
61 munge_32_to_64_unsigned(args, args, 4);
62 }
63
64 void
65 munge_wwwww(const void *arg0 __unused, void *args)
66 {
67 munge_32_to_64_unsigned(args, args, 5);
68 }
69
70 void
71 munge_wwwwww(const void *arg0 __unused, void *args)
72 {
73 munge_32_to_64_unsigned(args, args, 6);
74 }
75
76 void
77 munge_wwwwwww(const void *arg0 __unused, void *args)
78 {
79 munge_32_to_64_unsigned(args, args, 7);
80 }
81
82 void
83 munge_wwwwwwww(const void *arg0 __unused, void *args)
84 {
85 munge_32_to_64_unsigned(args, args, 8);
86 }
87
88 void
89 munge_wl(const void *arg0 __unused, void *args)
90 {
91 volatile uint64_t *out_args = (volatile uint64_t*)args;
92 volatile uint32_t *in_args = (volatile uint32_t*)args;
93
94 out_args[1] = *(uint64_t*)&in_args[1];
95 out_args[0] = in_args[0];
96 }
97
98 void
99 munge_wwl(const void *arg0 __unused, void *args)
100 {
101 volatile uint64_t *out_args = (volatile uint64_t*)args;
102 volatile uint32_t *in_args = (volatile uint32_t*)args;
103
104 out_args[2] = *(uint64_t*)&in_args[2];
105 out_args[1] = in_args[1];
106 out_args[0] = in_args[0];
107 }
108
109 void
110 munge_wwlw(const void *arg0 __unused, void *args)
111 {
112 volatile uint64_t *out_args = (volatile uint64_t*)args;
113 volatile uint32_t *in_args = (volatile uint32_t*)args;
114
115 out_args[3] = in_args[4];
116 out_args[2] = *(uint64_t*)&in_args[2];
117 out_args[1] = in_args[1];
118 out_args[0] = in_args[0];
119 }
120 void
121 munge_wwlll(const void *arg0 __unused, void *args)
122 {
123 volatile uint64_t *out_args = (volatile uint64_t*)args;
124 volatile uint32_t *in_args = (volatile uint32_t*)args;
125
126 out_args[4] = *(uint64_t*)&in_args[6];
127 out_args[3] = *(uint64_t*)&in_args[4];
128 out_args[2] = *(uint64_t*)&in_args[2];
129 out_args[1] = in_args[1];
130 out_args[0] = in_args[0];
131 }
132
133 void
134 munge_wwllww(const void *arg0 __unused, void *args)
135 {
136 volatile uint64_t *out_args = (volatile uint64_t*)args;
137 volatile uint32_t *in_args = (volatile uint32_t*)args;
138
139 out_args[5] = in_args[7];
140 out_args[4] = in_args[6];
141 out_args[3] = *(uint64_t*)&in_args[4];
142 out_args[2] = *(uint64_t*)&in_args[2];
143 out_args[1] = in_args[1];
144 out_args[0] = in_args[0];
145 }
146
147 void
148 munge_wlw(const void *arg0 __unused, void *args)
149 {
150 volatile uint64_t *out_args = (volatile uint64_t*)args;
151 volatile uint32_t *in_args = (volatile uint32_t*)args;
152
153 out_args[2] = in_args[3];
154 out_args[1] = *(uint64_t*)&in_args[1];
155 out_args[0] = in_args[0];
156 }
157
158 void
159 munge_wlwwwll(const void *arg0 __unused, void *args)
160 {
161 volatile uint64_t *out_args = (volatile uint64_t*)args;
162 volatile uint32_t *in_args = (volatile uint32_t*)args;
163
164 out_args[6] = *(uint64_t*)&in_args[8];
165 out_args[5] = *(uint64_t*)&in_args[6];
166 out_args[4] = in_args[5];
167 out_args[3] = in_args[4];
168 out_args[2] = in_args[3];
169 out_args[1] = *(uint64_t*)&in_args[1];
170 out_args[0] = in_args[0];
171 }
172
173 void
174 munge_wlwwwllw(const void *arg0 __unused, void *args)
175 {
176 volatile uint64_t *out_args = (volatile uint64_t*)args;
177 volatile uint32_t *in_args = (volatile uint32_t*)args;
178
179 out_args[7] = in_args[10];
180 munge_wlwwwll(args, args);
181 }
182
183 void
184 munge_wlwwlwlw(const void *arg0 __unused, void *args)
185 {
186 volatile uint64_t *out_args = (volatile uint64_t*)args;
187 volatile uint32_t *in_args = (volatile uint32_t*)args;
188
189 out_args[7] = in_args[10];
190 out_args[6] = *(uint64_t*)&in_args[8];
191 out_args[5] = in_args[7];
192 out_args[4] = *(uint64_t*)&in_args[5];
193 out_args[3] = in_args[4];
194 out_args[2] = in_args[3];
195 out_args[1] = *(uint64_t*)&in_args[1];
196 out_args[0] = in_args[0];
197 }
198
199 void
200 munge_wll(const void *arg0 __unused, void *args)
201 {
202 volatile uint64_t *out_args = (volatile uint64_t*)args;
203 volatile uint32_t *in_args = (volatile uint32_t*)args;
204
205 out_args[2] = *(uint64_t*)&in_args[3];
206 out_args[1] = *(uint64_t*)&in_args[1];
207 out_args[0] = in_args[0];
208 }
209
210 void
211 munge_wlll(const void *arg0 __unused, void *args)
212 {
213 volatile uint64_t *out_args = (volatile uint64_t*)args;
214 volatile uint32_t *in_args = (volatile uint32_t*)args;
215
216 out_args[3] = *(uint64_t*)&in_args[5];
217 out_args[2] = *(uint64_t*)&in_args[3];
218 out_args[1] = *(uint64_t*)&in_args[1];
219 out_args[0] = in_args[0];
220 }
221
222 void
223 munge_wllww(const void *arg0 __unused, void *args)
224 {
225 volatile uint64_t *out_args = (volatile uint64_t*)args;
226 volatile uint32_t *in_args = (volatile uint32_t*)args;
227
228 out_args[4] = in_args[6];
229 out_args[3] = in_args[5];
230 out_args[2] = *(uint64_t*)&in_args[3];
231 out_args[1] = *(uint64_t*)&in_args[1];
232 out_args[0] = in_args[0];
233 }
234
235 void
236 munge_wllwwll(const void *arg0 __unused, void *args)
237 {
238 volatile uint64_t *out_args = (volatile uint64_t*)args;
239 volatile uint32_t *in_args = (volatile uint32_t*)args;
240
241 out_args[6] = *(uint64_t*)&in_args[9];
242 out_args[5] = *(uint64_t*)&in_args[7];
243 out_args[4] = in_args[6];
244 out_args[3] = in_args[5];
245 out_args[2] = *(uint64_t*)&in_args[3];
246 out_args[1] = *(uint64_t*)&in_args[1];
247 out_args[0] = in_args[0];
248 }
249
250 void
251 munge_wwwlw(const void *arg0 __unused, 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[4] = in_args[5];
257 out_args[3] = *(uint64_t*)&in_args[3];
258 out_args[2] = in_args[2];
259 out_args[1] = in_args[1];
260 out_args[0] = in_args[0];
261 }
262
263 void
264 munge_wwwlww(const void *arg0 __unused, void *args)
265 {
266 volatile uint64_t *out_args = (volatile uint64_t*)args;
267 volatile uint32_t *in_args = (volatile uint32_t*)args;
268
269 out_args[5] = in_args[6];
270 out_args[4] = in_args[5];
271 out_args[3] = *(uint64_t*)&in_args[3];
272 out_args[2] = in_args[2];
273 out_args[1] = in_args[1];
274 out_args[0] = in_args[0];
275 }
276
277 void
278 munge_wwwl(const void *arg0 __unused, 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[3] = *(uint64_t*)&in_args[3];
284 out_args[2] = in_args[2];
285 out_args[1] = in_args[1];
286 out_args[0] = in_args[0];
287 }
288
289 void
290 munge_wwwwlw(const void *arg0 __unused, void *args)
291 {
292 volatile uint64_t *out_args = (volatile uint64_t*)args;
293 volatile uint32_t *in_args = (volatile uint32_t*)args;
294
295 out_args[5] = in_args[6];
296 out_args[4] = *(uint64_t*)&in_args[4];
297 out_args[3] = in_args[3];
298 out_args[2] = in_args[2];
299 out_args[1] = in_args[1];
300 out_args[0] = in_args[0];
301 }
302
303 void
304 munge_wwwwl(const void *arg0 __unused, void *args)
305 {
306 volatile uint64_t *out_args = (volatile uint64_t*)args;
307 volatile uint32_t *in_args = (volatile uint32_t*)args;
308
309 out_args[4] = *(uint64_t*)&in_args[4];
310 out_args[3] = in_args[3];
311 out_args[2] = in_args[2];
312 out_args[1] = in_args[1];
313 out_args[0] = in_args[0];
314 }
315
316 void
317 munge_wwwwwl(const void *arg0 __unused, void *args)
318 {
319 volatile uint64_t *out_args = (volatile uint64_t*)args;
320 volatile uint32_t *in_args = (volatile uint32_t*)args;
321
322 out_args[5] = *(uint64_t*)&in_args[5];
323 out_args[4] = in_args[4];
324 out_args[3] = in_args[3];
325 out_args[2] = in_args[2];
326 out_args[1] = in_args[1];
327 out_args[0] = in_args[0];
328 }
329
330 void
331 munge_wwwwwlww(const void *arg0 __unused, void *args)
332 {
333 volatile uint64_t *out_args = (volatile uint64_t*)args;
334 volatile uint32_t *in_args = (volatile uint32_t*)args;
335
336 out_args[7] = in_args[8];
337 out_args[6] = in_args[7];
338 out_args[5] = *(uint64_t*)&in_args[5];
339 out_args[4] = in_args[4];
340 out_args[3] = in_args[3];
341 out_args[2] = in_args[2];
342 out_args[1] = in_args[1];
343 out_args[0] = in_args[0];
344 }
345
346 void
347 munge_wwwwwllw(const void *arg0 __unused, void *args)
348 {
349 volatile uint64_t *out_args = (volatile uint64_t*)args;
350 volatile uint32_t *in_args = (volatile uint32_t*)args;
351
352 out_args[7] = in_args[9];
353 out_args[6] = *(uint64_t*)&in_args[7];
354 out_args[5] = *(uint64_t*)&in_args[5];
355 out_args[4] = in_args[4];
356 out_args[3] = in_args[3];
357 out_args[2] = in_args[2];
358 out_args[1] = in_args[1];
359 out_args[0] = in_args[0];
360 }
361
362 void
363 munge_wwwwwlll(const void *arg0 __unused, void *args)
364 {
365 volatile uint64_t *out_args = (volatile uint64_t*)args;
366 volatile uint32_t *in_args = (volatile uint32_t*)args;
367
368 out_args[7] = *(uint64_t*)&in_args[9];
369 out_args[6] = *(uint64_t*)&in_args[7];
370 out_args[5] = *(uint64_t*)&in_args[5];
371 out_args[4] = in_args[4];
372 out_args[3] = in_args[3];
373 out_args[2] = in_args[2];
374 out_args[1] = in_args[1];
375 out_args[0] = in_args[0];
376 }
377
378 void
379 munge_wwwwwwl(const void *arg0 __unused, void *args)
380 {
381 volatile uint64_t *out_args = (volatile uint64_t*)args;
382 volatile uint32_t *in_args = (volatile uint32_t*)args;
383
384 out_args[6] = *(uint64_t*)&in_args[6];
385 out_args[5] = in_args[5];
386 out_args[4] = in_args[4];
387 out_args[3] = in_args[3];
388 out_args[2] = in_args[2];
389 out_args[1] = in_args[1];
390 out_args[0] = in_args[0];
391 }
392
393 void
394 munge_wwwwwwlw(const void *arg0 __unused, void *args)
395 {
396 volatile uint64_t *out_args = (volatile uint64_t*)args;
397 volatile uint32_t *in_args = (volatile uint32_t*)args;
398
399 out_args[7] = in_args[8];
400 out_args[6] = *(uint64_t*)&in_args[6];
401 out_args[5] = in_args[5];
402 out_args[4] = in_args[4];
403 out_args[3] = in_args[3];
404 out_args[2] = in_args[2];
405 out_args[1] = in_args[1];
406 out_args[0] = in_args[0];
407 }
408
409 void
410 munge_wwwwwwll(const void *arg0 __unused, void *args)
411 {
412 volatile uint64_t *out_args = (volatile uint64_t*)args;
413 volatile uint32_t *in_args = (volatile uint32_t*)args;
414
415 out_args[7] = *(uint64_t*)&in_args[8];
416 out_args[6] = *(uint64_t*)&in_args[6];
417 out_args[5] = in_args[5];
418 out_args[4] = in_args[4];
419 out_args[3] = in_args[3];
420 out_args[2] = in_args[2];
421 out_args[1] = in_args[1];
422 out_args[0] = in_args[0];
423 }
424
425 void
426 munge_wsw(const void *arg0 __unused, void *args)
427 {
428 volatile uint64_t *out_args = (volatile uint64_t*)args;
429 volatile uint32_t *in_args = (volatile uint32_t*)args;
430
431 out_args[2] = in_args[2];
432 out_args[1] = (int64_t)(int)in_args[1]; /* Sign-extend */
433 out_args[0] = in_args[0];
434 }
435
436 void
437 munge_wws(const void *arg0 __unused, void *args)
438 {
439 volatile uint64_t *out_args = (volatile uint64_t*)args;
440 volatile uint32_t *in_args = (volatile uint32_t*)args;
441
442 out_args[2] = (int64_t)(int)in_args[2]; /* Sign-extend */
443 out_args[1] = in_args[1];
444 out_args[0] = in_args[0];
445 }
446
447 void
448 munge_wwwsw(const void *arg0 __unused, void *args)
449 {
450 volatile uint64_t *out_args = (volatile uint64_t*)args;
451 volatile uint32_t *in_args = (volatile uint32_t*)args;
452
453 out_args[4] = in_args[4];
454 out_args[3] = (int64_t)(int)in_args[3]; /* Sign-extend */
455 out_args[2] = in_args[2];
456 out_args[1] = in_args[1];
457 out_args[0] = in_args[0];
458 }
459
460 void
461 munge_llllll(const void *arg0 __unused, void *args __unused)
462 {
463 /* Nothing to do, already all 64-bit */
464 }
465
466 void
467 munge_ll(const void *arg0 __unused, void *args __unused)
468 {
469 /* Nothing to do, already all 64-bit */
470 }
471
472 void
473 munge_l(const void *arg0 __unused, void *args __unused)
474 {
475 /* Nothing to do, already all 64-bit */
476 }
477
478 void
479 munge_lw(const void *arg0 __unused, void *args)
480 {
481 volatile uint64_t *out_args = (volatile uint64_t*)args;
482 volatile uint32_t *in_args = (volatile uint32_t*)args;
483
484 out_args[1] = in_args[2];
485 out_args[0] = *(uint64_t*)&in_args[0];
486 }
487
488 void
489 munge_lwww(const void *arg0 __unused, void *args)
490 {
491 volatile uint64_t *out_args = (volatile uint64_t*)args;
492 volatile uint32_t *in_args = (volatile uint32_t*)args;
493
494 out_args[3] = in_args[4];
495 out_args[2] = in_args[3];
496 out_args[1] = in_args[2];
497 out_args[0] = *(uint64_t*)&in_args[0];
498 }
499
500 void
501 munge_wwlwww(const void *arg0 __unused, void *args)
502 {
503 volatile uint64_t *out_args = (volatile uint64_t*)args;
504 volatile uint32_t *in_args = (volatile uint32_t*)args;
505
506 out_args[5] = in_args[6];
507 out_args[4] = in_args[5];
508 out_args[3] = in_args[4];
509 out_args[2] = *(uint64_t*)&in_args[2];
510 out_args[1] = in_args[1];
511 out_args[0] = in_args[0];
512 }
513
514 /*
515 * Munge array of 32-bit values into an array of 64-bit values,
516 * without sign extension. Note, src and dest can be the same
517 * (copies from end of array)
518 */
519 static inline __attribute__((always_inline)) void
520 munge_32_to_64_unsigned(volatile uint64_t *dest, volatile uint32_t *src, int count)
521 {
522 int i;
523
524 for (i = count - 1; i >= 0; i--) {
525 dest[i] = src[i];
526 }
527 }
528