usr/src/lib/libc/i386/sys/door.s
author Mark J. Nelson <Mark.J.Nelson@Sun.COM>
Wed, 06 Aug 2008 16:29:39 -0600
changeset 7298 b69e27387f74
parent 6812 febeba71273d
child 11102 b91faef0c984
permissions -rw-r--r--
6733918 Teamware has retired, please welcome your new manager, Mercurial 4758439 some files use "current date" sccs keywords 6560843 asm sources should not rely on .file "%M%" for naming STT_FILE symbols 6560958 Solaris:: perl modules should not use SCCS keywords in version information 6729074 webrev doesn't deal well with remote ssh hg parents
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 5540
diff changeset
     5
 * Common Development and Distribution License (the "License").
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 5540
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 5540
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 5540
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
7298
b69e27387f74 6733918 Teamware has retired, please welcome your new manager, Mercurial
Mark J. Nelson <Mark.J.Nelson@Sun.COM>
parents: 6812
diff changeset
    27
	.file	"door.s"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    29
#include "SYS.h"
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    30
#include <sys/door.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
	 * weak aliases for public interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
	 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    35
	ANSI_PRAGMA_WEAK2(door_bind,__door_bind,function)
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    36
	ANSI_PRAGMA_WEAK2(door_getparam,__door_getparam,function)
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    37
	ANSI_PRAGMA_WEAK2(door_info,__door_info,function)
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    38
	ANSI_PRAGMA_WEAK2(door_revoke,__door_revoke,function)
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    39
	ANSI_PRAGMA_WEAK2(door_setparam,__door_setparam,function)
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
    40
	ANSI_PRAGMA_WEAK2(door_unbind,__door_unbind,function)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 * Offsets within struct door_results
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#define	DOOR_COOKIE	_MUL(0, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#define	DOOR_DATA_PTR	_MUL(1, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#define	DOOR_DATA_SIZE	_MUL(2, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#define	DOOR_DESC_PTR	_MUL(3, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#define	DOOR_DESC_SIZE	_MUL(4, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#define	DOOR_PC		_MUL(5, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define	DOOR_SERVERS	_MUL(6, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#define	DOOR_INFO_PTR	_MUL(7, CLONGSIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 * All of the syscalls except door_return() follow the same pattern.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * The subcode goes in argument 6, which means we have to copy our
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 * arguments into a new bit of stack, large enough to include the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * subcode.  We fill the unused positions with zeros.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	DOOR_SYSCALL(name, code, copy_args)				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	ENTRY(name);							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	pushl	%ebp;							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	movl	%esp, %ebp;						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	pushl	$code;		/* syscall subcode, arg 6 */		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	pushl	$0;		/* dummy arg 5 */			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	pushl	$0;		/* dummy arg 4 */			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	copy_args;		/* args 1, 2, 3 */			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	pushl	$0;		/* dummy return PC */			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	SYSTRAP_RVAL1(door);						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	jae	1f;							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	addl	$28, %esp;						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	leave;								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	jmp	__cerror;						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
1:									\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	addl	$28, %esp;						\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	leave;								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	ret;								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	SET_SIZE(name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
#define	COPY_0								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	pushl	$0;		/* dummy */				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	pushl	$0;		/* dummy */				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	pushl	$0		/* dummy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
#define	COPY_1								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	pushl	$0;		/* dummy */				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	pushl	$0;		/* dummy */				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	pushl	8(%ebp)		/* 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#define	COPY_2								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	pushl	$0;		/* dummy */				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	pushl	12(%ebp);	/* 2 */					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	pushl	8(%ebp)		/* 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#define	COPY_3								\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	pushl	16(%ebp);	/* 3 */					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	pushl	12(%ebp);	/* 2 */					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	pushl	8(%ebp)		/* 1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	DOOR_SYSCALL(__door_bind,	DOOR_BIND,	COPY_1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	DOOR_SYSCALL(__door_call,	DOOR_CALL,	COPY_2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	DOOR_SYSCALL(__door_create,	DOOR_CREATE,	COPY_3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	DOOR_SYSCALL(__door_getparam,	DOOR_GETPARAM,	COPY_3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	DOOR_SYSCALL(__door_info,	DOOR_INFO,	COPY_2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	DOOR_SYSCALL(__door_revoke,	DOOR_REVOKE,	COPY_1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	DOOR_SYSCALL(__door_setparam,	DOOR_SETPARAM,	COPY_3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	DOOR_SYSCALL(__door_ucred,	DOOR_UCRED,	COPY_1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	DOOR_SYSCALL(__door_unbind,	DOOR_UNBIND,	COPY_0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	DOOR_SYSCALL(__door_unref,	DOOR_UNREFSYS,	COPY_0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 * int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 * __door_return(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 *	void 			*data_ptr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
 *	size_t			data_size,	(in bytes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
 *	door_return_desc_t	*door_ptr,	(holds returned desc info)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 *	caddr_t			stack_base,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 *	size_t			stack_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	ENTRY(__door_return)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	movl	%esp, %edx		/ Save pointer to args
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	pushl	%edi			/ save old %edi and %esi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	pushl	%esi			/ and use them to hold the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	movl	16(%edx), %esi		/ stack pointer and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	movl	20(%edx), %edi		/ size.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	pushl	$DOOR_RETURN		/ syscall subcode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	pushl	%edi			/ size of user stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	pushl	%esi			/ base of user stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	pushl	12(%edx)		/ desc arguments ptr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	pushl	8(%edx)			/ data size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	pushl	4(%edx)			/ data ptr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	pushl	0(%edx)			/ dummy return PC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
door_restart:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	SYSTRAP_RVAL1(door)
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   138
	jb	2f			/* errno is set */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	 * On return, we're serving a door_call.  Our stack looks like this:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	 *		descriptors (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	 *		data (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	 *	 sp->	struct door_results
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	 * struct door_results has the arguments in place for the server proc,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	 * so we just call it directly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	movl	DOOR_SERVERS(%esp), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	andl	%eax, %eax	/* test nservers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	jg	1f
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	 * this is the last server thread - call creation func for more
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	movl	DOOR_INFO_PTR(%esp), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	_prologue_
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	pushl	%eax		/* door_info_t * */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	movl	_daref_(door_server_func), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	movl	0(%eax), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	call	*%eax		/* call create function */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	addl	$4, %esp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	_epilogue_
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
	/* Call the door server function now */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	movl	DOOR_PC(%esp), %eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	call	*%eax
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	/* Exit the thread if we return here */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	pushl	$0
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 6515
diff changeset
   169
	call	_thrp_terminate
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	/* NOTREACHED */
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   171
2:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	 * Error during door_return call.  Repark the thread in the kernel if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	 * the error code is EINTR (or ERESTART) and this lwp is still part
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	 * of the same process.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	 * If the error code is EINTR or ERESTART, our stack may have been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	 * corrupted by a partial door call, so we refresh the system call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	 * arguments.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	cmpl	$ERESTART, %eax		/* ERESTART is same as EINTR */
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   182
	jne	3f
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	movl	$EINTR, %eax
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   184
3:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	cmpl	$EINTR, %eax		/* interrupted while waiting? */
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   186
	jne	4f			/* if not, return the error */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	_prologue_
6515
10dab2b883e0 6678310 using LD_AUDIT, ld.so.1 calls shared library's .init before library is fully relocated
raf
parents: 5891
diff changeset
   188
	call	getpid
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	movl	_daref_(door_create_pid), %edx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	movl	0(%edx), %edx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	_epilogue_
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	cmpl	%eax, %edx		/* same process? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	movl	$EINTR, %eax	/* if no, return EINTR (child of forkall) */
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   194
	jne	4f
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	movl	$0, 4(%esp)		/* clear arguments and restart */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	movl	$0, 8(%esp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	movl	$0, 12(%esp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	movl	%esi, 16(%esp)		/* refresh sp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	movl	%edi, 20(%esp)		/* refresh ssize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	movl	$DOOR_RETURN, 24(%esp)	/* refresh syscall subcode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	jmp	door_restart
5540
c41a1b542098 backout 6580293: causes 6635129
dm120769
parents: 5488
diff changeset
   203
4:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	/* Something bad happened during the door_return */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	addl	$28, %esp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	popl	%esi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	popl	%edi
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	jmp	__cerror
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	SET_SIZE(__door_return)