usr/src/uts/intel/brand/sn1/sn1_brand_asm.s
author nn35248
Mon, 11 Sep 2006 22:51:59 -0700
changeset 2712 f74a135872bc
child 5084 7d838c5c0eed
permissions -rw-r--r--
PSARC/2005/471 BrandZ: Support for non-native zones 6374606 ::nm -D without an object may not work on processes in zones 6409350 BrandZ project integration into Solaris 6455289 pthread_setschedparam() should return EPERM rather than panic libc 6455591 setpriority(3C) gets errno wrong for deficient privileges failure 6458178 fifofs doesn't support lofs mounts of fifos 6460380 Attempted open() of a symlink with the O_NOFOLLOW flag set returns EINVAL, not ELOOP 6463857 renice(1) errors erroneously
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2712
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     1
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     2
 * CDDL HEADER START
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     3
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     7
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    11
 * and limitations under the License.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    12
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    18
 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    19
 * CDDL HEADER END
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    20
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    21
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    23
 * Use is subject to license terms.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    24
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    25
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    27
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    28
#if defined(lint)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    29
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    30
#include <sys/systm.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    31
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    32
#else	/* lint */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    33
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    34
#include <sys/asm_linkage.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    35
#include <sys/privregs.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    36
#include <sys/segments.h>
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    37
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    38
#endif	/* lint */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    39
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    40
#ifdef	lint
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    41
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    42
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    43
sn1_brand_sysenter_callback(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    44
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    45
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    46
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    47
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    48
sn1_brand_syscall_callback(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    49
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    50
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    51
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    52
#if defined(__amd64)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    53
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    54
sn1_brand_syscall32_callback(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    55
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    56
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    57
#endif	/* amd64 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    58
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    59
void
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    60
sn1_brand_int91_callback(void)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    61
{
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    62
}
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    63
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    64
#else	/* lint */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    65
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    66
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    67
 * Each of the following macros returns to the standard syscall codepath if
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    68
 * it detects that this process is not able, or intended, to emulate this
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    69
 * system call.  They all assume that the routine provides a 'bail-out'
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    70
 * label of '9'.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    71
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    72
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    73
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    74
 * See if this process has a user-space handler registered for it.  For the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    75
 * sn1 brand, the per-process brand data holds the address of the handler.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    76
 * As shown in the stack diagrams below, the callback code leaves that data
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    77
 * at these offsets.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    78
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    79
#if defined(__amd64)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    80
#define	CHECK_FOR_HANDLER		 \
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    81
	cmpq	$0, 24(%rsp)		;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    82
	je	9f		
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    83
#else
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    84
#define	CHECK_FOR_HANDLER		 \
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    85
	cmpl	$0, 12(%esp)		;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    86
	je	9f		
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    87
#endif	/* __amd64 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    88
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    89
/* 
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    90
 * If the system call number is >= 1024, then it is coming from the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    91
 * emulation support library.  As such we should handle it natively instead
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    92
 * of sending it back to the emulation library.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    93
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    94
#define	CHECK_FOR_NATIVE(reg)		\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    95
	cmp	$1024, reg		;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    96
	jl	1f			;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    97
	sub	$1024, reg		;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    98
	jmp	9f			;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
    99
1:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   100
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   101
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   102
 * Check to see if we want to interpose on this system call.  If not, we
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   103
 * jump back into the normal syscall path and pretend nothing happened.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   104
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   105
#define CHECK_FOR_INTERPOSITION(sysr, scr, scr_low)		\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   106
	lea	sn1_emulation_table, scr			;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   107
	mov	(scr), scr					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   108
	add	sysr, scr					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   109
	movb	(scr), scr_low					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   110
	cmpb	$0, scr_low					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   111
	je	9f						;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   112
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   113
#define	CALLBACK_PROLOGUE(call, scr, scr_low)			;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   114
	push	scr		/* Save scratch register */	;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   115
	CHECK_FOR_HANDLER					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   116
	CHECK_FOR_NATIVE(call)					;\
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   117
	CHECK_FOR_INTERPOSITION(call, scr, scr_low)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   118
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   119
/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   120
 * The callback routines:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   121
 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   122
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   123
#if defined(__amd64)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   124
	/* 
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   125
	 * When we get into any of these callback routines, the stack
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   126
	 * looks like this:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   127
	 *  	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   128
	 *      32 | saved stack pointer		|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   129
	 *    | 24 | lwp brand data			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   130
	 *    | 16 | proc brand data			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   131
	 *    v  8 | user return address (*)		|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   132
	 *       0 | BRAND_CALLBACK()'s return addr 	|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   133
	 *         --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   134
	 *   (*) This is actually just the bottom value from the user's
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   135
	 *       stack.  syscall puts this in %rcx instead of the stack,
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   136
	 *       so it's just garbage for that entry point.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   137
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   138
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   139
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   140
	 * syscall handler for 32-bit user processes:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   141
	 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   142
	 * %ecx contains the address of the instruction after the syscall
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   143
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   144
	ENTRY(sn1_brand_syscall32_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   145
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   146
	CALLBACK_PROLOGUE(%rax, %r15, %r15b)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   147
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   148
	movq	%rsp, %r15	/* save our stack pointer */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   149
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   150
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   151
	 * Adjust the user's stack so that the 'ret' from our userspace
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   152
	 * handler takes us to the post-syscall instruction instead of to
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   153
	 * the routine that called the system call.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   154
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   155
	movq	40(%rsp), %rsp	/* restore user's stack pointer 	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   156
	subq	$4, %rsp	/* save room for the post-syscall addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   157
	movl	%ecx, (%rsp)	/* Save post-syscall addr on stack	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   158
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   159
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   160
	 * To 'return' to our user-space handler, we just need to copy
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   161
	 * its address into %ecx.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   162
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   163
	movq	24(%r15), %rcx	/* user-space handler == proc_data for sn1 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   164
	movq	(%r15), %r15	/* Restore scratch register */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   165
	sysret
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   166
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   167
	popq	%r15
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   168
	retq
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   169
	SET_SIZE(sn1_brand_syscall32_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   170
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   171
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   172
	 * syscall handler for 64-bit user processes:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   173
	 *     %rax - syscall number
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   174
	 *     %rcx - user space %rip
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   175
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   176
	ENTRY(sn1_brand_syscall_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   177
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   178
	CALLBACK_PROLOGUE(%rax, %r15, %r15b)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   179
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   180
	movq	%rsp, %r15	/* save our stack pointer */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   181
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   182
	movq	40(%rsp), %rsp	/* restore user's stack pointer 	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   183
	subq	$8, %rsp	/* save room for the post-syscall addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   184
	movq	%rcx, (%rsp)	/* Save post-syscall addr on stack	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   185
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   186
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   187
	 * To 'return' to our user-space handler, we just need to copy
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   188
	 * its address into %ecx.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   189
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   190
	movq	24(%r15), %rcx	/* user-space handler == proc_data for sn1 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   191
	movq	(%r15), %r15	/* Restore scratch register */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   192
	sysretq
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   193
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   194
	popq	%r15
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   195
	retq
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   196
	
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   197
	SET_SIZE(sn1_brand_syscall_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   198
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   199
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   200
	 * %rax - syscall number
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   201
	 * %rcx - user space %esp
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   202
	 * %rdx - user space return address
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   203
	 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   204
	 * XXX: not tested yet.  Need a Nocona machine first.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   205
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   206
	ENTRY(sn1_brand_sysenter_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   207
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   208
	CALLBACK_PROLOGUE(%rax, %r15, %r15b)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   209
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   210
	subq	$4, %rcx	/* Save room for user ret addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   211
	movq	%rdx, (%rcx)	/* Save current return addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   212
	movq	24(%rsp), %rdx	/* user-space handler == proc_data for sn1 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   213
	popq	%r15
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   214
	sysexit
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   215
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   216
	popq	%r15
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   217
	ret
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   218
	SET_SIZE(sn1_brand_sysenter_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   219
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   220
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   221
	 * The saved stack pointer points at the state saved when we took
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   222
	 * the interrupt:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   223
	 *	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   224
	 *    | 32 | user's %ss				|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   225
	 *    | 24 | user's %esp			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   226
	 *    | 16 | EFLAGS register			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   227
	 *    v  8 | user's %cs				|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   228
	 *       0 | user's %eip			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   229
	 *	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   230
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   231
	ENTRY(sn1_brand_int91_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   232
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   233
	CALLBACK_PROLOGUE(%rax, %r15, %r15b)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   234
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   235
	movq	24(%rsp), %r15	/* user-space handler == proc_data for sn1 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   236
	pushq	%rax		/* Save scratch register		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   237
	movq	48(%rsp), %rax	/* Get saved %esp			*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   238
	movq	%r15, (%rax)	/* replace iret target address with hdlr */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   239
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   240
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   241
	 * Adjust the caller's stack so we return to the instruction after
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   242
	 * the syscall on the next 'ret' in userspace - not to the parent
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   243
	 * routine.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   244
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   245
	movq	24(%rax), %r15	/* Get user's %esp			*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   246
	subq	$4, %r15	/* Make room for new ret addr		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   247
	movq	%r15, 24(%rax)	/* Replace current with updated %esp	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   248
	movl	24(%rsp), %eax	/* Get post-syscall address		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   249
	movl	%eax, (%r15)	/* Put it on the user's stack		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   250
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   251
	popq	%rax		/* Restore scratch register		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   252
	popq	%r15		/* Restore scratch register		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   253
	movq	32(%rsp), %rsp	/* Remove all callback stuff from stack	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   254
	iretq
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   255
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   256
	popq	%r15
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   257
	retq
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   258
	SET_SIZE(sn1_brand_int91_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   259
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   260
#else	/* __amd64 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   261
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   262
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   263
	 * When we get into any of these callback routines, the stack
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   264
	 * looks like this:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   265
	 *	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   266
	 *    | 28 | 'scatch space'			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   267
	 *    | 24 | user's %ebx			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   268
	 *    | 20 | user's %gs selector		|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   269
	 *    | 16 | kernel's %gs selector		|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   270
	 *    | 12 | lwp brand data			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   271
	 *    |  8 | proc brand data			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   272
	 *    v  4 | user return address		|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   273
	 *       0 | callback wrapper return addr	|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   274
	 *         --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   275
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   276
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   277
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   278
	 * lcall handler for 32-bit OS
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   279
	 *     %eax - syscall number
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   280
	 *
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   281
	 * Above the stack contents common to all callbacks is the
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   282
	 * int/lcall-specific state:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   283
	 *	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   284
	 *    | 48 | user's %ss				|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   285
	 *    | 44 | user's %esp			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   286
	 *    | 40 | EFLAGS register			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   287
	 *    v 36 | user's %cs				|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   288
	 *      32 | user's %eip			|
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   289
	 *	   --------------------------------------
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   290
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   291
	ENTRY(sn1_brand_syscall_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   292
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   293
	CALLBACK_PROLOGUE(%eax, %ebx, %bl)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   294
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   295
	movl	12(%esp), %ebx	/* user-space handler == proc_data for sn1 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   296
	movl	%ebx, 36(%esp)	/* replace iret target address with hdlr */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   297
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   298
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   299
	 * Adjust the caller's stack so we return to the instruction after
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   300
	 * the syscall on the next 'ret' in userspace - not to the parent
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   301
	 * routine.
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   302
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   303
	pushl	%eax		/* Save scratch register		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   304
	movl	52(%esp), %eax	/* Get current %esp			*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   305
	subl	$4, %eax	/* Make room for new ret addr		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   306
	movl	%eax, 52(%esp)	/* Replace current with updated %esp	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   307
	movl	12(%esp), %ebx	/* Get post-syscall address		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   308
	movl	%ebx, (%eax)	/* Put it on the user's stack		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   309
	popl	%eax		/* Restore scratch register 		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   310
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   311
	popl	%ebx		/* Restore scratch register 		*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   312
	addl	$32, %esp	/* Remove all callback stuff from stack	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   313
	iret
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   314
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   315
	popl	%ebx
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   316
	ret
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   317
	SET_SIZE(sn1_brand_syscall_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   318
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   319
	/*
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   320
	 * %eax - syscall number
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   321
	 * %ecx - user space %esp
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   322
	 * %edx - user space return address
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   323
	 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   324
	ENTRY(sn1_brand_sysenter_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   325
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   326
	CALLBACK_PROLOGUE(%eax, %ebx, %bl)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   327
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   328
	subl	$4, %ecx	/* Save room for user ret addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   329
	movl	%edx, (%ecx)	/* Save current return addr	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   330
	movl	12(%esp), %edx	/* Return to user-space handler	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   331
	popl	%ebx		/* Restore scratch register	*/
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   332
	sysexit
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   333
9:
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   334
	popl	%ebx
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   335
	ret
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   336
	SET_SIZE(sn1_brand_sysenter_callback)
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   337
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   338
#endif	/* __amd64 */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   339
#endif	/* lint */
f74a135872bc PSARC/2005/471 BrandZ: Support for non-native zones
nn35248
parents:
diff changeset
   340