12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 2a7e926abSLuca Barbieri/* 3a7e926abSLuca Barbieri * atomic64_t for 386/486 4a7e926abSLuca Barbieri * 5a7e926abSLuca Barbieri * Copyright © 2010 Luca Barbieri 6a7e926abSLuca Barbieri */ 7a7e926abSLuca Barbieri 8a7e926abSLuca Barbieri#include <linux/linkage.h> 9*5e21a3ecSJuergen Gross#include <asm/alternative.h> 10a7e926abSLuca Barbieri 11a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */ 12a7e926abSLuca Barbieri.macro LOCK reg 13131484c8SIngo Molnar pushfl 14a7e926abSLuca Barbieri cli 15a7e926abSLuca Barbieri.endm 16a7e926abSLuca Barbieri 17a7e926abSLuca Barbieri.macro UNLOCK reg 18131484c8SIngo Molnar popfl 19a7e926abSLuca Barbieri.endm 20a7e926abSLuca Barbieri 2130246557SLuca Barbieri#define BEGIN(op) \ 22417484d4SLuca Barbieri.macro endp; \ 236d685e53SJiri SlabySYM_FUNC_END(atomic64_##op##_386); \ 24417484d4SLuca Barbieri.purgem endp; \ 2530246557SLuca Barbieri.endm; \ 266d685e53SJiri SlabySYM_FUNC_START(atomic64_##op##_386); \ 2730246557SLuca Barbieri LOCK v; 28a7e926abSLuca Barbieri 29417484d4SLuca Barbieri#define ENDP endp 30417484d4SLuca Barbieri 3130246557SLuca Barbieri#define RET \ 3230246557SLuca Barbieri UNLOCK v; \ 33a7e926abSLuca Barbieri ret 34a7e926abSLuca Barbieri 35417484d4SLuca Barbieri#define RET_ENDP \ 3630246557SLuca Barbieri RET; \ 37417484d4SLuca Barbieri ENDP 38a7e926abSLuca Barbieri 3930246557SLuca Barbieri#define v %ecx 4030246557SLuca BarbieriBEGIN(read) 4130246557SLuca Barbieri movl (v), %eax 4230246557SLuca Barbieri movl 4(v), %edx 43417484d4SLuca BarbieriRET_ENDP 4430246557SLuca Barbieri#undef v 45a7e926abSLuca Barbieri 4630246557SLuca Barbieri#define v %esi 4730246557SLuca BarbieriBEGIN(set) 4830246557SLuca Barbieri movl %ebx, (v) 4930246557SLuca Barbieri movl %ecx, 4(v) 50417484d4SLuca BarbieriRET_ENDP 5130246557SLuca Barbieri#undef v 52a7e926abSLuca Barbieri 5330246557SLuca Barbieri#define v %esi 5430246557SLuca BarbieriBEGIN(xchg) 5530246557SLuca Barbieri movl (v), %eax 5630246557SLuca Barbieri movl 4(v), %edx 5730246557SLuca Barbieri movl %ebx, (v) 5830246557SLuca Barbieri movl %ecx, 4(v) 59417484d4SLuca BarbieriRET_ENDP 6030246557SLuca Barbieri#undef v 61a7e926abSLuca Barbieri 6230246557SLuca Barbieri#define v %ecx 6330246557SLuca BarbieriBEGIN(add) 6430246557SLuca Barbieri addl %eax, (v) 6530246557SLuca Barbieri adcl %edx, 4(v) 66417484d4SLuca BarbieriRET_ENDP 6730246557SLuca Barbieri#undef v 68a7e926abSLuca Barbieri 6930246557SLuca Barbieri#define v %ecx 7030246557SLuca BarbieriBEGIN(add_return) 7130246557SLuca Barbieri addl (v), %eax 7230246557SLuca Barbieri adcl 4(v), %edx 7330246557SLuca Barbieri movl %eax, (v) 7430246557SLuca Barbieri movl %edx, 4(v) 75417484d4SLuca BarbieriRET_ENDP 7630246557SLuca Barbieri#undef v 77a7e926abSLuca Barbieri 7830246557SLuca Barbieri#define v %ecx 7930246557SLuca BarbieriBEGIN(sub) 8030246557SLuca Barbieri subl %eax, (v) 8130246557SLuca Barbieri sbbl %edx, 4(v) 82417484d4SLuca BarbieriRET_ENDP 8330246557SLuca Barbieri#undef v 8430246557SLuca Barbieri 8530246557SLuca Barbieri#define v %ecx 8630246557SLuca BarbieriBEGIN(sub_return) 87a7e926abSLuca Barbieri negl %edx 88a7e926abSLuca Barbieri negl %eax 89a7e926abSLuca Barbieri sbbl $0, %edx 9030246557SLuca Barbieri addl (v), %eax 9130246557SLuca Barbieri adcl 4(v), %edx 9230246557SLuca Barbieri movl %eax, (v) 9330246557SLuca Barbieri movl %edx, 4(v) 94417484d4SLuca BarbieriRET_ENDP 9530246557SLuca Barbieri#undef v 96a7e926abSLuca Barbieri 9730246557SLuca Barbieri#define v %esi 9830246557SLuca BarbieriBEGIN(inc) 9930246557SLuca Barbieri addl $1, (v) 10030246557SLuca Barbieri adcl $0, 4(v) 101417484d4SLuca BarbieriRET_ENDP 10230246557SLuca Barbieri#undef v 103a7e926abSLuca Barbieri 10430246557SLuca Barbieri#define v %esi 10530246557SLuca BarbieriBEGIN(inc_return) 10630246557SLuca Barbieri movl (v), %eax 10730246557SLuca Barbieri movl 4(v), %edx 108a7e926abSLuca Barbieri addl $1, %eax 109a7e926abSLuca Barbieri adcl $0, %edx 11030246557SLuca Barbieri movl %eax, (v) 11130246557SLuca Barbieri movl %edx, 4(v) 112417484d4SLuca BarbieriRET_ENDP 11330246557SLuca Barbieri#undef v 114a7e926abSLuca Barbieri 11530246557SLuca Barbieri#define v %esi 11630246557SLuca BarbieriBEGIN(dec) 11730246557SLuca Barbieri subl $1, (v) 11830246557SLuca Barbieri sbbl $0, 4(v) 119417484d4SLuca BarbieriRET_ENDP 12030246557SLuca Barbieri#undef v 121a7e926abSLuca Barbieri 12230246557SLuca Barbieri#define v %esi 12330246557SLuca BarbieriBEGIN(dec_return) 12430246557SLuca Barbieri movl (v), %eax 12530246557SLuca Barbieri movl 4(v), %edx 126a7e926abSLuca Barbieri subl $1, %eax 127a7e926abSLuca Barbieri sbbl $0, %edx 12830246557SLuca Barbieri movl %eax, (v) 12930246557SLuca Barbieri movl %edx, 4(v) 130417484d4SLuca BarbieriRET_ENDP 13130246557SLuca Barbieri#undef v 132a7e926abSLuca Barbieri 133cb8095bbSJan Beulich#define v %esi 13430246557SLuca BarbieriBEGIN(add_unless) 135cb8095bbSJan Beulich addl %eax, %ecx 136a7e926abSLuca Barbieri adcl %edx, %edi 13730246557SLuca Barbieri addl (v), %eax 13830246557SLuca Barbieri adcl 4(v), %edx 139cb8095bbSJan Beulich cmpl %eax, %ecx 140a7e926abSLuca Barbieri je 3f 141a7e926abSLuca Barbieri1: 14230246557SLuca Barbieri movl %eax, (v) 14330246557SLuca Barbieri movl %edx, 4(v) 1446e6104feSLuca Barbieri movl $1, %eax 145a7e926abSLuca Barbieri2: 14630246557SLuca Barbieri RET 147a7e926abSLuca Barbieri3: 148a7e926abSLuca Barbieri cmpl %edx, %edi 149a7e926abSLuca Barbieri jne 1b 1506e6104feSLuca Barbieri xorl %eax, %eax 151a7e926abSLuca Barbieri jmp 2b 152417484d4SLuca BarbieriENDP 15330246557SLuca Barbieri#undef v 154a7e926abSLuca Barbieri 15530246557SLuca Barbieri#define v %esi 15630246557SLuca BarbieriBEGIN(inc_not_zero) 15730246557SLuca Barbieri movl (v), %eax 15830246557SLuca Barbieri movl 4(v), %edx 159a7e926abSLuca Barbieri testl %eax, %eax 160a7e926abSLuca Barbieri je 3f 161a7e926abSLuca Barbieri1: 162a7e926abSLuca Barbieri addl $1, %eax 163a7e926abSLuca Barbieri adcl $0, %edx 16430246557SLuca Barbieri movl %eax, (v) 16530246557SLuca Barbieri movl %edx, 4(v) 166f3e83131SLuca Barbieri movl $1, %eax 167a7e926abSLuca Barbieri2: 16830246557SLuca Barbieri RET 169a7e926abSLuca Barbieri3: 170a7e926abSLuca Barbieri testl %edx, %edx 171a7e926abSLuca Barbieri jne 1b 172a7e926abSLuca Barbieri jmp 2b 173417484d4SLuca BarbieriENDP 17430246557SLuca Barbieri#undef v 175a7e926abSLuca Barbieri 17630246557SLuca Barbieri#define v %esi 17730246557SLuca BarbieriBEGIN(dec_if_positive) 17830246557SLuca Barbieri movl (v), %eax 17930246557SLuca Barbieri movl 4(v), %edx 180a7e926abSLuca Barbieri subl $1, %eax 181a7e926abSLuca Barbieri sbbl $0, %edx 182a7e926abSLuca Barbieri js 1f 18330246557SLuca Barbieri movl %eax, (v) 18430246557SLuca Barbieri movl %edx, 4(v) 185a7e926abSLuca Barbieri1: 186417484d4SLuca BarbieriRET_ENDP 18730246557SLuca Barbieri#undef v 188