-# $OpenBSD: genassym.cf,v 1.32 2018/01/22 10:04:46 mpi Exp $
+# $OpenBSD: genassym.cf,v 1.33 2018/02/10 09:21:12 mpi Exp $
# Written by Artur Grabowski art@openbsd.org, Public Domain
include <sys/param.h>
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
+++ /dev/null
-/* $OpenBSD: mutex.S,v 1.13 2017/06/29 17:17:28 deraadt Exp $ */
-
-/*
- * Copyright (c) 2004 Artur Grabowski <art@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
-# $OpenBSD: genassym.cf,v 1.41 2018/01/22 10:04:46 mpi Exp $
+# $OpenBSD: genassym.cf,v 1.42 2018/02/10 09:21:12 mpi Exp $
#
# Copyright (c) 1982, 1990 The Regents of the University of California.
# All rights reserved.
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)
+++ /dev/null
-/* $OpenBSD: mutex.S,v 1.12 2017/06/29 17:17:28 deraadt Exp $ */
-
-/*
- * Copyright (c) 2004 Artur Grabowski <art@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