lock_stubs.s revision 1.8
11.8Schs/* $NetBSD: lock_stubs.s,v 1.8 2008/05/25 15:56:12 chs 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 * 191.2Sad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.2Sad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.2Sad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.2Sad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.2Sad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.2Sad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.2Sad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.2Sad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.2Sad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.2Sad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.2Sad * POSSIBILITY OF SUCH DAMAGE. 301.2Sad */ 311.2Sad 321.2Sad#include "opt_multiprocessor.h" 331.2Sad#include "opt_lockdebug.h" 341.2Sad 351.2Sad#include <machine/param.h> 361.2Sad#include <machine/asm.h> 371.2Sad 381.2Sad#include "assym.h" 391.2Sad 401.2Sad#undef CURLWP 411.5Smartin#define CURLWP (CPUINFO_VA+CI_CURLWP) 421.5Smartin 431.2Sad#if defined(MULTIPROCESSOR) 441.2Sad#define MB_READ membar #LoadLoad 451.3Smartin#define MB_MEM membar #LoadStore | #StoreStore 461.2Sad#else 471.2Sad#define MB_READ /* nothing */ 481.2Sad#define MB_MEM /* nothing */ 491.2Sad#endif 501.2Sad 511.2Sad#ifdef __arch64__ 521.2Sad#define CASPTR casx 531.2Sad#define LDPTR ldx 541.2Sad#define STPTR stx 551.4Smartin#define CCCR %xcc 561.2Sad#else 571.2Sad#define CASPTR cas 581.2Sad#define LDPTR ld 591.2Sad#define STPTR st 601.4Smartin#define CCCR %icc 611.2Sad#endif /* __arch64__ */ 621.2Sad 631.2Sad/* 641.3Smartin * int _lock_cas(uintptr_t *ptr, uintptr_t old, uintptr_t new); 651.2Sad */ 661.6Smartin.align 32 671.8SchsENTRY(_lock_cas) 681.2Sad CASPTR [%o0], %o1, %o2 ! compare-and-swap 691.2Sad MB_MEM 701.6Smartin xor %o1, %o2, %o2 ! expected == actual? 711.6Smartin clr %o0 721.2Sad retl 731.6Smartin movrz %o2, 1, %o0 741.2Sad 751.2Sad#if !defined(LOCKDEBUG) 761.2Sad 771.2Sad/* 781.2Sad * void mutex_enter(kmutex_t *); 791.2Sad */ 801.6Smartin.align 32 811.8SchsENTRY(mutex_enter) 821.3Smartin sethi %hi(CURLWP), %o1 831.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 841.3Smartin CASPTR [%o0], %g0, %o1 ! compare-and-swap 851.2Sad MB_READ 861.3Smartin brnz,pn %o1, 1f ! lock was unowned? 871.3Smartin nop 881.3Smartin retl ! - yes, done 891.2Sad nop 901.6Smartin1: ba _C_LABEL(mutex_vector_enter) ! nope, do it the 911.6Smartin nop ! hard way 921.2Sad 931.2Sad/* 941.2Sad * void mutex_exit(kmutex_t *); 951.2Sad * 961.2Sad * XXX This should use a restartable sequence. See mutex_vector_enter(). 971.2Sad */ 981.6Smartin.align 32 991.8SchsENTRY(mutex_exit) 1001.3Smartin sethi %hi(CURLWP), %o1 1011.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 1021.3Smartin clr %o2 ! new value (0) 1031.2Sad MB_MEM 1041.3Smartin CASPTR [%o0], %o1, %o2 ! compare-and-swap 1051.4Smartin cmp %o1, %o2 1061.4Smartin bne,pn CCCR, 1f ! nope, hard case 1071.2Sad nop 1081.2Sad retl 1091.2Sad nop 1101.6Smartin1: ba _C_LABEL(mutex_vector_exit) 1111.3Smartin nop 1121.2Sad 1131.2Sad#endif /* !LOCKDEBUG */ 114