* Coyright (c) 2005-2015 Apple Computer, Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- *
+ *
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* unlawful or unlicensed copies of an Apple operating system, or to
* circumvent, violate, or enable the circumvention or violation of, any
* terms of an Apple operating system software license agreement.
- *
+ *
* Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this file.
- *
+ *
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
- *
+ *
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
-/*
+/*
* For arm32 ABI where 64-bit types are aligned to even registers and
* 64-bits on stack, we need to unpack registers differently. So
* we use the mungers for that. Currently this is just ARMv7k.
#include <stdint.h>
-/*
+/*
* Userspace args are in r0-r6, then r8, then stack unless this is an
* indirect call in which case the syscall number is in r0 then args
* are in registers r1-r6, then r8, then stack. This is for mach and
} style_t;
#define DECLARE_AND_CAST(regs, args, ss, uu_args) const arm_saved_state_t *ss = (const arm_saved_state_t *)regs; \
- uint32_t *uu_args = (uint32_t *)args;
+ uint32_t *uu_args = (uint32_t *)args;
-/*
+/*
* We start 32 bytes after sp since 4 registers are pushed onto the stack
- * in the userspace syscall handler, and the first 4 stack argumnets are moved
+ * in the userspace syscall handler, and the first 4 stack argumnets are moved
* into registers already
*/
#define ARG_SP_BYTE_OFFSET 32
/* stack */
if (word_count > copy_count) {
error = copyin(ss->sp + ARG_SP_BYTE_OFFSET,
- args, (word_count - copy_count) * sizeof(uint32_t));
- if (error)
+ args, (word_count - copy_count) * sizeof(uint32_t));
+ if (error) {
return error;
+ }
}
}
return error;
return marshal_no_pad(regs, args, 1);
}
-int
+int
munge_ww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 2);
}
-int
+int
munge_www(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 3);
}
-int
+int
munge_wwww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 4);
}
-int
+int
munge_wwwww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 5);
}
-int
+int
munge_wwwwww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 6);
}
-int
+int
munge_wwwwwww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 7);
}
-int
+int
munge_wwwwwwww(const void *regs, void *args)
{
return marshal_no_pad(regs, args, 8);
}
-int
+int
munge_wwl(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 3);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
uu_args[1] = ss->r[2]; // w
uu_args[2] = ss->r[4]; // l (longs are aligned to even registers for armv7k, so skip r3)
- uu_args[3] = ss->r[5]; //
+ uu_args[3] = ss->r[5]; //
return 0;
}
}
-int
+int
munge_wwlw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 5);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwl(regs, args); // wwl
int
munge_wwlww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
// the long-long here is aligned on an even register
// so there shouldn't be any padding
return marshal_no_pad(regs, args, 6);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwlw(regs, args); // wwlw
}
}
-int
+int
munge_wwlll(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 8);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwl(regs, args); // wwl
- if (error)
+ if (error) {
return error;
+ }
uu_args[4] = ss->r[6]; // l
uu_args[5] = ss->r[8]; //
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- &(uu_args[6]), 2 * sizeof(uint32_t));
+ &(uu_args[6]), 2 * sizeof(uint32_t));
}
}
int
munge_wl(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
memcpy(args, regs, 4 * sizeof(uint32_t));
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
int
munge_wlw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
- memcpy(args, regs, 5 * sizeof(uint32_t));
- else {
+ if (REGS_TO_STYLE(regs) == kDirect) {
+ memcpy(args, regs, 5 * sizeof(uint32_t));
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
int
munge_wlww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
memcpy(args, regs, 6 * sizeof(uint32_t));
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
if (REGS_TO_STYLE(regs) == kDirect) {
memcpy(args, regs, 7 * sizeof(uint32_t)); // wlwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- uu_args + 8, 4 * sizeof(uint32_t));
- }
- else {
+ uu_args + 8, 4 * sizeof(uint32_t));
+ } else {
uu_args[0] = ss->r[1]; // w
uu_args[2] = ss->r[2]; // l
- uu_args[3] = ss->r[3]; //
+ uu_args[3] = ss->r[3]; //
uu_args[4] = ss->r[4]; // w
uu_args[5] = ss->r[5]; // w
uu_args[6] = ss->r[6]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- uu_args + 8, 4 * sizeof(uint32_t));
+ uu_args + 8, 4 * sizeof(uint32_t));
}
}
if (REGS_TO_STYLE(regs) == kDirect) {
memcpy(args, regs, 7 * sizeof(uint32_t)); // wlwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET,
- uu_args + 8, 5 * sizeof(uint32_t)); // ll
- }
- else {
+ uu_args + 8, 5 * sizeof(uint32_t)); // ll
+ } else {
uu_args[0] = ss->r[1]; // w
uu_args[2] = ss->r[2]; // l
- uu_args[3] = ss->r[3]; //
+ uu_args[3] = ss->r[3]; //
uu_args[4] = ss->r[4]; // w
uu_args[5] = ss->r[5]; // w
uu_args[6] = ss->r[6]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // llw
- uu_args + 8, 5 * sizeof(uint32_t));
+ uu_args + 8, 5 * sizeof(uint32_t));
}
}
-int
+int
munge_wlwwlwlw(const void *regs, void *args)
{
DECLARE_AND_CAST(regs, args, ss, uu_args);
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
uu_args[0] = ss->r[0]; // w
- else
+ } else {
uu_args[0] = ss->r[1]; // w
-
+ }
uu_args[2] = ss->r[2]; // l
uu_args[3] = ss->r[3]; //
uu_args[4] = ss->r[4]; // w
uu_args[6] = ss->r[6]; // l
uu_args[7] = ss->r[8]; //
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // wlw
- uu_args + 8, 5 * sizeof(uint32_t));
+ uu_args + 8, 5 * sizeof(uint32_t));
}
-int
+int
munge_wll(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
- memcpy(args, regs, 6 * sizeof(uint32_t));
- else {
+ if (REGS_TO_STYLE(regs) == kDirect) {
+ memcpy(args, regs, 6 * sizeof(uint32_t));
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
return 0;
}
-int
+int
munge_wlll(const void *regs, void *args)
{
DECLARE_AND_CAST(regs, args, ss, uu_args);
return error;
}
-int
+int
munge_wllll(const void *regs, void *args)
{
DECLARE_AND_CAST(regs, args, ss, uu_args);
munge_wlll(regs, args); // wlll
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- uu_args + 8, 2 * sizeof(uint32_t));
+ uu_args + 8, 2 * sizeof(uint32_t));
}
int
return munge_wlll(regs, args);
}
-int
+int
munge_wllwwll(const void *regs, void *args)
{
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wlll(regs, args); // wllww
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- uu_args + 8, 4 * sizeof(uint32_t));
+ uu_args + 8, 4 * sizeof(uint32_t));
}
-int
+int
munge_wwwlw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
memcpy(args, regs, 7 * sizeof(uint32_t));
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
int
munge_wwwlww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return munge_wlll(regs, args);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
return 0;
}
}
-
-int
+
+int
munge_wwwl(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return munge_wll(regs, args);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
}
}
-int
+int
munge_wwwwl(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 6);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
int
munge_wwwwlw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 7);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwwwl(regs, args); // wwwwl
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // w
- uu_args + 6, sizeof(uint32_t));
+ uu_args + 6, sizeof(uint32_t));
}
}
-int
+int
munge_wwwwwl(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return munge_wlll(regs, args);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
}
}
-int
+int
munge_wwwwwlww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return munge_wllll(regs, args);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwwwwl(regs, args); // wwwwwl
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ww
- uu_args + 8, 2 * sizeof(uint32_t));
+ uu_args + 8, 2 * sizeof(uint32_t));
}
}
DECLARE_AND_CAST(regs, args, ss, uu_args);
int error = munge_wwwwwl(regs, args); // wwwwwl
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // lw
- uu_args + 8, 3 * sizeof(uint32_t));
+ uu_args + 8, 3 * sizeof(uint32_t));
}
int
if (REGS_TO_STYLE(regs) == kDirect) {
error = munge_wlll(regs, args); // wlll
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- uu_args + 8, 4 * sizeof(uint32_t));
- }
- else {
+ uu_args + 8, 4 * sizeof(uint32_t));
+ } else {
error = munge_wwwwwl(regs, args); // wwwwwl
- if (error)
+ if (error) {
return error;
+ }
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- uu_args + 8, 4 * sizeof(uint32_t));
+ uu_args + 8, 4 * sizeof(uint32_t));
}
}
{
munge_wwlll(regs, args);
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 8);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
memcpy(args, &(ss->r[1]), 6 * sizeof(uint32_t)); // wwwwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- &(uu_args[6]), 2 * sizeof(uint32_t));
+ &(uu_args[6]), 2 * sizeof(uint32_t));
}
}
-int
+int
munge_wwwwwwlw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 9);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
memcpy(args, &(ss->r[1]), 6 * sizeof(uint32_t)); // wwwwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // lw
- &(uu_args[6]), 3 * sizeof(uint32_t));
+ &(uu_args[6]), 3 * sizeof(uint32_t));
}
}
-
-int
+
+int
munge_wwwwwwll(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 10);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
memcpy(args, &(ss->r[1]), 6 * sizeof(uint32_t)); // wwwwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // ll
- &(uu_args[6]), 4 * sizeof(uint32_t));
+ &(uu_args[6]), 4 * sizeof(uint32_t));
}
}
-int
+int
munge_wsw(const void *regs, void *args)
{
return munge_wlw(regs, args);
}
-int
+int
munge_wws(const void *regs, void *args)
{
return munge_wwl(regs, args);
return munge_wwwlw(regs, args);
}
-int
+int
munge_llllll(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 12);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[2]; // l
uu_args[4] = ss->r[6]; // l
uu_args[5] = ss->r[8]; //
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // lll
- uu_args + 6, 6 * sizeof(uint32_t));
+ uu_args + 6, 6 * sizeof(uint32_t));
}
}
-int
+int
munge_ll(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 4);
- else
+ } else {
memcpy(args, (const uint32_t*)regs + 2, 4 * sizeof(uint32_t));
+ }
return 0;
}
-int
+int
munge_l(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 2);
- else
+ } else {
memcpy(args, (const uint32_t*)regs + 2, 2 * sizeof(uint32_t));
+ }
return 0;
}
-int
+int
munge_lw(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 3);
- else
+ } else {
memcpy(args, (const uint32_t*)regs + 2, 3 * sizeof(uint32_t));
+ }
return 0;
}
int
munge_lwww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 5);
- else
+ } else {
memcpy(args, (const uint32_t*)regs + 2, 5 * sizeof(uint32_t));
+ }
return 0;
}
-int
+int
munge_lwwwwwww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 9);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[2]; // l
- uu_args[1] = ss->r[3]; //
+ uu_args[1] = ss->r[3]; //
uu_args[2] = ss->r[4]; // w
uu_args[3] = ss->r[5]; // w
uu_args[4] = ss->r[6]; // w
uu_args[5] = ss->r[8]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // www
- uu_args + 6, 3 * sizeof(uint32_t));
+ uu_args + 6, 3 * sizeof(uint32_t));
}
}
int
munge_wwlwww(const void *regs, void *args)
{
- if (REGS_TO_STYLE(regs) == kDirect)
+ if (REGS_TO_STYLE(regs) == kDirect) {
return marshal_no_pad(regs, args, 7);
- else {
+ } else {
DECLARE_AND_CAST(regs, args, ss, uu_args);
uu_args[0] = ss->r[1]; // w
uu_args[4] = ss->r[6]; // w
uu_args[5] = ss->r[8]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // w
- uu_args + 6, sizeof(uint32_t));
+ uu_args + 6, sizeof(uint32_t));
}
-
}
int
DECLARE_AND_CAST(regs, args, ss, uu_args);
if (REGS_TO_STYLE(regs) == kDirect) {
- memcpy(args, regs, 7 * sizeof(uint32_t)); // wlwww
+ memcpy(args, regs, 7 * sizeof(uint32_t)); // wlwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- uu_args + 8, 2 * sizeof(uint32_t));
+ uu_args + 8, 2 * sizeof(uint32_t));
} else {
uu_args[0] = ss->r[1]; // w
uu_args[2] = ss->r[2]; // l
uu_args[5] = ss->r[5]; // w
uu_args[6] = ss->r[6]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- uu_args + 8, 2 * sizeof(uint32_t));
+ uu_args + 8, 2 * sizeof(uint32_t));
}
}
int
munge_wwlwwwl(const void *regs, void *args)
{
- DECLARE_AND_CAST(regs, args, ss, uu_args);
+ DECLARE_AND_CAST(regs, args, ss, uu_args);
if (REGS_TO_STYLE(regs) == kDirect) {
- memcpy(args, regs, 7 * sizeof(uint32_t)); // wwlwww
+ memcpy(args, regs, 7 * sizeof(uint32_t)); // wwlwww
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // l
- uu_args + 8, 2 * sizeof(uint32_t));
+ uu_args + 8, 2 * sizeof(uint32_t));
} else {
uu_args[0] = ss->r[1]; // w
uu_args[1] = ss->r[2]; // w
uu_args[4] = ss->r[6]; // w
uu_args[5] = ss->r[8]; // w
return copyin(ss->sp + ARG_SP_BYTE_OFFSET, // wl
- uu_args + 6, 4 * sizeof(uint32_t));
+ uu_args + 6, 4 * sizeof(uint32_t));
}
}