1/*
2 * Copyright (c) 2004 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/*
30 *  Syscall argument mungers.
31 *
32 *  Passed a pointer to the users register array in the savearea, we copy args into
33 *  the uu_arg[] array, padding etc as appropriate.  The issue is that parameters
34 *  passed in registers from a 32-bit address space do not map directly into the uu_args.
35 *  For example, a 32-bit long-long comes in two registers, but we need to combine
36 *  them into one 64-bit long-long in the uu_args.
37 *
38 *  There are several functions in this file.  Each takes two parameters:
39 *
40 *      void    munge_XXXX( const void *regs, void *uu_args);
41 *
42 *  The name of the function encodes the number and type of the parameters, as follows:
43 *
44 *      w = a 32-bit value such as an int or a 32-bit ptr, that does not require
45 *          sign extension.  These are handled by skipping a word in the input,
46 *          zeroing a word of output, and copying a word from input to output.
47 *
48 *      s = a 32-bit value such as a long, which must be sign-extended to a 64-bit
49 *          long-long in the uu_args.  These are handled by skipping a word of
50 *          input, loading a word of input and sign extending it to a double,
51 *          and storing two words of output.
52 *
53 *      l = a 64-bit long-long, passed in two registers.  These are handled by skipping
54 *          a word of input, copying a word, skipping another word of input, and
55 *          copying another word.
56 *
57 *      d = a 32-bit int or a 64-bit ptr or long, passed in via a 64-bit GPR
58 *          from a 64-bit process.  We copy two words from input to output.
59 *
60 *  For example, "munge_wls" takes a word, a long-long, and a word.  This takes
61 *  four registers: the first word is in one, the long-long takes two, and the
62 *  final word is in the fourth.  We store six words: a 0, the low words of the
63 *  first three registers, and the two words resulting from sign-extending the
64 *  low word of the fourth register.
65 *
66 *  As you can see, we save a lot of code by collapsing mungers that are prefixes
67 *  of each other, into the more general routine.  This ends up copying a few extra
68 *  bytes of parameters, but big deal.  The old kernel copied all eight words for
69 *  every system call.
70 *
71 *  These routines assume explicit pad words in the uu_arg structures, that fill out
72 *  int parameters to 64 bits.  Having pad words makes munging args for 64-bit
73 *  processes the equivalent of a simple bcopy(), though it does introduce an
74 *  endian dependency.
75 */
76
77        .align  5
78        .globl  _munge_dddddddd        // that is 8 'd's
79_munge_dddddddd:
80        .globl  _munge_ddddddd
81_munge_ddddddd:
82        .globl  _munge_dddddd
83_munge_dddddd:
84        .globl  _munge_ddddd
85_munge_ddddd:
86        ld     r5,0*8+0(r3)
87        ld     r6,1*8+0(r3)
88        ld     r7,2*8+0(r3)
89        ld     r8,3*8+0(r3)
90        ld     r9,4*8+0(r3)
91        ld     r10,5*8+0(r3)
92        ld     r11,6*8+0(r3)
93        ld     r12,7*8+0(r3)
94
95        std     r5,0*8+0(r4)
96        std     r6,1*8+0(r4)
97        std     r7,2*8+0(r4)
98        std     r8,3*8+0(r4)
99        std     r9,4*8+0(r4)
100        std     r10,5*8+0(r4)
101        std     r11,6*8+0(r4)
102        std     r12,7*8+0(r4)
103
104        blr
105
106
107        .align  5
108        .globl  _munge_dddd
109_munge_dddd:
110        .globl  _munge_ddd
111_munge_ddd:
112        .globl  _munge_dd
113_munge_dd:
114        .globl  _munge_d
115_munge_d:
116        ld     r5,0*8+0(r3)
117        ld     r6,1*8+0(r3)
118        ld     r7,2*8+0(r3)
119        ld     r8,3*8+0(r3)
120
121        std     r5,0*8+0(r4)
122        std     r6,1*8+0(r4)
123        std     r7,2*8+0(r4)
124        std     r8,3*8+0(r4)
125
126        blr
127
128
129        .align  5
130        .globl  _munge_wwwwwwww        // that is 8 'w's
131_munge_wwwwwwww:
132        .globl  _munge_wwwwwww
133_munge_wwwwwww:
134        .globl  _munge_wwwwww
135_munge_wwwwww:
136        .globl  _munge_wwwww
137_munge_wwwww:
138        li      r0,0
139        lwz     r5,0*8+4(r3)
140        lwz     r6,1*8+4(r3)
141        lwz     r7,2*8+4(r3)
142        lwz     r8,3*8+4(r3)
143        lwz     r9,4*8+4(r3)
144        lwz     r10,5*8+4(r3)
145        lwz     r11,6*8+4(r3)
146        lwz     r12,7*8+4(r3)
147
148        stw     r0,0*8+0(r4)
149        stw     r5,0*8+4(r4)
150        stw     r0,1*8+0(r4)
151        stw     r6,1*8+4(r4)
152        stw     r0,2*8+0(r4)
153        stw     r7,2*8+4(r4)
154        stw     r0,3*8+0(r4)
155        stw     r8,3*8+4(r4)
156        stw     r0,4*8+0(r4)
157        stw     r9,4*8+4(r4)
158        stw     r0,5*8+0(r4)
159        stw     r10,5*8+4(r4)
160        stw     r0,6*8+0(r4)
161        stw     r11,6*8+4(r4)
162        stw     r0,7*8+0(r4)
163        stw     r12,7*8+4(r4)
164
165        blr
166
167
168        .align  5
169        .globl  _munge_wwww
170_munge_wwww:
171        .globl  _munge_www
172_munge_www:
173        .globl  _munge_ww
174_munge_ww:
175        .globl  _munge_w
176_munge_w:
177        li      r0,0
178        lwz     r5,0*8+4(r3)
179        lwz     r6,1*8+4(r3)
180        lwz     r7,2*8+4(r3)
181        lwz     r8,3*8+4(r3)
182
183        stw     r0,0*8+0(r4)
184        stw     r5,0*8+4(r4)
185        stw     r0,1*8+0(r4)
186        stw     r6,1*8+4(r4)
187        stw     r0,2*8+0(r4)
188        stw     r7,2*8+4(r4)
189        stw     r0,3*8+0(r4)
190        stw     r8,3*8+4(r4)
191
192        blr
193
194        .align	5
195	.globl	_munge_l
196_munge_l:
197        li      r0,0
198        lwz     r5,0*8+4(r3)
199        lwz     r6,1*8+4(r3)
200
201        stw     r5,0*8+0(r4)
202        stw     r6,0*8+4(r4)
203
204        blr
205
206        .align  5
207        .globl  _munge_wlw
208_munge_wlw:
209        .globl  _munge_wl
210_munge_wl:
211        li      r0,0
212        lwz     r5,0*8+4(r3)
213        lwz     r6,1*8+4(r3)
214        lwz     r7,2*8+4(r3)
215        lwz     r8,3*8+4(r3)
216
217        stw     r0,0*8+0(r4)
218        stw     r5,0*8+4(r4)
219        stw     r6,1*8+0(r4)
220        stw     r7,1*8+4(r4)
221        stw     r0,2*8+0(r4)
222        stw     r8,2*8+4(r4)
223
224        blr
225
226
227        .align  5
228        .globl  _munge_wwwl
229_munge_wwwl:
230        li      r0,0
231        lwz     r5,0*8+4(r3)
232        lwz     r6,1*8+4(r3)
233        lwz     r7,2*8+4(r3)
234        lwz     r8,3*8+4(r3)
235        lwz     r9,4*8+4(r3)
236
237        stw     r0,0*8+0(r4)
238        stw     r5,0*8+4(r4)
239        stw     r0,1*8+0(r4)
240        stw     r6,1*8+4(r4)
241        stw     r0,2*8+0(r4)
242        stw     r7,2*8+4(r4)
243        stw     r8,3*8+0(r4)
244        stw     r9,3*8+4(r4)
245
246        blr
247
248
249        .align  5
250        .globl  _munge_wwwlww
251_munge_wwwlww:
252        li      r0,0
253        lwz     r5,0*8+4(r3)
254        lwz     r6,1*8+4(r3)
255        lwz     r7,2*8+4(r3)
256        lwz     r8,3*8+4(r3)
257        lwz     r9,4*8+4(r3)
258        lwz     r10,5*8+4(r3)
259        lwz     r11,6*8+4(r3)
260
261        stw     r0,0*8+0(r4)
262        stw     r5,0*8+4(r4)
263        stw     r0,1*8+0(r4)
264        stw     r6,1*8+4(r4)
265        stw     r0,2*8+0(r4)
266        stw     r7,2*8+4(r4)
267        stw     r8,3*8+0(r4)
268        stw     r9,3*8+4(r4)
269        stw     r0,4*8+0(r4)
270        stw     r10,4*8+4(r4)
271        stw     r0,5*8+0(r4)
272        stw     r11,5*8+4(r4)
273
274        blr
275
276
277        .align  5
278        .globl  _munge_wwlwww
279_munge_wwlwww:
280        li      r0,0
281        lwz     r5,0*8+4(r3)	// Wwlwww
282        lwz     r6,1*8+4(r3)	// wWlwww
283        lwz     r7,2*8+4(r3)	// wwLwww (hi)
284        lwz     r8,3*8+4(r3)	// wwLwww (lo)
285        lwz     r9,4*8+4(r3)	// wwlWww
286        lwz     r10,5*8+4(r3)	// wwlwWw
287        lwz     r11,6*8+4(r3)	// wwlwwW
288
289        stw     r0,0*8+0(r4)	// 0wlwww
290        stw     r5,0*8+4(r4)	// Wwlwww
291        stw     r0,1*8+0(r4)	// w0lwww
292        stw     r6,1*8+4(r4)	// wWlwww
293        stw     r7,2*8+0(r4)	// wwLwww (hi)
294        stw     r8,2*8+4(r4)	// wwLwww (lo)
295        stw     r0,3*8+0(r4)	// wwl0ww
296        stw     r9,3*8+4(r4)	// wwlwww
297        stw     r0, 4*8+0(r4)	// wwlw0w
298        stw     r10,4*8+4(r4)	// wwlwWw
299        stw     r0, 5*8+0(r4)	// wwlww0
300        stw     r11,5*8+4(r4)	// wwlwwW
301
302        blr
303
304
305        .align  5
306        .globl  _munge_wwwwl	// 4 'w's and an l
307_munge_wwwwl:
308        li      r0,0
309        lwz     r5,0*8+4(r3)
310        lwz     r6,1*8+4(r3)
311        lwz     r7,2*8+4(r3)
312        lwz     r8,3*8+4(r3)
313        lwz     r9,4*8+4(r3)
314        lwz     r10,5*8+4(r3)
315
316        stw     r0,0*8+0(r4)
317        stw     r5,0*8+4(r4)
318        stw     r0,1*8+0(r4)
319        stw     r6,1*8+4(r4)
320        stw     r0,2*8+0(r4)
321        stw     r7,2*8+4(r4)
322        stw     r0,3*8+0(r4)
323        stw     r8,3*8+4(r4)
324        stw     r9,4*8+0(r4)
325        stw     r10,4*8+4(r4)
326
327        blr
328
329
330        .align  5
331        .globl  _munge_wwwwwl      // 5 'w's and an l
332_munge_wwwwwl:
333        li      r0,0
334        lwz     r5,0*8+4(r3)
335        lwz     r6,1*8+4(r3)
336        lwz     r7,2*8+4(r3)
337        lwz     r8,3*8+4(r3)
338        lwz     r9,4*8+4(r3)
339        lwz     r10,5*8+4(r3)
340        lwz     r11,6*8+4(r3)
341
342        stw     r0,0*8+0(r4)
343        stw     r5,0*8+4(r4)
344        stw     r0,1*8+0(r4)
345        stw     r6,1*8+4(r4)
346        stw     r0,2*8+0(r4)
347        stw     r7,2*8+4(r4)
348        stw     r0,3*8+0(r4)
349        stw     r8,3*8+4(r4)
350        stw     r0,4*8+0(r4)
351        stw     r9,4*8+4(r4)
352        stw     r10,5*8+0(r4)
353        stw     r11,5*8+4(r4)
354
355        blr
356
357
358        .align  5
359        .globl  _munge_wsw
360_munge_wsw:
361        li      r0,0
362        lwz     r5,0*8+4(r3)
363        lwz     r6,1*8+4(r3)
364        lwz     r7,2*8+4(r3)
365
366        stw     r0,0*8+0(r4)
367        srawi   r2,r6,31
368        stw     r5,0*8+4(r4)
369        stw     r2,1*8+0(r4)
370        stw     r6,1*8+4(r4)
371        stw     r0,2*8+0(r4)
372        stw     r7,2*8+4(r4)
373
374        blr
375
376
377        .align  5
378        .globl  _munge_wws
379_munge_wws:
380        li      r0,0
381        lwz     r5,0*8+4(r3)
382        lwz     r6,1*8+4(r3)
383        lwz     r7,2*8+4(r3)
384
385        stw     r0,0*8+0(r4)
386        stw     r5,0*8+4(r4)
387        stw     r0,1*8+0(r4)
388        srawi   r2,r7,31
389        stw     r6,1*8+4(r4)
390        stw     r2,2*8+0(r4)
391        stw     r7,2*8+4(r4)
392
393        blr
394
395
396        .align  5
397        .globl  _munge_wwwsw
398_munge_wwwsw:
399        li      r0,0
400        lwz     r5,0*8+4(r3)
401        lwz     r6,1*8+4(r3)
402        lwz     r7,2*8+4(r3)
403        lwz     r8,3*8+4(r3)
404        lwz     r9,4*8+4(r3)
405
406        stw     r0,0*8+0(r4)
407        stw     r5,0*8+4(r4)
408        stw     r0,1*8+0(r4)
409        stw     r6,1*8+4(r4)
410        srawi   r2,r8,31
411        stw     r0,2*8+0(r4)
412        stw     r7,2*8+4(r4)
413        stw     r2,3*8+0(r4)
414        stw     r8,3*8+4(r4)
415        stw     r0,4*8+0(r4)
416        stw     r9,4*8+4(r4)
417
418        blr
419