xref: /onnv-gate/usr/src/lib/libc/sparcv9/gen/smt_pause.s (revision 13081:431da7fc1d0a)
1*13081SChris.Kiick@Sun.COM/*
2*13081SChris.Kiick@Sun.COM * CDDL HEADER START
3*13081SChris.Kiick@Sun.COM *
4*13081SChris.Kiick@Sun.COM * The contents of this file are subject to the terms of the
5*13081SChris.Kiick@Sun.COM * Common Development and Distribution License (the "License").
6*13081SChris.Kiick@Sun.COM * You may not use this file except in compliance with the License.
7*13081SChris.Kiick@Sun.COM *
8*13081SChris.Kiick@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*13081SChris.Kiick@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*13081SChris.Kiick@Sun.COM * See the License for the specific language governing permissions
11*13081SChris.Kiick@Sun.COM * and limitations under the License.
12*13081SChris.Kiick@Sun.COM *
13*13081SChris.Kiick@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*13081SChris.Kiick@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*13081SChris.Kiick@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*13081SChris.Kiick@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*13081SChris.Kiick@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*13081SChris.Kiick@Sun.COM *
19*13081SChris.Kiick@Sun.COM * CDDL HEADER END
20*13081SChris.Kiick@Sun.COM */
21*13081SChris.Kiick@Sun.COM/*
22*13081SChris.Kiick@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*13081SChris.Kiick@Sun.COM */
24*13081SChris.Kiick@Sun.COM
25*13081SChris.Kiick@Sun.COM	.file	"smt_pause.s"
26*13081SChris.Kiick@Sun.COM
27*13081SChris.Kiick@Sun.COM#include <sys/asm_linkage.h>
28*13081SChris.Kiick@Sun.COM#include <../assym.h>
29*13081SChris.Kiick@Sun.COM
30*13081SChris.Kiick@Sun.COM/*
31*13081SChris.Kiick@Sun.COM * void smt_pause(void)
32*13081SChris.Kiick@Sun.COM *
33*13081SChris.Kiick@Sun.COM * Do nothing efficiently.
34*13081SChris.Kiick@Sun.COM */
35*13081SChris.Kiick@Sun.COM
36*13081SChris.Kiick@Sun.COM#ifdef lint
37*13081SChris.Kiick@Sun.COMvoid
38*13081SChris.Kiick@Sun.COMsmt_pause(void)
39*13081SChris.Kiick@Sun.COM{
40*13081SChris.Kiick@Sun.COM}
41*13081SChris.Kiick@Sun.COM#else
42*13081SChris.Kiick@Sun.COM#define	BANKS	(4 * 64)
43*13081SChris.Kiick@Sun.COM	ENTRY(smt_pause)
44*13081SChris.Kiick@Sun.COM	save %sp, -SA(MINFRAME+BANKS), %sp
45*13081SChris.Kiick@Sun.COM	ld      [%g7 + UL_LWPID], %i3   ! curthread->ul_lwpid
46*13081SChris.Kiick@Sun.COM	add	%fp, STACK_BIAS-BANKS, %i0
47*13081SChris.Kiick@Sun.COM	and     %i3, 0x3, %i2           ! save last 2 bits
48*13081SChris.Kiick@Sun.COM	sllx    %i2, 0x6, %i1           ! pick a slot
49*13081SChris.Kiick@Sun.COM	add     %i1, %i0, %o0
50*13081SChris.Kiick@Sun.COM	casx    [%o0], %g0, %g0
51*13081SChris.Kiick@Sun.COM	casx    [%o0], %g0, %g0
52*13081SChris.Kiick@Sun.COM	ret
53*13081SChris.Kiick@Sun.COM	restore
54*13081SChris.Kiick@Sun.COM	SET_SIZE(smt_pause)
55*13081SChris.Kiick@Sun.COM#endif
56