i386 and amd64 have been using the MI mutex code for some time now without problem. Time to remove the old assembly code, ok?
Index: arch/amd64/amd64/genassym.cf =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/genassym.cf,v retrieving revision 1.32 diff -u -p -r1.32 genassym.cf --- arch/amd64/amd64/genassym.cf 22 Jan 2018 10:04:46 -0000 1.32 +++ arch/amd64/amd64/genassym.cf 9 Feb 2018 17:54:21 -0000 @@ -139,11 +139,6 @@ struct ioapic_softc member IOAPIC_SC_REG sc_reg member IOAPIC_SC_DATA sc_data -struct mutex -member mtx_wantipl -member mtx_oldipl -member mtx_owner - # pte fields export PG_V export PG_KR Index: arch/amd64/amd64/mutex.S =================================================================== RCS file: arch/amd64/amd64/mutex.S diff -N arch/amd64/amd64/mutex.S --- arch/amd64/amd64/mutex.S 29 Jun 2017 17:17:28 -0000 1.13 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,170 +0,0 @@ -/* $OpenBSD: mutex.S,v 1.13 2017/06/29 17:17:28 deraadt Exp $ */ - -/* - * Copyright (c) 2004 Artur Grabowski <a...@openbsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "assym.h" - -#include <machine/param.h> -#include <machine/asm.h> -#include <machine/segments.h> -#include <machine/specialreg.h> -#include <machine/trap.h> -#include <machine/frameasm.h> - -/* - * Yeah, we don't really need to implement mtx_init here, but let's keep - * all the functions in the same place. - */ -ENTRY(__mtx_init) - movl %esi, MTX_WANTIPL(%rdi) - movl $0, MTX_OLDIPL(%rdi) - movq $0, MTX_OWNER(%rdi) - ret - -ENTRY(__mtx_enter) -1: movl MTX_WANTIPL(%rdi), %eax - movq CPUVAR(SELF), %rcx - movl CPU_INFO_ILEVEL(%rcx), %edx # oipl = cpl; - cmpl %eax, %edx # if (cpl < mtx->mtx_wantipl) - cmovge %edx, %eax - movl %eax, CPU_INFO_ILEVEL(%rcx) # cpl = mtx->mtx_wantipl; - /* - * %edx - the old ipl - * %rcx - curcpu() - */ - xorq %rax, %rax -#ifdef MULTIPROCESSOR - lock -#endif - cmpxchgq %rcx, MTX_OWNER(%rdi) # test_and_set(mtx->mtx_owner) - jne 2f - movl %edx, MTX_OLDIPL(%rdi) -#ifdef DIAGNOSTIC - incl CPU_INFO_MUTEX_LEVEL(%rcx) -#endif - ret - - /* We failed to obtain the lock. splx, spin and retry. */ -2: pushq %rdi - movl %edx, %edi - call _C_LABEL(spllower) - popq %rdi -3: - pause -#ifdef DIAGNOSTIC - movq CPUVAR(SELF), %rcx - cmpq MTX_OWNER(%rdi), %rcx - je 4f -#endif - movq MTX_OWNER(%rdi), %rax - testq %rax, %rax - jz 1b - jmp 3b -#ifdef DIAGNOSTIC -4: movq $mtx_lockingself, %rdi - call _C_LABEL(panic) - - .section .rodata -mtx_lockingself: - .asciz "mtx_enter: locking against myself" - .text -#endif - -ENTRY(__mtx_enter_try) -1: movl MTX_WANTIPL(%rdi), %eax - movq CPUVAR(SELF), %rcx - movl CPU_INFO_ILEVEL(%rcx), %edx # oipl = cpl; - cmpl %eax, %edx # if (cpl < mtx->mtx_wantipl) - cmovge %edx, %eax - movl %eax, CPU_INFO_ILEVEL(%rcx) # cpl = mtx->mtx_wantipl; - /* - * %edx - the old ipl - * %rcx - curcpu() - */ - xorq %rax, %rax -#ifdef MULTIPROCESSOR - lock -#endif - cmpxchgq %rcx, MTX_OWNER(%rdi) # test_and_set(mtx->mtx_owner) - jne 2f - movl %edx, MTX_OLDIPL(%rdi) -#ifdef DIAGNOSTIC - incl CPU_INFO_MUTEX_LEVEL(%rcx) -#endif - movq $1, %rax - ret - - /* We failed to obtain the lock. splx and return 0. */ -2: pushq %rdi - movl %edx, %edi - call _C_LABEL(spllower) - popq %rdi -#ifdef DIAGNOSTIC - movq CPUVAR(SELF), %rcx - cmpq MTX_OWNER(%rdi), %rcx - je 3f -#endif - xorq %rax, %rax - ret - -#ifdef DIAGNOSTIC -3: movq $mtx_lockingtry, %rdi - call _C_LABEL(panic) - - .section .rodata -mtx_lockingtry: - .asciz "mtx_enter_try: locking against myself" - .text -#endif - - -ENTRY(__mtx_leave) - movq %rdi, %rax -#ifdef DIAGNOSTIC - movq CPUVAR(SELF), %rcx - cmpq MTX_OWNER(%rax), %rcx - jne 2f - decl CPU_INFO_MUTEX_LEVEL(%rcx) -#endif - xorq %rcx, %rcx - movl MTX_OLDIPL(%rax), %edi - movl %ecx, MTX_OLDIPL(%rax) - movq %rcx, MTX_OWNER(%rax) - cmpl %edi, CPUVAR(ILEVEL) - je 1f - call _C_LABEL(spllower) -1: - ret - -#ifdef DIAGNOSTIC -2: movq $mtx_leave_held, %rdi - call _C_LABEL(panic) - - .section .rodata -mtx_leave_held: - .asciz "mtx_leave: lock not held" - .text -#endif Index: arch/i386/i386/genassym.cf =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/genassym.cf,v retrieving revision 1.41 diff -u -p -r1.41 genassym.cf --- arch/i386/i386/genassym.cf 22 Jan 2018 10:04:46 -0000 1.41 +++ arch/i386/i386/genassym.cf 9 Feb 2018 17:54:29 -0000 @@ -135,11 +135,6 @@ member IH_COUNT ih_count.ec_count member ih_next endif -struct mutex -member mtx_wantipl -member mtx_oldipl -member mtx_owner - define IP_SRC offsetof(struct ip, ip_src) define IP_DST offsetof(struct ip, ip_dst) Index: arch/i386/i386/mutex.S =================================================================== RCS file: arch/i386/i386/mutex.S diff -N arch/i386/i386/mutex.S --- arch/i386/i386/mutex.S 29 Jun 2017 17:17:28 -0000 1.12 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,179 +0,0 @@ -/* $OpenBSD: mutex.S,v 1.12 2017/06/29 17:17:28 deraadt Exp $ */ - -/* - * Copyright (c) 2004 Artur Grabowski <a...@openbsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "assym.h" -/* - * Yeah, we don't really need to implement mtx_init here, but let's keep - * all the functions in the same place. - */ -ENTRY(__mtx_init) - pushl %ebp - movl %esp, %ebp - movl 8(%esp), %eax - movl 12(%esp), %edx - movl %edx, MTX_WANTIPL(%eax) - xorl %edx, %edx - movl %edx, MTX_OLDIPL(%eax) - movl %edx, MTX_LOCK(%eax) - movl %edx, MTX_OWNER(%eax) - leave - ret - -#define SOFF 8 - -ENTRY(__mtx_enter) - pushl %ebp - movl %esp, %ebp -1: movl SOFF(%ebp), %ecx - movl MTX_WANTIPL(%ecx), %eax - movl CPL, %edx # oipl = cpl; - cmpl %edx, %eax # if (cpl < mtx->mtx_wantipl) - jle 2f - movl %eax, CPL # cpl = mtx->mtx_wantipl; -2: /* - * %edx now contains the oldipl. - * %ecx contains the mtx. - */ - movl $1, %eax - xchgl %eax, MTX_LOCK(%ecx) # test_and_set(mtx->mtx_lock) - testl %eax, %eax # if (already held) - jnz 3f - movl CPUVAR(SELF), %eax -#ifdef DIAGNOSTIC - incl CPU_INFO_MUTEX_LEVEL(%eax) -#endif - movl %eax, MTX_OWNER(%ecx) - movl %edx, MTX_OLDIPL(%ecx) - leave - ret - - /* We failed to obtain the lock. splx, spin and retry. */ -3: pushl %edx - call _C_LABEL(splx) - movl %ebp, %esp - movl SOFF(%ebp), %ecx # %ecx clobbered -4: - pause -#ifdef DIAGNOSTIC - movl CPUVAR(SELF), %edx - cmpl MTX_OWNER(%ecx), %edx - je 5f -#endif - movl MTX_LOCK(%ecx), %eax - testl %eax, %eax - jz 1b - jmp 4b -#ifdef DIAGNOSTIC -5: pushl $mtx_lockingself - call _C_LABEL(panic) - - .section .rodata -mtx_lockingself: - .asciz "mtx_enter: locking against myself" - .text -#endif - -ENTRY(__mtx_enter_try) - pushl %ebp - movl %esp, %ebp -1: movl SOFF(%ebp), %ecx - movl MTX_WANTIPL(%ecx), %eax - movl CPL, %edx # oipl = cpl; - cmpl %edx, %eax # if (cpl < mtx->mtx_wantipl) - jle 2f - movl %eax, CPL # cpl = mtx->mtx_wantipl; -2: /* - * %edx now contains the oldipl. - * %ecx contains the mtx. - */ - movl $1, %eax - xchgl %eax, MTX_LOCK(%ecx) # test_and_set(mtx->mtx_lock) - testl %eax, %eax # if (already held) - jnz 3f - movl CPUVAR(SELF), %eax -#ifdef DIAGNOSTIC - incl CPU_INFO_MUTEX_LEVEL(%eax) -#endif - movl %eax, MTX_OWNER(%ecx) - movl %edx, MTX_OLDIPL(%ecx) - movl $1, %eax - leave - ret - - /* We failed to obtain the lock. splx and return zero. */ -3: pushl %edx - call _C_LABEL(splx) - movl %ebp, %esp - movl SOFF(%ebp), %ecx # %ecx clobbered -#ifdef DIAGNOSTIC - movl CPUVAR(SELF), %edx - cmpl MTX_OWNER(%ecx), %edx - je 4f -#endif - xorl %eax, %eax - leave - ret - -#ifdef DIAGNOSTIC -4: pushl $mtx_lockingtry - call _C_LABEL(panic) - - .section .rodata -mtx_lockingtry: - .asciz "mtx_enter_try: locking against myself" - .text -#endif - - -ENTRY(__mtx_leave) - pushl %ebp - movl %esp, %ebp - movl SOFF(%ebp), %ecx -#ifdef DIAGNOSTIC - movl CPUVAR(SELF), %eax - cmpl %eax, MTX_OWNER(%ecx) - jne 1f - decl CPU_INFO_MUTEX_LEVEL(%eax) -#endif - xorl %eax, %eax - movl %eax, MTX_OWNER(%ecx) - pushl MTX_OLDIPL(%ecx) - movl %eax, MTX_OLDIPL(%ecx) - movl %eax, MTX_LOCK(%ecx) - call _C_LABEL(splx) - leave - ret - -#ifdef DIAGNOSTIC -1: pushl $mtx_leave_held - call _C_LABEL(panic) - - .section .rodata -mtx_leave_held: - .asciz "mtx_leave: lock not held" - .text -#endif