forked from Minki/linux
6d685e5318
These are all functions which are invoked from elsewhere, so annotate them as global using the new SYM_FUNC_START and their ENDPROC's by SYM_FUNC_END. Now, ENTRY/ENDPROC can be forced to be undefined on X86, so do so. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Allison Randal <allison@lohutok.net> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Andy Shevchenko <andy@infradead.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Bill Metzenthen <billm@melbpc.org.au> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Darren Hart <dvhart@infradead.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: linux-arch@vger.kernel.org Cc: linux-crypto@vger.kernel.org Cc: linux-efi <linux-efi@vger.kernel.org> Cc: linux-efi@vger.kernel.org Cc: linux-pm@vger.kernel.org Cc: Mark Rutland <mark.rutland@arm.com> Cc: Matt Fleming <matt@codeblueprint.co.uk> Cc: Pavel Machek <pavel@ucw.cz> Cc: platform-driver-x86@vger.kernel.org Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Will Deacon <will@kernel.org> Cc: x86-ml <x86@kernel.org> Link: https://lkml.kernel.org/r/20191011115108.12392-28-jslaby@suse.cz
188 lines
2.3 KiB
ArmAsm
188 lines
2.3 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* atomic64_t for 386/486
|
|
*
|
|
* Copyright © 2010 Luca Barbieri
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/alternative-asm.h>
|
|
|
|
/* if you want SMP support, implement these with real spinlocks */
|
|
.macro LOCK reg
|
|
pushfl
|
|
cli
|
|
.endm
|
|
|
|
.macro UNLOCK reg
|
|
popfl
|
|
.endm
|
|
|
|
#define BEGIN(op) \
|
|
.macro endp; \
|
|
SYM_FUNC_END(atomic64_##op##_386); \
|
|
.purgem endp; \
|
|
.endm; \
|
|
SYM_FUNC_START(atomic64_##op##_386); \
|
|
LOCK v;
|
|
|
|
#define ENDP endp
|
|
|
|
#define RET \
|
|
UNLOCK v; \
|
|
ret
|
|
|
|
#define RET_ENDP \
|
|
RET; \
|
|
ENDP
|
|
|
|
#define v %ecx
|
|
BEGIN(read)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(set)
|
|
movl %ebx, (v)
|
|
movl %ecx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(xchg)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
movl %ebx, (v)
|
|
movl %ecx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %ecx
|
|
BEGIN(add)
|
|
addl %eax, (v)
|
|
adcl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %ecx
|
|
BEGIN(add_return)
|
|
addl (v), %eax
|
|
adcl 4(v), %edx
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %ecx
|
|
BEGIN(sub)
|
|
subl %eax, (v)
|
|
sbbl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %ecx
|
|
BEGIN(sub_return)
|
|
negl %edx
|
|
negl %eax
|
|
sbbl $0, %edx
|
|
addl (v), %eax
|
|
adcl 4(v), %edx
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(inc)
|
|
addl $1, (v)
|
|
adcl $0, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(inc_return)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
addl $1, %eax
|
|
adcl $0, %edx
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(dec)
|
|
subl $1, (v)
|
|
sbbl $0, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(dec_return)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
subl $1, %eax
|
|
sbbl $0, %edx
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
RET_ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(add_unless)
|
|
addl %eax, %ecx
|
|
adcl %edx, %edi
|
|
addl (v), %eax
|
|
adcl 4(v), %edx
|
|
cmpl %eax, %ecx
|
|
je 3f
|
|
1:
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
movl $1, %eax
|
|
2:
|
|
RET
|
|
3:
|
|
cmpl %edx, %edi
|
|
jne 1b
|
|
xorl %eax, %eax
|
|
jmp 2b
|
|
ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(inc_not_zero)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
testl %eax, %eax
|
|
je 3f
|
|
1:
|
|
addl $1, %eax
|
|
adcl $0, %edx
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
movl $1, %eax
|
|
2:
|
|
RET
|
|
3:
|
|
testl %edx, %edx
|
|
jne 1b
|
|
jmp 2b
|
|
ENDP
|
|
#undef v
|
|
|
|
#define v %esi
|
|
BEGIN(dec_if_positive)
|
|
movl (v), %eax
|
|
movl 4(v), %edx
|
|
subl $1, %eax
|
|
sbbl $0, %edx
|
|
js 1f
|
|
movl %eax, (v)
|
|
movl %edx, 4(v)
|
|
1:
|
|
RET_ENDP
|
|
#undef v
|