]>
git.saurik.com Git - apple/xnu.git/blob - bsd/dev/munge.c
2 * Coyright (c) 2005-2006 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
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.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #include <sys/cdefs.h>
30 #include <sys/types.h>
31 #include <sys/munge.h>
34 static inline __attribute__((always_inline
)) void
35 munge_32_to_64_unsigned(volatile uint64_t *dest
, volatile uint32_t *src
, int count
);
38 * Refer to comments in bsd/sys/munge.h
41 munge_w(const void *arg0 __unused
, void *args
)
43 munge_32_to_64_unsigned(args
, args
, 1);
47 munge_ww(const void *arg0 __unused
, void *args
)
49 munge_32_to_64_unsigned(args
, args
, 2);
53 munge_www(const void *arg0 __unused
, void *args
)
55 munge_32_to_64_unsigned(args
, args
, 3);
59 munge_wwww(const void *arg0 __unused
, void *args
)
61 munge_32_to_64_unsigned(args
, args
, 4);
65 munge_wwwww(const void *arg0 __unused
, void *args
)
67 munge_32_to_64_unsigned(args
, args
, 5);
71 munge_wwwwww(const void *arg0 __unused
, void *args
)
73 munge_32_to_64_unsigned(args
, args
, 6);
77 munge_wwwwwww(const void *arg0 __unused
, void *args
)
79 munge_32_to_64_unsigned(args
, args
, 7);
83 munge_wwwwwwww(const void *arg0 __unused
, void *args
)
85 munge_32_to_64_unsigned(args
, args
, 8);
89 munge_wl(const void *arg0 __unused
, void *args
)
91 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
92 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
94 out_args
[1] = *(uint64_t*)&in_args
[1];
95 out_args
[0] = in_args
[0];
99 munge_wwl(const void *arg0 __unused
, void *args
)
101 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
102 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
104 out_args
[2] = *(uint64_t*)&in_args
[2];
105 out_args
[1] = in_args
[1];
106 out_args
[0] = in_args
[0];
110 munge_wwlw(const void *arg0 __unused
, void *args
)
112 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
113 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
121 munge_wwlll(const void *arg0 __unused
, void *args
)
123 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
124 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
134 munge_wwllww(const void *arg0 __unused
, void *args
)
136 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
137 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
148 munge_wlw(const void *arg0 __unused
, void *args
)
150 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
151 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
153 out_args
[2] = in_args
[3];
154 out_args
[1] = *(uint64_t*)&in_args
[1];
155 out_args
[0] = in_args
[0];
159 munge_wlwwwll(const void *arg0 __unused
, void *args
)
161 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
162 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
174 munge_wlwwwllw(const void *arg0 __unused
, void *args
)
176 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
177 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
179 out_args
[7] = in_args
[10];
180 munge_wlwwwll(args
, args
);
184 munge_wlwwlwlw(const void *arg0 __unused
, void *args
)
186 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
187 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
200 munge_wll(const void *arg0 __unused
, void *args
)
202 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
203 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
211 munge_wlll(const void *arg0 __unused
, void *args
)
213 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
214 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
223 munge_wllww(const void *arg0 __unused
, void *args
)
225 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
226 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
236 munge_wllwwll(const void *arg0 __unused
, void *args
)
238 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
239 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
251 munge_wwwlw(const void *arg0 __unused
, void *args
)
253 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
254 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
264 munge_wwwlww(const void *arg0 __unused
, void *args
)
266 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
267 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
278 munge_wwwl(const void *arg0 __unused
, void *args
)
280 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
281 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
290 munge_wwwwlw(const void *arg0 __unused
, void *args
)
292 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
293 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
304 munge_wwwwl(const void *arg0 __unused
, void *args
)
306 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
307 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
317 munge_wwwwwl(const void *arg0 __unused
, void *args
)
319 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
320 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
331 munge_wwwwwlww(const void *arg0 __unused
, void *args
)
333 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
334 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
347 munge_wwwwwllw(const void *arg0 __unused
, void *args
)
349 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
350 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
363 munge_wwwwwlll(const void *arg0 __unused
, void *args
)
365 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
366 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
379 munge_wwwwwwl(const void *arg0 __unused
, void *args
)
381 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
382 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
394 munge_wwwwwwlw(const void *arg0 __unused
, void *args
)
396 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
397 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
410 munge_wwwwwwll(const void *arg0 __unused
, void *args
)
412 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
413 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
426 munge_wsw(const void *arg0 __unused
, void *args
)
428 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
429 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
437 munge_wws(const void *arg0 __unused
, void *args
)
439 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
440 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
448 munge_wwwsw(const void *arg0 __unused
, void *args
)
450 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
451 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
461 munge_llllll(const void *arg0 __unused
, void *args __unused
)
463 /* Nothing to do, already all 64-bit */
467 munge_ll(const void *arg0 __unused
, void *args __unused
)
469 /* Nothing to do, already all 64-bit */
473 munge_l(const void *arg0 __unused
, void *args __unused
)
475 /* Nothing to do, already all 64-bit */
479 munge_lw(const void *arg0 __unused
, void *args
)
481 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
482 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
484 out_args
[1] = in_args
[2];
485 out_args
[0] = *(uint64_t*)&in_args
[0];
489 munge_lwww(const void *arg0 __unused
, void *args
)
491 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
492 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
501 munge_wwlwww(const void *arg0 __unused
, void *args
)
503 volatile uint64_t *out_args
= (volatile uint64_t*)args
;
504 volatile uint32_t *in_args
= (volatile uint32_t*)args
;
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];
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)
519 static inline __attribute__((always_inline
)) void
520 munge_32_to_64_unsigned(volatile uint64_t *dest
, volatile uint32_t *src
, int count
)
524 for (i
= count
- 1; i
>= 0; i
--) {