1a7e926abSLuca Barbieri/* 2a7e926abSLuca Barbieri * atomic64_t for 386/486 3a7e926abSLuca Barbieri * 4a7e926abSLuca Barbieri * Copyright © 2010 Luca Barbieri 5a7e926abSLuca Barbieri * 6a7e926abSLuca Barbieri * This program is free software; you can redistribute it and/or modify 7a7e926abSLuca Barbieri * it under the terms of the GNU General Public License as published by 8a7e926abSLuca Barbieri * the Free Software Foundation; either version 2 of the License, or 9a7e926abSLuca Barbieri * (at your option) any later version. 10a7e926abSLuca Barbieri */ 11a7e926abSLuca Barbieri 12a7e926abSLuca Barbieri#include <linux/linkage.h> 13a7e926abSLuca Barbieri#include <asm/alternative-asm.h> 14a7e926abSLuca Barbieri#include <asm/dwarf2.h> 15a7e926abSLuca Barbieri 16a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */ 17a7e926abSLuca Barbieri.macro LOCK reg 1860cf637aSJan Beulich pushfl_cfi 19a7e926abSLuca Barbieri cli 20a7e926abSLuca Barbieri.endm 21a7e926abSLuca Barbieri 22a7e926abSLuca Barbieri.macro UNLOCK reg 2360cf637aSJan Beulich popfl_cfi 24a7e926abSLuca Barbieri.endm 25a7e926abSLuca Barbieri 2630246557SLuca Barbieri#define BEGIN(op) \ 27417484d4SLuca Barbieri.macro endp; \ 2830246557SLuca Barbieri CFI_ENDPROC; \ 2930246557SLuca BarbieriENDPROC(atomic64_##op##_386); \ 30417484d4SLuca Barbieri.purgem endp; \ 3130246557SLuca Barbieri.endm; \ 3230246557SLuca BarbieriENTRY(atomic64_##op##_386); \ 3330246557SLuca Barbieri CFI_STARTPROC; \ 3430246557SLuca Barbieri LOCK v; 35a7e926abSLuca Barbieri 36417484d4SLuca Barbieri#define ENDP endp 37417484d4SLuca Barbieri 3830246557SLuca Barbieri#define RET \ 3930246557SLuca Barbieri UNLOCK v; \ 40a7e926abSLuca Barbieri ret 41a7e926abSLuca Barbieri 42417484d4SLuca Barbieri#define RET_ENDP \ 4330246557SLuca Barbieri RET; \ 44417484d4SLuca Barbieri ENDP 45a7e926abSLuca Barbieri 4630246557SLuca Barbieri#define v %ecx 4730246557SLuca BarbieriBEGIN(read) 4830246557SLuca Barbieri movl (v), %eax 4930246557SLuca Barbieri movl 4(v), %edx 50417484d4SLuca BarbieriRET_ENDP 5130246557SLuca Barbieri#undef v 52a7e926abSLuca Barbieri 5330246557SLuca Barbieri#define v %esi 5430246557SLuca BarbieriBEGIN(set) 5530246557SLuca Barbieri movl %ebx, (v) 5630246557SLuca Barbieri movl %ecx, 4(v) 57417484d4SLuca BarbieriRET_ENDP 5830246557SLuca Barbieri#undef v 59a7e926abSLuca Barbieri 6030246557SLuca Barbieri#define v %esi 6130246557SLuca BarbieriBEGIN(xchg) 6230246557SLuca Barbieri movl (v), %eax 6330246557SLuca Barbieri movl 4(v), %edx 6430246557SLuca Barbieri movl %ebx, (v) 6530246557SLuca Barbieri movl %ecx, 4(v) 66417484d4SLuca BarbieriRET_ENDP 6730246557SLuca Barbieri#undef v 68a7e926abSLuca Barbieri 6930246557SLuca Barbieri#define v %ecx 7030246557SLuca BarbieriBEGIN(add) 7130246557SLuca Barbieri addl %eax, (v) 7230246557SLuca Barbieri adcl %edx, 4(v) 73417484d4SLuca BarbieriRET_ENDP 7430246557SLuca Barbieri#undef v 75a7e926abSLuca Barbieri 7630246557SLuca Barbieri#define v %ecx 7730246557SLuca BarbieriBEGIN(add_return) 7830246557SLuca Barbieri addl (v), %eax 7930246557SLuca Barbieri adcl 4(v), %edx 8030246557SLuca Barbieri movl %eax, (v) 8130246557SLuca Barbieri movl %edx, 4(v) 82417484d4SLuca BarbieriRET_ENDP 8330246557SLuca Barbieri#undef v 84a7e926abSLuca Barbieri 8530246557SLuca Barbieri#define v %ecx 8630246557SLuca BarbieriBEGIN(sub) 8730246557SLuca Barbieri subl %eax, (v) 8830246557SLuca Barbieri sbbl %edx, 4(v) 89417484d4SLuca BarbieriRET_ENDP 9030246557SLuca Barbieri#undef v 9130246557SLuca Barbieri 9230246557SLuca Barbieri#define v %ecx 9330246557SLuca BarbieriBEGIN(sub_return) 94a7e926abSLuca Barbieri negl %edx 95a7e926abSLuca Barbieri negl %eax 96a7e926abSLuca Barbieri sbbl $0, %edx 9730246557SLuca Barbieri addl (v), %eax 9830246557SLuca Barbieri adcl 4(v), %edx 9930246557SLuca Barbieri movl %eax, (v) 10030246557SLuca Barbieri movl %edx, 4(v) 101417484d4SLuca BarbieriRET_ENDP 10230246557SLuca Barbieri#undef v 103a7e926abSLuca Barbieri 10430246557SLuca Barbieri#define v %esi 10530246557SLuca BarbieriBEGIN(inc) 10630246557SLuca Barbieri addl $1, (v) 10730246557SLuca Barbieri adcl $0, 4(v) 108417484d4SLuca BarbieriRET_ENDP 10930246557SLuca Barbieri#undef v 110a7e926abSLuca Barbieri 11130246557SLuca Barbieri#define v %esi 11230246557SLuca BarbieriBEGIN(inc_return) 11330246557SLuca Barbieri movl (v), %eax 11430246557SLuca Barbieri movl 4(v), %edx 115a7e926abSLuca Barbieri addl $1, %eax 116a7e926abSLuca Barbieri adcl $0, %edx 11730246557SLuca Barbieri movl %eax, (v) 11830246557SLuca Barbieri movl %edx, 4(v) 119417484d4SLuca BarbieriRET_ENDP 12030246557SLuca Barbieri#undef v 121a7e926abSLuca Barbieri 12230246557SLuca Barbieri#define v %esi 12330246557SLuca BarbieriBEGIN(dec) 12430246557SLuca Barbieri subl $1, (v) 12530246557SLuca Barbieri sbbl $0, 4(v) 126417484d4SLuca BarbieriRET_ENDP 12730246557SLuca Barbieri#undef v 128a7e926abSLuca Barbieri 12930246557SLuca Barbieri#define v %esi 13030246557SLuca BarbieriBEGIN(dec_return) 13130246557SLuca Barbieri movl (v), %eax 13230246557SLuca Barbieri movl 4(v), %edx 133a7e926abSLuca Barbieri subl $1, %eax 134a7e926abSLuca Barbieri sbbl $0, %edx 13530246557SLuca Barbieri movl %eax, (v) 13630246557SLuca Barbieri movl %edx, 4(v) 137417484d4SLuca BarbieriRET_ENDP 13830246557SLuca Barbieri#undef v 139a7e926abSLuca Barbieri 140*cb8095bbSJan Beulich#define v %esi 14130246557SLuca BarbieriBEGIN(add_unless) 142*cb8095bbSJan Beulich addl %eax, %ecx 143a7e926abSLuca Barbieri adcl %edx, %edi 14430246557SLuca Barbieri addl (v), %eax 14530246557SLuca Barbieri adcl 4(v), %edx 146*cb8095bbSJan Beulich cmpl %eax, %ecx 147a7e926abSLuca Barbieri je 3f 148a7e926abSLuca Barbieri1: 14930246557SLuca Barbieri movl %eax, (v) 15030246557SLuca Barbieri movl %edx, 4(v) 1516e6104feSLuca Barbieri movl $1, %eax 152a7e926abSLuca Barbieri2: 15330246557SLuca Barbieri RET 154a7e926abSLuca Barbieri3: 155a7e926abSLuca Barbieri cmpl %edx, %edi 156a7e926abSLuca Barbieri jne 1b 1576e6104feSLuca Barbieri xorl %eax, %eax 158a7e926abSLuca Barbieri jmp 2b 159417484d4SLuca BarbieriENDP 16030246557SLuca Barbieri#undef v 161a7e926abSLuca Barbieri 16230246557SLuca Barbieri#define v %esi 16330246557SLuca BarbieriBEGIN(inc_not_zero) 16430246557SLuca Barbieri movl (v), %eax 16530246557SLuca Barbieri movl 4(v), %edx 166a7e926abSLuca Barbieri testl %eax, %eax 167a7e926abSLuca Barbieri je 3f 168a7e926abSLuca Barbieri1: 169a7e926abSLuca Barbieri addl $1, %eax 170a7e926abSLuca Barbieri adcl $0, %edx 17130246557SLuca Barbieri movl %eax, (v) 17230246557SLuca Barbieri movl %edx, 4(v) 173f3e83131SLuca Barbieri movl $1, %eax 174a7e926abSLuca Barbieri2: 17530246557SLuca Barbieri RET 176a7e926abSLuca Barbieri3: 177a7e926abSLuca Barbieri testl %edx, %edx 178a7e926abSLuca Barbieri jne 1b 179a7e926abSLuca Barbieri jmp 2b 180417484d4SLuca BarbieriENDP 18130246557SLuca Barbieri#undef v 182a7e926abSLuca Barbieri 18330246557SLuca Barbieri#define v %esi 18430246557SLuca BarbieriBEGIN(dec_if_positive) 18530246557SLuca Barbieri movl (v), %eax 18630246557SLuca Barbieri movl 4(v), %edx 187a7e926abSLuca Barbieri subl $1, %eax 188a7e926abSLuca Barbieri sbbl $0, %edx 189a7e926abSLuca Barbieri js 1f 19030246557SLuca Barbieri movl %eax, (v) 19130246557SLuca Barbieri movl %edx, 4(v) 192a7e926abSLuca Barbieri1: 193417484d4SLuca BarbieriRET_ENDP 19430246557SLuca Barbieri#undef v 195