xref: /onnv-gate/usr/src/lib/libc/sparc/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#include <sys/stack.h>
30*13081SChris.Kiick@Sun.COM
31*13081SChris.Kiick@Sun.COM/*
32*13081SChris.Kiick@Sun.COM * void smt_pause(void)
33*13081SChris.Kiick@Sun.COM *
34*13081SChris.Kiick@Sun.COM * Do nothing efficiently.
35*13081SChris.Kiick@Sun.COM * We do the dance with the lwpid so that the actual address is spread
36*13081SChris.Kiick@Sun.COM * across cache banks thus avoiding hot spots.
37*13081SChris.Kiick@Sun.COM * Casx arguments are a no-op, but they force access to L2 cache, which
38*13081SChris.Kiick@Sun.COM * takes lots of cycles.
39*13081SChris.Kiick@Sun.COM */
40*13081SChris.Kiick@Sun.COM
41*13081SChris.Kiick@Sun.COM#ifdef lint
42*13081SChris.Kiick@Sun.COMvoid
43*13081SChris.Kiick@Sun.COMsmt_pause(void)
44*13081SChris.Kiick@Sun.COM{
45*13081SChris.Kiick@Sun.COM}
46*13081SChris.Kiick@Sun.COM#else
47*13081SChris.Kiick@Sun.COM#define	BANKS	(4 * 64)	/* covers 4 cachelines, all banks */
48*13081SChris.Kiick@Sun.COM	ENTRY(smt_pause)
49*13081SChris.Kiick@Sun.COM	save	%sp, -SA(MINFRAME+BANKS), %sp
50*13081SChris.Kiick@Sun.COM	ld      [%g7 + UL_LWPID], %i5
51*13081SChris.Kiick@Sun.COM	add	%fp, STACK_BIAS-BANKS, %i3
52*13081SChris.Kiick@Sun.COM	and     %i5, 0x3, %i4           ! save last 2 bits
53*13081SChris.Kiick@Sun.COM	sll     %i4, 0x6, %i2           ! pick a slot
54*13081SChris.Kiick@Sun.COM	add     %i2, %i3, %o0
55*13081SChris.Kiick@Sun.COM	casx    [%o0], %g0, %g0
56*13081SChris.Kiick@Sun.COM	casx    [%o0], %g0, %g0
57*13081SChris.Kiick@Sun.COM	ret
58*13081SChris.Kiick@Sun.COM	restore
59*13081SChris.Kiick@Sun.COM	SET_SIZE(smt_pause)
60*13081SChris.Kiick@Sun.COM#endif
61