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 18a7e926abSLuca Barbieri pushfl 19a7e926abSLuca Barbieri CFI_ADJUST_CFA_OFFSET 4 20a7e926abSLuca Barbieri cli 21a7e926abSLuca Barbieri.endm 22a7e926abSLuca Barbieri 23a7e926abSLuca Barbieri.macro UNLOCK reg 24a7e926abSLuca Barbieri popfl 25a7e926abSLuca Barbieri CFI_ADJUST_CFA_OFFSET -4 26a7e926abSLuca Barbieri.endm 27a7e926abSLuca Barbieri 28*30246557SLuca Barbieri#define BEGIN(op) \ 29*30246557SLuca Barbieri.macro END; \ 30*30246557SLuca Barbieri CFI_ENDPROC; \ 31*30246557SLuca BarbieriENDPROC(atomic64_##op##_386); \ 32*30246557SLuca Barbieri.purgem END; \ 33*30246557SLuca Barbieri.endm; \ 34*30246557SLuca BarbieriENTRY(atomic64_##op##_386); \ 35*30246557SLuca Barbieri CFI_STARTPROC; \ 36*30246557SLuca Barbieri LOCK v; 37a7e926abSLuca Barbieri 38*30246557SLuca Barbieri#define RET \ 39*30246557SLuca Barbieri UNLOCK v; \ 40a7e926abSLuca Barbieri ret 41a7e926abSLuca Barbieri 42*30246557SLuca Barbieri#define RET_END \ 43*30246557SLuca Barbieri RET; \ 44a7e926abSLuca Barbieri END 45a7e926abSLuca Barbieri 46*30246557SLuca Barbieri#define v %ecx 47*30246557SLuca BarbieriBEGIN(read) 48*30246557SLuca Barbieri movl (v), %eax 49*30246557SLuca Barbieri movl 4(v), %edx 50*30246557SLuca BarbieriRET_END 51*30246557SLuca Barbieri#undef v 52a7e926abSLuca Barbieri 53*30246557SLuca Barbieri#define v %esi 54*30246557SLuca BarbieriBEGIN(set) 55*30246557SLuca Barbieri movl %ebx, (v) 56*30246557SLuca Barbieri movl %ecx, 4(v) 57*30246557SLuca BarbieriRET_END 58*30246557SLuca Barbieri#undef v 59a7e926abSLuca Barbieri 60*30246557SLuca Barbieri#define v %esi 61*30246557SLuca BarbieriBEGIN(xchg) 62*30246557SLuca Barbieri movl (v), %eax 63*30246557SLuca Barbieri movl 4(v), %edx 64*30246557SLuca Barbieri movl %ebx, (v) 65*30246557SLuca Barbieri movl %ecx, 4(v) 66*30246557SLuca BarbieriRET_END 67*30246557SLuca Barbieri#undef v 68a7e926abSLuca Barbieri 69*30246557SLuca Barbieri#define v %ecx 70*30246557SLuca BarbieriBEGIN(add) 71*30246557SLuca Barbieri addl %eax, (v) 72*30246557SLuca Barbieri adcl %edx, 4(v) 73*30246557SLuca BarbieriRET_END 74*30246557SLuca Barbieri#undef v 75a7e926abSLuca Barbieri 76*30246557SLuca Barbieri#define v %ecx 77*30246557SLuca BarbieriBEGIN(add_return) 78*30246557SLuca Barbieri addl (v), %eax 79*30246557SLuca Barbieri adcl 4(v), %edx 80*30246557SLuca Barbieri movl %eax, (v) 81*30246557SLuca Barbieri movl %edx, 4(v) 82*30246557SLuca BarbieriRET_END 83*30246557SLuca Barbieri#undef v 84a7e926abSLuca Barbieri 85*30246557SLuca Barbieri#define v %ecx 86*30246557SLuca BarbieriBEGIN(sub) 87*30246557SLuca Barbieri subl %eax, (v) 88*30246557SLuca Barbieri sbbl %edx, 4(v) 89*30246557SLuca BarbieriRET_END 90*30246557SLuca Barbieri#undef v 91*30246557SLuca Barbieri 92*30246557SLuca Barbieri#define v %ecx 93*30246557SLuca BarbieriBEGIN(sub_return) 94a7e926abSLuca Barbieri negl %edx 95a7e926abSLuca Barbieri negl %eax 96a7e926abSLuca Barbieri sbbl $0, %edx 97*30246557SLuca Barbieri addl (v), %eax 98*30246557SLuca Barbieri adcl 4(v), %edx 99*30246557SLuca Barbieri movl %eax, (v) 100*30246557SLuca Barbieri movl %edx, 4(v) 101*30246557SLuca BarbieriRET_END 102*30246557SLuca Barbieri#undef v 103a7e926abSLuca Barbieri 104*30246557SLuca Barbieri#define v %esi 105*30246557SLuca BarbieriBEGIN(inc) 106*30246557SLuca Barbieri addl $1, (v) 107*30246557SLuca Barbieri adcl $0, 4(v) 108*30246557SLuca BarbieriRET_END 109*30246557SLuca Barbieri#undef v 110a7e926abSLuca Barbieri 111*30246557SLuca Barbieri#define v %esi 112*30246557SLuca BarbieriBEGIN(inc_return) 113*30246557SLuca Barbieri movl (v), %eax 114*30246557SLuca Barbieri movl 4(v), %edx 115a7e926abSLuca Barbieri addl $1, %eax 116a7e926abSLuca Barbieri adcl $0, %edx 117*30246557SLuca Barbieri movl %eax, (v) 118*30246557SLuca Barbieri movl %edx, 4(v) 119*30246557SLuca BarbieriRET_END 120*30246557SLuca Barbieri#undef v 121a7e926abSLuca Barbieri 122*30246557SLuca Barbieri#define v %esi 123*30246557SLuca BarbieriBEGIN(dec) 124*30246557SLuca Barbieri subl $1, (v) 125*30246557SLuca Barbieri sbbl $0, 4(v) 126*30246557SLuca BarbieriRET_END 127*30246557SLuca Barbieri#undef v 128a7e926abSLuca Barbieri 129*30246557SLuca Barbieri#define v %esi 130*30246557SLuca BarbieriBEGIN(dec_return) 131*30246557SLuca Barbieri movl (v), %eax 132*30246557SLuca Barbieri movl 4(v), %edx 133a7e926abSLuca Barbieri subl $1, %eax 134a7e926abSLuca Barbieri sbbl $0, %edx 135*30246557SLuca Barbieri movl %eax, (v) 136*30246557SLuca Barbieri movl %edx, 4(v) 137*30246557SLuca BarbieriRET_END 138*30246557SLuca Barbieri#undef v 139a7e926abSLuca Barbieri 140*30246557SLuca Barbieri#define v %ecx 141*30246557SLuca BarbieriBEGIN(add_unless) 142a7e926abSLuca Barbieri addl %eax, %esi 143a7e926abSLuca Barbieri adcl %edx, %edi 144*30246557SLuca Barbieri addl (v), %eax 145*30246557SLuca Barbieri adcl 4(v), %edx 146a7e926abSLuca Barbieri cmpl %eax, %esi 147a7e926abSLuca Barbieri je 3f 148a7e926abSLuca Barbieri1: 149*30246557SLuca Barbieri movl %eax, (v) 150*30246557SLuca Barbieri movl %edx, 4(v) 1516e6104feSLuca Barbieri movl $1, %eax 152a7e926abSLuca Barbieri2: 153*30246557SLuca Barbieri RET 154a7e926abSLuca Barbieri3: 155a7e926abSLuca Barbieri cmpl %edx, %edi 156a7e926abSLuca Barbieri jne 1b 1576e6104feSLuca Barbieri xorl %eax, %eax 158a7e926abSLuca Barbieri jmp 2b 159*30246557SLuca BarbieriEND 160*30246557SLuca Barbieri#undef v 161a7e926abSLuca Barbieri 162*30246557SLuca Barbieri#define v %esi 163*30246557SLuca BarbieriBEGIN(inc_not_zero) 164*30246557SLuca Barbieri movl (v), %eax 165*30246557SLuca 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 171*30246557SLuca Barbieri movl %eax, (v) 172*30246557SLuca Barbieri movl %edx, 4(v) 173f3e83131SLuca Barbieri movl $1, %eax 174a7e926abSLuca Barbieri2: 175*30246557SLuca Barbieri RET 176a7e926abSLuca Barbieri3: 177a7e926abSLuca Barbieri testl %edx, %edx 178a7e926abSLuca Barbieri jne 1b 179a7e926abSLuca Barbieri jmp 2b 180*30246557SLuca BarbieriEND 181*30246557SLuca Barbieri#undef v 182a7e926abSLuca Barbieri 183*30246557SLuca Barbieri#define v %esi 184*30246557SLuca BarbieriBEGIN(dec_if_positive) 185*30246557SLuca Barbieri movl (v), %eax 186*30246557SLuca Barbieri movl 4(v), %edx 187a7e926abSLuca Barbieri subl $1, %eax 188a7e926abSLuca Barbieri sbbl $0, %edx 189a7e926abSLuca Barbieri js 1f 190*30246557SLuca Barbieri movl %eax, (v) 191*30246557SLuca Barbieri movl %edx, 4(v) 192a7e926abSLuca Barbieri1: 193*30246557SLuca BarbieriRET_END 194*30246557SLuca Barbieri#undef v 195