1/*- 2 * Copyright (c) 2007 Konstantin Belousov 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $FreeBSD$ 30 */ 31 32#include "linux_assym.h" /* system definitions */ 33#include <machine/asmacros.h> /* miscellaneous asm macros */ 34 35#include "assym.s" 36 37futex_fault: 38 movq $0,PCB_ONFAULT(%r8) 39 movl $-EFAULT,%eax 40 ret 41 42ENTRY(futex_xchgl) 43 movq PCPU(CURPCB),%r8 44 movq $futex_fault,PCB_ONFAULT(%r8) 45 movq $VM_MAXUSER_ADDRESS-4,%rax 46 cmpq %rax,%rsi 47 ja futex_fault 48 xchgq %rdi,(%rsi) 49 movq %rdi,(%rdx) 50 xorq %rax,%rax 51 movq %rax,PCB_ONFAULT(%r8) 52 ret 53 54ENTRY(futex_addl) 55 movq PCPU(CURPCB),%r8 56 movq $futex_fault,PCB_ONFAULT(%r8) 57 movq $VM_MAXUSER_ADDRESS-4,%rax 58 cmpq %rax,%rsi 59 ja futex_fault 60#ifdef SMP 61 lock 62#endif 63 xaddq %rdi,(%rsi) 64 movq %rdi,(%rdx) 65 xorq %rax,%rax 66 movq %rax,PCB_ONFAULT(%r8) 67 ret 68 69ENTRY(futex_orl) 70 movq PCPU(CURPCB),%r8 71 movq $futex_fault,PCB_ONFAULT(%r8) 72 movq $VM_MAXUSER_ADDRESS-4,%rax 73 cmpq %rax,%rsi 74 ja futex_fault 75 movq (%rsi),%rax 761: movq %rax,%rcx 77 orq %rdi,%rcx 78#ifdef SMP 79 lock 80#endif 81 cmpxchgq %rcx,(%rsi) 82 jnz 1b 83 movq %rax,(%rdx) 84 xorq %rax,%rax 85 movq %rax,PCB_ONFAULT(%r8) 86 ret 87 88ENTRY(futex_andl) 89 movq PCPU(CURPCB),%r8 90 movq $futex_fault,PCB_ONFAULT(%r8) 91 movq $VM_MAXUSER_ADDRESS-4,%rax 92 cmpq %rax,%rsi 93 ja futex_fault 94 movq (%rsi),%rax 951: movq %rax,%rcx 96 andq %rdi,%rcx 97#ifdef SMP 98 lock 99#endif 100 cmpxchgq %rcx,(%rsi) 101 jnz 1b 102 movq %rax,(%rdx) 103 xorq %rax,%rax 104 movq %rax,PCB_ONFAULT(%r8) 105 ret 106 107ENTRY(futex_xorl) 108 movq PCPU(CURPCB),%r8 109 movq $futex_fault,PCB_ONFAULT(%r8) 110 movq $VM_MAXUSER_ADDRESS-4,%rax 111 cmpq %rax,%rsi 112 ja futex_fault 113 movq (%rsi),%rax 1141: movq %rax,%rcx 115 xorq %rdi,%rcx 116#ifdef SMP 117 lock 118#endif 119 cmpxchgq %rcx,(%rsi) 120 jnz 1b 121 movq %rax,(%rdx) 122 xorq %rax,%rax 123 movq %rax,PCB_ONFAULT(%r8) 124 ret 125