The reason for the problem you're seeing is probably that the constraints are not quite right. Here, x0 is not simply clobbered, but is actively written to in the middle of the sequence (it is at least an early clobber). It is also, I assume, a result from the hypercall, so it cannot simply be discarded. It would help to get a disassembly of the function, but I'd tend to rewrite the code as such: extern int bar(void); int foo(void) { register int w0 asm("w0"); int a, b; a = bar(); w0 = 0x4b000000; asm volatile("hvc #0" : "+r" (w0) :: ); b = bar(); return a - b; }
There still is the issue of x1-x3 registers being used for local variables and clobbering of the same across the "hvc" call.
Comparatively, the fix below works more reliably : asm volatile("hvc #0" : "+r" (w0) :: "x1","x2","x3"); Thanks, Ashish