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 15a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */ 16a7e926abSLuca Barbieri.macro LOCK reg 17*131484c8SIngo Molnar pushfl 18a7e926abSLuca Barbieri cli 19a7e926abSLuca Barbieri.endm 20a7e926abSLuca Barbieri 21a7e926abSLuca Barbieri.macro UNLOCK reg 22*131484c8SIngo Molnar popfl 23a7e926abSLuca Barbieri.endm 24a7e926abSLuca Barbieri 2530246557SLuca Barbieri#define BEGIN(op) \ 26417484d4SLuca Barbieri.macro endp; \ 2730246557SLuca BarbieriENDPROC(atomic64_##op##_386); \ 28417484d4SLuca Barbieri.purgem endp; \ 2930246557SLuca Barbieri.endm; \ 3030246557SLuca BarbieriENTRY(atomic64_##op##_386); \ 3130246557SLuca Barbieri LOCK v; 32a7e926abSLuca Barbieri 33417484d4SLuca Barbieri#define ENDP endp 34417484d4SLuca Barbieri 3530246557SLuca Barbieri#define RET \ 3630246557SLuca Barbieri UNLOCK v; \ 37a7e926abSLuca Barbieri ret 38a7e926abSLuca Barbieri 39417484d4SLuca Barbieri#define RET_ENDP \ 4030246557SLuca Barbieri RET; \ 41417484d4SLuca Barbieri ENDP 42a7e926abSLuca Barbieri 4330246557SLuca Barbieri#define v %ecx 4430246557SLuca BarbieriBEGIN(read) 4530246557SLuca Barbieri movl (v), %eax 4630246557SLuca Barbieri movl 4(v), %edx 47417484d4SLuca BarbieriRET_ENDP 4830246557SLuca Barbieri#undef v 49a7e926abSLuca Barbieri 5030246557SLuca Barbieri#define v %esi 5130246557SLuca BarbieriBEGIN(set) 5230246557SLuca Barbieri movl %ebx, (v) 5330246557SLuca Barbieri movl %ecx, 4(v) 54417484d4SLuca BarbieriRET_ENDP 5530246557SLuca Barbieri#undef v 56a7e926abSLuca Barbieri 5730246557SLuca Barbieri#define v %esi 5830246557SLuca BarbieriBEGIN(xchg) 5930246557SLuca Barbieri movl (v), %eax 6030246557SLuca Barbieri movl 4(v), %edx 6130246557SLuca Barbieri movl %ebx, (v) 6230246557SLuca Barbieri movl %ecx, 4(v) 63417484d4SLuca BarbieriRET_ENDP 6430246557SLuca Barbieri#undef v 65a7e926abSLuca Barbieri 6630246557SLuca Barbieri#define v %ecx 6730246557SLuca BarbieriBEGIN(add) 6830246557SLuca Barbieri addl %eax, (v) 6930246557SLuca Barbieri adcl %edx, 4(v) 70417484d4SLuca BarbieriRET_ENDP 7130246557SLuca Barbieri#undef v 72a7e926abSLuca Barbieri 7330246557SLuca Barbieri#define v %ecx 7430246557SLuca BarbieriBEGIN(add_return) 7530246557SLuca Barbieri addl (v), %eax 7630246557SLuca Barbieri adcl 4(v), %edx 7730246557SLuca Barbieri movl %eax, (v) 7830246557SLuca Barbieri movl %edx, 4(v) 79417484d4SLuca BarbieriRET_ENDP 8030246557SLuca Barbieri#undef v 81a7e926abSLuca Barbieri 8230246557SLuca Barbieri#define v %ecx 8330246557SLuca BarbieriBEGIN(sub) 8430246557SLuca Barbieri subl %eax, (v) 8530246557SLuca Barbieri sbbl %edx, 4(v) 86417484d4SLuca BarbieriRET_ENDP 8730246557SLuca Barbieri#undef v 8830246557SLuca Barbieri 8930246557SLuca Barbieri#define v %ecx 9030246557SLuca BarbieriBEGIN(sub_return) 91a7e926abSLuca Barbieri negl %edx 92a7e926abSLuca Barbieri negl %eax 93a7e926abSLuca Barbieri sbbl $0, %edx 9430246557SLuca Barbieri addl (v), %eax 9530246557SLuca Barbieri adcl 4(v), %edx 9630246557SLuca Barbieri movl %eax, (v) 9730246557SLuca Barbieri movl %edx, 4(v) 98417484d4SLuca BarbieriRET_ENDP 9930246557SLuca Barbieri#undef v 100a7e926abSLuca Barbieri 10130246557SLuca Barbieri#define v %esi 10230246557SLuca BarbieriBEGIN(inc) 10330246557SLuca Barbieri addl $1, (v) 10430246557SLuca Barbieri adcl $0, 4(v) 105417484d4SLuca BarbieriRET_ENDP 10630246557SLuca Barbieri#undef v 107a7e926abSLuca Barbieri 10830246557SLuca Barbieri#define v %esi 10930246557SLuca BarbieriBEGIN(inc_return) 11030246557SLuca Barbieri movl (v), %eax 11130246557SLuca Barbieri movl 4(v), %edx 112a7e926abSLuca Barbieri addl $1, %eax 113a7e926abSLuca Barbieri adcl $0, %edx 11430246557SLuca Barbieri movl %eax, (v) 11530246557SLuca Barbieri movl %edx, 4(v) 116417484d4SLuca BarbieriRET_ENDP 11730246557SLuca Barbieri#undef v 118a7e926abSLuca Barbieri 11930246557SLuca Barbieri#define v %esi 12030246557SLuca BarbieriBEGIN(dec) 12130246557SLuca Barbieri subl $1, (v) 12230246557SLuca Barbieri sbbl $0, 4(v) 123417484d4SLuca BarbieriRET_ENDP 12430246557SLuca Barbieri#undef v 125a7e926abSLuca Barbieri 12630246557SLuca Barbieri#define v %esi 12730246557SLuca BarbieriBEGIN(dec_return) 12830246557SLuca Barbieri movl (v), %eax 12930246557SLuca Barbieri movl 4(v), %edx 130a7e926abSLuca Barbieri subl $1, %eax 131a7e926abSLuca Barbieri sbbl $0, %edx 13230246557SLuca Barbieri movl %eax, (v) 13330246557SLuca Barbieri movl %edx, 4(v) 134417484d4SLuca BarbieriRET_ENDP 13530246557SLuca Barbieri#undef v 136a7e926abSLuca Barbieri 137cb8095bbSJan Beulich#define v %esi 13830246557SLuca BarbieriBEGIN(add_unless) 139cb8095bbSJan Beulich addl %eax, %ecx 140a7e926abSLuca Barbieri adcl %edx, %edi 14130246557SLuca Barbieri addl (v), %eax 14230246557SLuca Barbieri adcl 4(v), %edx 143cb8095bbSJan Beulich cmpl %eax, %ecx 144a7e926abSLuca Barbieri je 3f 145a7e926abSLuca Barbieri1: 14630246557SLuca Barbieri movl %eax, (v) 14730246557SLuca Barbieri movl %edx, 4(v) 1486e6104feSLuca Barbieri movl $1, %eax 149a7e926abSLuca Barbieri2: 15030246557SLuca Barbieri RET 151a7e926abSLuca Barbieri3: 152a7e926abSLuca Barbieri cmpl %edx, %edi 153a7e926abSLuca Barbieri jne 1b 1546e6104feSLuca Barbieri xorl %eax, %eax 155a7e926abSLuca Barbieri jmp 2b 156417484d4SLuca BarbieriENDP 15730246557SLuca Barbieri#undef v 158a7e926abSLuca Barbieri 15930246557SLuca Barbieri#define v %esi 16030246557SLuca BarbieriBEGIN(inc_not_zero) 16130246557SLuca Barbieri movl (v), %eax 16230246557SLuca Barbieri movl 4(v), %edx 163a7e926abSLuca Barbieri testl %eax, %eax 164a7e926abSLuca Barbieri je 3f 165a7e926abSLuca Barbieri1: 166a7e926abSLuca Barbieri addl $1, %eax 167a7e926abSLuca Barbieri adcl $0, %edx 16830246557SLuca Barbieri movl %eax, (v) 16930246557SLuca Barbieri movl %edx, 4(v) 170f3e83131SLuca Barbieri movl $1, %eax 171a7e926abSLuca Barbieri2: 17230246557SLuca Barbieri RET 173a7e926abSLuca Barbieri3: 174a7e926abSLuca Barbieri testl %edx, %edx 175a7e926abSLuca Barbieri jne 1b 176a7e926abSLuca Barbieri jmp 2b 177417484d4SLuca BarbieriENDP 17830246557SLuca Barbieri#undef v 179a7e926abSLuca Barbieri 18030246557SLuca Barbieri#define v %esi 18130246557SLuca BarbieriBEGIN(dec_if_positive) 18230246557SLuca Barbieri movl (v), %eax 18330246557SLuca Barbieri movl 4(v), %edx 184a7e926abSLuca Barbieri subl $1, %eax 185a7e926abSLuca Barbieri sbbl $0, %edx 186a7e926abSLuca Barbieri js 1f 18730246557SLuca Barbieri movl %eax, (v) 18830246557SLuca Barbieri movl %edx, 4(v) 189a7e926abSLuca Barbieri1: 190417484d4SLuca BarbieriRET_ENDP 19130246557SLuca Barbieri#undef v 192