e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick/*
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * CDDL HEADER START
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick *
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * The contents of this file are subject to the terms of the
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * Common Development and Distribution License (the "License").
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * You may not use this file except in compliance with the License.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick *
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * or http://www.opensolaris.org/os/licensing.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * See the License for the specific language governing permissions
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * and limitations under the License.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick *
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * When distributing Covered Code, include this CDDL HEADER in each
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * If applicable, add the following below this CDDL HEADER, with the
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * fields enclosed by brackets "[]" replaced with your own identifying
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * information: Portions Copyright [yyyy] [name of copyright owner]
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick *
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * CDDL HEADER END
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick */
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick/*
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick */
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick .file "smt_pause.s"
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#include <sys/asm_linkage.h>
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#include <../assym.h>
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#include <sys/stack.h>
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick/*
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * void smt_pause(void)
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick *
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * Do nothing efficiently.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * We do the dance with the lwpid so that the actual address is spread
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * across cache banks thus avoiding hot spots.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * Casx arguments are a no-op, but they force access to L2 cache, which
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick * takes lots of cycles.
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick */
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#ifdef lint
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiickvoid
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiicksmt_pause(void)
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick{
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick}
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#else
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#define BANKS (4 * 64) /* covers 4 cachelines, all banks */
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick ENTRY(smt_pause)
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick save %sp, -SA(MINFRAME+BANKS), %sp
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick ld [%g7 + UL_LWPID], %i5
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick add %fp, STACK_BIAS-BANKS, %i3
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick and %i5, 0x3, %i4 ! save last 2 bits
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick sll %i4, 0x6, %i2 ! pick a slot
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick add %i2, %i3, %o0
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick casx [%o0], %g0, %g0
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick casx [%o0], %g0, %g0
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick ret
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick restore
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick SET_SIZE(smt_pause)
e2c5185af3c50d9510e5df68aa37abdc6c0d3aacChristopher Kiick#endif