Anybody want to write a fancy macro? I need a cmpxchg_user() macro
that corresponds to the following x86 code used in grant_table.c
and defined in include/asm-x86/system.h, but (of course) works
for ia64. It must also conform to the ia64 __ex_table convention.
Please include a Signed-off-by as this will be new code for Xen.
Thanks!
Dan
/*
* This function causes value _o to be changed to _n at location _p.
* If this access causes a fault then we return 1, otherwise we return
0.
* If no fault occurs then _o is updated to the value we saw at _p. If
this
* is the same as the initial value of _o then _n is written to location
_p.
*/
#define __cmpxchg_user(_p,_o,_n,_isuff,_oppre,_regtype)
\
__asm__ __volatile__ (
\
"1: " LOCK_PREFIX "cmpxchg"_isuff" %"_oppre"2,%3\n"
\
"2:\n"
\
".section .fixup,\"ax\"\n"
\
"3: movl $1,%1\n"
\
" jmp 2b\n"
\
".previous\n"
\
".section __ex_table,\"a\"\n"
\
" .align 4\n"
\
" .long 1b,3b\n"
\
".previous"
\
: "=a" (_o), "=r" (_rc)
\
: _regtype (_n), "m" (*__xg((volatile void *)_p)), "0" (_o), "1"
(0) \
: "memory");
#define cmpxchg_user(_p,_o,_n)
\
({
\
int _rc;
\
switch ( sizeof(*(_p)) ) {
\
case 1:
\
__cmpxchg_user(_p,_o,_n,"b","b","q");
\
break;
\
case 2:
\
__cmpxchg_user(_p,_o,_n,"w","w","r");
\
break;
\
case 4:
\
__cmpxchg_user(_p,_o,_n,"l","","r");
\
break;
\
case 8:
\
__asm__ __volatile__ (
\
"1: " LOCK_PREFIX "cmpxchg8b %4\n"
\
"2:\n"
\
".section .fixup,\"ax\"\n"
\
"3: movl $1,%1\n"
\
" jmp 2b\n"
\
".previous\n"
\
".section __ex_table,\"a\"\n"
\
" .align 4\n"
\
" .long 1b,3b\n"
\
".previous"
\
: "=A" (_o), "=r" (_rc)
\
: "c" ((u32)((u64)(_n)>>32)), "b" ((u32)(_n)),
\
"m" (*__xg((volatile void *)(_p))), "0" (_o), "1" (0)
\
: "memory");
\
break;
\
}
\
_rc;
\
})
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|