11.13Sriastrad/* $NetBSD: lock_stubs.s,v 1.13 2023/02/20 13:30:36 riastradh 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.11Sriastrad * 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.13Sriastrad#define MB_ACQ membar #LoadLoad | #LoadStore 451.13Sriastrad#define MB_REL membar #LoadStore | #StoreStore 461.2Sad#else 471.13Sriastrad#define MB_ACQ /* nothing */ 481.13Sriastrad#define MB_REL /* nothing */ 491.2Sad#endif 501.2Sad 511.2Sad#if !defined(LOCKDEBUG) 521.2Sad 531.2Sad/* 541.2Sad * void mutex_enter(kmutex_t *); 551.2Sad */ 561.6Smartin.align 32 571.8SchsENTRY(mutex_enter) 581.3Smartin sethi %hi(CURLWP), %o1 591.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 601.3Smartin CASPTR [%o0], %g0, %o1 ! compare-and-swap 611.13Sriastrad MB_ACQ 621.3Smartin brnz,pn %o1, 1f ! lock was unowned? 631.3Smartin nop 641.3Smartin retl ! - yes, done 651.2Sad nop 661.6Smartin1: ba _C_LABEL(mutex_vector_enter) ! nope, do it the 671.6Smartin nop ! hard way 681.2Sad 691.2Sad/* 701.2Sad * void mutex_exit(kmutex_t *); 711.2Sad * 721.2Sad * XXX This should use a restartable sequence. See mutex_vector_enter(). 731.2Sad */ 741.6Smartin.align 32 751.8SchsENTRY(mutex_exit) 761.3Smartin sethi %hi(CURLWP), %o1 771.3Smartin LDPTR [%o1 + %lo(CURLWP)], %o1 ! current thread 781.3Smartin clr %o2 ! new value (0) 791.13Sriastrad MB_REL 801.3Smartin CASPTR [%o0], %o1, %o2 ! compare-and-swap 811.4Smartin cmp %o1, %o2 821.4Smartin bne,pn CCCR, 1f ! nope, hard case 831.2Sad nop 841.2Sad retl 851.2Sad nop 861.6Smartin1: ba _C_LABEL(mutex_vector_exit) 871.3Smartin nop 881.2Sad 891.2Sad#endif /* !LOCKDEBUG */ 90