lock_stubs.s revision 1.4
11.4Smartin/* $NetBSD: lock_stubs.s,v 1.4 2007/02/21 20:03:26 martin Exp $ */ 21.2Sad 31.2Sad/*- 41.2Sad * Copyright (c) 2002, 2006 The NetBSD Foundation, Inc. 51.2Sad * All rights reserved. 61.2Sad * 71.2Sad * This code is derived from software contributed to The NetBSD Foundation 81.2Sad * by Jason R. Thorpe and Andrew Doran. 91.2Sad * 101.2Sad * Redistribution and use in source and binary forms, with or without 111.2Sad * modification, are permitted provided that the following conditions 121.2Sad * are met: 131.2Sad * 1. Redistributions of source code must retain the above copyright 141.2Sad * notice, this list of conditions and the following disclaimer. 151.2Sad * 2. Redistributions in binary form must reproduce the above copyright 161.2Sad * notice, this list of conditions and the following disclaimer in the 171.2Sad * documentation and/or other materials provided with the distribution. 181.2Sad * 3. All advertising materials mentioning features or use of this software 191.2Sad * must display the following acknowledgement: 201.2Sad * This product includes software developed by the NetBSD 211.2Sad * Foundation, Inc. and its contributors. 221.2Sad * 4. Neither the name of The NetBSD Foundation nor the names of its 231.2Sad * contributors may be used to endorse or promote products derived 241.2Sad * from this software without specific prior written permission. 251.2Sad * 261.2Sad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 271.2Sad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 281.2Sad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 291.2Sad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 301.2Sad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 311.2Sad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 321.2Sad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 331.2Sad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 341.2Sad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 351.2Sad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 361.2Sad * POSSIBILITY OF SUCH DAMAGE. 371.2Sad */ 381.2Sad 391.2Sad#include "opt_multiprocessor.h" 401.2Sad#include "opt_lockdebug.h" 411.2Sad 421.2Sad#include <machine/param.h> 431.2Sad#include <machine/asm.h> 441.2Sad 451.2Sad#include "assym.h" 461.2Sad 471.2Sad#undef CURLWP 481.2Sad#if defined(MULTIPROCESSOR) 491.2Sad#define CURLWP (CPUINFO_VA+CI_CURLWP) 501.2Sad#define MB_READ membar #LoadLoad 511.3Smartin#define MB_MEM membar #LoadStore | #StoreStore 521.2Sad#else 531.2Sad#define CURLWP _C_LABEL(curlwp) 541.2Sad#define MB_READ /* nothing */ 551.2Sad#define MB_MEM /* nothing */ 561.2Sad#endif 571.2Sad 581.2Sad#ifdef __arch64__ 591.2Sad#define CASPTR casx 601.2Sad#define LDPTR ldx 611.2Sad#define STPTR stx 621.4Smartin#define CCCR %xcc 631.2Sad#else 641.2Sad#define CASPTR cas 651.2Sad#define LDPTR ld 661.2Sad#define STPTR st 671.4Smartin#define CCCR %icc 681.2Sad#endif /* __arch64__ */ 691.2Sad 701.2Sad/* 711.3Smartin * int _lock_cas(uintptr_t *ptr, uintptr_t old, uintptr_t new); 721.2Sad */ 731.2Sad_ENTRY(_C_LABEL(_lock_cas)) 741.2Sad CASPTR [%o0], %o1, %o2 ! compare-and-swap 751.2Sad MB_MEM 761.2Sad cmp %o1, %o2 ! expected == actual? 771.3Smartin bne,pn %icc,1f ! nope 781.3Smartin nop 791.2Sad retl 801.3Smartin mov 1, %o0 811.2Sad1: retl 821.3Smartin clr %o0 831.2Sad 841.2Sad#if !defined(LOCKDEBUG) 851.2Sad 861.2Sad/* 871.2Sad * void mutex_enter(kmutex_t *); 881.2Sad */ 891.2Sad_ENTRY(_C_LABEL(mutex_enter)) 901.3Smartin sethi %hi(CURLWP), %o1 911.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 921.3Smartin CASPTR [%o0], %g0, %o1 ! compare-and-swap 931.2Sad MB_READ 941.3Smartin brnz,pn %o1, 1f ! lock was unowned? 951.3Smartin nop 961.3Smartin retl ! - yes, done 971.2Sad nop 981.3Smartin1: sethi %hi(_C_LABEL(mutex_vector_enter)),%o2 ! nope, do it the 991.3Smartin jmp %o2 + %lo(_C_LABEL(mutex_vector_enter)) ! hard way 1001.2Sad nop 1011.2Sad 1021.2Sad/* 1031.2Sad * void mutex_exit(kmutex_t *); 1041.2Sad * 1051.2Sad * XXX This should use a restartable sequence. See mutex_vector_enter(). 1061.2Sad */ 1071.2Sad_ENTRY(_C_LABEL(mutex_exit)) 1081.3Smartin sethi %hi(CURLWP), %o1 1091.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 1101.3Smartin clr %o2 ! new value (0) 1111.2Sad MB_MEM 1121.3Smartin CASPTR [%o0], %o1, %o2 ! compare-and-swap 1131.4Smartin cmp %o1, %o2 1141.4Smartin bne,pn CCCR, 1f ! nope, hard case 1151.2Sad nop 1161.2Sad retl 1171.2Sad nop 1181.3Smartin1: sethi %hi(_C_LABEL(mutex_vector_exit)), %o2 1191.3Smartin jmp %o2 + %lo(_C_LABEL(mutex_vector_exit)) 1201.3Smartin nop 1211.2Sad 1221.2Sad#endif /* !LOCKDEBUG */ 123