Path: blob/main/sys/amd64/linux32/linux32_support.S
39536 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2007 Konstantin Belousov4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728#include "linux32_assym.h" /* system definitions */29#include <machine/asmacros.h> /* miscellaneous asm macros */30#include <machine/specialreg.h>3132#include "assym.inc"3334futex_fault:35testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)36je 1f37clac381: movq $0,PCB_ONFAULT(%r8)39movl $EFAULT,%eax40ret4142ENTRY(futex_xchgl_nosmap)43movq PCPU(CURPCB),%r844movq $futex_fault,PCB_ONFAULT(%r8)45movq $VM_MAXUSER_ADDRESS-4,%rax46cmpq %rax,%rsi47ja futex_fault48xchgl %edi,(%rsi)49movl %edi,(%rdx)50xorl %eax,%eax51movq %rax,PCB_ONFAULT(%r8)52ret53END(futex_xchgl_nosmap)5455ENTRY(futex_xchgl_smap)56movq PCPU(CURPCB),%r857movq $futex_fault,PCB_ONFAULT(%r8)58movq $VM_MAXUSER_ADDRESS-4,%rax59cmpq %rax,%rsi60ja futex_fault61stac62xchgl %edi,(%rsi)63clac64movl %edi,(%rdx)65xorl %eax,%eax66movq %rax,PCB_ONFAULT(%r8)67ret68END(futex_xchgl_smap)6970ENTRY(futex_addl_nosmap)71movq PCPU(CURPCB),%r872movq $futex_fault,PCB_ONFAULT(%r8)73movq $VM_MAXUSER_ADDRESS-4,%rax74cmpq %rax,%rsi75ja futex_fault76#ifdef SMP77lock78#endif79xaddl %edi,(%rsi)80movl %edi,(%rdx)81xorl %eax,%eax82movq %rax,PCB_ONFAULT(%r8)83ret84END(futex_addl_nosmap)8586ENTRY(futex_addl_smap)87movq PCPU(CURPCB),%r888movq $futex_fault,PCB_ONFAULT(%r8)89movq $VM_MAXUSER_ADDRESS-4,%rax90cmpq %rax,%rsi91ja futex_fault92stac93#ifdef SMP94lock95#endif96xaddl %edi,(%rsi)97clac98movl %edi,(%rdx)99xorl %eax,%eax100movq %rax,PCB_ONFAULT(%r8)101ret102END(futex_addl_smap)103104ENTRY(futex_orl_nosmap)105movq PCPU(CURPCB),%r8106movq $futex_fault,PCB_ONFAULT(%r8)107movq $VM_MAXUSER_ADDRESS-4,%rax108cmpq %rax,%rsi109ja futex_fault110movl (%rsi),%eax1111: movl %eax,%ecx112orl %edi,%ecx113#ifdef SMP114lock115#endif116cmpxchgl %ecx,(%rsi)117jnz 1b118movl %eax,(%rdx)119xorl %eax,%eax120movq %rax,PCB_ONFAULT(%r8)121ret122END(futex_orl_nosmap)123124ENTRY(futex_orl_smap)125movq PCPU(CURPCB),%r8126movq $futex_fault,PCB_ONFAULT(%r8)127movq $VM_MAXUSER_ADDRESS-4,%rax128cmpq %rax,%rsi129ja futex_fault130stac131movl (%rsi),%eax1321: movl %eax,%ecx133orl %edi,%ecx134#ifdef SMP135lock136#endif137cmpxchgl %ecx,(%rsi)138jnz 1b139clac140movl %eax,(%rdx)141xorl %eax,%eax142movq %rax,PCB_ONFAULT(%r8)143ret144END(futex_orl_smap)145146ENTRY(futex_andl_nosmap)147movq PCPU(CURPCB),%r8148movq $futex_fault,PCB_ONFAULT(%r8)149movq $VM_MAXUSER_ADDRESS-4,%rax150cmpq %rax,%rsi151ja futex_fault152movl (%rsi),%eax1531: movl %eax,%ecx154andl %edi,%ecx155#ifdef SMP156lock157#endif158cmpxchgl %ecx,(%rsi)159jnz 1b160movl %eax,(%rdx)161xorl %eax,%eax162movq %rax,PCB_ONFAULT(%r8)163ret164END(futex_andl_nosmap)165166ENTRY(futex_andl_smap)167movq PCPU(CURPCB),%r8168movq $futex_fault,PCB_ONFAULT(%r8)169movq $VM_MAXUSER_ADDRESS-4,%rax170cmpq %rax,%rsi171ja futex_fault172stac173movl (%rsi),%eax1741: movl %eax,%ecx175andl %edi,%ecx176#ifdef SMP177lock178#endif179cmpxchgl %ecx,(%rsi)180jnz 1b181clac182movl %eax,(%rdx)183xorl %eax,%eax184movq %rax,PCB_ONFAULT(%r8)185ret186END(futex_andl_smap)187188ENTRY(futex_xorl_nosmap)189movq PCPU(CURPCB),%r8190movq $futex_fault,PCB_ONFAULT(%r8)191movq $VM_MAXUSER_ADDRESS-4,%rax192cmpq %rax,%rsi193ja futex_fault194movl (%rsi),%eax1951: movl %eax,%ecx196xorl %edi,%ecx197#ifdef SMP198lock199#endif200cmpxchgl %ecx,(%rsi)201jnz 1b202movl %eax,(%rdx)203xorl %eax,%eax204movq %rax,PCB_ONFAULT(%r8)205ret206END(futex_xorl_nosmap)207208ENTRY(futex_xorl_smap)209movq PCPU(CURPCB),%r8210movq $futex_fault,PCB_ONFAULT(%r8)211movq $VM_MAXUSER_ADDRESS-4,%rax212cmpq %rax,%rsi213ja futex_fault214stac215movl (%rsi),%eax2161: movl %eax,%ecx217xorl %edi,%ecx218#ifdef SMP219lock220#endif221cmpxchgl %ecx,(%rsi)222jnz 1b223clac224movl %eax,(%rdx)225xorl %eax,%eax226movq %rax,PCB_ONFAULT(%r8)227ret228END(futex_xorl_smap)229230231