1169895Skib/*- 2169895Skib * Copyright (c) 2006,2007 Konstantin Belousov 3169895Skib * All rights reserved. 4169895Skib * 5169895Skib * Redistribution and use in source and binary forms, with or without 6169895Skib * modification, are permitted provided that the following conditions 7169895Skib * are met: 8169895Skib * 1. Redistributions of source code must retain the above copyright 9169895Skib * notice, this list of conditions and the following disclaimer. 10169895Skib * 2. Redistributions in binary form must reproduce the above copyright 11169895Skib * notice, this list of conditions and the following disclaimer in the 12169895Skib * documentation and/or other materials provided with the distribution. 13169895Skib * 4. Neither the name of the University nor the names of its contributors 14169895Skib * may be used to endorse or promote products derived from this software 15169895Skib * without specific prior written permission. 16169895Skib * 17169895Skib * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18169895Skib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19169895Skib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20169895Skib * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21169895Skib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22169895Skib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23169895Skib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24169895Skib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25169895Skib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26169895Skib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27169895Skib * SUCH DAMAGE. 28169895Skib * 29169895Skib * $FreeBSD$ 30169895Skib */ 31169895Skib 32169895Skib#include "linux_assym.h" /* system definitions */ 33169895Skib#include <machine/asmacros.h> /* miscellaneous asm macros */ 34169895Skib 35169895Skib#include "assym.s" 36169895Skib 37169895Skibfutex_fault_decx: 38169895Skib movl PCPU(CURPCB),%ecx 39169895Skibfutex_fault: 40169895Skib movl $0,PCB_ONFAULT(%ecx) 41169895Skib movl $-EFAULT,%eax 42169895Skib ret 43169895Skib 44169895SkibENTRY(futex_xchgl) 45169895Skib movl PCPU(CURPCB),%ecx 46169895Skib movl $futex_fault,PCB_ONFAULT(%ecx) 47169895Skib movl 4(%esp),%eax 48169895Skib movl 8(%esp),%edx 49169895Skib cmpl $VM_MAXUSER_ADDRESS-4,%edx 50169895Skib ja futex_fault 51169895Skib xchgl %eax,(%edx) 52169895Skib movl 12(%esp),%edx 53169895Skib movl %eax,(%edx) 54169895Skib xorl %eax,%eax 55169895Skib movl %eax,PCB_ONFAULT(%ecx) 56169895Skib ret 57169895Skib 58169895SkibENTRY(futex_addl) 59169895Skib movl PCPU(CURPCB),%ecx 60169895Skib movl $futex_fault,PCB_ONFAULT(%ecx) 61169895Skib movl 4(%esp),%eax 62169895Skib movl 8(%esp),%edx 63169895Skib cmpl $VM_MAXUSER_ADDRESS-4,%edx 64169895Skib ja futex_fault 65169895Skib#ifdef SMP 66169895Skib lock 67169895Skib#endif 68169895Skib xaddl %eax,(%edx) 69169895Skib movl 12(%esp),%edx 70169895Skib movl %eax,(%edx) 71169895Skib xorl %eax,%eax 72169895Skib movl %eax,PCB_ONFAULT(%ecx) 73169895Skib ret 74169895Skib 75169895SkibENTRY(futex_orl) 76169895Skib movl PCPU(CURPCB),%ecx 77169895Skib movl $futex_fault_decx,PCB_ONFAULT(%ecx) 78169895Skib movl 8(%esp),%edx 79169895Skib cmpl $VM_MAXUSER_ADDRESS-4,%edx 80169895Skib ja futex_fault 81169895Skib movl (%edx),%eax 82169895Skib1: movl %eax,%ecx 83169895Skib orl 4(%esp),%ecx 84169895Skib#ifdef SMP 85169895Skib lock 86169895Skib#endif 87169895Skib cmpxchgl %ecx,(%edx) 88169895Skib jnz 1b 89169895Skibfutex_tail: 90169895Skib movl 12(%esp),%edx 91169895Skib movl %eax,(%edx) 92169895Skib xorl %eax,%eax 93169895Skib movl PCPU(CURPCB),%ecx 94169895Skib movl %eax,PCB_ONFAULT(%ecx) 95169895Skib ret 96169895Skib 97169895SkibENTRY(futex_andl) 98169895Skib movl PCPU(CURPCB),%ecx 99169895Skib movl $futex_fault_decx,PCB_ONFAULT(%ecx) 100169895Skib movl 8(%esp),%edx 101169895Skib cmpl $VM_MAXUSER_ADDRESS-4,%edx 102169895Skib ja futex_fault 103169895Skib movl (%edx),%eax 104169895Skib1: movl %eax,%ecx 105169895Skib andl 4(%esp),%ecx 106169895Skib#ifdef SMP 107169895Skib lock 108169895Skib#endif 109169895Skib cmpxchgl %ecx,(%edx) 110169895Skib jnz 1b 111169895Skib jmp futex_tail 112169895Skib 113169895SkibENTRY(futex_xorl) 114169895Skib movl PCPU(CURPCB),%ecx 115169895Skib movl $futex_fault_decx,PCB_ONFAULT(%ecx) 116169895Skib movl 8(%esp),%edx 117169895Skib cmpl $VM_MAXUSER_ADDRESS-4,%edx 118169895Skib ja futex_fault 119169895Skib movl (%edx),%eax 120169895Skib1: movl %eax,%ecx 121169895Skib xorl 4(%esp),%ecx 122169895Skib#ifdef SMP 123169895Skib lock 124169895Skib#endif 125169895Skib cmpxchgl %ecx,(%edx) 126169895Skib jnz 1b 127169895Skib jmp futex_tail 128