/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#include "SYS.h"
/*
* weak aliases for public interfaces
*/
/*
* Offsets within struct door_results
*/
/*
* All of the syscalls except door_return() follow the same pattern.
* The subcode goes in argument 6, which means we have to copy our
* arguments into a new bit of stack, large enough to include the
* subcode. We fill the unused positions with zeros.
*/
pushl $0; /* dummy arg 5 */ \
pushl $0; /* dummy arg 4 */ \
copy_args; /* args 1, 2, 3 */ \
pushl $0; /* dummy return PC */ \
SYSTRAP_RVAL1(door); \
jae 1f; \
leave; \
1: \
leave; \
ret; \
#define COPY_0 \
pushl $0; /* dummy */ \
pushl $0; /* dummy */ \
pushl $0 /* dummy */
#define COPY_1 \
pushl $0; /* dummy */ \
pushl $0; /* dummy */ \
#define COPY_2 \
pushl $0; /* dummy */ \
#define COPY_3 \
/*
* int
* __door_return(
* void *data_ptr,
* size_t data_size, (in bytes)
* door_return_desc_t *door_ptr, (holds returned desc info)
* caddr_t stack_base,
* size_t stack_size)
*/
/*
* On return, we're serving a door_call. Our stack looks like this:
*
* descriptors (if any)
* data (if any)
* sp-> struct door_results
*
* struct door_results has the arguments in place for the server proc,
* so we just call it directly.
*/
jg 1f
/*
* this is the last server thread - call creation func for more
*/
1:
/* Call the door server function now */
/* Exit the thread if we return here */
pushl $0
/* NOTREACHED */
2:
/*
* Error during door_return call. Repark the thread in the kernel if
* the error code is EINTR (or ERESTART) and this lwp is still part
* of the same process.
*
* If the error code is EINTR or ERESTART, our stack may have been
* corrupted by a partial door call, so we refresh the system call
* arguments.
*/
jne 3f
3:
jne 4f
4:
/* Something bad happened during the door_return */