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: releng/11.0/sys/amd64/linux32/linux32_support.s 169895 2007-05-23 08:33:06Z kib $ 30 */ 31 32#include "linux32_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 xchgl %edi,(%rsi) 49 movl %edi,(%rdx) 50 xorl %eax,%eax 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 xaddl %edi,(%rsi) 64 movl %edi,(%rdx) 65 xorl %eax,%eax 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 movl (%rsi),%eax 761: movl %eax,%ecx 77 orl %edi,%ecx 78#ifdef SMP 79 lock 80#endif 81 cmpxchgl %ecx,(%rsi) 82 jnz 1b 83 movl %eax,(%rdx) 84 xorl %eax,%eax 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 movl (%rsi),%eax 951: movl %eax,%ecx 96 andl %edi,%ecx 97#ifdef SMP 98 lock 99#endif 100 cmpxchgl %ecx,(%rsi) 101 jnz 1b 102 movl %eax,(%rdx) 103 xorl %eax,%eax 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 movl (%rsi),%eax 1141: movl %eax,%ecx 115 xorl %edi,%ecx 116#ifdef SMP 117 lock 118#endif 119 cmpxchgl %ecx,(%rsi) 120 jnz 1b 121 movl %eax,(%rdx) 122 xorl %eax,%eax 123 movq %rax,PCB_ONFAULT(%r8) 124 ret 125